unescape.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:4k
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: RCSL 1.0
- *
- * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
- *
- * The contents of this file, and the files included with this file, are
- * subject to the current version of RealNetworks Community Source License
- * Version 1.0 (the "License"). You may not use this file except in
- * compliance with the License executed by both you and RealNetworks. You
- * may obtain a copy of the License at
- * http://www.helixcommunity.org/content/rcsl. You may also obtain a
- * copy of the License by contacting RealNetworks directly. Please see the
- * License for the rights, obligations and limitations governing use of the
- * contents of the file.
- *
- * This file is part of the Helix DNA Technology. RealNetworks is the
- * developer of the Original Code and owns the copyrights in the portions
- * it created.
- *
- * This file, and the files included with this file, is distributed and made
- * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- *
- * Technology Compatibility Kit Test Suite(s) Location:
- * http://www.helixcommunity.org/content/tck
- *
- * Contributor(s):
- *
- * ***** END LICENSE BLOCK ***** */
- // $Id: unescape.cpp,v 1.1 2002/12/18 15:52:40 ehyche Exp $
- #include "hxtypes.h"
- #include "hxcom.h"
- #include "ihxpckts.h"
- #include "unescape.h"
- void
- SetAttBuffer(IHXBuffer* pBuf, const char* p)
- {
- pBuf->SetSize(strlen(p)+1);
- char* buf = (char*)pBuf->GetBuffer();
- const char* strPos = NULL;
- char* bufPos = NULL;
- for (;;)
- {
- switch(*p)
- {
- case ' ':
- *buf = *p;
- return;
- case '&':
- bufPos = buf;
- strPos = p;
- break;
- case ';':
- {
- if (bufPos)
- {
- // - we have an entity refference...
- // back up and convert it.
- const char* end = p - 1;
- const char* start = ++strPos;
- if (*start == '#')
- {
- // character refference
- int c = 0;
- int error = 0;
- int mult = 1;
- if (*(start +1) == 'X')
- {
- // hex
- ++start;
- do
- {
- switch(*end)
- {
- case 'a': case 'b': case 'c': case 'd':
- case 'e': case 'f':
- c += mult * (*end - 'a' + 10);
- break;
- case 'A': case 'B': case 'C': case 'D':
- case 'E': case 'F':
- c += mult * (*end - 'A' + 10);
- break;
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
- c += mult * (*end - '0');
- break;
- default:
- // error
- error = 1;
- }
- mult *= 16;
- --end;
- }
- while (end > start && !error);
- }
- else
- {
- // decimal
- ++start;
- do
- {
- switch(*end)
- {
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- case '8': case '9':
- c += mult * (*end - '0');
- break;
- default:
- // error
- error = 1;
- }
- mult *= 10;
- --end;
- }
- while (end > start && !error);
- }
- if (!error)
- {
- buf = bufPos;
- *buf = (char) c;
- }
- }
- else
- {
- // general entity reference --
- // expat allready does this, but the old parser
- // will need this.
- char c = ' ';
- switch (end - start) {
- case 2:
- if (*(start + 1) == 't') {
- switch (*start) {
- case 'l':
- c = '<';
- break;
- case 'g':
- c = '>';
- break;
- }
- }
- break;
- case 3:
- if (*start == 'a')
- {
- if (*(start+1) == 'm')
- {
- if (*(start+2) == 'p')
- {
- c = '&';
- }
- }
- }
- break;
- case 4:
- switch (*start) {
- case 'q':
- if (*(start+1) == 'u')
- {
- if (*(start+2) == 'o')
- {
- if (*(start+3) == 't')
- {
- c = '"';
- }
- }
- }
- break;
- case 'a':
- if (*(start+1) == 'p')
- {
- if (*(start+2) == 'o')
- {
- if (*(start+3) == 's')
- {
- c = '"';
- }
- }
- }
- break;
- }
- break;
- }
- }
- }
- else
- {
- *buf = *p;
- }
- }
- break;
- default:
- *buf = *p;
- break;
- }
- ++p;
- ++buf;
- }
- }