CILIX_AUX_UTILS.h 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861
  1. /*************************************************************************
  2. > File Name: CILIX_AUX_UTILS.h
  3. > Author: 陈必灏
  4. > Mail: chenbh@nantian.com.cn
  5. > Created Time: 2017年09月21日 星期四 09时43分04秒
  6. ************************************************************************/
  7. #ifndef _CILIX_AUX_UTILS_H
  8. #define _CILIX_AUX_UTILS_H
  9. #include<stdio.h>
  10. #include<stdlib.h>
  11. #include<unistd.h>
  12. #include<sys/types.h>
  13. #include<sys/stat.h>
  14. #include<fcntl.h>
  15. #include<termios.h>
  16. #include<errno.h>
  17. #include<dirent.h>
  18. #include<string>
  19. #include<string.h>
  20. #include<sys/time.h>
  21. #include<time.h>
  22. #include<stdarg.h>
  23. #include<map>
  24. #include<vector>
  25. #include<iostream>
  26. #include<list>
  27. #include<memory.h>
  28. #include<malloc.h>
  29. #include<wchar.h>
  30. #include<dlfcn.h>
  31. #include <ostream>
  32. #include <fstream>
  33. using namespace std;
  34. typedef char* LPSTR;
  35. typedef unsigned long ULONG;
  36. typedef int BOOL;
  37. #define TRUE 1
  38. #define FALSE 0
  39. typedef vector<string> STRVECTOR;
  40. typedef string::size_type STRPOS;
  41. typedef struct _cilix_sys_time_ {
  42. int Year;
  43. int Month;
  44. int Day;
  45. int DayOfWeek;
  46. int DayOfYear;
  47. int Hour;
  48. int Minute;
  49. int Second;
  50. int MilliSecond;
  51. } CILIX_SYS_TIME, *LP_CILIX_SYS_TIME;
  52. class CILIX_AUX_X
  53. {
  54. public:
  55. static int CILIX_strlen_00(char* pSrc)
  56. {
  57. if (!pSrc) return 0;
  58. int x=0;
  59. for (; pSrc[x]||pSrc[x+1]; x++);
  60. return (x+2);
  61. }
  62. static int CILIX_strlen_00_w(wchar_t* pSrc)
  63. {
  64. if (!pSrc) return 0;
  65. int x=0;
  66. for (; pSrc[x]||pSrc[x+1]; x++);
  67. return (x+2);
  68. }
  69. static void GetLocalTime(CILIX_SYS_TIME *pt)
  70. {
  71. struct timeval ttv;
  72. gettimeofday(&ttv,NULL);
  73. struct tm* ttm = localtime(&ttv.tv_sec);
  74. pt->Year = ttm->tm_year+1900;
  75. pt->Month = ttm->tm_mon+1;
  76. pt->Day = ttm->tm_mday;
  77. pt->DayOfWeek = ttm->tm_wday;
  78. pt->DayOfYear = ttm->tm_yday+1;
  79. pt->Hour = ttm->tm_hour;
  80. pt->Minute = ttm->tm_min;
  81. pt->Second = ttm->tm_sec;
  82. pt->MilliSecond = (int)(ttv.tv_usec/1000);
  83. }
  84. static void Sleep(int ms)
  85. {
  86. usleep(ms*1000);
  87. }
  88. static int Tickcount()
  89. {
  90. struct timeval tv;
  91. gettimeofday(&tv,NULL);
  92. return (tv.tv_sec*1000 + tv.tv_usec/1000);
  93. }
  94. static void CILIX_uti_unpack(unsigned char *pSrc,unsigned char* pDest,int len)
  95. {
  96. unsigned char ch1, ch2;
  97. int i ;
  98. for( i = 0; i < len; i++ )
  99. {
  100. ch1 = (pSrc[i] & 0xF0) >> 4;
  101. ch2 = pSrc[i] & 0x0F;
  102. ch1 += ( (ch1 > 9 ) ? 0x37 : 0x30 );
  103. ch2 += ( (ch2 > 9 ) ? 0x37 : 0x30 );
  104. pDest[i*2] = ch1;
  105. pDest[i*2 + 1] = ch2;
  106. }
  107. }
  108. static void CILIX_uti_pack(unsigned char* pSrc,unsigned char* pDest,int len)
  109. {
  110. char ch1, ch2;
  111. int i;
  112. for( i = 0; i < (len / 2); i++ )
  113. {
  114. ch1 = pSrc[i*2];
  115. ch2 = pSrc[i*2 + 1];
  116. (ch1 >= 'a' && ch1 <= 'z') ? (ch1 -= 32) : (ch1);
  117. (ch2 >= 'a' && ch2 <= 'z') ? (ch2 -= 32) : (ch2);
  118. ch1 -= ( (ch1 > '9' ) ? 0x37 : 0x30 );
  119. ch2 -= ( (ch2 > '9' ) ? 0x37 : 0x30 );
  120. pDest[i] = ( ch1 << 4 ) | ch2;
  121. }
  122. }
  123. static char* CILIX_GetModuleCurPath(char* sCurPath)
  124. {
  125. std::string wdir;
  126. Dl_info dl_info;
  127. dladdr((void*)CILIX_GetModuleCurPath, &dl_info);
  128. std::string path(dl_info.dli_fname);
  129. wdir = path.substr(0, path.find_last_of('/') + 1);
  130. strcpy(sCurPath, wdir.c_str());
  131. return sCurPath;
  132. }
  133. static bool CreateDirectory(char* path)
  134. {
  135. int i = 0;
  136. char FilePath[100] = "";
  137. FilePath[0] = path[0];
  138. for(i= 1; i<=strlen(path); i++)
  139. {
  140. FilePath[i] = path[i];
  141. if(path[i] == '/')
  142. {
  143. char tempBuff[1024]= "";
  144. memcpy(tempBuff,FilePath,i);
  145. int iRet = access(tempBuff,F_OK);
  146. if(access(tempBuff, F_OK) != 0)
  147. {
  148. mkdir(FilePath,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
  149. }
  150. }
  151. }
  152. return true;
  153. }
  154. static int CILIX_split_str(string strSrc,STRVECTOR& vecDest,char cSep)
  155. {
  156. STRPOS pos = 0;
  157. STRPOS prev_pos = 0;
  158. while((pos = strSrc.find_first_of(cSep,pos))!= string::npos)
  159. {
  160. string strTemp = strSrc.substr(prev_pos,pos-prev_pos);
  161. vecDest.push_back(strTemp);
  162. prev_pos = ++ pos;
  163. }
  164. if(!strSrc.empty())
  165. vecDest.push_back(&strSrc[prev_pos]);
  166. return vecDest.size();
  167. }
  168. static int CILIX_split_str_00(char* sSrc,STRVECTOR& vecDest)
  169. {
  170. if(!sSrc || (!sSrc[0]&& !sSrc[1]))return 0;
  171. do
  172. {
  173. vecDest.push_back(sSrc);
  174. sSrc += strlen(sSrc)+1;
  175. }while(sSrc[0]);
  176. return vecDest.size();
  177. }
  178. static bool CILIX_X_SetINIKeyString(char* fileName,char* title,char* key , char* KeyValue)
  179. {
  180. if((fileName == NULL)||(title == NULL)||
  181. (key == NULL)||(KeyValue == NULL)) return FALSE;
  182. FILE *frp = NULL;
  183. char szLine[1024*10],szRcvData[1024*10];
  184. memset(szLine,0,sizeof(szLine));
  185. memset(szRcvData,0,sizeof(szRcvData));
  186. int rtnval = 0,iDataLen = 0,iRcvDataLen = 0;
  187. frp = fopen(fileName,"r");
  188. if(frp == NULL)return FALSE;
  189. while(!feof(frp))
  190. {
  191. rtnval = fgetc(frp);
  192. szLine[iDataLen++] = rtnval;
  193. if(rtnval == EOF) break;
  194. }
  195. fclose(frp);
  196. // printf("...%d...",iDataLen);
  197. // printf("%s",szLine);
  198. //iDataLen = data + enter + \n + EOF
  199. char sztitle[1024];
  200. memset(sztitle,0,sizeof(sztitle));
  201. strcpy(sztitle,"[");
  202. strcat(sztitle,title);
  203. strcat(sztitle,"]");
  204. // printf("%s",sztitle);
  205. char szkey[1024];
  206. memset(szkey,0,sizeof(szkey));
  207. strcpy(szkey,key);
  208. strcat(szkey,"=");
  209. char* titlePostion = NULL;
  210. if((titlePostion = strstr(szLine,sztitle))== NULL) return FALSE;
  211. int ititlePostion = titlePostion - szLine;
  212. // printf("...%d...",ititlePostion);
  213. char* keyPostion = NULL;
  214. if((keyPostion = strstr(szLine+ititlePostion,szkey)) == NULL) return FALSE;
  215. int ikeyPostion = keyPostion - szLine;
  216. // printf("***%d***",ikeyPostion);
  217. int iStarPostion = ikeyPostion+strlen(szkey);
  218. char* endPostion = NULL;
  219. if((endPostion = strchr(szLine+iStarPostion,'\r'))!= NULL);
  220. else if((endPostion = strchr(szLine+iStarPostion,'\n'))!= NULL);
  221. else return FALSE;
  222. int iendPostion = endPostion - szLine;
  223. // printf("+++%d+++",iendPostion);
  224. memcpy(szRcvData,szLine,iStarPostion);
  225. iRcvDataLen += iStarPostion;
  226. // char keyData[100]= "384000";
  227. memcpy(szRcvData+iStarPostion,KeyValue,strlen(KeyValue));
  228. iRcvDataLen += strlen(KeyValue);
  229. memcpy(szRcvData+iStarPostion+strlen(KeyValue),szLine+iendPostion,iDataLen-iendPostion);
  230. iRcvDataLen += (iDataLen-iendPostion);
  231. // printf("%s",szRcvData);
  232. // printf("...%d...",iRcvDataLen);
  233. FILE *fwp = NULL;
  234. fwp = fopen(fileName,"w+");
  235. if(fwp == NULL)
  236. {
  237. // printf("Open error\n");
  238. return FALSE;
  239. }
  240. int iWriteNum = fwrite(szRcvData,sizeof(char),iRcvDataLen-1,fwp);
  241. fclose(fwp);
  242. if(iWriteNum == 0)
  243. {
  244. // printf("Write error \n");
  245. return FALSE;
  246. }
  247. // printf("...%d...",iWriteNum);
  248. return TRUE;
  249. }
  250. static bool CILIX_X_INIKeyString(char* fileName , char* title,char* key,char* KeyValue,char* Default =NULL )
  251. {
  252. if((fileName == NULL)||(title == NULL)||
  253. (key == NULL)||(KeyValue == NULL))
  254. return FALSE;
  255. FILE *fp = NULL ;
  256. char szLine[1024],tmpstr[1024];
  257. char *tmp = NULL;
  258. memset(szLine,0,sizeof(szLine));
  259. memset(tmpstr,0,sizeof(tmpstr));
  260. int rtnval, i = 0,flag = 0;
  261. fp = fopen(fileName,"r");
  262. if(fp == NULL) return FALSE;
  263. while(!feof(fp))
  264. {
  265. rtnval = fgetc(fp);
  266. if(rtnval == EOF)break;
  267. else szLine[i++] = rtnval;
  268. if(rtnval == '\n')
  269. {
  270. szLine[--i] = '\0';
  271. i = 0;
  272. tmp = strchr(szLine,'=');
  273. if((tmp != NULL)&&(flag == 1))
  274. {
  275. if (strstr(szLine,key)!= NULL)
  276. {
  277. if('#'== szLine[0]);
  278. else if('\/'== szLine[0]&& '\/' == szLine[1]);
  279. else
  280. {
  281. strcpy(tmpstr,tmp+1);
  282. fclose(fp);
  283. char* FindPos = NULL;
  284. if((FindPos = strchr(tmpstr,'\n'))!= NULL)
  285. {
  286. memcpy(KeyValue,tmpstr,FindPos-tmpstr);
  287. }
  288. else if((FindPos =strchr(tmpstr,'\r'))!=NULL)
  289. memcpy(KeyValue,tmpstr,FindPos-tmpstr);
  290. else strcpy(KeyValue,tmpstr);
  291. return TRUE;
  292. }
  293. }
  294. }
  295. else
  296. {
  297. strcpy(tmpstr,"[");
  298. strcat(tmpstr,title);
  299. strcat(tmpstr,"]");
  300. if(strncmp(tmpstr,szLine,strlen(tmpstr)) == 0)
  301. flag = 1;
  302. }
  303. }
  304. }
  305. fclose(fp);
  306. if(Default == NULL) return FALSE;
  307. strcpy(KeyValue,Default);
  308. return TRUE;
  309. }
  310. static char* strupr(char *str)
  311. {
  312. char *ptr = str;
  313. while (*ptr != '\0') {
  314. if (islower(*ptr))
  315. *ptr = toupper(*ptr);
  316. ptr++;
  317. }
  318. return str;
  319. }
  320. static char* strlwr(char* str)
  321. {
  322. char* ptr = str;
  323. while (*ptr != '\0') {
  324. if (isupper(*ptr))
  325. *ptr = tolower(*ptr);
  326. ptr++;
  327. }
  328. return str;
  329. }
  330. static void TraceVAS(int hService, ULONG id, const char* f, char* p_szTraceData, ...)
  331. {
  332. char f_trace_data[1024 * 10 + 1] = "";
  333. if (p_szTraceData != NULL)
  334. {
  335. va_list f_va_list;
  336. va_start(f_va_list, p_szTraceData);
  337. vsprintf(f_trace_data + strlen(f_trace_data), p_szTraceData, f_va_list);
  338. va_end(f_va_list);
  339. }
  340. fprintf(stderr, "$$$$$$$$$$$$$$ %s H:<%d> ID:<%d> [%s] -- %s\n", __TIME__, hService, id, f, f_trace_data);
  341. }
  342. };
  343. //?ַ???\C0\A9չ??
  344. class CAU_unpacker
  345. {
  346. public:
  347. CAU_unpacker(const char* s) : str_(0)
  348. {
  349. unpack(s, ( s ? strlen(s) : 0 ));
  350. }
  351. CAU_unpacker(const char* s, int l) : str_(0)
  352. {
  353. unpack(s, l);
  354. }
  355. ~CAU_unpacker()
  356. {
  357. free(this->str_);
  358. }
  359. char* str()
  360. {
  361. return this->str_;
  362. }
  363. int len()
  364. {
  365. return this->len_;
  366. }
  367. private:
  368. void unpack(const char* s, int l)
  369. {
  370. free(this->str_);
  371. this->str_ = NULL;
  372. //
  373. unsigned char* s_unpack_ = (unsigned char*)malloc(l*2 + 10);
  374. memset(s_unpack_, 0, l*2 + 10);
  375. CILIX_AUX_X::CILIX_uti_unpack((unsigned char*)s, s_unpack_, l);
  376. //
  377. this->str_ = (char*)s_unpack_;
  378. this->len_ = l*2;
  379. }
  380. private:
  381. char* str_;
  382. int len_;
  383. };
  384. //???ַ????Զ?\C0\A9չ??
  385. class CAU_unpacker_w
  386. {
  387. public:
  388. CAU_unpacker_w(const wchar_t* s) : str_(0)
  389. {
  390. unpack(s, ( s ? wcslen(s) : 0 ));
  391. }
  392. CAU_unpacker_w(const wchar_t* s, int l) : str_(0)
  393. {
  394. unpack(s, l);
  395. }
  396. ~CAU_unpacker_w()
  397. {
  398. free(this->str_);
  399. }
  400. char* str()
  401. {
  402. return this->str_;
  403. }
  404. int len()
  405. {
  406. return this->len_;
  407. }
  408. private:
  409. void unpack(const wchar_t* s, int l)
  410. {
  411. free(this->str_);
  412. this->str_ = NULL;
  413. //
  414. unsigned char* s_unpack_ = (unsigned char*)malloc(l*sizeof(wchar_t)*2 + 10);
  415. memset(s_unpack_, 0, l*sizeof(wchar_t)*2 + 10);
  416. CILIX_AUX_X::CILIX_uti_unpack((unsigned char*)s, s_unpack_, l*sizeof(wchar_t));
  417. //
  418. this->str_ = (char*)s_unpack_;
  419. this->len_ = l*sizeof(wchar_t)*2;
  420. }
  421. private:
  422. char* str_;
  423. int len_;
  424. };
  425. //?ַ????Զ?ѹ????
  426. class CAU_packer
  427. {
  428. public:
  429. CAU_packer(const char* s) : str_(0)
  430. {
  431. pack(s, ( s ? strlen(s) : 0 ));
  432. }
  433. CAU_packer(const char* s, int l) : str_(0)
  434. {
  435. pack(s, l);
  436. }
  437. ~CAU_packer()
  438. {
  439. free(this->str_);
  440. }
  441. char* str()
  442. {
  443. return this->str_;
  444. }
  445. int len()
  446. {
  447. return this->len_;
  448. }
  449. private:
  450. void pack(const char* s, int l)
  451. {
  452. free(this->str_);
  453. this->str_ = NULL;
  454. //
  455. unsigned char* s_pack_ = (unsigned char*)malloc(l/2 + 10);
  456. memset(s_pack_, 0, l/2 + 10);
  457. CILIX_AUX_X::CILIX_uti_pack((unsigned char*)s, s_pack_, l);
  458. //
  459. this->str_ = (char*)s_pack_;
  460. this->len_ = l/2;
  461. }
  462. private:
  463. char* str_;
  464. int len_;
  465. };
  466. typedef int (*CILIXTTY_READINISH)(char*,int);
  467. class CILIX_TTY_Op
  468. {
  469. public:
  470. CILIX_TTY_Op()
  471. {
  472. this->fd = 0;
  473. }
  474. ~CILIX_TTY_Op()
  475. {
  476. this->Close();
  477. }
  478. virtual int Open(char* szPort,int nBaudRate)
  479. {
  480. this->speed = this->GetBaudRate(nBaudRate);
  481. if(this->speed == -1) return -1;
  482. this->fd = open( szPort, O_RDWR|O_NONBLOCK);
  483. if(this->fd == FALSE) return -1;
  484. struct termios options;
  485. if(tcgetattr(this->fd,&options))
  486. {
  487. close(this->fd);
  488. return -1;
  489. }
  490. options.c_cflag &= ~CSIZE;
  491. options.c_cflag |= CS8;
  492. options.c_cflag &= ~CSTOPB;
  493. cfmakeraw(&options);
  494. cfsetispeed(&options,this->speed);
  495. cfsetospeed(&options,this->speed);
  496. if(tcsetattr(this->fd,TCSANOW,&options)!= 0)
  497. {
  498. close(this->fd);
  499. return -1;
  500. }
  501. return 0;
  502. }
  503. virtual int Open(char* szPort,int nBaudRate, int nEvent,int cflag )
  504. {
  505. this->speed = this->GetBaudRate(nBaudRate);
  506. if(this->speed == -1) return -1;
  507. this->fd = open( szPort, O_RDWR|O_NONBLOCK);
  508. if(this->fd == FALSE) return -1;
  509. struct termios options;
  510. if(tcgetattr(this->fd,&options))
  511. {
  512. close(this->fd);
  513. return -1;
  514. }
  515. cfmakeraw(&options);
  516. options.c_cflag &= ~CSIZE;
  517. options.c_cflag |= CS8;
  518. options.c_cflag &= ~CSTOPB;
  519. //options.c_cflag |= CLOCAL|CREAD;
  520. //options.c_oflag &= ~OPOST;
  521. //options.c_cc[VTIME] = 0;
  522. //options.c_cc[VMIN] = 0;
  523. //tcflush(this->fd,TCOFLUSH);
  524. //if(cflag == 0 ) options.c_cflag &= ~CRTSCTS;
  525. //else options.c_cflag |= CRTSCTS;
  526. switch (nEvent)
  527. {
  528. case 'n':
  529. case 'N':
  530. options.c_cflag &= ~PARENB; /* Clear parity enable */
  531. options.c_iflag &= ~INPCK; /* Enable parity checking */
  532. break;
  533. case 'o':
  534. case 'O':
  535. options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  536. options.c_iflag |= INPCK; /* Disnable parity checking */
  537. break;
  538. case 'e':
  539. case 'E':
  540. options.c_cflag |= PARENB; /* Enable parity */
  541. options.c_cflag &= ~PARODD; /* 转换为偶效验*/
  542. options.c_iflag |= INPCK; /* Disnable parity checking */
  543. break;
  544. case 'S':
  545. case 's': /*as no parity*/
  546. options.c_cflag &= ~PARENB;
  547. options.c_cflag &= ~CSTOPB;
  548. break;
  549. default:
  550. fprintf(stderr,"Unsupported parity\n");
  551. return -1;
  552. }
  553. cfsetispeed(&options,this->speed);
  554. cfsetospeed(&options,this->speed);
  555. if(tcsetattr(this->fd,TCSANOW,&options)!= 0)
  556. {
  557. close(this->fd);
  558. return -1;
  559. }
  560. tcflush(this->fd,TCIOFLUSH);
  561. return 0;
  562. }
  563. virtual int Close()
  564. {
  565. if(this->fd > 0)
  566. close(this->fd);
  567. return 0;
  568. }
  569. virtual int Write(char* szSend,int nSendLen,int InnerTime)
  570. {
  571. if(this->fd == -1) return -1;
  572. int iLen = 0;
  573. tcflush(this->fd,TCIFLUSH);
  574. iLen = write(this->fd,szSend,nSendLen);
  575. if(iLen < nSendLen)
  576. {
  577. //clear buff
  578. tcflush(this->fd,TCOFLUSH);
  579. return -1;
  580. }
  581. return iLen;
  582. }
  583. virtual int Read(char* szRecvData,int nRcvlen,int inner,int total,int isleep,CILIXTTY_READINISH srf)
  584. {
  585. int ret_ = 0,count_ = 0 ;
  586. char buff_[2];
  587. int time_old = CILIX_AUX_X::Tickcount(),time_last = 0;
  588. while((CILIX_AUX_X::Tickcount() -time_old ) < total)
  589. {
  590. memset(buff_,0,sizeof(buff_));
  591. ret_ = read(this->fd,buff_,1);
  592. if(ret_ != 1)
  593. {
  594. if(count_ > 0)
  595. {
  596. if((CILIX_AUX_X::Tickcount() - time_last) >= inner) break;
  597. }
  598. if(isleep > 0) CILIX_AUX_X::Sleep(isleep);
  599. }
  600. else if(ret_ == 1)
  601. {
  602. memcpy(szRecvData+count_,buff_,1);
  603. count_++;
  604. if(count_ >= nRcvlen) break;
  605. //get data full
  606. if(srf != NULL && srf(szRecvData,count_)) break;
  607. time_last = CILIX_AUX_X::Tickcount();
  608. }
  609. // else return ret_;
  610. }
  611. /*if(count_ == 0) printf("Read Count 0 :%s\n",strerror(errno));*/
  612. return count_;
  613. }
  614. virtual int Read(char* szRecvData ,int nRcvlen,int inner ,int total,int isleep)
  615. {
  616. int iRet = 0,ret_ = 0;
  617. struct timeval time_old,time_last,time_now;
  618. gettimeofday(&time_old,NULL);
  619. time_last.tv_sec = 0;
  620. time_last.tv_usec = 0;
  621. time_now.tv_sec = 0;
  622. time_now.tv_usec = 0;
  623. long _old = time_old.tv_sec * 1000 + time_old.tv_usec /1000;
  624. long _time = 0, _now = 0;
  625. while((_time - _old) < total)
  626. {
  627. unsigned char buf_;
  628. ret_ = read(this->fd,&buf_,1);
  629. if(ret_ != 1)
  630. {
  631. if(iRet > 0)
  632. {
  633. gettimeofday(&time_now,NULL);
  634. _now = time_now.tv_sec * 1000 + time_now.tv_usec /1000;
  635. if((_now - _time) >= inner ) break;
  636. }
  637. if(isleep > 0)usleep(isleep*1000);
  638. }
  639. if(ret_ == 1)
  640. {
  641. szRecvData[iRet]= buf_;
  642. iRet ++ ;
  643. if(iRet >= nRcvlen) break;
  644. gettimeofday(&time_last,NULL);
  645. _time = time_last.tv_sec * 1000 + time_last.tv_usec/1000;
  646. }
  647. }
  648. return iRet;
  649. }
  650. private:
  651. int fd;
  652. speed_t speed;
  653. static speed_t GetBaudRate(int iBaudRate)
  654. {
  655. switch(iBaudRate)
  656. {
  657. case 0: return B0;
  658. case 9600: return B9600;
  659. case 19200: return B19200;
  660. case 38400: return B38400;
  661. case 115200:return B115200;
  662. case 57600: return B57600;
  663. default: return -1;
  664. }
  665. }
  666. };
  667. //日志级别
  668. #define CILIXTRACE_L_DEBUG 1
  669. #define CILIXTRACE_L_INFO 2
  670. #define CILIXTRACE_L_WARN 3
  671. #define CILIXTRACE_L_ERROR 4
  672. #define CILIXTRACE_L_FATAL 5
  673. #define CILIXTRACE_L_SYSTEM 9
  674. class CILIXTrace
  675. {
  676. public:
  677. CILIXTrace(char* p_szDir,char* p_szMethodName,char* p_szFilePrefix):day_(0),month_(0),year_(0)
  678. {
  679. char szPath[1024],iniPath[1024];
  680. memset(szPath,0,sizeof(szPath));
  681. CILIX_AUX_X::CILIX_GetModuleCurPath(szPath);
  682. memset(iniPath,0,sizeof(iniPath));
  683. strcat(iniPath,szPath);
  684. strcat(iniPath,"CILIX_CONFIG.ini");
  685. //是否记录日志
  686. char dtFlag[200] = "";
  687. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","Switch",dtFlag,"1");
  688. atoi(dtFlag) ? m_trace_flag = TRUE:m_trace_flag = FALSE;
  689. //是否日志加密
  690. char dtcrypt[200] = "";
  691. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","Encrypt",dtcrypt,"0");
  692. atoi(dtcrypt) ? m_trace_crypt = TRUE :m_trace_crypt = FALSE;
  693. //文件保留天数
  694. char dtRD[200] = "";
  695. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","FileDay",dtRD,"30");
  696. m_file_reserve_days = atoi(dtRD);
  697. // m_file_open_mode="a+";
  698. strcpy(m_file_open_mode,"a+");
  699. memset(m_file_prefix_,0,sizeof(m_file_prefix_));
  700. strcpy(m_file_prefix_ ,p_szFilePrefix);
  701. //日志级别
  702. char dtLevel[200]= "";
  703. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","Level",dtLevel,"INFO");
  704. m_trace_level = this->l_a2i(dtLevel);
  705. if(m_trace_flag == FALSE) return ;
  706. //日志路径
  707. char dtTracePath[1024];
  708. memset(dtTracePath,0,sizeof(dtTracePath));
  709. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","Path",dtTracePath,"/etc/UFS/CILIXTrace");
  710. //创建日文件夹
  711. //CILIX_AUX_X::CreateDirectory(dtTracePath);
  712. //创建日志文件夹
  713. mkdir(dtTracePath,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
  714. memset(m_dir_,0,sizeof(m_dir_));
  715. strcpy(m_dir_, dtTracePath);
  716. //文件名
  717. memset(m_ModuleName,0,sizeof(m_ModuleName));
  718. strcpy(m_ModuleName, p_szMethodName);
  719. CILIX_SYS_TIME p;
  720. CILIX_AUX_X::GetLocalTime(&p);
  721. this->WriteTrace(CILIXTRACE_L_SYSTEM,"===","|*********************************************|");
  722. this->WriteTrace(CILIXTRACE_L_SYSTEM,"==="," START %04d-%02d-%2d %02d-%02d-%02d ",
  723. p.Year,p.Month,p.Day,p.Hour,p.Minute,p.Second);
  724. }
  725. virtual ~CILIXTrace()
  726. {
  727. CILIX_SYS_TIME p;
  728. CILIX_AUX_X::GetLocalTime(&p);
  729. this->WriteTrace(CILIXTRACE_L_SYSTEM,"==="," END %04d-%02d-%2d %02d-%02d-%02d ",
  730. p.Year,p.Month,p.Day,p.Hour,p.Minute,p.Second);
  731. this->WriteTrace(CILIXTRACE_L_SYSTEM,"===","|*********************************************|");
  732. }
  733. void WriteTrace(const char* p_szMethodName,const char* p_szTraceData,...)
  734. {
  735. if(m_trace_flag == FALSE ) return;
  736. char f_trace_data[1024 * 10+1] = "";
  737. if(p_szTraceData != NULL)
  738. {
  739. va_list f_va_list;
  740. va_start (f_va_list,p_szTraceData);
  741. vsprintf(f_trace_data+strlen(f_trace_data),p_szTraceData,f_va_list);
  742. va_end(f_va_list);
  743. }
  744. this->write_trace(CILIXTRACE_L_INFO,p_szMethodName,f_trace_data);
  745. }
  746. void WriteTrace(int p_iLevel, const char* p_szMethodName,const char* p_szTraceData,...)
  747. {
  748. if(m_trace_flag == FALSE ) return;
  749. //判断日志级别
  750. if(p_iLevel < m_trace_level) return ;
  751. char f_trace_data[1024 * 10+1] = "";
  752. if(p_szTraceData != NULL)
  753. {
  754. va_list f_va_list;
  755. va_start (f_va_list,p_szTraceData);
  756. vsprintf(f_trace_data+strlen(f_trace_data),p_szTraceData,f_va_list);
  757. va_end(f_va_list);
  758. }
  759. this->write_trace(p_iLevel,p_szMethodName,f_trace_data);
  760. }
  761. private:
  762. //Write file Mode
  763. void write_trace(int p_iLevel, const char* p_szMethodName ,const char* p_szTraceData)
  764. {
  765. char f_trace_data[1024*10 +1] = "";
  766. //trace level
  767. char f_sl[200] = "";
  768. this->l_i2a(p_iLevel, f_sl);
  769. //time
  770. /*
  771. time_t timep = time(NULL);
  772. struct tm* p = localtime(&timep);*/
  773. CILIX_SYS_TIME p;
  774. CILIX_AUX_X::GetLocalTime(&p);
  775. //生成日期信息
  776. sprintf(f_trace_data,"%04d-%02d-%02d %02d:%02d:%02d:%03d [%s] <%s> - ",
  777. p.Year,p.Month,p.Day,
  778. p.Hour,p.Minute,p.Second,p.MilliSecond,f_sl,(p_szMethodName == NULL ?"":p_szMethodName));
  779. if(year_ != p.Year || month_ != p.Month || day_ != p.Day)
  780. {
  781. char sPath[1025] = "\0";
  782. //创建日期目录
  783. sprintf(sPath,"%s/%04d%02d%02d",m_dir_,p.Year,p.Month,p.Day);
  784. mkdir(sPath,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
  785. sprintf(m_dir_,"%s/%s",sPath,m_ModuleName);
  786. mkdir(m_dir_,S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
  787. }
  788. //trace info
  789. if(p_szTraceData != NULL)
  790. strcat(f_trace_data,p_szTraceData);
  791. strcat(f_trace_data,"\r\n");
  792. int f_i_trace_data_len = strlen(f_trace_data);
  793. if(m_trace_crypt == TRUE)
  794. {
  795. int i ;
  796. for(i = 0; i< f_i_trace_data_len; f_trace_data[i++]^=0x55);
  797. }
  798. char f_szFileName[1030] = "";
  799. sprintf(f_szFileName,"%s/",m_dir_);
  800. sprintf(f_szFileName+strlen(f_szFileName), "%s_%d%d%d.txt",
  801. m_file_prefix_,
  802. p.Year,
  803. p.Month,
  804. p.Day);
  805. //open file Write
  806. FILE *f_pFile = NULL;
  807. if((f_pFile = fopen(f_szFileName,m_file_open_mode))!= NULL)
  808. {
  809. fseek(f_pFile,0L,SEEK_END);
  810. fwrite(f_trace_data,sizeof(char),f_i_trace_data_len,f_pFile);
  811. fclose(f_pFile);
  812. }
  813. //判断是否产生新的一天
  814. if(year_ != p.Year || month_ != p.Month || day_ != p.Day)
  815. {
  816. this->delete_redun_files();
  817. this->year_ = p.Year;
  818. this->month_ = p.Month;
  819. this->day_ = p.Day;
  820. }
  821. }
  822. //
  823. int l_a2i(char* sl)
  824. {
  825. int il = CILIXTRACE_L_INFO;
  826. {
  827. if (!strcmp(sl, "DEBUG")) il = CILIXTRACE_L_DEBUG;
  828. if (!strcmp(sl, "INFO")) il = CILIXTRACE_L_INFO;
  829. if (!strcmp(sl, "WARN")) il = CILIXTRACE_L_WARN;
  830. if (!strcmp(sl, "ERROR")) il = CILIXTRACE_L_ERROR;
  831. if (!strcmp(sl, "FATAL")) il = CILIXTRACE_L_FATAL;
  832. if (!strcmp(sl, "SYSTEM")) il = CILIXTRACE_L_SYSTEM;
  833. }
  834. return il;
  835. }
  836. void l_i2a(int il, char* sl)
  837. {
  838. strcpy(sl, "UNKNOWN");
  839. if (il == CILIXTRACE_L_DEBUG) strcpy(sl, "DEBUG");
  840. if (il == CILIXTRACE_L_INFO) strcpy(sl, "INFO");
  841. if (il == CILIXTRACE_L_WARN) strcpy(sl, "WARN");
  842. if (il == CILIXTRACE_L_ERROR) strcpy(sl, "ERROR");
  843. if (il == CILIXTRACE_L_FATAL) strcpy(sl, "FATAL");
  844. if (il == CILIXTRACE_L_SYSTEM) strcpy(sl, "SYSTEM");
  845. }
  846. private:
  847. //根据文件保留天数,删除过期文件
  848. void delete_redun_files()
  849. {
  850. //如果不记录日志则返回
  851. if(!m_trace_flag)
  852. return ;
  853. char szPath[1025] = "\0";
  854. char iniPath[1025] = "\0";
  855. CILIX_AUX_X::CILIX_GetModuleCurPath(szPath);
  856. memset(iniPath,0,sizeof(iniPath));
  857. strcat(iniPath,szPath);
  858. strcat(iniPath,"CILIX_CONFIG.ini");
  859. char dtTracePath[1024];
  860. memset(dtTracePath,0,sizeof(dtTracePath));
  861. CILIX_AUX_X::CILIX_X_INIKeyString(iniPath,"DEVTRACE","Path",dtTracePath,"");
  862. //fprintf(stderr,"m_dir_%s\n ",dtTracePath);
  863. REMOVE_FILES(dtTracePath);
  864. }
  865. void DeleteFolder(string dirIn)
  866. {
  867. if(dirIn.empty())return ;
  868. struct stat s;
  869. stat(dirIn.c_str(),&s);
  870. if(!S_ISDIR(s.st_mode))return ;
  871. DIR* open_dir = opendir(dirIn.c_str());
  872. if(!open_dir) return ;
  873. dirent* pDren = NULL;
  874. while((pDren = readdir(open_dir)) != NULL)
  875. {
  876. string fileName = pDren->d_name;
  877. if(fileName == "."||fileName == "..")
  878. continue;
  879. struct stat st;
  880. string name = dirIn+string("/")+fileName;
  881. stat(name.c_str(),&st);
  882. if(S_ISDIR(st.st_mode))
  883. {
  884. DeleteFolder(name);
  885. remove(name.c_str());
  886. }
  887. else if(S_ISREG(st.st_mode))
  888. remove(name.c_str());
  889. }
  890. closedir(open_dir);
  891. }
  892. BOOL REMOVE_FILES(string dirIn)
  893. {
  894. //搜索到的文件夹个数
  895. int f_iFileNumber = 0;
  896. //搜索到的文件名列表,最多1024 个文件
  897. char *f_szFileNames[1025] = {0};
  898. if(dirIn.empty())return FALSE;
  899. struct stat s;
  900. stat(dirIn.c_str(),&s);
  901. if(!S_ISDIR(s.st_mode))return FALSE;
  902. DIR* open_dir = opendir(dirIn.c_str());
  903. if(!open_dir) return FALSE;
  904. dirent* pDren = NULL;
  905. while((pDren = readdir(open_dir)) != NULL)
  906. {
  907. string fileName = pDren->d_name;
  908. if(fileName == "."||fileName == "..")
  909. continue;
  910. struct stat st;
  911. string name = dirIn+string("/")+fileName;
  912. stat(name.c_str(),&st);
  913. if(S_ISDIR(st.st_mode))
  914. {
  915. f_szFileNames[f_iFileNumber] = (char*)malloc(strlen(name.c_str())+1);
  916. strcpy(f_szFileNames[f_iFileNumber],name.c_str());
  917. f_iFileNumber++;
  918. }
  919. }
  920. closedir(open_dir);
  921. qsort(f_szFileNames,f_iFileNumber,sizeof(char*),cmpfile_names);
  922. for(int f_iFNTemp = f_iFileNumber;m_file_reserve_days>0 && f_iFNTemp >m_file_reserve_days;f_iFNTemp--)
  923. {
  924. // cout<<f_szFileNames[f_iFNTemp-1]<<endl;
  925. DeleteFolder(f_szFileNames[f_iFNTemp-1]);
  926. remove(f_szFileNames[f_iFNTemp-1]);
  927. }
  928. for(int i = 0;i<f_iFileNumber;i++)
  929. free(f_szFileNames[i]);
  930. return TRUE;
  931. }
  932. static int cmpfile_names(const void* p_pFileName1,const void* p_pFileName2)
  933. {
  934. return strcmp(*(char**)p_pFileName2,*(char**)p_pFileName1);
  935. }
  936. private:
  937. //trace dir
  938. char m_dir_[1030];
  939. //trace prefix
  940. char m_file_prefix_[200];
  941. //trace Name
  942. char m_ModuleName[100] ;
  943. //open mode
  944. char m_file_open_mode[100];
  945. //data
  946. int m_file_reserve_days;
  947. //trace flag
  948. bool m_trace_flag;
  949. //trace crypt
  950. bool m_trace_crypt;
  951. //level
  952. int m_trace_level;
  953. private:
  954. int day_;
  955. int month_;
  956. int year_;
  957. };
  958. //Auto
  959. class CILIXAutoTrace
  960. {
  961. public:
  962. CILIXAutoTrace(CILIXTrace* pt,char *method ,int* iret):m_pt(pt),m_iret(iret)
  963. {
  964. memset(m_method,0,sizeof(m_method));
  965. strcpy(m_method,method);
  966. m_pt->WriteTrace(m_method,"Entry");
  967. }
  968. ~CILIXAutoTrace()
  969. {
  970. m_pt->WriteTrace(m_method,"Exit - [iret = %d]",*m_iret);
  971. }
  972. private:
  973. CILIXTrace *m_pt;
  974. char m_method[1025];
  975. int* m_iret;
  976. };
  977. class CILIX_X_Config
  978. {
  979. public:
  980. private:
  981. char sCfgPath[1025];
  982. };
  983. typedef list<void*> VPLIST,*LPVPLIST;
  984. typedef VPLIST::iterator VPLISTIT;
  985. typedef map<void*,LPVPLIST> VPLIST_MAP;
  986. typedef VPLIST_MAP::iterator VPLIST_MAP_IT;
  987. class CILIX_Allocator
  988. {
  989. public:
  990. CILIX_Allocator()
  991. {
  992. }
  993. virtual ~CILIX_Allocator()
  994. {
  995. FreeBuffer();
  996. }
  997. public:
  998. int AllocateBuffer(unsigned long iSize,void** pData)
  999. {
  1000. if(iSize == 0)
  1001. {
  1002. *pData = NULL;
  1003. return 0;
  1004. }
  1005. void *mem = malloc(iSize);
  1006. if(mem == NULL) return -1;
  1007. memset(mem,0,iSize);
  1008. LPVPLIST vl = new VPLIST;
  1009. vl->insert(vl->end(),mem);
  1010. VM.insert(VPLIST_MAP::value_type(mem,vl));
  1011. *pData = mem;
  1012. return 0;
  1013. }
  1014. int AllocateMore(unsigned long iSize,void* pOriginal,void ** pData)
  1015. {
  1016. if(iSize == 0)
  1017. {
  1018. *pData = NULL;
  1019. return 0;
  1020. }
  1021. VPLIST_MAP_IT it_ = VM.find(pOriginal);
  1022. if(it_ == VM.end()) return -1;
  1023. void *mem = malloc(iSize);
  1024. if(mem == NULL) return -1;
  1025. memset(mem,0,iSize);
  1026. (it_->second)->insert((it_->second)->end(),mem);
  1027. *pData = mem;
  1028. return 0;
  1029. }
  1030. void FreeBuffer(void* pOriginal)
  1031. {
  1032. if(pOriginal == NULL) return ;
  1033. VPLIST_MAP_IT it_ = VM.find(pOriginal);
  1034. if(it_ != VM.end())
  1035. {
  1036. LPVPLIST vl = it_->second;
  1037. VPLISTIT t= vl->begin();
  1038. for(t;t!=vl->end();)
  1039. {
  1040. free(*t);
  1041. vl->erase(t++);
  1042. }
  1043. delete vl;
  1044. VM.erase(it_);
  1045. }
  1046. }
  1047. private:
  1048. void FreeBuffer()
  1049. {
  1050. //遍历VM中的元素
  1051. while(!VM.empty())
  1052. {
  1053. VPLIST_MAP_IT it_ = VM.begin();
  1054. LPVPLIST vl = it_->second;
  1055. //遍列地址列表
  1056. VPLISTIT t = vl->begin();
  1057. for(t;t!=vl->end();)
  1058. {
  1059. free(*t);
  1060. vl->erase(t++);
  1061. }
  1062. delete vl;
  1063. VM.erase(it_);
  1064. }
  1065. }
  1066. private:
  1067. //存放各个LPVPLIST对象的MAP
  1068. VPLIST_MAP VM;
  1069. };
  1070. ///////////////////////////////////#####未使用STL的字符串处理集合#####///////////////////////////////////
  1071. /***********************************************
  1072. 说明:
  1073. 空白字符包括:
  1074. 空格: 0x20
  1075. 换页符 (\f): 0x0c
  1076. 换行符 (\n): 0x0a
  1077. 回车符 (\r): 0x0d
  1078. 制表符 (\t): 0x09
  1079. 垂直制表符 (\v): 0x0b
  1080. ************************************************/
  1081. class CPlusStringProcess
  1082. {
  1083. public:
  1084. //构造器
  1085. CPlusStringProcess()
  1086. {
  1087. //空白字符合集
  1088. memset(m_pWhiteChar, 0, sizeof(m_pWhiteChar));
  1089. strcpy(m_pWhiteChar, "\x20\x0c\x0a\x0d\x09\x0b");
  1090. }
  1091. public:
  1092. //功能:去除左边的空白符
  1093. //参数:p_pStrOld : 要操作的字符串
  1094. // p_pStrNew : 如果为null则修改作用于p_pStrOld,否则通过p_pStrNew返回
  1095. //备注:如果p_pStrOld为空指针或空字符串,则不对原字符串做任何修改,同时如果p_pStrNew
  1096. // 也不为空,则将p_pStrNew置为一个空字符串
  1097. void TrimLeft(char* p_pStrOld, char* p_pStrNew = NULL)
  1098. {
  1099. //如果操作字符串为空则直接返回
  1100. if (p_pStrOld == NULL || strlen(p_pStrOld) <= 0)
  1101. {
  1102. if (p_pStrNew != NULL)
  1103. p_pStrNew[0] = '\0';
  1104. return;
  1105. }
  1106. //临时存储字符串
  1107. char* f_pTempStr = (char*)malloc(sizeof(char)*(strlen(p_pStrOld)+1));
  1108. memset(f_pTempStr, 0, sizeof(char)*(strlen(p_pStrOld)+1));
  1109. //查找左边第一个非空白符
  1110. char* f_pStrIdx = p_pStrOld;
  1111. for (unsigned int i=0; i<strlen(p_pStrOld)&&is_white_char_(*f_pStrIdx); f_pStrIdx++,i++);
  1112. //拷贝不包括左边空白字符的字符串到f_pTempStr
  1113. strcpy(f_pTempStr, f_pStrIdx);
  1114. //产生输出
  1115. if (p_pStrNew == NULL)
  1116. strcpy(p_pStrOld, f_pTempStr);
  1117. else
  1118. strcpy(p_pStrNew, f_pTempStr);
  1119. //释放临时字符串空间
  1120. free(f_pTempStr);
  1121. }
  1122. //功能:去除右边的空白符
  1123. //参数:p_pStrOld : 要操作的字符串
  1124. // p_pStrNew : 如果为null则修改作用于p_pStrOld,否则通过p_pStrNew返回
  1125. //备注:如果p_pStrOld为空指针或空字符串,则不对原字符串做任何修改,同时如果p_pStrNew
  1126. // 也不为空,则将p_pStrNew置为一个空字符串
  1127. void TrimRight(char* p_pStrOld, char* p_pStrNew = NULL)
  1128. {
  1129. //如果操作字符串为空则直接返回
  1130. if (p_pStrOld == NULL || strlen(p_pStrOld) <= 0)
  1131. {
  1132. if (p_pStrNew != NULL)
  1133. p_pStrNew[0] = '\0';
  1134. return;
  1135. }
  1136. //临时存储字符串
  1137. char* f_pTempStr = (char*)malloc(sizeof(char)*(strlen(p_pStrOld)+1));
  1138. memset(f_pTempStr, 0, sizeof(char)*(strlen(p_pStrOld)+1));
  1139. //拷贝原操作字符串
  1140. strcpy(f_pTempStr, p_pStrOld);
  1141. //循环去除右边的空白符
  1142. for (int i=strlen(f_pTempStr)-1; i>=0&&is_white_char_(f_pTempStr[i]); f_pTempStr[i--]='\0');
  1143. //产生输出
  1144. if (p_pStrNew == NULL)
  1145. strcpy(p_pStrOld, f_pTempStr);
  1146. else
  1147. strcpy(p_pStrNew, f_pTempStr);
  1148. //释放临时字符串空间
  1149. free(f_pTempStr);
  1150. }
  1151. //功能:去除左右两边的空白符
  1152. //参数:p_pStrOld : 要操作的字符串
  1153. // p_pStrNew : 如果为null则修改作用于p_pStrOld,否则通过p_pStrNew返回
  1154. //备注:如果p_pStrOld为空指针或空字符串,则不对原字符串做任何修改,同时如果p_pStrNew
  1155. // 也不为空,则将p_pStrNew置为一个空字符串
  1156. void TrimLR(char* p_pStrOld, char* p_pStrNew = NULL)
  1157. {
  1158. //如果操作字符串为空则直接返回
  1159. if (p_pStrOld == NULL || strlen(p_pStrOld) <= 0)
  1160. {
  1161. if (p_pStrNew != NULL)
  1162. p_pStrNew[0] = '\0';
  1163. return;
  1164. }
  1165. //临时存储字符串
  1166. char* f_pTempStr = (char*)malloc(sizeof(char)*(strlen(p_pStrOld)+1));
  1167. memset(f_pTempStr, 0, sizeof(char)*(strlen(p_pStrOld)+1));
  1168. //拷贝原操作字符串
  1169. strcpy(f_pTempStr, p_pStrOld);
  1170. //去除左边空格
  1171. TrimLeft(f_pTempStr);
  1172. //去除右边空格
  1173. TrimRight(f_pTempStr);
  1174. //产生输出
  1175. if (p_pStrNew == NULL)
  1176. strcpy(p_pStrOld, f_pTempStr);
  1177. else
  1178. strcpy(p_pStrNew, f_pTempStr);
  1179. //释放临时字符串空间
  1180. free(f_pTempStr);
  1181. }
  1182. //功能:去除字符串里的所有空白符
  1183. //参数:p_pStrOld : 要操作的字符串
  1184. // p_pStrNew : 如果为null则修改作用于p_pStrOld,否则通过p_pStrNew返回
  1185. //备注:如果p_pStrOld为空指针或空字符串,则不对原字符串做任何修改,同时如果p_pStrNew
  1186. // 也不为空,则将p_pStrNew置为一个空字符串
  1187. void TrimAll(char* p_pStrOld, char* p_pStrNew = NULL)
  1188. {
  1189. //如果操作字符串为空则直接返回
  1190. if (p_pStrOld == NULL || strlen(p_pStrOld) <= 0)
  1191. {
  1192. if (p_pStrNew != NULL)
  1193. p_pStrNew[0] = '\0';
  1194. return;
  1195. }
  1196. //临时存储字符串
  1197. char* f_pTempStr = (char*)malloc(sizeof(char)*(strlen(p_pStrOld)+1));
  1198. memset(f_pTempStr, 0, sizeof(char)*(strlen(p_pStrOld)+1));
  1199. //拷贝非空白字符
  1200. int f_iIdx = 0;
  1201. for (unsigned int i=0; i<strlen(p_pStrOld); i++)
  1202. if (!is_white_char_(p_pStrOld[i]))
  1203. f_pTempStr[f_iIdx++] = p_pStrOld[i];
  1204. //产生输出
  1205. if (p_pStrNew == NULL)
  1206. strcpy(p_pStrOld, f_pTempStr);
  1207. else
  1208. strcpy(p_pStrNew, f_pTempStr);
  1209. //释放临时字符串空间
  1210. free(f_pTempStr);
  1211. }
  1212. //功能:分隔字符串
  1213. //参数:p_pStrOld : 要操作的字符串
  1214. // p_pSpliter : 分隔字符串
  1215. // p_ppResult : 指针数组,保存分割后的各个字符串地址
  1216. //备注:1. 如果p_pStrOld为空指针或空字符串,则不会产生任何输出
  1217. // 2. 如果p_pSpliter为空指针或空字符串,则不会产生任何输出
  1218. // 3. 指针数组p_ppResult指向分割后的各字符串指针,以NULL结束,
  1219. // 因此如果分割得到n个字符串则该数组大小应为n+1
  1220. // 4. 指针数组p_ppResult应由外部保证传入时已将所有元素初始化为NULL
  1221. // 5. p_ppResult各元素所指向的内存数据需要调用FreeSplitOut方法来释放,
  1222. // 将p_ppResult[0]指针值传给FreeSplitOut函数即可完成释放
  1223. // 6. 假设用"A"来分割字符串"12A34A",则分割后应得到"12"/"34"/"",
  1224. // 但因为最后一个字符串是空字符串,所以最终返回的只有"12"/"34",
  1225. // 有如"12AA",最后得到的字符串也只有"12"
  1226. void Split(char* p_pStrOld, char* p_pSpliter, char* p_ppResult[])
  1227. {
  1228. //如果p_pStrOld为空指针或空字符串则直接返回
  1229. if (p_pStrOld == NULL || strlen(p_pStrOld) <= 0)
  1230. return;
  1231. //如果p_pSpliter为空指针或空字符串则直接返回
  1232. if (p_pSpliter == NULL || strlen(p_pSpliter) <= 0)
  1233. return;
  1234. //操作字符串长度
  1235. unsigned int f_uiStrOldLen = strlen(p_pStrOld);
  1236. //分隔字符串长度
  1237. unsigned int f_uiSpliterLen = strlen(p_pSpliter);
  1238. //输出字符串,分隔开的各字符串统一存储在该连续的空间上,而由不同的字符串指针来标识
  1239. char* f_pOutStr = (char*)malloc(sizeof(char)*(f_uiStrOldLen*2));
  1240. memset(f_pOutStr, 0, sizeof(char)*(f_uiStrOldLen*2));
  1241. //当前已填充到f_pOutStr的索引值
  1242. int f_iOutStrIdx = 0;
  1243. //已分隔开的字符串个数
  1244. int f_iResultNum = 0;
  1245. //已查找过的字符串下标索引值
  1246. int f_iStrOldIdx = 0;
  1247. //循环查找p_pSpliter出现位置
  1248. for (char* p=NULL; ((unsigned int)f_iStrOldIdx)<f_uiStrOldLen;)
  1249. {
  1250. //新分隔开的字符串长度
  1251. unsigned int f_uiNewStrLen = 0;
  1252. //查找下一个分隔字符串
  1253. p = strstr(p_pStrOld+f_iStrOldIdx, p_pSpliter);
  1254. //如果没找到分隔字符串说明剩余的全部都需要拷贝
  1255. if (p == NULL)
  1256. f_uiNewStrLen = strlen(p_pStrOld+f_iStrOldIdx);
  1257. //如果找到分隔字符串说明只拷贝间隔部分
  1258. else
  1259. f_uiNewStrLen = p - (p_pStrOld+f_iStrOldIdx);
  1260. //拷贝的前提是不为空字符串
  1261. if (f_uiNewStrLen > 0)
  1262. {
  1263. //记录第n个分隔开的字符串指针地址
  1264. p_ppResult[f_iResultNum++] = f_pOutStr+f_iOutStrIdx;
  1265. //拷贝第n个分隔开的字符串
  1266. memcpy(f_pOutStr+f_iOutStrIdx, p_pStrOld+f_iStrOldIdx, f_uiNewStrLen);
  1267. //更新输出字符串连续地址的索引值,注意需要多向后移一位以保证有'\0'存在
  1268. f_iOutStrIdx += (f_uiNewStrLen+1);
  1269. }
  1270. //更新下一次查找的起始位置
  1271. f_iStrOldIdx += (f_uiNewStrLen+(p==NULL?0:f_uiSpliterLen));
  1272. }
  1273. //如果没有产生输出,则要将f_pOutStr释放,否则由外部来进行释放
  1274. if (p_ppResult[0] == NULL)
  1275. free(f_pOutStr);
  1276. }
  1277. //功能:分隔字符串,该字符串以0x00分隔以两个0x00结束
  1278. //参数:p_pStrOld : 要操作的字符串
  1279. // p_ppResult : 指针数组,保存分割后的各个字符串地址
  1280. // p_iStrOldMaxLen : 要操作的字符串最大可能长度,默认为10k
  1281. //备注:1. 指针数组p_ppResult指向分割后的各字符串指针,以NULL结束,
  1282. // 因此如果分割得到n个字符串则该数组大小应为n+1
  1283. // 2. 指针数组p_ppResult应由外部保证传入时已将所有元素初始化为NULL
  1284. // 3. p_ppResult各元素所指向的内存数据需要调用FreeSplitOut方法来释放,
  1285. // 将p_ppResult[0]指针值传给FreeSplitOut函数即可完成释放
  1286. //返回:分隔后的串数
  1287. int Split_00(char* p_pStrOld, char* p_ppResult[], int p_iStrOldMaxLen = 1024*10)
  1288. {
  1289. //输出字符串,分隔开的各字符串统一存储在该连续的空间上,而由不同的字符串指针来标识
  1290. char* f_pOutStr = (char*)malloc(sizeof(char)*(p_iStrOldMaxLen*2));
  1291. memset(f_pOutStr, 0, sizeof(char)*(p_iStrOldMaxLen*2));
  1292. //已查找过的字符串下标索引值
  1293. int f_iStrOldIdx = 0;
  1294. //当前已填充到f_pOutStr的索引值
  1295. int f_iOutStrIdx = 0;
  1296. //新分隔开的字符串长度
  1297. unsigned int f_uiNewStrLen = 0;
  1298. //已分隔开的字符串个数
  1299. int f_iResultNum = 0;
  1300. //循环获取各字符串
  1301. for ( ;
  1302. ( p_pStrOld != NULL ) &&
  1303. ( f_iStrOldIdx == 0
  1304. ? !( *(p_pStrOld+f_iStrOldIdx) == NULL && *(p_pStrOld+f_iStrOldIdx+1) == NULL )
  1305. : 1 ) &&
  1306. ( f_iStrOldIdx != 0
  1307. ? !( *(p_pStrOld+f_iStrOldIdx) == NULL )
  1308. : 1 ) &&
  1309. ( f_uiNewStrLen = strlen(p_pStrOld+f_iStrOldIdx), 1 )
  1310. ;
  1311. ( f_uiNewStrLen > 0
  1312. ? ( p_ppResult[f_iResultNum++] = f_pOutStr+f_iOutStrIdx ,
  1313. memcpy(f_pOutStr+f_iOutStrIdx, p_pStrOld+f_iStrOldIdx, f_uiNewStrLen) ,
  1314. f_iOutStrIdx += (f_uiNewStrLen+1) ,
  1315. f_iStrOldIdx += (f_uiNewStrLen+1) )
  1316. : ( f_iStrOldIdx += (f_uiNewStrLen+1) )
  1317. )
  1318. );
  1319. //如果没有产生输出,则要将f_pOutStr释放,否则由外部来进行释放
  1320. if (p_ppResult == NULL || p_ppResult[0] == NULL)
  1321. free(f_pOutStr);
  1322. //返回
  1323. return f_iResultNum;
  1324. }
  1325. //功能:分隔Unicode字符串,该字符串以0x0000分隔以两个0x0000结束
  1326. //参数:p_pStrOld : 要操作的Unicode字符串
  1327. // p_ppResult : 指针数组,保存分割后的各个Unicode字符串地址
  1328. // p_iStrOldMaxLen : 要操作的Unicode字符串最大可能长度,默认为10k
  1329. //备注:1. 指针数组p_ppResult指向分割后的Unicode各字符串指针,以NULL结束,
  1330. // 因此如果分割得到n个Unicode字符串则该数组大小应为n+1
  1331. // 2. 指针数组p_ppResult应由外部保证传入时已将所有元素初始化为NULL
  1332. // 3. p_ppResult各元素所指向的内存数据需要调用FreeSplitOut方法来释放,
  1333. // 将p_ppResult[0]指针值传给FreeSplitOut函数即可完成释放
  1334. //返回:分隔后的串数
  1335. int SplitW_00(wchar_t* p_pStrOld, wchar_t* p_ppResult[], int p_iStrOldMaxLen = 1024*10)
  1336. {
  1337. //输出字符串,分隔开的各字符串统一存储在该连续的空间上,而由不同的字符串指针来标识
  1338. wchar_t* f_pOutStr = (wchar_t*)malloc(sizeof(wchar_t)*(p_iStrOldMaxLen*2));
  1339. memset(f_pOutStr, 0, sizeof(wchar_t)*(p_iStrOldMaxLen*2));
  1340. //已查找过的字符串下标索引值
  1341. int f_iStrOldIdx = 0;
  1342. //当前已填充到f_pOutStr的索引值
  1343. int f_iOutStrIdx = 0;
  1344. //新分隔开的字符串长度
  1345. unsigned int f_uiNewStrLen = 0;
  1346. //已分隔开的字符串个数
  1347. int f_iResultNum = 0;
  1348. //循环获取各字符串
  1349. for ( ;
  1350. ( p_pStrOld != NULL ) &&
  1351. ( f_iStrOldIdx == 0
  1352. ? !( *(p_pStrOld+f_iStrOldIdx) == NULL && *(p_pStrOld+f_iStrOldIdx+1) == NULL )
  1353. : 1 ) &&
  1354. ( f_iStrOldIdx != 0
  1355. ? !( *(p_pStrOld+f_iStrOldIdx) == NULL )
  1356. : 1 ) &&
  1357. ( f_uiNewStrLen = wcslen(p_pStrOld+f_iStrOldIdx), 1 )
  1358. ;
  1359. ( f_uiNewStrLen > 0
  1360. ? ( p_ppResult[f_iResultNum++] = f_pOutStr+f_iOutStrIdx ,
  1361. wmemcpy(f_pOutStr+f_iOutStrIdx, p_pStrOld+f_iStrOldIdx, f_uiNewStrLen) ,
  1362. f_iOutStrIdx += (f_uiNewStrLen+1) ,
  1363. f_iStrOldIdx += (f_uiNewStrLen+1) )
  1364. : ( f_iStrOldIdx += (f_uiNewStrLen+1) )
  1365. )
  1366. );
  1367. //如果没有产生输出,则要将f_pOutStr释放,否则由外部来进行释放
  1368. if (p_ppResult == NULL || p_ppResult[0] == NULL)
  1369. free(f_pOutStr);
  1370. //返回
  1371. return f_iResultNum;
  1372. }
  1373. //功能:释放Split/Split_00/SplitW_00方法产生的p_ppResult输出
  1374. //参数:p_pMem : 要释放的地址值
  1375. //备注:调用Split后输出参数为分隔开的各字符串地址,要释放这些字符串
  1376. // 的内存只需将p_ppResult[0]的值作为参数传入即可完成全部内存的释放,
  1377. // 另外,释放一个NULL地址值不会出错
  1378. void FreeSplitOut(void* p_pMem)
  1379. {
  1380. free(p_pMem);
  1381. }
  1382. private:
  1383. //判断一个字符是否是空白符,为真则返回1,为假则返回0
  1384. int is_white_char_(char p_cChar)
  1385. {
  1386. for (unsigned int i=0; i<strlen(m_pWhiteChar); i++)
  1387. if (p_cChar == m_pWhiteChar[i])
  1388. return 1;
  1389. return 0;
  1390. }
  1391. private:
  1392. //空白字符合集
  1393. char m_pWhiteChar[10];
  1394. };
  1395. typedef struct __ini_item__
  1396. {
  1397. string Key;
  1398. string Value;
  1399. string Note;
  1400. }INIITEM,*LPINIITEM;
  1401. typedef struct __ini_grop__
  1402. {
  1403. string name;
  1404. string Note;
  1405. list<INIITEM> Items;
  1406. }INIGROP,*LPINIGROP;
  1407. //INI文件读写
  1408. class UFS_Stream_INI
  1409. {
  1410. public:
  1411. //**********
  1412. //该构造器将读取参数 iniPath 传入的文件信息,来获取INI配置信息,
  1413. //INI文件编写方式如下
  1414. // [NTFKV2CF]
  1415. // DeviceDll=libCardReader.so;注释so库名称
  1416. // StatusTime=2000;状态轮询时间
  1417. // OpenReset=0
  1418. UFS_Stream_INI(const char* iniPath)
  1419. {
  1420. list_name.clear();
  1421. if(!iniPath) return ;
  1422. ifstream fin;
  1423. fin.open(iniPath);
  1424. if(fin.fail())return;
  1425. string strBuff = "";
  1426. string desBuff = "";
  1427. char tmpChar ;
  1428. while(!fin.eof())
  1429. {
  1430. // 逐行读取并解析
  1431. strBuff = "";
  1432. while(!fin.eof())
  1433. {
  1434. tmpChar = static_cast<char>(fin.get());
  1435. if(fin.eof())
  1436. break;
  1437. // 如果是换行或者回车则一整行读取完毕
  1438. if(tmpChar == static_cast<char>(10) ||
  1439. tmpChar == static_cast<char>(13) ||
  1440. tmpChar == static_cast<char>(EOF))
  1441. break;
  1442. strBuff += tmpChar;
  1443. }
  1444. if(strBuff.length() < 1 || strBuff[0] == note)
  1445. continue;
  1446. //剔除字符串前后的空格
  1447. TrimItem(strBuff,desBuff);
  1448. //cout<<desBuff<<endl;
  1449. INIGROP ini_grop;
  1450. ini_grop.name = "";
  1451. ini_grop.Note = "";
  1452. ini_grop.Items.clear();
  1453. //解析键名
  1454. if(ParseGroup(desBuff,&ini_grop))
  1455. {
  1456. list_name.push_back(ini_grop);
  1457. continue;
  1458. }
  1459. INIITEM ini_item;
  1460. ini_item.Key = "";
  1461. ini_item.Value = "";
  1462. ini_item.Note = "";
  1463. //解析键值
  1464. if(ParseItem(desBuff,&ini_item))
  1465. {
  1466. list_name.back().Items.push_back(ini_item);
  1467. continue;
  1468. }
  1469. }
  1470. fin.close();
  1471. bFlag = true;
  1472. }
  1473. virtual ~UFS_Stream_INI()
  1474. {
  1475. list_name.clear();
  1476. }
  1477. //功能:数据读取
  1478. //参数:lpAppName : 要操作的节名
  1479. // lpKeyName : 要操作的键名
  1480. // lpDefault :如果lpRetrunString为空,则把个变量赋给lpRetrunString
  1481. // lpRetrunString :存放键值的指针变量,用于接收INI文件中键值(数据)的接收缓冲区
  1482. //返回值 :
  1483. // lpRetrunString数据长度
  1484. int GetPrivateProfileString(LPSTR lpAppName,LPSTR lpKeyName,LPSTR lpDefault,LPSTR lpRetrunString)
  1485. {
  1486. if(!bFlag) return -1;
  1487. bool bFindFlag = false;
  1488. //查找组名
  1489. for(list_name_it = list_name.begin();list_name_it != list_name.end();++list_name_it)
  1490. {
  1491. if(!strcmp((char*)lpAppName,(*list_name_it).name.c_str())){
  1492. bFindFlag = true;
  1493. break;
  1494. }
  1495. }
  1496. if(!bFindFlag) return -1;
  1497. //cout<<(*list_name_it).name.c_str()<<endl;
  1498. bFindFlag = false;
  1499. //获取键名键值
  1500. for(list_item_it = (*list_name_it).Items.begin();
  1501. list_item_it != (*list_name_it).Items.end();
  1502. ++list_item_it)
  1503. {
  1504. //cout<<(*list_item_it).Key<<"++"<<(*list_item_it).Value<<"--"<<(*list_item_it).Note<<endl;
  1505. if(!strcmp((char*)lpKeyName,(*list_item_it).Key.c_str()))
  1506. {
  1507. //cout<<(*list_item_it).Key<<endl;
  1508. bFindFlag =true;
  1509. break;
  1510. }
  1511. }
  1512. //std::cout<<"name"<<(*list_item_it).Key<<"==>"<<(*list_item_it).Value<<endl;
  1513. if(bFindFlag)
  1514. memcpy(lpRetrunString,(*list_item_it).Value.c_str(),(*list_item_it).Value.length());
  1515. else
  1516. memcpy(lpRetrunString,lpDefault,strlen((char*)lpDefault));
  1517. return strlen((char*)lpRetrunString);
  1518. }
  1519. //写文件方式待续。。。
  1520. private:
  1521. list<INIGROP> list_name;
  1522. list<INIGROP>::iterator list_name_it;
  1523. list<INIITEM>::iterator list_item_it;
  1524. //注释标志
  1525. char note = ';';
  1526. bool bFlag = false;
  1527. //剔除字符串前后的空格
  1528. static void TrimItem(const string& str,string& dst)
  1529. {
  1530. int ilen = str.length();
  1531. if(ilen<1)return ;
  1532. //剔除前端的空格
  1533. int iStart = 0;
  1534. while(str[iStart] == ' ')
  1535. ++iStart;
  1536. if(iStart>str.length())
  1537. {
  1538. dst = "";
  1539. return ;
  1540. }
  1541. int iEnd = ilen;
  1542. if(iEnd >= str.length())
  1543. iEnd = str.length();
  1544. //剔除后端的空格
  1545. while(str[iEnd - 1] == ' ' && iEnd > iStart)
  1546. --iEnd;
  1547. // 如果字符串包含在 "" 中则提取出来
  1548. if(str[iStart] == '\"' && str[iEnd - 1] == '\"')
  1549. {
  1550. ++iStart;
  1551. --iEnd;
  1552. }
  1553. dst = str.substr(iStart, iEnd - iStart);
  1554. }
  1555. //解析分组
  1556. static bool ParseGroup(const string& str ,LPINIGROP lpIniGrop,char note = ';' )
  1557. {
  1558. if(str.empty()) return false;
  1559. string::size_type left = str.find('[');
  1560. // 没有找到[号
  1561. if(left == string::npos)
  1562. return false;
  1563. string::size_type right = str.rfind(']');
  1564. if(right == string::npos)return false;
  1565. if(right < left)return false;
  1566. left++;
  1567. lpIniGrop->name = str.substr(left, right - left);
  1568. string::size_type tag = str.find(note);
  1569. if(tag != string::npos && tag > right)
  1570. {
  1571. ++tag;
  1572. lpIniGrop->Note = str.substr(tag, str.length() - tag);
  1573. }
  1574. return true;
  1575. }
  1576. //解析元素
  1577. static bool ParseItem(const string& str ,LPINIITEM lpIniItem,char note = ';' )
  1578. {
  1579. if(str.empty()) return false;
  1580. string tempKey = "";
  1581. string tempValue = "";
  1582. string tempNote = "";
  1583. string::size_type pos = str.find('=');//查找 = 位置
  1584. string::size_type right = str.length();//获取数据长度
  1585. string::size_type cnote = str.find(note);
  1586. //未找到 “=”
  1587. if((pos == string::npos)||(pos == 0))return false;
  1588. if((cnote!=string::npos)&&(cnote<=pos))return false;
  1589. tempKey= str.substr(0,pos);
  1590. ++pos;
  1591. if(cnote != string::npos)
  1592. {
  1593. tempValue = str.substr(pos,cnote-pos);
  1594. ++cnote;
  1595. tempNote = str.substr(cnote,right - cnote);
  1596. }
  1597. else
  1598. tempValue = str.substr(pos,right - pos);
  1599. //cout<<tempKey<<"--"<<tempValue<<"++"<<tempNote<<endl;
  1600. int i_not_pos_start = 0;int i_not_pos_end = 0;
  1601. i_not_pos_start = tempKey.find_first_not_of(" ");
  1602. i_not_pos_end = tempKey.find_last_not_of(" ");
  1603. if((i_not_pos_start >= i_not_pos_end))lpIniItem->Key = "";
  1604. else lpIniItem->Key = str.substr(i_not_pos_start,i_not_pos_end - i_not_pos_start +1);
  1605. i_not_pos_start = tempValue.find_first_not_of(" ");
  1606. i_not_pos_end = tempValue.find_last_not_of(" ");
  1607. if((i_not_pos_start >= i_not_pos_end))
  1608. lpIniItem->Value = "";
  1609. else lpIniItem->Value = tempValue.substr(i_not_pos_start,i_not_pos_end - i_not_pos_start +1);
  1610. i_not_pos_start = tempNote.find_first_not_of(" ");
  1611. i_not_pos_end = tempNote.find_last_not_of(" ");
  1612. if((i_not_pos_start >= i_not_pos_end))
  1613. lpIniItem->Note = "";
  1614. else lpIniItem->Note = tempNote.substr(i_not_pos_start,i_not_pos_end - i_not_pos_start +1);
  1615. return true;
  1616. }
  1617. };
  1618. #endif