/* recognize HTML ISO entities */ #include #include #include #define HASHSIZE 101 struct nlist { struct nlist *next; char *name; unsigned code; }; static struct nlist *hashtab[HASHSIZE]; struct entity { char *name; unsigned code; } entities[] = { "quot", 34, "apos", 39, "iexcl", 161, "cent", 162, "pound", 163, "yen", 165, "brvbar", 166, "sect", 167, "copy", 169, "laquo", 171, "raquo", 187, "not", 172, "reg", 174, "deg", 176, "plusmn", 177, "sup2", 178, "sup3", 179, "micro", 181, "para", 182, "sup1", 185, "middot", 183, "frac14", 188, "frac12", 189, "iquest", 191, "frac34", 190, "AElig", 198, "Aacute", 193, "Acirc", 194, "Agrave", 192, "Aring", 197, "Atilde", 195, "Auml", 196, "Ccedil", 199, "ETH", 208, "Eacute", 201, "Ecirc", 202, "Egrave", 200, "Euml", 203, "Iacute", 205, "Icirc", 206, "Igrave", 204, "Iuml", 207, "Ntilde", 209, "Oacute", 211, "Ocirc", 212, "Ograve", 210, "Oslash", 216, "Otilde", 213, "Ouml", 214, "THORN", 222, "Uacute", 218, "Ucirc", 219, "Ugrave", 217, "Uuml", 220, "Yacute", 221, "aacute", 225, "acirc", 226, "aelig", 230, "agrave", 224, "amp", 38, "aring", 229, "atilde", 227, "auml", 228, "ccedil", 231, "eacute", 233, "ecirc", 234, "egrave", 232, "eth", 240, "euml", 235, "tagc", 62, "gt", 62, "iacute", 237, "icirc", 238, "igrave", 236, "iuml", 239, "stago", 60, "lt", 60, "ntilde", 241, "oacute", 243, "ocirc", 244, "ograve", 242, "oslash", 248, "otilde", 245, "ouml", 246, "szlig", 223, "thorn", 254, "uacute", 250, "ucirc", 251, "ugrave", 249, "uuml", 252, "yacute", 253, "yuml", 255 }; static unsigned hash(char *s) { unsigned hashval; for (hashval = 0; *s != '\0'; s++) hashval = *s + 31*hashval; return hashval % HASHSIZE; } static struct nlist *lookup(char *s) { struct nlist *np; for (np = hashtab[hash(s)]; np != NULL; np = np->next) if (strcmp(s, np->name) == 0) return np; return NULL; } static struct nlist *install(char *name, unsigned code) { struct nlist *np; unsigned hashval; if ((np = lookup(name)) == NULL) { np = (struct nlist *)malloc(sizeof(*np)); if (np == NULL || (np->name = strdup(name)) == NULL) return NULL; hashval = hash(name); np->next = hashtab[hashval]; hashtab[hashval] = np; } np->code = code; return np; } int entity(char *name, int *len) { int i, c; char *p, buf[64]; struct nlist *np; for (i = 2, p = buf; i < 65; ++i) { c = *name++; if (c == ';') { *p = '\0'; *len = i; np = lookup(buf); if (np) return np->code; break; } *p++ = c; } return 0; /* signifies unknown entity name */ } void InitEntities(void) { struct entity *ep; ep = entities; for(;;) { install(ep->name, ep->code); if (strcmp(ep->name, "yuml") == 0) break; ++ep; } }