00001
00002 #line 1 "OW_XMLUnescape.re"
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00037
00038 #include "OW_config.h"
00039 #include "OW_XMLUnescape.hpp"
00040 #include "OW_StringBuffer.hpp"
00041 #include "OW_XMLParseException.hpp"
00042 #include "OW_Format.hpp"
00043 #include <limits.h>
00044 #include <stdlib.h>
00045
00046 namespace OW_NAMESPACE
00047 {
00048
00049 String XMLUnescape(const char* escapedText, unsigned len)
00050 {
00051 StringBuffer rval(len);
00052 const char* begin = escapedText;
00053 const char* q;
00054 const char* thisTokStart = escapedText;
00055 #define YYCTYPE char
00056 #define YYCURSOR begin
00057 #define YYLIMIT begin
00058 #define YYMARKER q
00059 #define YYFILL(n)
00060 start:
00061
00062 #line 63 "OW_XMLUnescape.cpp"
00063 {
00064 YYCTYPE yych;
00065 unsigned int yyaccept;
00066 goto yy0;
00067 ++YYCURSOR;
00068 yy0:
00069 if((YYLIMIT - YYCURSOR) < 6) YYFILL(6);
00070 yych = *YYCURSOR;
00071 if(yych <= 0x00) goto yy5;
00072 if(yych != '&') goto yy4;
00073 goto yy2;
00074 yy2: yyaccept = 0;
00075 yych = *(YYMARKER = ++YYCURSOR);
00076 if(yych <= 'f'){
00077 if(yych <= '#'){
00078 if(yych >= '#') goto yy7;
00079 goto yy3;
00080 } else {
00081 if(yych == 'a') goto yy9;
00082 goto yy3;
00083 }
00084 } else {
00085 if(yych <= 'l'){
00086 if(yych <= 'g') goto yy12;
00087 if(yych >= 'l') goto yy11;
00088 goto yy3;
00089 } else {
00090 if(yych == 'q') goto yy10;
00091 goto yy3;
00092 }
00093 }
00094 yy3:
00095 #line 92 "OW_XMLUnescape.re"
00096 { rval += *(YYCURSOR-1); thisTokStart = YYCURSOR; goto start; }
00097 #line 98 "OW_XMLUnescape.cpp"
00098 yy4: yych = *++YYCURSOR;
00099 goto yy3;
00100 yy5: ++YYCURSOR;
00101 goto yy6;
00102 yy6:
00103 #line 93 "OW_XMLUnescape.re"
00104 { return rval.releaseString(); }
00105 #line 106 "OW_XMLUnescape.cpp"
00106 yy7: yych = *++YYCURSOR;
00107 if(yych <= '/') goto yy8;
00108 if(yych <= '9') goto yy34;
00109 if(yych == 'x') goto yy33;
00110 goto yy8;
00111 yy8: YYCURSOR = YYMARKER;
00112 switch(yyaccept){
00113 case 0: goto yy3;
00114 }
00115 yy9: yych = *++YYCURSOR;
00116 if(yych == 'm') goto yy24;
00117 if(yych == 'p') goto yy25;
00118 goto yy8;
00119 yy10: yych = *++YYCURSOR;
00120 if(yych == 'u') goto yy19;
00121 goto yy8;
00122 yy11: yych = *++YYCURSOR;
00123 if(yych == 't') goto yy16;
00124 goto yy8;
00125 yy12: yych = *++YYCURSOR;
00126 if(yych != 't') goto yy8;
00127 goto yy13;
00128 yy13: yych = *++YYCURSOR;
00129 if(yych != ';') goto yy8;
00130 goto yy14;
00131 yy14: ++YYCURSOR;
00132 goto yy15;
00133 yy15:
00134 #line 65 "OW_XMLUnescape.re"
00135 { rval += '>'; thisTokStart = YYCURSOR; goto start; }
00136 #line 137 "OW_XMLUnescape.cpp"
00137 yy16: yych = *++YYCURSOR;
00138 if(yych != ';') goto yy8;
00139 goto yy17;
00140 yy17: ++YYCURSOR;
00141 goto yy18;
00142 yy18:
00143 #line 66 "OW_XMLUnescape.re"
00144 { rval += '<'; thisTokStart = YYCURSOR; goto start; }
00145 #line 146 "OW_XMLUnescape.cpp"
00146 yy19: yych = *++YYCURSOR;
00147 if(yych != 'o') goto yy8;
00148 goto yy20;
00149 yy20: yych = *++YYCURSOR;
00150 if(yych != 't') goto yy8;
00151 goto yy21;
00152 yy21: yych = *++YYCURSOR;
00153 if(yych != ';') goto yy8;
00154 goto yy22;
00155 yy22: ++YYCURSOR;
00156 goto yy23;
00157 yy23:
00158 #line 68 "OW_XMLUnescape.re"
00159 { rval += '\"'; thisTokStart = YYCURSOR; goto start; }
00160 #line 161 "OW_XMLUnescape.cpp"
00161 yy24: yych = *++YYCURSOR;
00162 if(yych == 'p') goto yy30;
00163 goto yy8;
00164 yy25: yych = *++YYCURSOR;
00165 if(yych != 'o') goto yy8;
00166 goto yy26;
00167 yy26: yych = *++YYCURSOR;
00168 if(yych != 's') goto yy8;
00169 goto yy27;
00170 yy27: yych = *++YYCURSOR;
00171 if(yych != ';') goto yy8;
00172 goto yy28;
00173 yy28: ++YYCURSOR;
00174 goto yy29;
00175 yy29:
00176 #line 69 "OW_XMLUnescape.re"
00177 { rval += '\''; thisTokStart = YYCURSOR; goto start; }
00178 #line 179 "OW_XMLUnescape.cpp"
00179 yy30: yych = *++YYCURSOR;
00180 if(yych != ';') goto yy8;
00181 goto yy31;
00182 yy31: ++YYCURSOR;
00183 goto yy32;
00184 yy32:
00185 #line 67 "OW_XMLUnescape.re"
00186 { rval += '&'; thisTokStart = YYCURSOR; goto start; }
00187 #line 188 "OW_XMLUnescape.cpp"
00188 yy33: yych = *++YYCURSOR;
00189 if(yych == ';') goto yy8;
00190 goto yy39;
00191 yy34: ++YYCURSOR;
00192 if(YYLIMIT == YYCURSOR) YYFILL(1);
00193 yych = *YYCURSOR;
00194 goto yy35;
00195 yy35: if(yych <= '/') goto yy8;
00196 if(yych <= '9') goto yy34;
00197 if(yych != ';') goto yy8;
00198 goto yy36;
00199 yy36: ++YYCURSOR;
00200 goto yy37;
00201 yy37:
00202 #line 82 "OW_XMLUnescape.re"
00203 {
00204 unsigned long lval = strtoul( thisTokStart + 2, NULL, 10 );
00205 if (lval > CHAR_MAX)
00206 {
00207 OW_THROWXML(XMLParseException::MALFORMED_REFERENCE, Format("XML escape code in unsupported range: %1", YYCURSOR - 1).c_str());
00208 }
00209 char val = lval;
00210 rval += val;
00211 thisTokStart = YYCURSOR; goto start;
00212 }
00213 #line 214 "OW_XMLUnescape.cpp"
00214 yy38: ++YYCURSOR;
00215 if(YYLIMIT == YYCURSOR) YYFILL(1);
00216 yych = *YYCURSOR;
00217 goto yy39;
00218 yy39: if(yych <= ';'){
00219 if(yych <= '/') goto yy8;
00220 if(yych <= '9') goto yy38;
00221 if(yych <= ':') goto yy8;
00222 goto yy40;
00223 } else {
00224 if(yych <= 'F'){
00225 if(yych <= '@') goto yy8;
00226 goto yy38;
00227 } else {
00228 if(yych <= '`') goto yy8;
00229 if(yych <= 'f') goto yy38;
00230 goto yy8;
00231 }
00232 }
00233 yy40: ++YYCURSOR;
00234 goto yy41;
00235 yy41:
00236 #line 71 "OW_XMLUnescape.re"
00237 {
00238 unsigned long lval = strtoul( thisTokStart + 3, NULL, 16 );
00239 if (lval > CHAR_MAX)
00240 {
00241 OW_THROWXML(XMLParseException::MALFORMED_REFERENCE, Format("XML escape code in unsupported range: %1", YYCURSOR - 1).c_str());
00242 }
00243 char val = lval;
00244 rval += val;
00245 thisTokStart = YYCURSOR; goto start;
00246 }
00247 #line 248 "OW_XMLUnescape.cpp"
00248 }
00249 #line 94 "OW_XMLUnescape.re"
00250
00251
00252 return rval.releaseString();
00253 }
00254
00255 }