rtsputil.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:18k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #include "hxstring.h"
  37. #include "dbcs.h"
  38. #include "rtsputil.h"
  39. #include "safestring.h"
  40. #include "hxheap.h"
  41. #ifdef _DEBUG
  42. #undef HX_THIS_FILE
  43. static const char HX_THIS_FILE[] = __FILE__;
  44. #endif
  45. /*
  46.  * Table for encoding base64
  47.  */
  48. static const char Base64[] =
  49.    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  50. /*
  51.  * Table for encoding URL-safe base64
  52.  */
  53. static const char URLBase64[] =
  54.    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!*";
  55. #define XX 127
  56. /*
  57.  * Table for decoding base64
  58.  */
  59. static const char Index64[256] = { /* Flawfinder: ignore */
  60.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  61.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  62.     XX,62,XX,XX, XX,XX,XX,XX, XX,XX,63,62, XX,XX,XX,63,
  63.     52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,XX,XX,XX,
  64.     XX, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
  65.     15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
  66.     XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
  67.     41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX,
  68.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  69.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  70.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  71.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  72.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  73.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  74.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
  75.     XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX
  76. };
  77. #define CHAR64(c)  (Index64[(unsigned char)(c)])
  78. static void 
  79. Output64Chunk(int c1, int c2, int c3, int pads, char* pBuf,
  80.     INT32 bufOffset)
  81. {
  82.     pBuf[bufOffset++] = Base64[c1>>2];
  83.     pBuf[bufOffset++] = Base64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
  84.     if (pads == 2) 
  85.     {
  86.         pBuf[bufOffset++] = '=';
  87.         pBuf[bufOffset++] = '=';
  88.     }
  89.     else if (pads) 
  90.     {
  91.         pBuf[bufOffset++] = Base64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  92.         pBuf[bufOffset++] = '=';
  93.     } 
  94.     else 
  95.     {
  96.         pBuf[bufOffset++] = Base64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  97.         pBuf[bufOffset++] = Base64[c3 & 0x3F];
  98.     }
  99. }
  100. static void 
  101. OutputURL64Chunk(int c1, int c2, int c3, int pads, char* pBuf,
  102.     INT32 bufOffset)
  103. {
  104.     pBuf[bufOffset++] = URLBase64[c1>>2];
  105.     pBuf[bufOffset++] = URLBase64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
  106.     if (pads == 2) 
  107.     {
  108.         pBuf[bufOffset++] = '=';
  109.         pBuf[bufOffset++] = '=';
  110.     }
  111.     else if (pads) 
  112.     {
  113.         pBuf[bufOffset++] = URLBase64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  114.         pBuf[bufOffset++] = '=';
  115.     } 
  116.     else 
  117.     {
  118.         pBuf[bufOffset++] = URLBase64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
  119.         pBuf[bufOffset++] = URLBase64[c3 & 0x3F];
  120.     }
  121. }
  122. INT32 
  123. BinTo64(const BYTE* pInBuf, INT32 len, char* pOutBuf)
  124. {
  125.     int c1, c2, c3;
  126.     //INT32 ct = 0;
  127.     //INT32 written = 0;
  128.     INT32 inOffset = 0;
  129.     INT32 outOffset = 0;
  130.     while(inOffset < len)
  131.     {
  132. c1 = pInBuf[inOffset++];
  133. if(inOffset == len)
  134. {
  135.     Output64Chunk(c1, 0, 0, 2, pOutBuf, outOffset);
  136.     outOffset += 4;
  137. }
  138. else
  139. {
  140.     c2 = pInBuf[inOffset++];
  141.     if(inOffset == len)
  142.     {
  143. Output64Chunk(c1, c2, 0, 1, pOutBuf, outOffset);
  144. outOffset += 4;
  145.     }
  146.     else
  147.     {
  148. c3 = pInBuf[inOffset++];
  149. Output64Chunk(c1, c2, c3, 0, pOutBuf, outOffset);
  150. outOffset += 4;
  151.     }
  152. }
  153. #if XXXBAB
  154. ct += 4;
  155. if(ct > 44) // EOL after 45 chars
  156. {
  157.     pOutBuf[outOffset++] = 'n';
  158.     written += 46;
  159.     ct = 0;
  160. }
  161. #endif
  162.     }
  163. #if XXXBAB
  164.     if(ct)
  165.     {
  166. pOutBuf[outOffset++] = 'n';
  167. ct++;
  168.     }
  169. #endif
  170.     pOutBuf[outOffset++] = '';
  171.     return outOffset;
  172. }
  173. INT32 
  174. BinToURL64(const BYTE* pInBuf, INT32 len, char* pOutBuf)
  175. {
  176.     int c1, c2, c3;
  177.     INT32 inOffset = 0;
  178.     INT32 outOffset = 0;
  179.     while(inOffset < len)
  180.     {
  181. c1 = pInBuf[inOffset++];
  182. if(inOffset == len)
  183. {
  184.     OutputURL64Chunk(c1, 0, 0, 2, pOutBuf, outOffset);
  185.     outOffset += 4;
  186. }
  187. else
  188. {
  189.     c2 = pInBuf[inOffset++];
  190.     if(inOffset == len)
  191.     {
  192. OutputURL64Chunk(c1, c2, 0, 1, pOutBuf, outOffset);
  193. outOffset += 4;
  194.     }
  195.     else
  196.     {
  197. c3 = pInBuf[inOffset++];
  198. OutputURL64Chunk(c1, c2, c3, 0, pOutBuf, outOffset);
  199. outOffset += 4;
  200.     }
  201. }
  202.     }
  203.     pOutBuf[outOffset++] = '';
  204.     return outOffset;
  205. }
  206. INT32
  207. BinFrom64(const char* pInBuf, INT32 len, BYTE* pOutBuf)
  208. {
  209.     int c1, c2, c3, c4;
  210.     INT32 offset = 0;
  211.     INT32 outOffset = 0;
  212.     while(offset < len)
  213.     {
  214. c1 = pInBuf[offset++];
  215. if(c1 != '=' && CHAR64(c1) == XX)
  216. {
  217.     continue;
  218. }
  219. else if (offset == len)
  220. {
  221.     /* BAD data */
  222.     return -1;
  223. }
  224. do
  225. {
  226.     c2 = pInBuf[offset++];
  227. while(offset < len && c2 != '=' && CHAR64(c2) == XX);
  228. if (offset == len)
  229. {
  230.     /* BAD data */
  231.     return -1;
  232. }
  233.         do
  234. {
  235.     c3 = pInBuf[offset++];
  236. }
  237. while(offset < len && c3 != '=' && CHAR64(c3) == XX);
  238. if (offset == len)
  239. {
  240.     /* BAD data */
  241.     return -1;
  242. }
  243. do
  244. {
  245.     c4 = pInBuf[offset++];
  246. }
  247. while(offset < len && c4 != '=' && CHAR64(c4) == XX);
  248. if (offset == len && c4 != '=' && CHAR64(c4) == XX)
  249. {
  250.     /* BAD data */
  251.     return -1;
  252. }
  253. if(c1 == '=' || c2 == '=')
  254. {
  255.     continue;
  256. }
  257. c1 = CHAR64(c1);
  258. c2 = CHAR64(c2);
  259. pOutBuf[outOffset++]  = ((c1 << 2) | ((c2 & 0x30) >> 4));
  260. if(c3 == '=')
  261. {
  262.     continue;
  263. }
  264. else
  265. {
  266.     c3 = CHAR64(c3);
  267.     pOutBuf[outOffset++]  = (((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2));
  268.     if(c4 == '=')
  269.     {
  270. continue;
  271.     }
  272.     else
  273.     {
  274. c4 = CHAR64(c4);
  275. pOutBuf[outOffset++] = (((c3 & 0x03) << 6) | c4);
  276.     }
  277. }
  278.     }
  279.     return outOffset;
  280. }
  281. const char*
  282. EncodeCString(const char* pStr)
  283. {
  284.     CHXString tmp;
  285.     for(size_t i=0;i<strlen(pStr);++i)
  286.     {
  287.         switch(pStr[i])
  288.         {
  289.             case 'n':
  290.             {
  291.                 tmp += "\n";
  292.             }
  293.             break;
  294.             case 't':
  295.             {
  296.                 tmp += "\t";
  297.             }
  298.             break;
  299.             case 'r':
  300.             {
  301.                 tmp += "\r";
  302.             }
  303.             break;
  304.             case '"':
  305.             {
  306.                 tmp += "\"";
  307.             }
  308.             break;
  309.             case '\':
  310.             {
  311.                 tmp += "\\";
  312.             }
  313.             break;
  314.             default:
  315.             {
  316.                 tmp += pStr[i];
  317.             }
  318.         }
  319.     }
  320.     return tmp;
  321. }
  322. #ifdef XXXBAB
  323. void
  324. printbuf(unsigned char* pBuf, int len)
  325. {
  326.     for(int i=0; i<len; i++)
  327.     {
  328. printf("%02x ", pBuf[i]);
  329.     }
  330.     printf("n");
  331. }
  332. static unsigned char testBytes[] =
  333.     { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 
  334.       0x4f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  335.       0x00, 0x00, 0x00, 0x00, 0x75, 0x76, 0x77, 0x78,
  336.       0x45, 0x44, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f,
  337.       0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xb3, 0x5f, 0x78,
  338.       0x4f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  339.       0x00, 0x00, 0x00, 0x00, 0x75, 0x76, 0x77, 0x78,
  340.       0x45, 0x44, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f,
  341.       0x45, 0x44, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f,
  342.       0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xb3, 0x5f, 0x78,
  343.       0x4f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  344.       0x00, 0x00, 0x00, 0x00, 0x75, 0x76, 0x77, 0x78,
  345.       0x45, 0x44, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f,
  346.       0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xb3, 0x5f, 0x78,
  347.       0x4f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
  348.       0x00, 0x00, 0x00, 0x00, 0x75, 0x76, 0x77, 0x78,
  349.       0x45, 0x44, 0x4a, 0x5b, 0x6c, 0x7d, 0x8e, 0x9f,
  350.       0x77, 0x88, 0x00 };
  351. static unsigned char testBytes2[] =
  352.     { 0x7F, 0x63, 0x31, 0xBB, 0x90, 0x21, 0x32, 0x11,
  353.       0xC4 };
  354. void main()
  355. {
  356.     unsigned char encodeBuf[300]; /* Flawfinder: ignore */
  357.     unsigned char decodeBuf[300]; /* Flawfinder: ignore */
  358.     memset(encodeBuf, '', sizeof(encodeBuf));
  359.     memset(decodeBuf, '', sizeof(decodeBuf));
  360.     int rc = BinTo64(testBytes, sizeof(testBytes), encodeBuf);
  361.     printf("original size: %d, encoded size: %dn", sizeof(testBytes), rc);
  362.     printf("%sn", encodeBuf);
  363.     rc = BinFrom64(encodeBuf, rc, decodeBuf);
  364.     printf("decode size: %dn", rc);
  365.     printbuf(decodeBuf, rc);
  366. }
  367. #endif /* XXXBAB */
  368. const char escapeChars[] =
  369. {       
  370.     0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  371.     1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,0,
  372.     0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  373.     1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  374.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  375.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  376.     0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
  377.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  378.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  379.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  380.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  381.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  382.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  383. };
  384. /*
  385.  * Function: URLEscapeBuffer
  386.  */
  387. INT32 
  388. URLEscapeBuffer(const char* pInBuf, INT32 len, char* pOutBuf)
  389. {
  390.     const char* pInputPos = pInBuf;
  391.     char* pOutputPos = pOutBuf;
  392.     char pTemp[3]; /* Flawfinder: ignore */
  393.     
  394.     if (!pInBuf || !len || !pOutBuf)
  395.     {
  396. return -1;
  397.     }
  398.     // Iterate through the input buffer
  399.     while (pInputPos < pInBuf + len)
  400.     {
  401. BOOL bIsIllegal = FALSE;
  402. if (HXIsDBCSEnabled())
  403. {
  404.     // If an illegal URL character is found, translate it
  405.     bIsIllegal = 
  406.         HXIsEqual(pInputPos, 0x7f) ||
  407.      HXIsEqual(pInputPos, '%')  ||
  408.      HXIsEqual(pInputPos, '"')  ||
  409.      HXIsEqual(pInputPos, '+')  ||
  410.      HXIsEqual(pInputPos, '<')  ||
  411. HXIsEqual(pInputPos, '>')  ||
  412.      HXIsEqual(pInputPos, ',')  ||
  413.      HXIsEqual(pInputPos, '#')  ||
  414.      HXIsEqual(pInputPos, 0x01) ||
  415.      HXIsEqual(pInputPos, 0x02) ||
  416.      HXIsEqual(pInputPos, 0x03) ||
  417.      HXIsEqual(pInputPos, 0x04) ||
  418.      HXIsEqual(pInputPos, 0x05) ||
  419.      HXIsEqual(pInputPos, 0x06) ||
  420.      HXIsEqual(pInputPos, 0x07) ||
  421.      HXIsEqual(pInputPos, 0x08) ||
  422.      HXIsEqual(pInputPos, 0x09) ||
  423.      HXIsEqual(pInputPos, 0x0a) ||
  424.      HXIsEqual(pInputPos, 0x0b) ||
  425.      HXIsEqual(pInputPos, 0x0c) ||
  426.      HXIsEqual(pInputPos, 0x0d) ||
  427.      HXIsEqual(pInputPos, 0x0e) ||
  428.      HXIsEqual(pInputPos, 0x0f) ||
  429.      HXIsEqual(pInputPos, 0x10) ||
  430.      HXIsEqual(pInputPos, 0x11) ||
  431.      HXIsEqual(pInputPos, 0x12) ||
  432.      HXIsEqual(pInputPos, 0x13) ||
  433.      HXIsEqual(pInputPos, 0x14) ||
  434.      HXIsEqual(pInputPos, 0x15) ||
  435.      HXIsEqual(pInputPos, 0x16) ||
  436.      HXIsEqual(pInputPos, 0x17) ||
  437.      HXIsEqual(pInputPos, 0x18) ||
  438.      HXIsEqual(pInputPos, 0x19) ||
  439.      HXIsEqual(pInputPos, 0x1a) ||
  440.      HXIsEqual(pInputPos, 0x1b) ||
  441.      HXIsEqual(pInputPos, 0x1c) ||
  442.      HXIsEqual(pInputPos, 0x1d) ||
  443.      HXIsEqual(pInputPos, 0x1e) ||
  444.      HXIsEqual(pInputPos, 0x1f);
  445. }
  446. else
  447. {
  448.     // Use a lookup table for improved performance
  449.     bIsIllegal = (BOOL)escapeChars[(UCHAR)*pInputPos];
  450. }
  451. if (bIsIllegal)
  452. {
  453.     SafeSprintf(pTemp, sizeof(pTemp), "%02x", *pInputPos);
  454.     *pOutputPos++ = '%';
  455.     *pOutputPos++ = pTemp[0];
  456.     *pOutputPos++ = pTemp[1];
  457. }
  458. else if (HXIsEqual(pInputPos, ' '))
  459. {
  460.     *pOutputPos++ = '+';
  461. }
  462. else
  463. {
  464.     *pOutputPos++ = *pInputPos;
  465.     if (HXIsLeadByte(*pInputPos))
  466.     {
  467.      *pOutputPos++ = *(pInputPos + 1);
  468.     }
  469. }
  470. pInputPos = HXGetNextChar(pInputPos);
  471.     }
  472.     // Return the length of the escaped content
  473.     return (pOutputPos - pOutBuf);
  474. }
  475. const char escapeCharsNoReserved[] =
  476. { //8,9,A,B,C,D,E,F
  477.     0,1,1,1,1,1,1,1, // 0x00
  478.     1,1,1,1,1,1,1,1, // 0x08
  479.     1,1,1,1,1,1,1,1, // 0x10
  480.     1,1,1,1,1,1,1,1, // 0x18
  481.     1,0,1,1,0,1,0,0, // 0x20
  482.     0,0,0,0,0,0,0,0, // 0x28
  483.     0,0,0,0,0,0,0,0, // 0x30
  484.     0,0,0,0,1,0,1,0, // 0x38
  485.     0,0,0,0,0,0,0,0, // 0x40
  486.     0,0,0,0,0,0,0,0, // 0x48
  487.     0,0,0,0,0,0,0,0, // 0x50
  488.     0,0,0,1,1,1,1,0, // 0x58
  489.     1,0,0,0,0,0,0,0, // 0x60
  490.     0,0,0,0,0,0,0,0, // 0x68
  491.     0,0,0,0,0,0,0,0, // 0x70
  492.     0,0,0,1,1,1,1,1, // 0x78
  493.     1,1,1,1,1,1,1,1, // 0x80
  494.     1,1,1,1,1,1,1,1, // 0x88
  495.     1,1,1,1,1,1,1,1, // 0x90
  496.     1,1,1,1,1,1,1,1, // 0x98
  497.     1,1,1,1,1,1,1,1, // 0xA0
  498.     1,1,1,1,1,1,1,1, // 0xA8
  499.     1,1,1,1,1,1,1,1, // 0xB0
  500.     1,1,1,1,1,1,1,1, // 0xB8
  501.     1,1,1,1,1,1,1,1, // 0xC0
  502.     1,1,1,1,1,1,1,1, // 0xC8
  503.     1,1,1,1,1,1,1,1, // 0xD0
  504.     1,1,1,1,1,1,1,1, // 0xD8
  505.     1,1,1,1,1,1,1,1, // 0xE0
  506.     1,1,1,1,1,1,1,1, // 0xE8
  507.     1,1,1,1,1,1,1,1, // 0xF0
  508.     1,1,1,1,1,1,1,1  // 0xF8
  509. };
  510. const char escapeCharsReserved[] =
  511. { //8,9,A,B,C,D,E,F     
  512.     0,1,1,1,1,1,1,1, // 0x00
  513.     1,1,1,1,1,1,1,1, // 0x08
  514.     1,1,1,1,1,1,1,1, // 0x10
  515.     1,1,1,1,1,1,1,1, // 0x18
  516.     1,0,1,1,0,1,1,0, // 0x20
  517.     0,0,0,0,0,0,0,1, // 0x28
  518.     0,0,0,0,0,0,0,0, // 0x30
  519.     0,0,1,1,1,1,1,1, // 0x38
  520.     1,0,0,0,0,0,0,0, // 0x40
  521.     0,0,0,0,0,0,0,0, // 0x48
  522.     0,0,0,0,0,0,0,0, // 0x50
  523.     0,0,0,1,1,1,1,0, // 0x58
  524.     1,0,0,0,0,0,0,0, // 0x60
  525.     0,0,0,0,0,0,0,0, // 0x68
  526.     0,0,0,0,0,0,0,0, // 0x70
  527.     0,0,0,1,1,1,1,1, // 0x78
  528.     1,1,1,1,1,1,1,1, // 0x80
  529.     1,1,1,1,1,1,1,1, // 0x88
  530.     1,1,1,1,1,1,1,1, // 0x90
  531.     1,1,1,1,1,1,1,1, // 0x98
  532.     1,1,1,1,1,1,1,1, // 0xA0
  533.     1,1,1,1,1,1,1,1, // 0xA8
  534.     1,1,1,1,1,1,1,1, // 0xB0
  535.     1,1,1,1,1,1,1,1, // 0xB8
  536.     1,1,1,1,1,1,1,1, // 0xC0
  537.     1,1,1,1,1,1,1,1, // 0xC8
  538.     1,1,1,1,1,1,1,1, // 0xD0
  539.     1,1,1,1,1,1,1,1, // 0xD8
  540.     1,1,1,1,1,1,1,1, // 0xE0
  541.     1,1,1,1,1,1,1,1, // 0xE8
  542.     1,1,1,1,1,1,1,1, // 0xF0
  543.     1,1,1,1,1,1,1,1  // 0xF8
  544. };
  545. /*
  546.  * Function: URLEscapeBufferReserved  this function will escape all potentially unsafe charactors.
  547.  */
  548. INT32 
  549. URLEscapeBuffer2(const char* pInBuf, INT32 len, char* pOutBuf, BOOL bReserved)
  550. {
  551.     const char* pInputPos = pInBuf;
  552.     char* pOutputPos = pOutBuf;
  553.     char pTemp[3];
  554.     
  555.     if (!pInBuf || !len || !pOutBuf)
  556.     {
  557. return -1;
  558.     }
  559.     const char* lookupTable = NULL;
  560.     if (bReserved)
  561.     {
  562. lookupTable = (const char*)escapeCharsReserved;
  563.     }
  564.     else
  565.     {
  566. lookupTable = (const char*)escapeCharsNoReserved;
  567.     }
  568.     
  569.  
  570.     // Iterate through the input buffer
  571.     while (pInputPos < pInBuf + len)
  572.     {
  573. // Use a lookup table for improved performance
  574. BOOL bIsIllegal = (BOOL)lookupTable[(UCHAR)*pInputPos];
  575. if (bIsIllegal)
  576. {
  577.     SafeSprintf(pTemp, sizeof(pTemp), "%02x", *pInputPos);
  578.     *pOutputPos++ = '%';
  579.     *pOutputPos++ = pTemp[0];
  580.     *pOutputPos++ = pTemp[1];
  581. }
  582. else
  583. {
  584.     *pOutputPos++ = *pInputPos;
  585. }
  586. ++pInputPos;
  587.     }
  588.     // Return the length of the escaped content
  589.     return (pOutputPos - pOutBuf);
  590. }
  591. /*
  592.  * Function: URLUnescapeBuffer
  593.  */
  594. INT32 
  595. URLUnescapeBuffer(const char* pInBuf, INT32 len, char* pOutBuf)
  596. {
  597.     char* pOutputPos = pOutBuf;
  598.     char pTemp[3];
  599.     if (!pInBuf || !len || !pOutBuf)
  600.     {
  601. return -1;
  602.     }
  603.     // Iterate through the input buffer
  604.     for (INT32 i = 0; i < len; i++)
  605.     {
  606. // Ignore whitespace
  607. if ((UCHAR)pInBuf[i] < 21)
  608. {
  609.     continue;
  610. }
  611. // If an escaped character is found, translate it
  612. else if (pInBuf[i] == '%')
  613. {
  614.     if (len < i + 3)
  615.     {
  616. // Incomplete %xx representation
  617. return -1;
  618.     }
  619.     
  620.     // Ignore whitespace
  621.     while (pInBuf[i + 1] < 21) 
  622.     { 
  623. i++;
  624. if (len < i + 3)
  625. {
  626.     return -1;
  627. }
  628.     }
  629.     pTemp[0] = pInBuf[i + 1];
  630.     // Ignore whitespace
  631.     while (pInBuf[i + 2] < 21) 
  632.     { 
  633. i++;
  634. if (len < i + 3)
  635. {
  636.     return -1;
  637. }
  638.     }
  639.     pTemp[1] = pInBuf[i + 2];
  640.     pTemp[2] = '';
  641.     *pOutputPos++ = (char)strtol(pTemp, NULL, 16);
  642.     i += 2;
  643. }
  644. else if (pInBuf[i] == '+')
  645. {
  646.     *pOutputPos++ = ' ';
  647. }
  648. else
  649. {
  650.     *pOutputPos++ = pInBuf[i];
  651. }
  652.     }
  653.     // Return the length of the escaped content
  654.     return (pOutputPos - pOutBuf);
  655. }
  656. #ifdef XXXDPS
  657. static const char* pTestTable[] =
  658. {
  659.     "this is a test, this is only a test",
  660.     "abcdefghijklmnopqrstuvwxyz0123456789/NoneOfThisShouldGetEscaped...",
  661.     "rnt,#><+"%All Of The First 10 Chars Should Get Escaped",
  662.     "Insert a DBCS test string here."
  663. };
  664. void main()
  665. {
  666.     unsigned char encodeBuf[300]; /* Flawfinder: ignore */
  667.     unsigned char decodeBuf[300]; /* Flawfinder: ignore */
  668.     for (int i = 0; i < 4; i++)
  669.     {
  670. memset(encodeBuf, '', sizeof(encodeBuf));
  671. memset(decodeBuf, '', sizeof(decodeBuf));
  672. printf("Escaping >>>%s<<<n", pTestTable[i]);
  673. int rc = URLEscapeBuffer((char*)pTestTable[i], strlen(pTestTable[i]), (char*)encodeBuf);
  674. printf("original size: %d, encoded size: %dn", strlen(pTestTable[i]), rc);
  675. printf("%sn", encodeBuf);
  676. rc = URLUnescapeBuffer((char*)encodeBuf, rc, (char*)decodeBuf);
  677. printf("decode size: %dn", rc);
  678. printf("%sn", decodeBuf);
  679. printf("n");
  680.     }
  681. }
  682. #endif /* XXXDPS */