col.h: see origin repo
# ifndef _COL_HOL_H_
# define _COL_HOL_H_ # include <stdlib.h>
# include <stdio.h>
# include <stdbool.h>
# include <string.h>
# include <math.h>
# ifdef _WIN32
# include <windows.h>
# else
# include <sys/types.h>
# include <unistd.h>
# ifdef __APPLE__
# include <sys/ioctl.h>
# else
# include <termios.h>
# endif
# endif
# define XSTR ( X) #X
# define STR ( X) XSTR ( X)
# define COL_MAX_CTRL 128
# define COL_MAX_FORMATTED 4096
# define COL_RESET "\033[0m"
typedef enum { COL_8, COL_8_BRIGHT, COL_256, COL_RGB
} col_mode_t ;
typedef enum { COL_NORMAL = 0 , COL_BOLD = 1 , COL_DIM = 2 , COL_ITALIC = 3 , COL_UNDERLINE = 4 , COL_BLINK = 5 , COL_REVERSE = 7 , COL_HIDDEN = 8 , COL_STRIKETHROUGH = 9 , COL_DOUBLE_UNDERLINE = 21
} col_style_t ;
typedef enum { COL_BLACK = 30 , COL_RED = 31 , COL_GREEN = 32 , COL_YELLOW = 33 , COL_BLUE = 34 , COL_MAGENTA = 35 , COL_CYAN = 36 , COL_WHITE = 37
} col_8_t ;
typedef enum { COL_BRIGHT_BLACK = 90 , COL_BRIGHT_RED = 91 , COL_BRIGHT_GREEN = 92 , COL_BRIGHT_YELLOW = 93 , COL_BRIGHT_BLUE = 94 , COL_BRIGHT_MAGENTA = 95 , COL_BRIGHT_CYAN = 96 , COL_BRIGHT_WHITE = 97
} col_8_bright_t ;
typedef enum { COL_BG_BLACK = 40 , COL_BG_RED = 41 , COL_BG_GREEN = 42 , COL_BG_YELLOW = 43 , COL_BG_BLUE = 44 , COL_BG_MAGENTA = 45 , COL_BG_CYAN = 46 , COL_BG_WHITE = 47
} col_bg_8_t ;
typedef enum { COL_BG_BRIGHT_BLACK = 100 , COL_BG_BRIGHT_RED = 101 , COL_BG_BRIGHT_GREEN = 102 , COL_BG_BRIGHT_YELLOW = 103 , COL_BG_BRIGHT_BLUE = 104 , COL_BG_BRIGHT_MAGENTA = 105 , COL_BG_BRIGHT_CYAN = 106 , COL_BG_BRIGHT_WHITE = 107
} col_bg_8_bright_t ;
typedef enum { COL_UP, COL_DOWN, COL_LEFT, COL_RIGHT
} col_direction_t ;
typedef enum { COL_ALIGN_LEFT, COL_ALIGN_CENTER, COL_ALIGN_RIGHT
} col_align_t ;
# ifdef __cplusplus
extern "C" {
# endif
void col_init ( void ) ;
bool col_supported ( void ) ;
int col_term_width ( void ) ;
int col_term_height ( void ) ;
void col_set_fg_8 ( col_8_t color, char * buf) ;
void col_set_fg_8_bright ( col_8_bright_t color, char * buf) ;
void col_set_bg_8 ( col_bg_8_t color, char * buf) ;
void col_set_bg_8_bright ( col_bg_8_bright_t color, char * buf) ;
void col_set_fg_256 ( int color_code, char * buf) ;
void col_set_bg_256 ( int color_code, char * buf) ;
void col_set_fg_rgb ( unsigned char r, unsigned char g, unsigned char b, char * buf) ;
void col_set_bg_rgb ( unsigned char r, unsigned char g, unsigned char b, char * buf) ;
void col_set_fg_hsl ( float h, float s, float l, char * buf) ;
void col_set_bg_hsl ( float h, float s, float l, char * buf) ;
void col_set_style ( col_style_t style, char * buf) ;
void col_reset ( char * buf) ;
void col_format ( const char * text, col_8_t color, col_style_t style, char * buf) ;
void col_format_advanced ( const char * text, col_mode_t fg_mode, int fg1, int fg2, int fg3, col_mode_t bg_mode, int bg1, int bg2, int bg3, col_style_t style, char * buf) ;
void col_cursor_move ( col_direction_t dir, int steps, char * buf) ;
void col_cursor_set ( int row, int col, char * buf) ;
void col_cursor_hide ( char * buf) ;
void col_cursor_show ( char * buf) ;
void col_clear_screen ( char * buf) ;
void col_clear_line ( char * buf) ;
void col_scroll_up ( int lines, char * buf) ;
void col_scroll_down ( int lines, char * buf) ;
void col_set_title ( const char * title, char * buf) ;
void col_align ( const char * text, col_align_t align, char * buf) ;
void col_pad ( const char * text, int width, col_align_t align, char * buf) ; # ifdef __cplusplus
}
# endif
# endif
# ifdef COL_IMPLEMENTATION
static int col_support = - 1 ;
static int col_width = 80 ;
static int col_height = 24 ;
static void hsl_to_rgb ( float h, float s, float l, unsigned char * r, unsigned char * g, unsigned char * b) { float c = ( 1.0f - fabsf ( 2.0f * l - 1.0f ) ) * s; float x = c * ( 1.0f - fabsf ( fmodf ( h / 60.0f , 2.0f ) - 1.0f ) ) ; float m = l - c / 2.0f ; float rf = 0.0f , gf = 0.0f , bf = 0.0f ; if ( h >= 0 && h < 60 ) { rf = c; gf = x; bf = 0 ; } else if ( h >= 60 && h < 120 ) { rf = x; gf = c; bf = 0 ; } else if ( h >= 120 && h < 180 ) { rf = 0 ; gf = c; bf = x; } else if ( h >= 180 && h < 240 ) { rf = 0 ; gf = x; bf = c; } else if ( h >= 240 && h < 300 ) { rf = x; gf = 0 ; bf = c; } else if ( h >= 300 && h < 360 ) { rf = c; gf = 0 ; bf = x; } * r = ( unsigned char ) ( ( rf + m) * 255.0f ) ; * g = ( unsigned char ) ( ( gf + m) * 255.0f ) ; * b = ( unsigned char ) ( ( bf + m) * 255.0f ) ;
}
void col_init ( void ) { if ( col_support != - 1 ) return ; # ifdef _WIN32 DWORD mode; HANDLE hOut = GetStdHandle ( STD_OUTPUT_HANDLE) ; if ( hOut == INVALID_HANDLE_VALUE) { col_support = 0 ; return ; } if ( ! GetConsoleMode ( hOut, & mode) ) { col_support = 0 ; return ; } if ( ! SetConsoleMode ( hOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING) ) { col_support = 0 ; return ; } CONSOLE_SCREEN_BUFFER_INFO csbi; if ( GetConsoleScreenBufferInfo ( hOut, & csbi) ) { col_width = csbi. srWindow. Right - csbi. srWindow. Left + 1 ; col_height = csbi. srWindow. Bottom - csbi. srWindow. Top + 1 ; } col_support = 1 ;
# else col_support = isatty ( STDOUT_FILENO) ? 1 : 0 ;
# ifdef TIOCGWINSZ struct winsize w; if ( ioctl ( STDOUT_FILENO, TIOCGWINSZ, & w) == 0 ) { col_width = w. ws_col; col_height = w. ws_row; }
# endif
# endif
}
bool col_supported ( void ) { if ( col_support == - 1 ) col_init ( ) ; return col_support == 1 ;
}
int col_term_width ( void ) { if ( col_support == - 1 ) col_init ( ) ; return col_width;
}
int col_term_height ( void ) { if ( col_support == - 1 ) col_init ( ) ; return col_height;
}
void col_set_fg_8 ( col_8_t color, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dm" , color) ;
} void col_set_fg_8_bright ( col_8_bright_t color, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dm" , color) ;
} void col_set_bg_8 ( col_bg_8_t color, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dm" , color) ;
} void col_set_bg_8_bright ( col_bg_8_bright_t color, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dm" , color) ;
}
void col_set_fg_256 ( int color_code, char * buf) { if ( ! col_supported ( ) || color_code < 0 || color_code > 255 ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[38;5;%dm" , color_code) ;
} void col_set_bg_256 ( int color_code, char * buf) { if ( ! col_supported ( ) || color_code < 0 || color_code > 255 ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[48;5;%dm" , color_code) ;
} void col_set_fg_rgb ( unsigned char r, unsigned char g, unsigned char b, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[38;2;%d;%d;%dm" , r, g, b) ;
} void col_set_bg_rgb ( unsigned char r, unsigned char g, unsigned char b, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[48;2;%d;%d;%dm" , r, g, b) ;
} void col_set_fg_hsl ( float h, float s, float l, char * buf) { unsigned char r, g, b; hsl_to_rgb ( h, s, l, & r, & g, & b) ; col_set_fg_rgb ( r, g, b, buf) ;
} void col_set_bg_hsl ( float h, float s, float l, char * buf) { unsigned char r, g, b; hsl_to_rgb ( h, s, l, & r, & g, & b) ; col_set_bg_rgb ( r, g, b, buf) ;
}
void col_set_style ( col_style_t style, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dm" , style) ;
} void col_reset ( char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, COL_RESET) ;
}
void col_format ( const char * text, col_8_t color, col_style_t style, char * buf) { if ( ! col_supported ( ) ) { snprintf ( buf, COL_MAX_FORMATTED, "%s" , text) ; return ; } char color_buf[ COL_MAX_CTRL] ; char style_buf[ COL_MAX_CTRL] ; char reset_buf[ COL_MAX_CTRL] ; col_set_fg_8 ( color, color_buf) ; col_set_style ( style, style_buf) ; col_reset ( reset_buf) ; snprintf ( buf, COL_MAX_FORMATTED, "%s%s%s%s" , style_buf, color_buf, text, reset_buf) ;
} void col_format_advanced ( const char * text, col_mode_t fg_mode, int fg1, int fg2, int fg3, col_mode_t bg_mode, int bg1, int bg2, int bg3, col_style_t style, char * buf) { if ( ! col_supported ( ) ) { snprintf ( buf, COL_MAX_FORMATTED, "%s" , text) ; return ; } char fg_buf[ COL_MAX_CTRL] = "" ; char bg_buf[ COL_MAX_CTRL] = "" ; char style_buf[ COL_MAX_CTRL] = "" ; char reset_buf[ COL_MAX_CTRL] ; col_reset ( reset_buf) ; col_set_style ( style, style_buf) ; switch ( fg_mode) { case COL_8: col_set_fg_8 ( ( col_8_t ) fg1, fg_buf) ; break ; case COL_8_BRIGHT: col_set_fg_8_bright ( ( col_8_bright_t ) fg1, fg_buf) ; break ; case COL_256: col_set_fg_256 ( fg1, fg_buf) ; break ; case COL_RGB: col_set_fg_rgb ( ( unsigned char ) fg1, ( unsigned char ) fg2, ( unsigned char ) fg3, fg_buf) ; break ; } switch ( bg_mode) { case COL_8: col_set_bg_8 ( ( col_bg_8_t ) bg1, bg_buf) ; break ; case COL_8_BRIGHT: col_set_bg_8_bright ( ( col_bg_8_bright_t ) bg1, bg_buf) ; break ; case COL_256: col_set_bg_256 ( bg1, bg_buf) ; break ; case COL_RGB: col_set_bg_rgb ( ( unsigned char ) bg1, ( unsigned char ) bg2, ( unsigned char ) bg3, bg_buf) ; break ; } snprintf ( buf, COL_MAX_FORMATTED, "%s%s%s%s%s" , style_buf, fg_buf, bg_buf, text, reset_buf) ;
}
void col_cursor_move ( col_direction_t dir, int steps, char * buf) { if ( ! col_supported ( ) || steps <= 0 ) { buf[ 0 ] = '\0' ; return ; } const char * dir_code; switch ( dir) { case COL_UP: dir_code = "A" ; break ; case COL_DOWN: dir_code = "B" ; break ; case COL_RIGHT: dir_code = "C" ; break ; case COL_LEFT: dir_code = "D" ; break ; default : buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%d%s" , steps, dir_code) ;
} void col_cursor_set ( int row, int col, char * buf) { if ( ! col_supported ( ) || row < 1 || col < 1 ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%d;%dH" , row, col) ;
} void col_cursor_hide ( char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[?25l" ) ;
} void col_cursor_show ( char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[?25h" ) ;
} void col_clear_screen ( char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[2J\033[1;1H" ) ;
} void col_clear_line ( char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[2K" ) ;
} void col_scroll_up ( int lines, char * buf) { if ( ! col_supported ( ) || lines <= 0 ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dS" , lines) ;
} void col_scroll_down ( int lines, char * buf) { if ( ! col_supported ( ) || lines <= 0 ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033[%dT" , lines) ;
} void col_set_title ( const char * title, char * buf) { if ( ! col_supported ( ) ) { buf[ 0 ] = '\0' ; return ; } snprintf ( buf, COL_MAX_CTRL, "\033]0;%s\007" , title) ;
}
void col_align ( const char * text, col_align_t align, char * buf) { col_pad ( text, col_term_width ( ) , align, buf) ;
} void col_pad ( const char * text, int width, col_align_t align, char * buf) { int len = strlen ( text) ; if ( len >= width) { snprintf ( buf, COL_MAX_FORMATTED, "%s" , text) ; return ; } int left = 0 , right = 0 ; int pad = width - len; switch ( align) { case COL_ALIGN_CENTER: left = pad / 2 ; right = pad - left; break ; case COL_ALIGN_RIGHT: left = pad; break ; case COL_ALIGN_LEFT: default : right = pad; break ; } snprintf ( buf, COL_MAX_FORMATTED, "%*s%s%*s" , left, "" , text, right, "" ) ;
} # endif
color_print.h
# ifndef COLOR_PRINT_H
# define COLOR_PRINT_H # include <stdio.h>
# include <stdarg.h>
# define COL_IMPLEMENTATION
# include "col.hol.h"
int cprintf ( const char * fmt, . . . ) ;
int cprintfc ( col_8_t fg, col_bg_8_t bg, col_style_t style, const char * fmt, . . . ) ;
void cprintf_set_default ( col_8_t fg, col_bg_8_t bg, col_style_t style) ;
int cfprintf ( FILE* stream, const char * fmt, . . . ) ;
int cfprintfc ( FILE* stream, col_8_t fg, col_bg_8_t bg, col_style_t style, const char * fmt, . . . ) ; # endif # ifdef COLOR_PRINT_IMPLEMENTATION # include <string.h>
# include <stdlib.h>
# ifdef _WIN32
# include <io.h>
# define is_terminal ( s) ( _isatty ( _fileno ( s) ) != 0 )
# else
# include <unistd.h>
# define is_terminal ( s) ( isatty ( fileno ( s) ) != 0 )
# endif
static struct { col_8_t fg; col_bg_8_t bg; col_style_t style;
} default_color = { COL_WHITE, COL_BG_BLACK, COL_NORMAL
} ;
static int color_inited = 0 ;
static void color_init ( void ) { if ( ! color_inited) { col_init ( ) ; color_inited = 1 ; }
}
static void get_color_codes ( col_8_t fg, col_bg_8_t bg, col_style_t style, char * prefix, size_t prefix_len, char * reset, size_t reset_len) { prefix[ 0 ] = '\0' ; reset[ 0 ] = '\0' ; color_init ( ) ; if ( ! col_supported ( ) ) return ; char s[ COL_MAX_CTRL] , f[ COL_MAX_CTRL] , b[ COL_MAX_CTRL] ; col_set_style ( style, s) ; col_set_fg_8 ( fg, f) ; col_set_bg_8 ( bg, b) ; snprintf ( prefix, prefix_len, "%s%s%s" , s, f, b) ; col_reset ( reset) ;
}
void cprintf_set_default ( col_8_t fg, col_bg_8_t bg, col_style_t style) { default_color. fg = fg; default_color. bg = bg; default_color. style = style;
}
int cprintf ( const char * fmt, . . . ) { va_list args; va_start ( args, fmt) ; char prefix[ COL_MAX_CTRL] , reset[ COL_MAX_CTRL] ; get_color_codes ( default_color. fg, default_color. bg, default_color. style, prefix, sizeof ( prefix) , reset, sizeof ( reset) ) ; int ret; if ( col_supported ( ) ) { fputs ( prefix, stdout ) ; ret = vfprintf ( stdout , fmt, args) ; fputs ( reset, stdout ) ; } else { ret = vfprintf ( stdout , fmt, args) ; } va_end ( args) ; return ret;
}
int cprintfc ( col_8_t fg, col_bg_8_t bg, col_style_t style, const char * fmt, . . . ) { va_list args; va_start ( args, fmt) ; char prefix[ COL_MAX_CTRL] , reset[ COL_MAX_CTRL] ; get_color_codes ( fg, bg, style, prefix, sizeof ( prefix) , reset, sizeof ( reset) ) ; int ret; if ( col_supported ( ) ) { fputs ( prefix, stdout ) ; ret = vfprintf ( stdout , fmt, args) ; fputs ( reset, stdout ) ; } else { ret = vfprintf ( stdout , fmt, args) ; } va_end ( args) ; return ret;
}
int cfprintf ( FILE* stream, const char * fmt, . . . ) { va_list args; va_start ( args, fmt) ; int ret; if ( is_terminal ( stream) ) { char prefix[ COL_MAX_CTRL] , reset[ COL_MAX_CTRL] ; get_color_codes ( default_color. fg, default_color. bg, default_color. style, prefix, sizeof ( prefix) , reset, sizeof ( reset) ) ; if ( col_supported ( ) ) { fputs ( prefix, stream) ; ret = vfprintf ( stream, fmt, args) ; fputs ( reset, stream) ; } else { ret = vfprintf ( stream, fmt, args) ; } } else { ret = vfprintf ( stream, fmt, args) ; } va_end ( args) ; return ret;
}
int cfprintfc ( FILE* stream, col_8_t fg, col_bg_8_t bg, col_style_t style, const char * fmt, . . . ) { va_list args; va_start ( args, fmt) ; int ret; if ( is_terminal ( stream) ) { char prefix[ COL_MAX_CTRL] , reset[ COL_MAX_CTRL] ; get_color_codes ( fg, bg, style, prefix, sizeof ( prefix) , reset, sizeof ( reset) ) ; if ( col_supported ( ) ) { fputs ( prefix, stream) ; ret = vfprintf ( stream, fmt, args) ; fputs ( reset, stream) ; } else { ret = vfprintf ( stream, fmt, args) ; } } else { ret = vfprintf ( stream, fmt, args) ; } va_end ( args) ; return ret;
} # endif
probe.c
# define COL_IMPLEMENTATION
# include "col.hol.h"
# include <stdio.h> int main ( ) { char buf[ COL_MAX_FORMATTED] ; char ctrl[ COL_MAX_CTRL] ; col_init ( ) ; if ( ! col_supported ( ) ) { printf ( "终端不支持颜色输出\n" ) ; return 0 ; } col_set_title ( "颜色库演示" , ctrl) ; printf ( "%s" , ctrl) ; col_format ( "红色粗体文本" , COL_RED, COL_BOLD, buf) ; printf ( "%s\n" , buf) ; col_format_advanced ( "天蓝色文本带粉色背景" , COL_RGB, 135 , 206 , 235 , COL_RGB, 255 , 192 , 203 , COL_ITALIC, buf) ; printf ( "%s\n" , buf) ; col_set_fg_hsl ( 120 , 0.7 , 0.5 , ctrl) ; printf ( "%sHSL颜色示例%s\n" , ctrl, COL_RESET) ; col_set_fg_256 ( 166 , ctrl) ; printf ( "%s256色模式示例%s\n" , ctrl, COL_RESET) ; col_cursor_move ( COL_DOWN, 1 , ctrl) ; printf ( "%s" , ctrl) ; col_align ( "居中对齐的文本" , COL_ALIGN_CENTER, buf) ; printf ( "%s\n" , buf) ; col_reset ( ctrl) ; printf ( "%s" , ctrl) ; return 0 ;
}
probe2.c
# define COLOR_PRINT_IMPLEMENTATION
# include "color_print.h"
# include <stdio.h> int main ( ) { cprintf ( "这是默认颜色输出\n" ) ; cprintf ( "数字: %d, 字符串: %s\n" , 123 , "测试" ) ; cprintf_set_default ( COL_GREEN, COL_BG_BLACK, COL_BOLD) ; cprintf ( "这行变成绿色粗体\n" ) ; cprintfc ( COL_RED, COL_BG_BLACK, COL_ITALIC, "这行是临时红色斜体\n" ) ; FILE* f = fopen ( "log.txt" , "w" ) ; if ( f) { cfprintf ( f, "写入文件的内容(无颜色)\n" ) ; fclose ( f) ; } return 0 ;
}
pwd.win.c
# define COLOR_PRINT_IMPLEMENTATION
# include "color_print.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
static char * get_current_dir ( void ) {
# ifdef _WIN32 char * buffer = malloc ( MAX_PATH) ; if ( buffer && GetCurrentDirectoryA ( MAX_PATH, buffer) ) { return buffer; }
# else char * buffer = getcwd ( NULL , 0 ) ; return buffer;
# endif free ( buffer) ; return NULL ;
}
static bool parse_args ( int argc, char * argv[ ] ) { for ( int i = 1 ; i < argc; i++ ) { if ( strcmp ( argv[ i] , "--no-color" ) == 0 ) { cprintf_set_default ( COL_WHITE, COL_BG_BLACK, COL_NORMAL) ; return false; } else if ( strcmp ( argv[ i] , "--help" ) == 0 ) { cprintfc ( COL_CYAN, COL_BG_BLACK, COL_NORMAL, "用法: pwd [选项]\n" ) ; cprintfc ( COL_CYAN, COL_BG_BLACK, COL_NORMAL, "显示当前工作目录\n" ) ; cprintfc ( COL_CYAN, COL_BG_BLACK, COL_NORMAL, "选项:\n" ) ; cprintfc ( COL_CYAN, COL_BG_BLACK, COL_NORMAL, " --no-color 禁用彩色输出\n" ) ; cprintfc ( COL_CYAN, COL_BG_BLACK, COL_NORMAL, " --help 显示帮助信息\n" ) ; exit ( 0 ) ; } else { cprintfc ( COL_RED, COL_BG_BLACK, COL_BOLD, "错误: 未知选项 '%s'\n" , argv[ i] ) ; cprintfc ( COL_YELLOW, COL_BG_BLACK, COL_NORMAL, "使用 '--help' 查看帮助\n" ) ; exit ( 1 ) ; } } return true;
} int main ( int argc, char * argv[ ] ) { color_init ( ) ; cprintf_set_default ( COL_BLUE, COL_BG_BLACK, COL_BOLD) ; bool use_color = parse_args ( argc, argv) ; char * cwd = get_current_dir ( ) ; if ( ! cwd) { cprintfc ( COL_RED, COL_BG_BLACK, COL_BOLD, "错误: 无法获取当前工作目录\n" ) ; return 1 ; } if ( use_color) { cprintf ( "%s\n" , cwd) ; } else { printf ( "%s\n" , cwd) ; } free ( cwd) ; return 0 ;
}
ref link
https://github.com/resyfer/libcol ai code, not for production