StrUtils.cpp
上传用户:woshihumen
上传日期:2013-07-18
资源大小:484k
文件大小:15k
源码类别:

Email服务器

开发平台:

Visual C++

  1. /*
  2.  *  XMail by Davide Libenzi ( Intranet and Internet mail server )
  3.  *  Copyright (C) 1999,..,2004  Davide Libenzi
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  *  Davide Libenzi <davidel@xmailserver.org>
  20.  *
  21.  */
  22. #include "SysInclude.h"
  23. #include "SysDep.h"
  24. #include "SvrDefines.h"
  25. #include "StrUtils.h"
  26. #define INVCHAR             '^'
  27. #define LoChar(c)           ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a'): (c))
  28. #define MIN_DYNSTR_INCR     256
  29. int StrCmdLineToken(char const *&pszCmdLine, char *pszToken)
  30. {
  31. char const *pszCurr = pszCmdLine;
  32. for (; (*pszCurr == ' ') || (*pszCurr == 't'); pszCurr++);
  33. if (*pszCurr == '')
  34. return (ERR_NO_MORE_TOKENS);
  35. if (*pszCurr == '"') {
  36. ++pszCurr;
  37. for (; *pszCurr != '';) {
  38. if (*pszCurr == '"') {
  39. ++pszCurr;
  40. if (*pszCurr != '"')
  41. break;
  42. *pszToken++ = *pszCurr++;
  43. } else
  44. *pszToken++ = *pszCurr++;
  45. }
  46. *pszToken = '';
  47. } else {
  48. for (; (*pszCurr != ' ') && (*pszCurr != 't') && (*pszCurr != '');)
  49. *pszToken++ = *pszCurr++;
  50. *pszToken = '';
  51. }
  52. pszCmdLine = pszCurr;
  53. return (0);
  54. }
  55. char **StrGetArgs(char const *pszCmdLine, int &iArgsCount)
  56. {
  57. char const *pszCLine = pszCmdLine;
  58. char szToken[1024] = "";
  59. for (iArgsCount = 0; StrCmdLineToken(pszCLine, szToken) == 0; iArgsCount++);
  60. char **ppszArgs = (char **) SysAlloc((iArgsCount + 1) * sizeof(char *));
  61. if (ppszArgs == NULL)
  62. return (NULL);
  63. int ii = 0;
  64. for (pszCLine = pszCmdLine;
  65.      (ii < iArgsCount) && (StrCmdLineToken(pszCLine, szToken) == 0); ii++)
  66. ppszArgs[ii] = SysStrDup(szToken);
  67. ppszArgs[ii] = NULL;
  68. return (ppszArgs);
  69. }
  70. char *StrLower(char *pszString)
  71. {
  72. char *pszCurr = pszString;
  73. for (; *pszCurr != ''; pszCurr++)
  74. if ((*pszCurr >= 'A') && (*pszCurr <= 'Z'))
  75. *pszCurr = 'a' + (*pszCurr - 'A');
  76. return (pszString);
  77. }
  78. char *StrUpper(char *pszString)
  79. {
  80. char *pszCurr = pszString;
  81. for (; *pszCurr != ''; pszCurr++)
  82. if ((*pszCurr >= 'a') && (*pszCurr <= 'z'))
  83. *pszCurr = 'A' + (*pszCurr - 'a');
  84. return (pszString);
  85. }
  86. char *StrCrypt(char const *pszString, char *pszCrypt)
  87. {
  88. SetEmptyString(pszCrypt);
  89. for (int ii = 0; pszString[ii] != ''; ii++) {
  90. unsigned int uChar = (unsigned int) pszString[ii];
  91. char szByte[32] = "";
  92. sprintf(szByte, "%02x", (uChar ^ 101) & 0xff);
  93. strcat(pszCrypt, szByte);
  94. }
  95. return (pszCrypt);
  96. }
  97. char *StrDeCrypt(char const *pszString, char *pszDeCrypt)
  98. {
  99. int iStrLength = strlen(pszString);
  100. SetEmptyString(pszDeCrypt);
  101. if ((iStrLength % 2) != 0)
  102. return (NULL);
  103. int ii;
  104. for (ii = 0; ii < iStrLength; ii += 2) {
  105. char szByte[8] = "";
  106. szByte[0] = pszString[ii];
  107. szByte[1] = pszString[ii + 1];
  108. szByte[2] = '';
  109. unsigned int uChar = 0;
  110. if (sscanf(szByte, "%x", &uChar) != 1)
  111. return (NULL);
  112. pszDeCrypt[ii >> 1] = (char) ((uChar ^ 101) & 0xff);
  113. }
  114. pszDeCrypt[ii >> 1] = '';
  115. return (pszDeCrypt);
  116. }
  117. char **StrBuildList(char const *pszString, ...)
  118. {
  119. int iNumString = 1;
  120. char const *pszArg = NULL;
  121. va_list Args;
  122. va_start(Args, pszString);
  123. while ((pszArg = va_arg(Args, char *)) != NULL)
  124. ++iNumString;
  125. va_end(Args);
  126. int iStrCurr = 0;
  127. char **ppszStrings = (char **) SysAlloc((iNumString + 1) * sizeof(char *));
  128. if (ppszStrings == NULL)
  129. return (NULL);
  130. ppszStrings[iStrCurr++] = SysStrDup(pszString);
  131. va_start(Args, pszString);
  132. while ((pszArg = va_arg(Args, char *)) != NULL)
  133.  ppszStrings[iStrCurr++] = SysStrDup(pszArg);
  134. va_end(Args);
  135. ppszStrings[iStrCurr] = NULL;
  136. return (ppszStrings);
  137. }
  138. char **StrTokenize(const char *pszString, const char *pszTokenizer)
  139. {
  140. char *pszBuffer = SysStrDup(pszString);
  141. if (pszBuffer == NULL)
  142. return (NULL);
  143. int iTokenCount = 0;
  144. char *pszToken = NULL;
  145. char *pszSavePtr = NULL;
  146. pszToken = SysStrTok(pszBuffer, pszTokenizer, &pszSavePtr);
  147. while (pszToken != NULL) {
  148. ++iTokenCount;
  149. pszToken = SysStrTok(NULL, pszTokenizer, &pszSavePtr);
  150. }
  151. char **ppszTokens = (char **) SysAlloc((iTokenCount + 1) * sizeof(char *));
  152. if (ppszTokens == NULL) {
  153. SysFree(pszBuffer);
  154. return (NULL);
  155. }
  156. strcpy(pszBuffer, pszString);
  157. iTokenCount = 0;
  158. pszToken = SysStrTok(pszBuffer, pszTokenizer, &pszSavePtr);
  159. while (pszToken != NULL) {
  160. ppszTokens[iTokenCount++] = SysStrDup(pszToken);
  161. pszToken = SysStrTok(NULL, pszTokenizer, &pszSavePtr);
  162. }
  163. ppszTokens[iTokenCount] = NULL;
  164. SysFree(pszBuffer);
  165. return (ppszTokens);
  166. }
  167. void StrFreeStrings(char **ppszStrings)
  168. {
  169. for (int ii = 0; ppszStrings[ii] != NULL; ii++)
  170. SysFree(ppszStrings[ii]);
  171. SysFree(ppszStrings);
  172. }
  173. int StrStringsCount(char const *const *ppszStrings)
  174. {
  175. int ii;
  176. for (ii = 0; ppszStrings[ii] != NULL; ii++);
  177. return (ii);
  178. }
  179. bool StrStringsMatch(char const *const *ppszStrings, char const *pszMatch)
  180. {
  181. int ii;
  182. for (ii = 0; ppszStrings[ii] != NULL; ii++)
  183. if (strcmp(ppszStrings[ii], pszMatch) == 0)
  184. return (true);
  185. return (false);
  186. }
  187. bool StrStringsIMatch(char const *const *ppszStrings, char const *pszMatch)
  188. {
  189. int ii;
  190. for (ii = 0; ppszStrings[ii] != NULL; ii++)
  191. if (stricmp(ppszStrings[ii], pszMatch) == 0)
  192. return (true);
  193. return (false);
  194. }
  195. bool StrStringsRIWMatch(char const *const *pszMatches, char const *pszString)
  196. {
  197. int ii;
  198. for (ii = 0; pszMatches[ii] != NULL; ii++)
  199. if (StrIWildMatch(pszString, pszMatches[ii]))
  200. return (true);
  201. return (false);
  202. }
  203. char *StrConcat(char const *const *ppszStrings, char const *pszCStr)
  204. {
  205. int ii;
  206. int iStrCount = StrStringsCount(ppszStrings);
  207. int iCStrLength = strlen(pszCStr);
  208. int iSumLength = 0;
  209. for (ii = 0; ii < iStrCount; ii++)
  210. iSumLength += strlen(ppszStrings[ii]) + iCStrLength;
  211. char *pszConcat = (char *) SysAlloc(iSumLength + 1);
  212. if (pszConcat == NULL)
  213. return (NULL);
  214. SetEmptyString(pszConcat);
  215. for (ii = 0; ii < iStrCount; ii++) {
  216. if (ii > 0)
  217. strcat(pszConcat, pszCStr);
  218. strcat(pszConcat, ppszStrings[ii]);
  219. }
  220. return (pszConcat);
  221. }
  222. char *StrDeQuote(char *pszString, int iChar)
  223. {
  224. if (*pszString == iChar) {
  225. int ii;
  226. for (ii = 1; (pszString[ii] != '') && (pszString[ii] != iChar); ii++)
  227. pszString[ii - 1] = pszString[ii];
  228. pszString[ii - 1] = '';
  229. }
  230. return (pszString);
  231. }
  232. char *StrQuote(const char *pszString, int iChar)
  233. {
  234. int iStrLen = strlen(pszString);
  235. char *pszBuffer = (char *) SysAlloc(3 + iStrLen);
  236. if (pszBuffer == NULL)
  237. return (NULL);
  238. pszBuffer[0] = (char) iChar;
  239. memcpy(pszBuffer + 1, pszString, iStrLen);
  240. pszBuffer[iStrLen + 1] = (char) iChar;
  241. pszBuffer[iStrLen + 2] = '';
  242. return (pszBuffer);
  243. }
  244. char **StrGetTabLineStrings(const char *pszUsrLine)
  245. {
  246. char **ppszStrings = StrTokenize(pszUsrLine, "t");
  247. if (ppszStrings == NULL)
  248. return (NULL);
  249. for (int ii = 0; ppszStrings[ii] != NULL; ii++)
  250. StrDeQuote(ppszStrings[ii], '"');
  251. return (ppszStrings);
  252. }
  253. int StrWriteCRLFString(FILE * pFile, const char *pszString)
  254. {
  255. unsigned int uStrLength = strlen(pszString);
  256. if ((uStrLength != 0) && (fwrite(pszString, uStrLength, 1, pFile) == 0)) {
  257. ErrSetErrorCode(ERR_FILE_WRITE);
  258. return (ERR_FILE_WRITE);
  259. }
  260. fputs("rn", pFile);
  261. return (0);
  262. }
  263. int StrWildMatch(char const *pszString, char const *pszMatch)
  264. {
  265. int iPrev;
  266. int iMatched;
  267. int iReverse;
  268. int iEscape;
  269. for (; *pszMatch; pszString++, pszMatch++) {
  270. switch (*pszMatch) {
  271. case ('\'):
  272. if (!*++pszMatch)
  273. return (0);
  274. default:
  275. if (*pszString != *pszMatch)
  276. return (0);
  277. continue;
  278. case ('?'):
  279. if (*pszString == '')
  280. return (0);
  281. continue;
  282. case ('*'):
  283. while (*(++pszMatch) == '*');
  284. if (!*pszMatch)
  285. return (1);
  286. while (*pszString)
  287. if (StrWildMatch(pszString++, pszMatch))
  288. return (1);
  289. return (0);
  290. case ('['):
  291. iEscape = 0;
  292. iReverse = (pszMatch[1] == INVCHAR) ? 1 : 0;
  293. if (iReverse)
  294. pszMatch++;
  295. for (iPrev = 256, iMatched = 0; *++pszMatch &&
  296.      (iEscape || (*pszMatch != ']')); iPrev = iEscape ? iPrev : *pszMatch)
  297. {
  298. if (!iEscape && (iEscape = *pszMatch == '\'))
  299. continue;
  300. if (!iEscape && (*pszMatch == '-')) {
  301. if (!*++pszMatch)
  302. return (0);
  303. if (*pszMatch == '\')
  304. if (!*++pszMatch)
  305. return (0);
  306. iMatched = iMatched || ((*pszString <= *pszMatch) &&
  307. (*pszString >= iPrev));
  308. } else
  309. iMatched = iMatched || (*pszString == *pszMatch);
  310. iEscape = 0;
  311. }
  312. if ((iPrev == 256) || iEscape || (*pszMatch != ']') ||
  313.     (iMatched == iReverse))
  314. return (0);
  315. continue;
  316. }
  317. }
  318. return ((*pszString == '') ? 1 : 0);
  319. }
  320. int StrIWildMatch(char const *pszString, char const *pszMatch)
  321. {
  322. char *pszLowString = SysStrDup(pszString);
  323. if (pszLowString == NULL)
  324. return (0);
  325. char *pszLowMatch = SysStrDup(pszMatch);
  326. if (pszLowMatch == NULL) {
  327. SysFree(pszLowString);
  328. return (0);
  329. }
  330. StrLower(pszLowString);
  331. StrLower(pszLowMatch);
  332. int iMatchResult = StrWildMatch(pszLowString, pszLowMatch);
  333. SysFree(pszLowMatch);
  334. SysFree(pszLowString);
  335. return (iMatchResult);
  336. }
  337. char *StrLoadFile(FILE * pFile)
  338. {
  339. fseek(pFile, 0, SEEK_END);
  340. unsigned int uFileSize = (unsigned int) ftell(pFile);
  341. char *pszData = (char *) SysAlloc(uFileSize + 1);
  342. if (pszData == NULL)
  343. return (NULL);
  344. fseek(pFile, 0, SEEK_SET);
  345. fread(pszData, uFileSize, 1, pFile);
  346. pszData[uFileSize] = '';
  347. return (pszData);
  348. }
  349. char *StrSprint(char const *pszFormat, ...)
  350. {
  351. char *pszMessage = NULL;
  352. STRSPRINTF(pszMessage, pszFormat, pszFormat);
  353. return (pszMessage);
  354. }
  355. int StrSplitString(char const *pszString, char const *pszSplitters,
  356.    char *pszStrLeft, int iSizeLeft, char *pszStrRight, int iSizeRight)
  357. {
  358. char const *pszSplitChar = NULL;
  359. for (;
  360.      (*pszSplitters != '') &&
  361.      ((pszSplitChar = strchr(pszString, *pszSplitters)) == NULL); ++pszSplitters);
  362. if (pszSplitChar == NULL) {
  363. if (pszStrLeft != NULL)
  364. StrNCpy(pszStrLeft, pszString, iSizeLeft);
  365. if (pszStrRight != NULL)
  366. SetEmptyString(pszStrRight);
  367. } else {
  368. if (pszStrLeft != NULL) {
  369. int iUserLength = (int) (pszSplitChar - pszString);
  370. StrNCpy(pszStrLeft, pszString, Min(iUserLength + 1, iSizeLeft));
  371. }
  372. if (pszStrRight != NULL)
  373. StrNCpy(pszStrRight, pszSplitChar + 1, iSizeRight);
  374. }
  375. return (0);
  376. }
  377. char *StrLTrim(char *pszString, char const *pszTrimChars)
  378. {
  379. int ii;
  380. for (ii = 0; (pszString[ii] != '') && (strchr(pszTrimChars, pszString[ii]) != NULL);
  381.      ii++);
  382. if ((ii > 0) && (pszString[ii] != '')) {
  383. int jj;
  384. for (jj = ii; pszString[jj] != ''; jj++)
  385. pszString[jj - ii] = pszString[jj];
  386. pszString[jj - ii] = pszString[jj];
  387. }
  388. return (pszString);
  389. }
  390. char *StrRTrim(char *pszString, char const *pszTrimChars)
  391. {
  392. int ii = strlen(pszString) - 1;
  393. for (; (ii >= 0) && (strchr(pszTrimChars, pszString[ii]) != NULL); ii--)
  394. pszString[ii] = '';
  395. return (pszString);
  396. }
  397. char *StrTrim(char *pszString, char const *pszTrimChars)
  398. {
  399. return (StrRTrim(StrLTrim(pszString, pszTrimChars), pszTrimChars));
  400. }
  401. char *StrEOLTrim(char *pszString)
  402. {
  403. int iPos = strlen(pszString);
  404. for (; (iPos > 0) && ((pszString[iPos - 1] == 'r') || (pszString[iPos - 1] == 'n'));
  405.      iPos--);
  406. pszString[iPos] = '';
  407. return (pszString);
  408. }
  409. char *StrIStr(char const *pszBuffer, char const *pszMatch)
  410. {
  411. int iMatchLen = strlen(pszMatch);
  412. int iMatchPos = 0;
  413. int iLoMatch = LoChar(*pszMatch);
  414. if (iMatchLen == 0)
  415. return ((char *) pszBuffer);
  416. for (; *pszBuffer != ''; pszBuffer++) {
  417. if (LoChar(*pszBuffer) == iLoMatch) {
  418. if (++iMatchPos == iMatchLen)
  419. return ((char *) pszBuffer - iMatchLen + 1);
  420. iLoMatch = LoChar(pszMatch[iMatchPos]);
  421. } else if (iMatchPos != 0) {
  422. iMatchPos = 0;
  423. iLoMatch = LoChar(*pszMatch);
  424. }
  425. }
  426. return (NULL);
  427. }
  428. int StrDynInit(DynString * pDS)
  429. {
  430. ZeroData(*pDS);
  431. pDS->pszBuffer = SysStrDup("");
  432. pDS->iStringSize = 0;
  433. pDS->iBufferSize = 0;
  434. return (0);
  435. }
  436. int StrDynFree(DynString * pDS)
  437. {
  438. if (pDS->pszBuffer != NULL)
  439. SysFree(pDS->pszBuffer);
  440. ZeroData(*pDS);
  441. return (0);
  442. }
  443. int StrDynTruncate(DynString * pDS)
  444. {
  445. if (pDS->pszBuffer != NULL)
  446. SetEmptyString(pDS->pszBuffer);
  447. pDS->iStringSize = 0;
  448. return (0);
  449. }
  450. char const *StrDynGet(DynString * pDS)
  451. {
  452. return (pDS->pszBuffer);
  453. }
  454. int StrDynSize(DynString * pDS)
  455. {
  456. return (pDS->iStringSize);
  457. }
  458. int StrDynAdd(DynString * pDS, char const *pszBuffer, int iStringSize)
  459. {
  460. if (iStringSize < 0)
  461. iStringSize = strlen(pszBuffer);
  462. if ((pDS->iStringSize + iStringSize) >= pDS->iBufferSize) {
  463. int iNewSize = pDS->iBufferSize + Max(2 * iStringSize, MIN_DYNSTR_INCR);
  464. char *pszNewBuffer = (char *) SysAlloc(iNewSize);
  465. if (pszNewBuffer == NULL)
  466. return (ErrGetErrorCode());
  467. strcpy(pszNewBuffer, pDS->pszBuffer);
  468. SysFree(pDS->pszBuffer);
  469. pDS->pszBuffer = pszNewBuffer;
  470. pDS->iBufferSize = iNewSize;
  471. }
  472. memcpy(pDS->pszBuffer + pDS->iStringSize, pszBuffer, iStringSize);
  473. pDS->iStringSize += iStringSize;
  474. pDS->pszBuffer[pDS->iStringSize] = '';
  475. return (0);
  476. }
  477. int StrParamGet(char const *pszBuffer, char const *pszName, char *pszVal, int iMaxVal)
  478. {
  479. int iNameLen = strlen(pszName), iParamSize;
  480. char const *pszTmp, *pszEnd;
  481. for (pszTmp = pszBuffer; (pszTmp = strstr(pszTmp, pszName)) != NULL; pszTmp++) {
  482. if ((pszTmp > pszBuffer) && (pszTmp[-1] != ','))
  483. continue;
  484. if (pszTmp[iNameLen] != '=')
  485. continue;
  486. pszTmp += iNameLen + 1;
  487. if ((pszEnd = strchr(pszTmp, ',')) == NULL)
  488. pszEnd = pszTmp + strlen(pszTmp);
  489. iParamSize = (int) (pszEnd - pszTmp);
  490. iParamSize = Min(iMaxVal - 1, iParamSize);
  491. Cpy2Sz(pszVal, pszTmp, iParamSize);
  492. return (1);
  493. }
  494. return (0);
  495. }