1 // Copyright 2013 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef NINJA_LINE_PRINTER_H_ 16 #define NINJA_LINE_PRINTER_H_ 17 18 #include <stddef.h> 19 #include <string> 20 21 /// Prints lines of text, possibly overprinting previously printed lines 22 /// if the terminal supports it. 23 struct LinePrinter { 24 LinePrinter(); 25 is_smart_terminalLinePrinter26 bool is_smart_terminal() const { return smart_terminal_; } set_smart_terminalLinePrinter27 void set_smart_terminal(bool smart) { smart_terminal_ = smart; } 28 supports_colorLinePrinter29 bool supports_color() const { return supports_color_; } 30 31 enum LineType { 32 FULL, 33 ELIDE 34 }; 35 /// Overprints the current line. If type is ELIDE, elides to_print to fit on 36 /// one line. 37 void Print(std::string to_print, LineType type); 38 39 /// Prints a string on a new line, not overprinting previous output. 40 void PrintOnNewLine(const std::string& to_print); 41 42 /// Lock or unlock the console. Any output sent to the LinePrinter while the 43 /// console is locked will not be printed until it is unlocked. 44 void SetConsoleLocked(bool locked); 45 46 private: 47 /// Whether we can do fancy terminal control codes. 48 bool smart_terminal_; 49 50 /// Whether we can use ISO 6429 (ANSI) color sequences. 51 bool supports_color_; 52 53 /// Whether the caret is at the beginning of a blank line. 54 bool have_blank_line_; 55 56 /// Whether console is locked. 57 bool console_locked_; 58 59 /// Buffered current line while console is locked. 60 std::string line_buffer_; 61 62 /// Buffered line type while console is locked. 63 LineType line_type_; 64 65 /// Buffered console output while console is locked. 66 std::string output_buffer_; 67 68 #ifdef _WIN32 69 void* console_; 70 #endif 71 72 /// Print the given data to the console, or buffer it if it is locked. 73 void PrintOrBuffer(const char *data, size_t size); 74 }; 75 76 #endif // NINJA_LINE_PRINTER_H_ 77