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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 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 RealNetworks Community Source License 
  8.  * Version 1.0 (the "License"). You may not use this file except in 
  9.  * compliance with the License executed by both you and RealNetworks.  You 
  10.  * may obtain a copy of the License at  
  11.  * http://www.helixcommunity.org/content/rcsl.  You may also obtain a 
  12.  * copy of the License by contacting RealNetworks directly.  Please see the 
  13.  * License for the rights, obligations and limitations governing use of the 
  14.  * contents of the file. 
  15.  *  
  16.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  17.  * developer of the Original Code and owns the copyrights in the portions 
  18.  * it created. 
  19.  *  
  20.  * This file, and the files included with this file, is distributed and made 
  21.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  22.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  23.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  24.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.  
  25.  * 
  26.  * Technology Compatibility Kit Test Suite(s) Location: 
  27.  *    http://www.helixcommunity.org/content/tck 
  28.  * 
  29.  * Contributor(s): 
  30.  *  
  31.  * ***** END LICENSE BLOCK ***** */ 
  32. //   $Id: unescape.cpp,v 1.1 2002/12/18 15:52:40 ehyche Exp $
  33. #include "hxtypes.h"
  34. #include "hxcom.h"
  35. #include "ihxpckts.h"
  36. #include "unescape.h"
  37. void 
  38. SetAttBuffer(IHXBuffer* pBuf, const char* p)
  39. {
  40.     pBuf->SetSize(strlen(p)+1);
  41.     char* buf = (char*)pBuf->GetBuffer();
  42.     const char* strPos = NULL;
  43.     char* bufPos = NULL;
  44.     for (;;)
  45.     {
  46. switch(*p)
  47. {
  48. case '':
  49.     *buf = *p;
  50.     return;
  51. case '&':
  52.     bufPos = buf;
  53.     strPos = p;
  54.     break;
  55. case ';':
  56.      {
  57.     if (bufPos)
  58.     {
  59. // - we have an entity refference...
  60. // back up and convert it.
  61. const char* end = p - 1;
  62. const char* start = ++strPos;
  63. if (*start == '#')
  64. {
  65.     // character refference
  66.     int c = 0;
  67.     int error = 0;
  68.     int mult = 1;
  69.     if (*(start +1) == 'X')
  70.     {
  71. // hex
  72. ++start;
  73. do
  74. {
  75.     switch(*end)
  76.     {
  77.     case 'a': case 'b': case 'c': case 'd': 
  78.     case 'e': case 'f':
  79. c += mult * (*end - 'a' + 10);
  80. break;
  81.     case 'A': case 'B': case 'C': case 'D': 
  82.     case 'E': case 'F':
  83. c += mult * (*end - 'A' + 10);
  84. break;
  85.     case '0': case '1': case '2': case '3':
  86.     case '4': case '5': case '6': case '7':
  87.     case '8': case '9':
  88. c += mult * (*end - '0');
  89. break;
  90.     default:
  91. // error
  92. error = 1;
  93.     }
  94.     mult *= 16;
  95.     --end;
  96. }
  97. while (end > start && !error);
  98.     }
  99.     else
  100.     {
  101.      // decimal
  102. ++start;
  103. do
  104. {
  105.     switch(*end)
  106.     {
  107.     case '0': case '1': case '2': case '3':
  108.     case '4': case '5': case '6': case '7':
  109.     case '8': case '9':
  110. c += mult * (*end - '0');
  111. break;
  112.     default:
  113. // error
  114. error = 1;
  115.     }
  116.     mult *= 10;
  117.     --end;
  118. }
  119. while (end > start && !error);
  120.     }
  121.     if (!error)
  122.     {
  123. buf = bufPos;
  124. *buf = (char) c;
  125.     }
  126. }
  127. else
  128. {
  129.     // general entity reference --
  130.     // expat allready does this, but the old parser
  131.     // will need this.
  132.     char c = '';
  133.     switch (end - start) {
  134.     case 2:
  135. if (*(start + 1) == 't') {
  136.     switch (*start) {
  137.     case 'l':
  138. c = '<';
  139. break;
  140.     case 'g':
  141. c = '>';
  142. break;
  143.     }
  144. }
  145. break;
  146.     case 3:
  147. if (*start == 'a') 
  148. {
  149.     if (*(start+1) == 'm') 
  150.     {
  151. if (*(start+2) == 'p')
  152. {
  153.     c = '&';
  154. }
  155.     }
  156. }
  157. break;
  158.     case 4:
  159. switch (*start) {
  160. case 'q':
  161.     if (*(start+1) == 'u') 
  162.     {
  163. if (*(start+2) == 'o') 
  164. {
  165.     if (*(start+3) == 't')
  166.     {
  167. c = '"';
  168.     }
  169. }
  170.     }
  171.     break;
  172. case 'a':
  173.     if (*(start+1) == 'p') 
  174.     {
  175. if (*(start+2) == 'o') 
  176. {
  177.     if (*(start+3) == 's')
  178.     {
  179. c = '"';
  180.     }
  181. }
  182.     }
  183.     break;
  184. }
  185. break;
  186.     }
  187. }
  188.     }
  189.     else
  190.     {
  191.      *buf = *p;
  192.     }
  193. }
  194. break;
  195. default:
  196.     *buf = *p;
  197.     break;
  198. }
  199. ++p;
  200. ++buf;
  201.     }
  202. }