00001
00002
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
00033
00034
00035
00036
00037
00038 #ifdef _WIN32
00039 #include "winconfig.h"
00040 #else
00041 #include "config.h"
00042 #endif
00043 #include "mxml.h"
00044
00045
00046
00047
00048
00049
00050 static int default_callback(const char *name);
00051
00052
00053
00054
00055
00056
00057 static int num_callbacks = 1;
00058 static int (*callbacks[100])(const char *name) =
00059 {
00060 default_callback
00061 };
00062
00063
00064
00065
00066
00067
00068 int
00069 mxmlEntityAddCallback(int (*cb)(const char *name))
00070
00071 {
00072 if (num_callbacks < (int)(sizeof(callbacks) / sizeof(callbacks[0])))
00073 {
00074 callbacks[num_callbacks] = cb;
00075 num_callbacks ++;
00076
00077 return (0);
00078 }
00079 else
00080 {
00081 mxml_error("Unable to add entity callback!");
00082
00083 return (-1);
00084 }
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094 const char *
00095 mxmlEntityGetName(int val)
00096 {
00097 switch (val)
00098 {
00099 case '&' :
00100 return ("amp");
00101
00102 case '<' :
00103 return ("lt");
00104
00105 case '>' :
00106 return ("gt");
00107
00108 case '\"' :
00109 return ("quot");
00110
00111 default :
00112 return (NULL);
00113 }
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 int
00125 mxmlEntityGetValue(const char *name)
00126 {
00127 int i;
00128 int ch;
00129
00130
00131 for (i = 0; i < num_callbacks; i ++)
00132 if ((ch = (callbacks[i])(name)) >= 0)
00133 return (ch);
00134
00135 return (-1);
00136 }
00137
00138
00139
00140
00141
00142
00143 void
00144 mxmlEntityRemoveCallback(int (*cb)(const char *name))
00145
00146 {
00147 int i;
00148
00149
00150 for (i = 0; i < num_callbacks; i ++)
00151 if (cb == callbacks[i])
00152 {
00153
00154
00155
00156
00157 num_callbacks --;
00158
00159 if (i < num_callbacks)
00160 memmove(callbacks + i, callbacks + i + 1,
00161 (num_callbacks - i) * sizeof(callbacks[0]));
00162
00163 return;
00164 }
00165 }
00166
00167
00168
00169
00170
00171
00172 static int
00173 default_callback(const char *name)
00174 {
00175 int diff,
00176 current,
00177 first,
00178 last;
00179 static const struct
00180 {
00181 const char *name;
00182 int val;
00183 } entities[] =
00184 {
00185 { "AElig", 198 },
00186 { "Aacute", 193 },
00187 { "Acirc", 194 },
00188 { "Agrave", 192 },
00189 { "Alpha", 913 },
00190 { "Aring", 197 },
00191 { "Atilde", 195 },
00192 { "Auml", 196 },
00193 { "Beta", 914 },
00194 { "Ccedil", 199 },
00195 { "Chi", 935 },
00196 { "Dagger", 8225 },
00197 { "Delta", 916 },
00198 { "Dstrok", 208 },
00199 { "ETH", 208 },
00200 { "Eacute", 201 },
00201 { "Ecirc", 202 },
00202 { "Egrave", 200 },
00203 { "Epsilon", 917 },
00204 { "Eta", 919 },
00205 { "Euml", 203 },
00206 { "Gamma", 915 },
00207 { "Iacute", 205 },
00208 { "Icirc", 206 },
00209 { "Igrave", 204 },
00210 { "Iota", 921 },
00211 { "Iuml", 207 },
00212 { "Kappa", 922 },
00213 { "Lambda", 923 },
00214 { "Mu", 924 },
00215 { "Ntilde", 209 },
00216 { "Nu", 925 },
00217 { "OElig", 338 },
00218 { "Oacute", 211 },
00219 { "Ocirc", 212 },
00220 { "Ograve", 210 },
00221 { "Omega", 937 },
00222 { "Omicron", 927 },
00223 { "Oslash", 216 },
00224 { "Otilde", 213 },
00225 { "Ouml", 214 },
00226 { "Phi", 934 },
00227 { "Pi", 928 },
00228 { "Prime", 8243 },
00229 { "Psi", 936 },
00230 { "Rho", 929 },
00231 { "Scaron", 352 },
00232 { "Sigma", 931 },
00233 { "THORN", 222 },
00234 { "Tau", 932 },
00235 { "Theta", 920 },
00236 { "Uacute", 218 },
00237 { "Ucirc", 219 },
00238 { "Ugrave", 217 },
00239 { "Upsilon", 933 },
00240 { "Uuml", 220 },
00241 { "Xi", 926 },
00242 { "Yacute", 221 },
00243 { "Yuml", 376 },
00244 { "Zeta", 918 },
00245 { "aacute", 225 },
00246 { "acirc", 226 },
00247 { "acute", 180 },
00248 { "aelig", 230 },
00249 { "agrave", 224 },
00250 { "alefsym", 8501 },
00251 { "alpha", 945 },
00252 { "amp", '&' },
00253 { "and", 8743 },
00254 { "ang", 8736 },
00255 { "aring", 229 },
00256 { "asymp", 8776 },
00257 { "atilde", 227 },
00258 { "auml", 228 },
00259 { "bdquo", 8222 },
00260 { "beta", 946 },
00261 { "brkbar", 166 },
00262 { "brvbar", 166 },
00263 { "bull", 8226 },
00264 { "cap", 8745 },
00265 { "ccedil", 231 },
00266 { "cedil", 184 },
00267 { "cent", 162 },
00268 { "chi", 967 },
00269 { "circ", 710 },
00270 { "clubs", 9827 },
00271 { "cong", 8773 },
00272 { "copy", 169 },
00273 { "crarr", 8629 },
00274 { "cup", 8746 },
00275 { "curren", 164 },
00276 { "dArr", 8659 },
00277 { "dagger", 8224 },
00278 { "darr", 8595 },
00279 { "deg", 176 },
00280 { "delta", 948 },
00281 { "diams", 9830 },
00282 { "die", 168 },
00283 { "divide", 247 },
00284 { "eacute", 233 },
00285 { "ecirc", 234 },
00286 { "egrave", 232 },
00287 { "empty", 8709 },
00288 { "emsp", 8195 },
00289 { "ensp", 8194 },
00290 { "epsilon", 949 },
00291 { "equiv", 8801 },
00292 { "eta", 951 },
00293 { "eth", 240 },
00294 { "euml", 235 },
00295 { "euro", 8364 },
00296 { "exist", 8707 },
00297 { "fnof", 402 },
00298 { "forall", 8704 },
00299 { "frac12", 189 },
00300 { "frac14", 188 },
00301 { "frac34", 190 },
00302 { "frasl", 8260 },
00303 { "gamma", 947 },
00304 { "ge", 8805 },
00305 { "gt", '>' },
00306 { "hArr", 8660 },
00307 { "harr", 8596 },
00308 { "hearts", 9829 },
00309 { "hellip", 8230 },
00310 { "hibar", 175 },
00311 { "iacute", 237 },
00312 { "icirc", 238 },
00313 { "iexcl", 161 },
00314 { "igrave", 236 },
00315 { "image", 8465 },
00316 { "infin", 8734 },
00317 { "int", 8747 },
00318 { "iota", 953 },
00319 { "iquest", 191 },
00320 { "isin", 8712 },
00321 { "iuml", 239 },
00322 { "kappa", 954 },
00323 { "lArr", 8656 },
00324 { "lambda", 955 },
00325 { "lang", 9001 },
00326 { "laquo", 171 },
00327 { "larr", 8592 },
00328 { "lceil", 8968 },
00329 { "ldquo", 8220 },
00330 { "le", 8804 },
00331 { "lfloor", 8970 },
00332 { "lowast", 8727 },
00333 { "loz", 9674 },
00334 { "lrm", 8206 },
00335 { "lsaquo", 8249 },
00336 { "lsquo", 8216 },
00337 { "lt", '<' },
00338 { "macr", 175 },
00339 { "mdash", 8212 },
00340 { "micro", 181 },
00341 { "middot", 183 },
00342 { "minus", 8722 },
00343 { "mu", 956 },
00344 { "nabla", 8711 },
00345 { "nbsp", 160 },
00346 { "ndash", 8211 },
00347 { "ne", 8800 },
00348 { "ni", 8715 },
00349 { "not", 172 },
00350 { "notin", 8713 },
00351 { "nsub", 8836 },
00352 { "ntilde", 241 },
00353 { "nu", 957 },
00354 { "oacute", 243 },
00355 { "ocirc", 244 },
00356 { "oelig", 339 },
00357 { "ograve", 242 },
00358 { "oline", 8254 },
00359 { "omega", 969 },
00360 { "omicron", 959 },
00361 { "oplus", 8853 },
00362 { "or", 8744 },
00363 { "ordf", 170 },
00364 { "ordm", 186 },
00365 { "oslash", 248 },
00366 { "otilde", 245 },
00367 { "otimes", 8855 },
00368 { "ouml", 246 },
00369 { "para", 182 },
00370 { "part", 8706 },
00371 { "permil", 8240 },
00372 { "perp", 8869 },
00373 { "phi", 966 },
00374 { "pi", 960 },
00375 { "piv", 982 },
00376 { "plusmn", 177 },
00377 { "pound", 163 },
00378 { "prime", 8242 },
00379 { "prod", 8719 },
00380 { "prop", 8733 },
00381 { "psi", 968 },
00382 { "quot", '\"' },
00383 { "rArr", 8658 },
00384 { "radic", 8730 },
00385 { "rang", 9002 },
00386 { "raquo", 187 },
00387 { "rarr", 8594 },
00388 { "rceil", 8969 },
00389 { "rdquo", 8221 },
00390 { "real", 8476 },
00391 { "reg", 174 },
00392 { "rfloor", 8971 },
00393 { "rho", 961 },
00394 { "rlm", 8207 },
00395 { "rsaquo", 8250 },
00396 { "rsquo", 8217 },
00397 { "sbquo", 8218 },
00398 { "scaron", 353 },
00399 { "sdot", 8901 },
00400 { "sect", 167 },
00401 { "shy", 173 },
00402 { "sigma", 963 },
00403 { "sigmaf", 962 },
00404 { "sim", 8764 },
00405 { "spades", 9824 },
00406 { "sub", 8834 },
00407 { "sube", 8838 },
00408 { "sum", 8721 },
00409 { "sup", 8835 },
00410 { "sup1", 185 },
00411 { "sup2", 178 },
00412 { "sup3", 179 },
00413 { "supe", 8839 },
00414 { "szlig", 223 },
00415 { "tau", 964 },
00416 { "there4", 8756 },
00417 { "theta", 952 },
00418 { "thetasym", 977 },
00419 { "thinsp", 8201 },
00420 { "thorn", 254 },
00421 { "tilde", 732 },
00422 { "times", 215 },
00423 { "trade", 8482 },
00424 { "uArr", 8657 },
00425 { "uacute", 250 },
00426 { "uarr", 8593 },
00427 { "ucirc", 251 },
00428 { "ugrave", 249 },
00429 { "uml", 168 },
00430 { "upsih", 978 },
00431 { "upsilon", 965 },
00432 { "uuml", 252 },
00433 { "weierp", 8472 },
00434 { "xi", 958 },
00435 { "yacute", 253 },
00436 { "yen", 165 },
00437 { "yuml", 255 },
00438 { "zeta", 950 },
00439 { "zwj", 8205 },
00440 { "zwnj", 8204 }
00441 };
00442
00443
00444
00445
00446
00447
00448 first = 0;
00449 last = (int)(sizeof(entities) / sizeof(entities[0]) - 1);
00450
00451 while ((last - first) > 1)
00452 {
00453 current = (first + last) / 2;
00454
00455 if ((diff = strcmp(name, entities[current].name)) == 0)
00456 return (entities[current].val);
00457 else if (diff < 0)
00458 last = current;
00459 else
00460 first = current;
00461 }
00462
00463
00464
00465
00466
00467
00468 if (!strcmp(name, entities[first].name))
00469 return (entities[first].val);
00470 else if (!strcmp(name, entities[last].name))
00471 return (entities[last].val);
00472 else
00473 return (-1);
00474 }
00475
00476
00477
00478
00479