message_file.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <memory.h>
  6. #include <time.h>
  7. #include <stdint.h>
  8. #include "message_file.h"
  9. #define _XOPEN_SOURCE
  10. namespace
  11. {
  12. char decode[256];
  13. char encode[256][3];
  14. bool code_init_flag=false;
  15. void init_code()
  16. {
  17. memset(decode,0,sizeof(decode));
  18. memset(encode,0,sizeof(encode));
  19. for(int c='A';c<='F';c++)
  20. decode[c]=c-'A'+10;
  21. for(int c='0';c<='9';c++)
  22. decode[c]=c-'0';
  23. for(int i=0;i<256;i++)
  24. {
  25. sprintf(encode[i],"%02X",i);
  26. }
  27. decode['\r']=-1;
  28. decode['\n']=-1;
  29. decode[' ']=-1;
  30. }
  31. inline int ch2int(const char c)
  32. {
  33. return (int) (uint8_t) c;
  34. }
  35. inline int convert(const char*p,char*o)
  36. {
  37. char c;
  38. char*r=o;
  39. for(;*p;p++)
  40. {
  41. if(decode[ch2int(*p)]<0)
  42. continue;
  43. c=decode[ch2int(*p++)]<<4;
  44. *o++=c+decode[ch2int(*p)];
  45. }
  46. return o-r;
  47. }
  48. }
  49. message_file::message_file(FILE*fp)
  50. {
  51. m_last_line[0]=0;
  52. m_file=fp;
  53. m_owner=false;
  54. if(!code_init_flag)
  55. {
  56. init_code();
  57. code_init_flag=true;
  58. }
  59. }
  60. message_file::message_file(const char*fname)
  61. {
  62. m_last_line[0]=0;
  63. m_file=fopen(fname,"r");
  64. m_owner=true;
  65. if(!code_init_flag)
  66. {
  67. init_code();
  68. code_init_flag=true;
  69. }
  70. }
  71. message_file::~message_file()
  72. {
  73. if(m_owner)
  74. fclose(m_file);
  75. }
  76. inline const char* now(char*date_str,uint64_t time)
  77. {
  78. time_t ntime=time/1000;
  79. #ifndef _WINDOWS
  80. struct tm buff;
  81. const struct tm*t=localtime_r(&ntime, &buff);
  82. #else
  83. const struct tm*t = localtime(&ntime);
  84. #endif
  85. sprintf(date_str,"%d-%02d-%02d %02d:%02d:%02d.%03d" ,
  86. t->tm_year+1900,t->tm_mon+1,t->tm_mday,
  87. t->tm_hour,t->tm_min,t->tm_sec,(int)(time%1000));
  88. return date_str;
  89. }
  90. int message_file::put_line(uint64_t time,char*buf,int buflen)
  91. {
  92. char b[8192];
  93. printf("[%s]\n",now(b,time));
  94. int n=0,t;
  95. for(int i=0;i<buflen;i++)
  96. {
  97. t=(int)(unsigned char)buf[i];
  98. n+=sprintf(&b[n],"%s ",encode[t]);
  99. }
  100. printf("%s\n",b);
  101. return 0;
  102. }
  103. int message_file::get_line(uint64_t*time,char*buf,int buflen)
  104. {
  105. const char*p;
  106. while(m_last_line[0]!='[')
  107. {
  108. if(fgets(m_last_line,sizeof(m_last_line),m_file)==nullptr)
  109. return 0;
  110. }
  111. {
  112. struct tm tm;
  113. memset(&tm, 0, sizeof(struct tm));
  114. #ifndef _WINDOWS
  115. const char*ms=strptime(&m_last_line[1], "%Y-%m-%d %H:%M:%S", &tm);
  116. *time=1000*mktime(&tm)+atoi(ms+1);
  117. #else
  118. std::string str(m_last_line,strlen(m_last_line));
  119. *time = parseLine(str);
  120. #endif
  121. }
  122. char*o=buf;
  123. for(;;)
  124. {
  125. if(nullptr==(p=fgets(m_last_line,sizeof(m_last_line),m_file)))
  126. return 0;
  127. if(*p=='[')
  128. break;
  129. o+=convert(p,o);
  130. }
  131. return o-buf;
  132. }
  133. time_t message_file::parseLine(string tmp)
  134. {
  135. std::string ms;
  136. time_t tmpsecond =0;
  137. int pos = tmp.find("[");
  138. if(pos!=tmp.npos)
  139. {
  140. tmp.erase(pos,1);
  141. }
  142. else
  143. return tmpsecond;
  144. pos = tmp.find("]");
  145. if(pos!=tmp.npos)
  146. {
  147. tmp.erase(pos,1);
  148. }
  149. else
  150. {
  151. return tmpsecond;
  152. }
  153. pos = tmp.find(".");
  154. if(pos != tmp.npos)
  155. {
  156. ms = tmp.substr(pos+1,3);
  157. tmp.erase(pos,4);
  158. }
  159. else
  160. {
  161. return tmpsecond;
  162. }
  163. tmpsecond =GetTimeStampByStr(tmp.c_str())*1000 + atoi(ms.c_str());
  164. return tmpsecond;
  165. }
  166. time_t message_file::GetTimeStampByStr( const char* pDate)
  167. {
  168. const char* pStart = pDate;
  169. char szYear[5], szMonth[3], szDay[3], szHour[3], szMin[3], szSec[3];
  170. szYear[0] = *pDate++;
  171. szYear[1] = *pDate++;
  172. szYear[2] = *pDate++;
  173. szYear[3] = *pDate++;
  174. szYear[4] = 0x0;
  175. ++pDate;
  176. szMonth[0] = *pDate++;
  177. szMonth[1] = *pDate++;
  178. szMonth[2] = 0x0;
  179. ++pDate;
  180. szDay[0] = *pDate++;
  181. szDay[1] = *pDate++;
  182. szDay[2] = 0x0;
  183. ++pDate;
  184. szHour[0] = *pDate++;
  185. szHour[1] = *pDate++;
  186. szHour[2] = 0x0;
  187. ++pDate;
  188. szMin[0] = *pDate++;
  189. szMin[1] = *pDate++;
  190. szMin[2] = 0x0;
  191. ++pDate;
  192. szSec[0] = *pDate++;
  193. szSec[1] = *pDate++;
  194. szSec[2] = 0x0;
  195. tm tmObj;
  196. tmObj.tm_year = atoi(szYear)-1900;
  197. tmObj.tm_mon = atoi(szMonth)-1;
  198. tmObj.tm_mday = atoi(szDay);
  199. tmObj.tm_hour = atoi(szHour);
  200. tmObj.tm_min = atoi(szMin);
  201. tmObj.tm_sec = atoi(szSec);
  202. tmObj.tm_isdst= -1;
  203. return mktime(&tmObj);
  204. }