Nicolas Winkler пре 6 година
родитељ
комит
466f058e9f
4 измењених фајлова са 54 додато и 17 уклоњено
  1. 8 4
      src/Driver.cpp
  2. 1 1
      src/Driver.h
  3. 11 0
      src/Logging.cpp
  4. 34 12
      src/Logging.h

+ 8 - 4
src/Driver.cpp

@@ -6,6 +6,8 @@
 
 #include "Logging.h"
 
+#include <cstdio>
+
 extern std::unique_ptr<std::vector<std::unique_ptr<qlow::ast::Class>>> parsedClasses;
 extern FILE* qlow_parser_in;
 extern int qlow_parser_parse(void);
@@ -52,7 +54,7 @@ Driver::Driver(int argc, char** argv) :
 }
 
 
-void Driver::run(void)
+int Driver::run(void)
 {
     Logger& logger = Logger::getInstance();
     
@@ -60,18 +62,20 @@ void Driver::run(void)
     
     std::vector<std::unique_ptr<qlow::ast::Class>> classes;
     for (auto& filename : options.infiles) {
-        FILE* file = ::fopen(filename.c_str(), "r");
+        std::FILE* file = std::fopen(filename.c_str(), "r");
         
         try {
             classes = parseFile(file);
         } catch (const char* errMsg) {
             logger.logError(errMsg);
+            return 1;
         }
         
-        fclose(file);
+        if (file)
+            std::fclose(file);
     }
     
-    return;
+    return 0;
 }
 
 

+ 1 - 1
src/Driver.h

@@ -38,7 +38,7 @@ public:
     Driver(void) = delete;
     Driver(int argc, char** argv);
     
-    void run(void);
+    int run(void);
     
     /// \brief runs the parser over a given stream
     /// \warning Don't call concurrently. Not supported!

+ 11 - 0
src/Logging.cpp

@@ -68,6 +68,17 @@ void Logger::logError(const std::string& errMsg, const qlow::CodePosition& cp)
 }
 
 
+std::ostream& Logger::operator()(LogLevel ll)
+{
+    if (logLevel >= ll) {
+        return *this;
+    }
+    else {
+        return nullStream;
+    }
+}
+
+
 int Logger::overflow(int c)
 {
     target.put(char(c));

+ 34 - 12
src/Logging.h

@@ -2,7 +2,6 @@
 #define QLOW_LOGGING_H
 
 #include <iostream>
-#include <stack>
 
 
 namespace qlow
@@ -29,17 +28,16 @@ class qlow::Logger :
     private std::streambuf
 {
 protected:
-    std::ostream& target;
-    bool firstChar;
-    int indentVal;
-
-    // type of current logging
-    LogLevel logType = LogLevel::OFF;
-    LogLevel logLevel = LogLevel::INFO;
     
-    static Logger instance;
-
-    // color
+    class NullStream :
+        public std::ostream,
+        public std::streambuf
+    {
+    public:
+        NullStream(void) : std::ostream{ this } {}
+        inline int overflow(int c) override { return c; }
+    };
+    
     enum Color {
         BLACK = 0,
         RED,
@@ -51,6 +49,17 @@ protected:
         WHITE
     };
 
+    std::ostream& target;
+    NullStream nullStream;
+    bool firstChar;
+    int indentVal;
+
+    // type of current logging
+    LogLevel logType = LogLevel::OFF;
+    LogLevel logLevel = LogLevel::INFO;
+
+    static Logger instance;
+
     void foreground(Color color, bool bright);
     void background(Color color, bool bright);
     void bold(void);
@@ -63,18 +72,31 @@ public:
     void logError(const std::string& errMsg);
     void logError(const std::string& errMsg, const qlow::CodePosition& cp);
 
+    std::ostream& operator() (LogLevel ll);
+    inline std::ostream& none (void) { return (*this)(LogLevel::NONE); }
+    inline std::ostream& err  (void) { return (*this)(LogLevel::ERROR); }
+    inline std::ostream& warn (void) { return (*this)(LogLevel::WARNING); }
+    inline std::ostream& info (void) { return (*this)(LogLevel::INFO); }
+    inline std::ostream& debug(void) { return (*this)(LogLevel::DEBUG); }
+    inline std::ostream& trace(void) { return (*this)(LogLevel::TRACE); }
+
     inline void setLogType(LogLevel l) { logType = l; }
 
     inline static Logger& getInstance(void) { return instance; }
 
 protected:
-    virtual int overflow(int c);
+    int overflow(int c) override;
     //virtual std::streamsize xsputn (const char* s, std::streamsize n);
 };
 
 
 std::ostream& operator << (std::ostream& o, qlow::LogLevel l);
 
+inline void shouldbe()
+{
+    qlow::Logger& logger = qlow::Logger::getInstance();
+    logger.err() << "something happened" << std::endl;
+}
 
 #endif // QLOW_LOGGING_H