tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

output.h (7229B)


      1 // Copyright (c) 2019 nyorain
      2 // Distributed under the Boost Software License, Version 1.0.
      3 // See accompanying file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt
      4 
      5 #ifndef INC_DLG_OUTPUT_H_
      6 #define INC_DLG_OUTPUT_H_
      7 
      8 #include <dlg/dlg.h>
      9 #include <stdio.h>
     10 
     11 #ifdef __cplusplus
     12 extern "C" {
     13 #endif
     14 
     15 // Text style
     16 enum dlg_text_style {
     17 dlg_text_style_reset     = 0,
     18 dlg_text_style_bold      = 1,
     19 dlg_text_style_dim       = 2,
     20 dlg_text_style_italic    = 3,
     21 dlg_text_style_underline = 4,
     22 dlg_text_style_blink     = 5,
     23 dlg_text_style_rblink    = 6,
     24 dlg_text_style_reversed  = 7,
     25 dlg_text_style_conceal   = 8,
     26 dlg_text_style_crossed   = 9,
     27 dlg_text_style_none,
     28 };
     29 
     30 // Text color
     31 enum dlg_color {
     32 dlg_color_black = 0,
     33 dlg_color_red,
     34 dlg_color_green,
     35 dlg_color_yellow,
     36 dlg_color_blue,
     37 dlg_color_magenta,
     38 dlg_color_cyan,
     39 dlg_color_gray,
     40 dlg_color_reset = 9,
     41 
     42 dlg_color_black2 = 60,
     43 dlg_color_red2,
     44 dlg_color_green2,
     45 dlg_color_yellow2,
     46 dlg_color_blue2,
     47 dlg_color_magenta2,
     48 dlg_color_cyan2,
     49 dlg_color_gray2,
     50 
     51 dlg_color_none = 69,
     52 };
     53 
     54 struct dlg_style {
     55 enum dlg_text_style style;
     56 enum dlg_color fg;
     57 enum dlg_color bg;
     58 };
     59 
     60 // Like fprintf but fixes utf-8 output to console on windows.
     61 // On non-windows sytems just uses the corresponding standard library
     62 // functions. On windows, if dlg was compiled with the win_console option,
     63 // will first try to output it in a way that allows the default console
     64 // to display utf-8. If that fails, will fall back to the standard
     65 // library functions.
     66 DLG_API int dlg_fprintf(FILE* stream, const char* format, ...) DLG_PRINTF_ATTRIB(2, 3);
     67 DLG_API int dlg_vfprintf(FILE* stream, const char* format, va_list list);
     68 
     69 // Like dlg_printf, but also applies the given style to this output.
     70 // The style will always be applied (using escape sequences), independent of the given stream.
     71 // On windows escape sequences don't work out of the box, see dlg_win_init_ansi().
     72 DLG_API int dlg_styled_fprintf(FILE* stream, struct dlg_style style,
     73 const char* format, ...) DLG_PRINTF_ATTRIB(3, 4);
     74 
     75 // Features to output from the generic output handler.
     76 // Some features might have only an effect in the specializations.
     77 enum dlg_output_feature {
     78 dlg_output_tags = 1, // output tags list
     79 dlg_output_time = 2, // output time of log call (hour:minute:second)
     80 dlg_output_style = 4, // whether to use the supplied styles
     81 dlg_output_func = 8, // output function
     82 dlg_output_file_line = 16, // output file:line,
     83 dlg_output_newline = 32, // output a newline at the end
     84 dlg_output_threadsafe = 64, // locks stream before printing
     85 dlg_output_time_msecs = 128 // output micro seconds (ms on windows)
     86 };
     87 
     88 // The default level-dependent output styles. The array values represent the styles
     89 // to be used for the associated level (i.e. [0] for trace level).
     90 DLG_API extern const struct dlg_style dlg_default_output_styles[6];
     91 
     92 // Generic output function. Used by the default output handler and might be useful
     93 // for custom output handlers (that don't want to manually format the output).
     94 // Will call the given output func with the given data (and format + args to print)
     95 // for everything it has to print in printf format.
     96 // See also the *_stream and *_buf specializations for common usage.
     97 // The given output function must not be NULL.
     98 typedef void(*dlg_generic_output_handler)(void* data, const char* format, ...);
     99 DLG_API void dlg_generic_output(dlg_generic_output_handler output, void* data,
    100 	unsigned int features, const struct dlg_origin* origin, const char* string,
    101 	const struct dlg_style styles[6]);
    102 
    103 // Generic output function, using a format string instead of feature flags.
    104 // Use following conversion characters:
    105 // %h - output the time in H:M:S format
    106 // %m - output the time in milliseconds
    107 // %t - output the full list of tags, comma separated
    108 // %f - output the function name noted in the origin
    109 // %o - output the file:line of the origin
    110 // %s - print the appropriate style escape sequence.
    111 // %r - print the escape sequence to reset the style.
    112 // %c - The content of the log/assert
    113 // %% - print the '%' character
    114 // Only the above specified conversion characters are valid, the rest are
    115 // written as it is.
    116 DLG_API void dlg_generic_outputf(dlg_generic_output_handler output, void* data,
    117 	const char* format_string, const struct dlg_origin* origin,
    118 	const char* string, const struct dlg_style styles[6]);
    119 
    120 // Generic output function. Used by the default output handler and might be useful
    121 // for custom output handlers (that don't want to manually format the output).
    122 // If stream is NULL uses stdout.
    123 // Automatically uses dlg_fprintf to assure correct utf-8 even on windows consoles.
    124 // Locks the stream (i.e. assures threadsafe access) when the associated feature
    125 // is passed (note that stdout/stderr might still mix from multiple threads).
    126 DLG_API void dlg_generic_output_stream(FILE* stream, unsigned int features,
    127 const struct dlg_origin* origin, const char* string,
    128 const struct dlg_style styles[6]);
    129 DLG_API void dlg_generic_outputf_stream(FILE* stream, const char* format_string,
    130 const struct dlg_origin* origin, const char* string,
    131 const struct dlg_style styles[6], bool lock_stream);
    132 
    133 // Generic output function (see dlg_generic_output) that uses a buffer instead of
    134 // a stream. buf must at least point to *size bytes. Will set *size to the number
    135 // of bytes written (capped to the given size), if buf == NULL will set *size
    136 // to the needed size. The size parameter must not be NULL.
    137 DLG_API void dlg_generic_output_buf(char* buf, size_t* size, unsigned int features,
    138 const struct dlg_origin* origin, const char* string,
    139 const struct dlg_style styles[6]);
    140 DLG_API void dlg_generic_outputf_buf(char* buf, size_t* size, const char* format_string,
    141 const struct dlg_origin* origin, const char* string,
    142 const struct dlg_style styles[6]);
    143 
    144 // Returns if the given stream is a tty. Useful for custom output handlers
    145 // e.g. to determine whether to use color.
    146 // NOTE: Due to windows limitations currently returns false for wsl ttys.
    147 DLG_API bool dlg_is_tty(FILE* stream);
    148 
    149 // Returns the null-terminated escape sequence for the given style into buf.
    150 // Undefined behvaiour if any member of style has a value outside its enum range (will
    151 // probably result in a buffer overflow or garbage being printed).
    152 // If all member of style are 'none' will simply nullterminate the first buf char.
    153 DLG_API void dlg_escape_sequence(struct dlg_style style, char buf[12]);
    154 
    155 // The reset style escape sequence.
    156 DLG_API extern const char* const dlg_reset_sequence;
    157 
    158 // Just returns true without other effect on non-windows systems or if dlg
    159 // was compiled without the win_console option.
    160 // On windows tries to set the console mode to ansi to make escape sequences work.
    161 // This works only on newer windows 10 versions. Returns false on error.
    162 // Only the first call to it will have an effect, following calls just return the result.
    163 // The function is threadsafe. Automatically called by the default output handler.
    164 // This will only be able to set the mode for the stdout and stderr consoles, so
    165 // other streams to consoles will still not work.
    166 DLG_API bool dlg_win_init_ansi(void);
    167 
    168 #ifdef __cplusplus
    169 } // extern "C"
    170 #endif
    171 
    172 #endif // header guard