diff --git a/xy.h b/xy.h index 3aad576..599c803 100644 --- a/xy.h +++ b/xy.h @@ -3,7 +3,7 @@ * License : MIT * Authors : Aoran Zeng * Created on : <2023-08-28> - * Last modified : <2023-09-29> + * Last modified : <2024-04-18> * * xy: * @@ -17,344 +17,359 @@ #ifndef XY_H #define XY_H -#include -#include -#include -#include -#include #include +#include +#include #include -#include // For access() +#include +#include +#include +#include // #define NDEBUG #ifdef _WIN32 - #define xy_on_windows true - #define xy_on_linux false - #define xy_on_macos false - #define xy_on_bsd false - #define xy_os_devnull "nul" - #include - #define xy_useutf8() SetConsoleOutputCP(65001) +#define xy_on_windows true +#define xy_on_linux false +#define xy_on_macos false +#define xy_on_bsd false +#define xy_os_devnull "nul" +#include +#define xy_useutf8() SetConsoleOutputCP (65001) #elif defined(__linux__) || defined(__linux) - #define xy_on_windows false - #define xy_on_linux true - #define xy_on_macos false - #define xy_on_bsd false - #define xy_os_devnull "/dev/null" - #define xy_useutf8() +#define xy_on_windows false +#define xy_on_linux true +#define xy_on_macos false +#define xy_on_bsd false +#define xy_os_devnull "/dev/null" +#define xy_useutf8() #elif defined(__APPLE__) - #define xy_on_windows false - #define xy_on_linux false - #define xy_on_macos true - #define xy_on_bsd false - #define xy_os_devnull "/dev/null" - #define xy_useutf8() +#define xy_on_windows false +#define xy_on_linux false +#define xy_on_macos true +#define xy_on_bsd false +#define xy_os_devnull "/dev/null" +#define xy_useutf8() #elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) - #define xy_on_windows false - #define xy_on_linux false - #define xy_on_macos false - #define xy_on_bsd true - #define xy_os_devnull "/dev/null" - #define xy_useutf8() +#define xy_on_windows false +#define xy_on_linux false +#define xy_on_macos false +#define xy_on_bsd true +#define xy_os_devnull "/dev/null" +#define xy_useutf8() #endif +void +putf (double n) +{ + printf ("%f\n", n); +} +void +puti (long long n) +{ + printf ("%lld\n", n); +} +void +putb (bool n) +{ + if (n) + puts ("true"); + else + puts ("false"); +} +void +print (char *s) +{ + printf ("%s", s); +} +void +println (char *s) +{ + printf ("%s\n", s); +} -void putf(double n) {printf("%f\n", n);} -void puti(long long n) {printf("%lld\n", n);} -void putb(bool n) {if(n) puts("true"); else puts("false");} -void print(char* s) {printf("%s", s);} -void println(char* s) {printf("%s\n", s);} +#define xy_arylen(x) (sizeof (x) / sizeof (x[0])) -#define xy_arylen(x) (sizeof(x) / sizeof(x[0])) +#define assert_str(a, b) assert (xy_streql ((a), (b))) -#define assert_str(a,b) assert(xy_streql((a), (b))) - - -static inline void* +static inline void * xy_malloc0 (size_t size) { - void* ptr = malloc(size); - memset(ptr, 0, size); + void *ptr = malloc (size); + memset (ptr, 0, size); return ptr; } +#define XY_Log_Info 00001 +#define XY_Log_Success 00001 << 1 +#define XY_Log_Warn 00001 << 2 +#define XY_Log_Error 00001 << 3 -#define XY_Log_Info 00001 -#define XY_Log_Success 00001<<1 -#define XY_Log_Warn 00001<<2 -#define XY_Log_Error 00001<<3 - -#define xy_success(str) _xy_log (XY_Log_Success, str) -#define xy_info(str) _xy_log (XY_Log_Info, str) -#define xy_warn(str) _xy_log (XY_Log_Warn, str) -#define xy_error(str) _xy_log (XY_Log_Error, str) +#define xy_success(str) _xy_log (XY_Log_Success, str) +#define xy_info(str) _xy_log (XY_Log_Info, str) +#define xy_warn(str) _xy_log (XY_Log_Warn, str) +#define xy_error(str) _xy_log (XY_Log_Error, str) static void -_xy_log (int level, const char* str) +_xy_log (int level, const char *str) { - char* color_fmt_str = NULL; + char *color_fmt_str = NULL; bool to_stderr = false; - if (level & XY_Log_Info) { - color_fmt_str = "\033[34m%s\033[0m"; // 蓝色 - } - else if (level & XY_Log_Success) { - color_fmt_str = "\033[32m%s\033[0m"; // 绿色 - } - else if (level & XY_Log_Warn) { - color_fmt_str = "\033[33m%s\033[0m\n"; // 黄色 - to_stderr = true; - } - else if (level & XY_Log_Error) { - color_fmt_str = "\033[31m%s\033[0m\n"; // 红色 - to_stderr = true; - } - else { - //xy_assert ("CAN'T REACH!"); - } + if (level & XY_Log_Info) + { + color_fmt_str = "\033[34m%s\033[0m"; // 蓝色 + } + else if (level & XY_Log_Success) + { + color_fmt_str = "\033[32m%s\033[0m"; // 绿色 + } + else if (level & XY_Log_Warn) + { + color_fmt_str = "\033[33m%s\033[0m\n"; // 黄色 + to_stderr = true; + } + else if (level & XY_Log_Error) + { + color_fmt_str = "\033[31m%s\033[0m\n"; // 红色 + to_stderr = true; + } + else + { + // xy_assert ("CAN'T REACH!"); + } // -2 把中间%s减掉 - size_t len = strlen(color_fmt_str) -2; - char* buf = malloc(strlen(str) + len + 1); + size_t len = strlen (color_fmt_str) - 2; + char *buf = malloc (strlen (str) + len + 1); sprintf (buf, color_fmt_str, str); - if (to_stderr) { - fprintf(stderr, "%s",buf); - } else { - puts(buf); - } - free(buf); + if (to_stderr) + { + fprintf (stderr, "%s", buf); + } + else + { + puts (buf); + } + free (buf); } - - /** * 将str中所有的pat字符串替换成replace,返回一个全新的字符串 */ -static char* -xy_str_gsub (const char* str, const char* pat, const char* replace) +static char * +xy_str_gsub (const char *str, const char *pat, const char *replace) { - size_t replace_len = strlen(replace); - size_t pat_len = strlen(pat); + size_t replace_len = strlen (replace); + size_t pat_len = strlen (pat); int unit = replace_len - pat_len; - if (unit<=0) unit = 0; + if (unit <= 0) + unit = 0; - size_t len = strlen(str); + size_t len = strlen (str); - const char* cur = str; + const char *cur = str; int count = 0; - while (cur al_cur) { - al_times += 1; al_cur = al_times * al_fixed; - need_realloc = true; + str = va_arg (args, const char *); + al_need += strlen (str); + while (al_need > al_cur) + { + al_times += 1; + al_cur = al_times * al_fixed; + need_realloc = true; + } + // printf("al_times %d, al_need %zd, al_cur %zd\n", al_times, al_need, + // al_cur); + if (need_realloc) + { + ptrdiff_t diff = cur - ret; + ret = realloc (ret, al_cur); + cur = ret + diff; + } + if (NULL == ret) + { + xy_error ("xy: No availble memory!"); + return NULL; + } + strcpy (cur, str); + // puts(ret); + cur += strlen (str); } - // printf("al_times %d, al_need %zd, al_cur %zd\n", al_times, al_need, al_cur); - if (need_realloc) { - ptrdiff_t diff = cur - ret; - ret = realloc(ret, al_cur); - cur = ret + diff; - } - if (NULL==ret) { - xy_error ("xy: No availble memory!"); return NULL; - } - strcpy(cur, str); - // puts(ret); - cur += strlen(str); - } - va_end(args); + va_end (args); *cur = '\0'; return ret; } - -static char* -xy_strdup(const char* str) +static char * +xy_strdup (const char *str) { - size_t len = strlen(str); - char* new = xy_malloc0(len+1); - strcpy(new, str); + size_t len = strlen (str); + char *new = xy_malloc0 (len + 1); + strcpy (new, str); return new; } - -#define XY_Str_Bold 1 -#define XY_Str_Faint 2 -#define XY_Str_Italic 3 +#define XY_Str_Bold 1 +#define XY_Str_Faint 2 +#define XY_Str_Italic 3 #define XY_Str_Underline 4 -#define XY_Str_Blink 5 -#define XY_Str_Cross 9 +#define XY_Str_Blink 5 +#define XY_Str_Cross 9 -#define xy_str_to_bold(str) _xy_str_to_terminal_style(XY_Str_Bold, str) -#define xy_str_to_faint(str) _xy_str_to_terminal_style(XY_Str_Faint, str) -#define xy_str_to_italic(str) _xy_str_to_terminal_style(XY_Str_Italic, str) -#define xy_str_to_underline(str) _xy_str_to_terminal_style(XY_Str_Underline,str) -#define xy_str_to_blink(str) _xy_str_to_terminal_style(XY_Str_Blink, str) -#define xy_str_to_cross(str) _xy_str_to_terminal_style(XY_Str_Cross, str) +#define xy_str_to_bold(str) _xy_str_to_terminal_style (XY_Str_Bold, str) +#define xy_str_to_faint(str) _xy_str_to_terminal_style (XY_Str_Faint, str) +#define xy_str_to_italic(str) _xy_str_to_terminal_style (XY_Str_Italic, str) +#define xy_str_to_underline(str) \ + _xy_str_to_terminal_style (XY_Str_Underline, str) +#define xy_str_to_blink(str) _xy_str_to_terminal_style (XY_Str_Blink, str) +#define xy_str_to_cross(str) _xy_str_to_terminal_style (XY_Str_Cross, str) -#define XY_Str_Red 31 -#define XY_Str_Green 32 -#define XY_Str_Yellow 33 -#define XY_Str_Blue 34 -#define XY_Str_Magenta 35 -#define XY_Str_Cyan 36 +#define XY_Str_Red 31 +#define XY_Str_Green 32 +#define XY_Str_Yellow 33 +#define XY_Str_Blue 34 +#define XY_Str_Magenta 35 +#define XY_Str_Cyan 36 -#define xy_str_to_red(str) _xy_str_to_terminal_style(XY_Str_Red, str) -#define xy_str_to_green(str) _xy_str_to_terminal_style(XY_Str_Green, str) -#define xy_str_to_yellow(str) _xy_str_to_terminal_style(XY_Str_Yellow, str) -#define xy_str_to_blue(str) _xy_str_to_terminal_style(XY_Str_Blue, str) -#define xy_str_to_magenta(str) _xy_str_to_terminal_style(XY_Str_Magenta,str) -#define xy_str_to_purple xy_str_to_magenta -#define xy_str_to_cyan(str) _xy_str_to_terminal_style(XY_Str_Cyan, str) +#define xy_str_to_red(str) _xy_str_to_terminal_style (XY_Str_Red, str) +#define xy_str_to_green(str) _xy_str_to_terminal_style (XY_Str_Green, str) +#define xy_str_to_yellow(str) _xy_str_to_terminal_style (XY_Str_Yellow, str) +#define xy_str_to_blue(str) _xy_str_to_terminal_style (XY_Str_Blue, str) +#define xy_str_to_magenta(str) _xy_str_to_terminal_style (XY_Str_Magenta, str) +#define xy_str_to_purple xy_str_to_magenta +#define xy_str_to_cyan(str) _xy_str_to_terminal_style (XY_Str_Cyan, str) -static char* -_xy_str_to_terminal_style(int style, const char* str) +static char * +_xy_str_to_terminal_style (int style, const char *str) { - char* color_fmt_str = NULL; - if (XY_Str_Red==style) - { - color_fmt_str = "\e[31m%s\e[0m"; // 红色 - } - else if (XY_Str_Green==style) - { - color_fmt_str = "\e[32m%s\e[0m"; // 绿色 - } - else if (XY_Str_Yellow==style) - { - color_fmt_str = "\e[33m%s\e[0m"; // 黄色 - } - else if (XY_Str_Blue==style) - { - color_fmt_str = "\e[34m%s\e[0m"; // 蓝色 - } - else if (XY_Str_Magenta==style) - { - color_fmt_str = "\e[35m%s\e[0m"; // 蓝色 - } - else if (XY_Str_Cyan==style) - { - color_fmt_str = "\e[36m%s\e[0m"; // 蓝色 - } + char *color_fmt_str = NULL; - - else if (XY_Str_Bold==style) - { - color_fmt_str = "\e[1m%s\e[0m"; - } - else if (XY_Str_Faint==style) - { - color_fmt_str = "\e[2m%s\e[0m"; - } - else if (XY_Str_Italic==style) - { - color_fmt_str = "\e[3m%s\e[0m"; - } - else if (XY_Str_Underline==style) - { - color_fmt_str = "\e[4m%s\e[0m"; - } - else if (XY_Str_Blink==style) - { - color_fmt_str = "\e[5m%s\e[0m"; - } - else if (XY_Str_Cross==style) - { - color_fmt_str = "\e[9m%s\e[0m"; - } + switch (style) + { + case XY_Str_Red: + color_fmt_str = "\e[31m%s\e[0m"; + case XY_Str_Green: + color_fmt_str = "\e[32m%s\e[0m"; + case XY_Str_Yellow: + color_fmt_str = "\e[33m%s\e[0m"; + case XY_Str_Blue: + color_fmt_str = "\e[34m%s\e[0m"; + case XY_Str_Magenta: + color_fmt_str = "\e[35m%s\e[0m"; + case XY_Str_Cyan: + color_fmt_str = "\e[36m%s\e[0m"; + case XY_Str_Bold: + color_fmt_str = "\e[1m%s\e[0m"; + case XY_Str_Faint: + color_fmt_str = "\e[2m%s\e[0m"; + case XY_Str_Italic: + color_fmt_str = "\e[3m%s\e[0m"; + case XY_Str_Underline: + color_fmt_str = "\e[4m%s\e[0m"; + case XY_Str_Blink: + color_fmt_str = "\e[5m%s\e[0m"; + case XY_Str_Cross: + color_fmt_str = "\e[9m%s\e[0m"; + } // -2 把中间%s减掉 - size_t len = strlen(color_fmt_str) -2; - char* buf = malloc(strlen(str) + len + 1); + size_t len = strlen (color_fmt_str) - 2; + char *buf = malloc (strlen (str) + len + 1); sprintf (buf, color_fmt_str, str); return buf; } - static bool -xy_streql(const char* str1, const char* str2) { - return strcmp(str1, str2) == 0 ? true : false; +xy_streql (const char *str1, const char *str2) +{ + return strcmp (str1, str2) == 0 ? true : false; } - -static char* -xy_str_to_quietcmd (const char* cmd) +static char * +xy_str_to_quietcmd (const char *cmd) { - char* ret = NULL; + char *ret = NULL; #ifdef _WIN32 ret = xy_2strjoin (cmd, " >nul 2>nul "); #else @@ -363,98 +378,104 @@ xy_str_to_quietcmd (const char* cmd) return ret; } - static bool -xy_str_end_with (const char* str, const char* suffix) +xy_str_end_with (const char *str, const char *suffix) { - size_t len1 = strlen(str); - size_t len2 = strlen(suffix); + size_t len1 = strlen (str); + size_t len2 = strlen (suffix); - if (0==len2) return true; // 空字符串直接返回 - if (len1 < len2) return false; + if (0 == len2) + return true; // 空字符串直接返回 + if (len1 < len2) + return false; - const char* cur1 = str + len1 - 1; - const char* cur2 = suffix + len2 - 1; + const char *cur1 = str + len1 - 1; + const char *cur2 = suffix + len2 - 1; - for (int i=0; i