ab_code.h 6.9 KB

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