ab_code.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /***************************************************************************
  2. *
  3. * 通用代码
  4. * 常用函数
  5. * 程序日志输出
  6. * 读取解析配置文件
  7. * 代码转换函数
  8. *
  9. * Author : Li Bo Feng
  10. *
  11. * Update History
  12. * DATE OWNER DESCRIPTION
  13. * ----------- ------------ -----------
  14. * 2010-01-19 Li Bo Feng Generated
  15. *
  16. ***************************************************************************/
  17. #ifndef _AB_CODE_H_
  18. #define _AB_CODE_H_
  19. #include <regex.h>
  20. #ifndef TRUE
  21. #define TRUE (1==1)
  22. #define FALSE !TRUE
  23. #endif
  24. #ifndef timelong
  25. typedef long long time_long;
  26. #endif
  27. ////////////// ABLOG definition ////////////////////////////////////////////////
  28. #define LPL_All 0x00FF
  29. #define LPL_Error 0x0008
  30. #define LPL_Metrics 0x0004
  31. #define LPL_State 0x0002
  32. #define LPL_Detail 0x0001
  33. #define LPL_Flow 0x00F0
  34. #define LPL_Flow_Public 0x0010
  35. #define LPL_Flow_Private 0x0020
  36. #define LPL_Flow_Restricted 0x0040
  37. #define LPL_Flow_Minor 0x0080
  38. #ifndef ABLOG
  39. #define ABLOG ____FunctionID____,__FILE__,__LINE__
  40. #endif
  41. #ifndef ABLOG_IsTracing
  42. #define ABLOG_IsTracing(_class) \
  43. (____LP_LEVEL____ & LPL_##_class)
  44. #endif
  45. #ifndef ABLOG_Entry
  46. #define ABLOG_Entry(_FL_, _FID_) \
  47. static char ____FunctionID____[] = #_FID_; \
  48. static int ____LP_LEVEL____; \
  49. static int ____LP_FLOW____;\
  50. ____LP_LEVEL____ = get_log_print_level(); \
  51. ____LP_FLOW____ = ____LP_LEVEL____ & LPL_Flow_##_FL_; \
  52. if (____LP_FLOW____) {log_println(ABLOG,"Entry");}
  53. #endif
  54. #ifndef ABLOG_Return_String
  55. #define ABLOG_Return_String(_RC_) \
  56. if(____LP_FLOW____){log_println(ABLOG,"Return: %s",_RC_);} return _RC_
  57. #endif
  58. #ifndef ABLOG_Return_Int
  59. #define ABLOG_Return_Int(_RC_) \
  60. if(____LP_FLOW____){log_println(ABLOG,"Return: %s",int_string(_RC_));} return _RC_
  61. #endif
  62. #ifndef ABLOG_Return_Long
  63. #define ABLOG_Return_Long(_RC_) \
  64. if(____LP_FLOW____){log_println(ABLOG,"Return: %s",format_long("%ld", _RC_));} return _RC_
  65. #endif
  66. #ifndef ABLOG_Return_Code
  67. #define ABLOG_Return_Code(_RC_) \
  68. if(____LP_FLOW____){log_println(ABLOG,"Return: %s",____RC2S____(_RC_));} return _RC_
  69. #endif
  70. #ifndef ABLOG_Return_Point
  71. #define ABLOG_Return_Point(_RC_) \
  72. if(____LP_FLOW____){log_println(ABLOG,"Return: 0x%08X", _RC_);} return _RC_
  73. #endif
  74. #ifndef ABLOG_Return
  75. #define ABLOG_Return \
  76. if(____LP_FLOW____){log_println(ABLOG,"Return");} return
  77. #endif
  78. #ifndef ABLOG_
  79. #define ABLOG_(_class, ...) \
  80. if (____LP_LEVEL____ & LPL_##_class) log_println(ABLOG, __VA_ARGS__)
  81. #endif
  82. #ifndef ABLOG_Printf
  83. #define ABLOG_Printf(_class, _args) \
  84. if (____LP_LEVEL____ & LPL_##_class) log_println _args
  85. #endif
  86. #ifndef println
  87. #define println(_args) \
  88. if (____LP_LEVEL____ & LPL_Detail) log_println _args
  89. #endif
  90. typedef char* (*RETURN_CODE_STRING)(int rc);
  91. typedef void (*function_on_ablog_reinitialized)();
  92. // 输出日志重新初始化回调函数
  93. extern function_on_ablog_reinitialized on_ablog_reinitialized;
  94. /**
  95. * 获取日志输出标记
  96. */
  97. int get_log_print_level();
  98. /**
  99. * 是否通过程序设置过ablog相关参数
  100. */
  101. int ablog_print();
  102. /**
  103. * 格式化输出日志
  104. */
  105. void log_println(const char *func, const char *file, int line, const char *format, ...);
  106. /**
  107. * @param fileout 0 输出到 stdout, 1 输出到通过 set_log_filename 设置的文件
  108. * @param func 代码标记
  109. * @param file 代码文件
  110. * @param line 代码行
  111. * @param format 格式
  112. * @param vl va_list
  113. */
  114. void log_println_vl(int fileout, const char *func, const char *file, int line, const char *format, va_list vl);
  115. ////////////// end of ABLOG definition ////////////////////////////////////////////////
  116. /**
  117. * 返回当前进程是否处于 debug 状态
  118. */
  119. int debug_current_process();
  120. /**
  121. * 释放 ab_code 占用的资源
  122. */
  123. void clear_coding();
  124. /**
  125. * 虚拟当前时间 virtual_current_time
  126. * 根据环境变量指定的 VIRTUAL_TIME = `date +"%Y-%m-%d %H:%M:%S"`确定时间偏移
  127. * 返回计算后的虚拟当前时间
  128. * 使用此函数前必须在main开始时调用 init_coding();
  129. */
  130. time_t vtime();
  131. #define MAX_FILEPATH_LENGTH 256
  132. /**
  133. * 模式替换实例化结构
  134. */
  135. struct pattern_instance
  136. {
  137. char pattern[MAX_FILEPATH_LENGTH];
  138. char last_pattern[MAX_FILEPATH_LENGTH];
  139. char regex[MAX_FILEPATH_LENGTH];
  140. regex_t reg; //pattern转换为正则表达式
  141. time_t instantiated_time; //实例化时间
  142. time_t expiration_ct; //文件实例名过期时间,以系统时间表示
  143. time_t expiration_vt; //文件实例名过期时间,以虚拟时间表示
  144. int instance_buf_len;
  145. char instance[MAX_FILEPATH_LENGTH]; //实际可用字节数由instance_buf_len指定,并分配内存相应内存
  146. };
  147. void set_log_filename(char *filepath_pattern);
  148. void set_log_keephours(int keep_hours);
  149. void set_log_stdout(int yn);
  150. int ablog_stdout();
  151. int ablog_file();
  152. void clear_pattern_instance(struct pattern_instance *pi);
  153. /**
  154. * 实例化一个模式字符串
  155. * 模式中可以替换内容包括
  156. * [PID] 用当前进程id
  157. * [YYYY] 虚拟当前时间的年
  158. * [yyyy] 系统当前时间的年
  159. * [MM] 虚拟当前时间的月
  160. * [mm] 系统当前时间的月
  161. * [DD] 虚拟当前时间的日
  162. * [dd] 系统当前时间的日
  163. * [HH] 虚拟当前时间的时
  164. * [hh] 系统当前时间的时
  165. * [MI] 虚拟当前时间的分
  166. * [mi] 系统当前时间的分
  167. *
  168. * 返回是否有新的实例产生 1有 0没有
  169. */
  170. int instantiated_pattern(struct pattern_instance *pi);
  171. /**
  172. * 锁文件
  173. */
  174. int lock_file(char* filename, int wait);
  175. /**
  176. * 解锁文件
  177. */
  178. int unlock_file(int lockfd);
  179. ///////////////////////////// 格式化 /////////////////////////////
  180. char* int_string(int n);
  181. #define DEFINE_RETURN_CODE(N) set_code_string(N, #N);
  182. void set_code_string(int n, char* string);
  183. char* code_string(int n);
  184. int parse_hex(char* s, int*o, int default_value);
  185. int parse_int(char* s, int*o, int default_value);
  186. int parse_double(char* s, double*o, double default_value);
  187. char* format_int(char* format, int n);
  188. char* format_long(char* format, long n);
  189. char* format_double(char* format, double n);
  190. time_t parse_time(char *s, long *ms);
  191. struct timeval parse_time_tv(char *stime);
  192. long parse_time_lms(char *stime);
  193. char* time_string(time_t seconds);
  194. char* time_lms_string(time_long milliseconds);
  195. char* time_tv_string(struct timeval tv);
  196. ///////////////////////////// end of 格式化 /////////////////////////////
  197. /**
  198. * 字符串分割
  199. */
  200. char** split_string(char* source, char split_char, char*recv_buf, int recv_buf_bytes,
  201. char**recv_buf_array, int recv_buf_array_size);
  202. /**
  203. * 分割字符串,返回下一分割段的起始位置
  204. */
  205. char* split_string_next(char* source, char split_char, char* recv_buf, int recv_buf_len);
  206. /**
  207. * 字符串替换
  208. */
  209. int replace_string(char* source, char* find, char* replace, char* recv_buf, int recv_buf_len);
  210. /**
  211. * 转换字符串 str 为大写并存入 rbuf, 返回 rbuf
  212. * rbuf的可用内存大小必须大于 strlen(str)
  213. */
  214. char* toUpperCase(const char *str, char *rbuf);
  215. /**
  216. * 去掉字符串 str 左边的空白字符并存入 rbuf, 返回 rbuf
  217. * rbuf的可用内存大小必须大于 strlen(str)
  218. */
  219. char* trimLeft(const char *str, char *rbuf);
  220. /**
  221. * 去掉字符串 str 右边的空白字符并存入 rbuf, 返回 rbuf
  222. * rbuf的可用内存大小必须大于 strlen(str)
  223. */
  224. char* trimRight(const char *str, char *rbuf);
  225. /**
  226. * 去掉字符串 str 两边的空白字符并存入 rbuf, 返回 rbuf
  227. * rbuf的可用内存大小必须大于 strlen(str)
  228. */
  229. // char* trim(const char *str, char *rbuf);
  230. /**
  231. * 读mapping文件
  232. */
  233. long read_mapping_file(int fd);
  234. /**
  235. * 写mapping文件
  236. */
  237. int write_mapping_file(int fd, long mid);
  238. int mk_parent_dir(char *filepath);
  239. ///////////////////////////// ABLOG_ComponentUnit /////////////////////////////
  240. #ifndef ABLOG_ComponentUnit
  241. #define ABLOG_ComponentUnit
  242. #ifdef _EDIT_IN_WINDOWS_ONLY
  243. #pragma GCC system_header
  244. #endif
  245. static RETURN_CODE_STRING ____RC2S____ = code_string;
  246. static char ____FunctionID____[] = "";
  247. static int ____LP_LEVEL____ = 0xFF;
  248. static int ____LP_FLOW____ = 0xFF;
  249. #endif//ABLOG_ComponentUnit
  250. ///////////////////////////// ABLOG_ComponentUnit /////////////////////////////
  251. #endif