Annotation of embedaddon/expat/xmlwf/ct.c, revision 1.1.1.1

1.1       misho       1: #define CHARSET_MAX 41
                      2: 
                      3: static const char *
                      4: getTok(const char **pp)
                      5: {
                      6:   enum { inAtom, inString, init, inComment };
                      7:   int state = init;
                      8:   const char *tokStart = 0;
                      9:   for (;;) {
                     10:     switch (**pp) {
                     11:     case '\0':
                     12:       return 0;
                     13:     case ' ':
                     14:     case '\r':
                     15:     case '\t':
                     16:     case '\n':
                     17:       if (state == inAtom)
                     18:         return tokStart;
                     19:       break;
                     20:     case '(':
                     21:       if (state == inAtom)
                     22:         return tokStart;
                     23:       if (state != inString)
                     24:         state++;
                     25:       break;
                     26:     case ')':
                     27:       if (state > init)
                     28:         --state;
                     29:       else if (state != inString)
                     30:         return 0;
                     31:       break;
                     32:     case ';':
                     33:     case '/':
                     34:     case '=':
                     35:       if (state == inAtom)
                     36:         return tokStart;
                     37:       if (state == init)
                     38:         return (*pp)++;
                     39:       break;
                     40:     case '\\':
                     41:       ++*pp;
                     42:       if (**pp == '\0')
                     43:         return 0;
                     44:       break;
                     45:     case '"':
                     46:       switch (state) {
                     47:       case inString:
                     48:         ++*pp;
                     49:         return tokStart;
                     50:       case inAtom:
                     51:         return tokStart;
                     52:       case init:
                     53:         tokStart = *pp;
                     54:         state = inString;
                     55:         break;
                     56:       }
                     57:       break;
                     58:     default:
                     59:       if (state == init) {
                     60:         tokStart = *pp;
                     61:         state = inAtom;
                     62:       }
                     63:       break;
                     64:     }
                     65:     ++*pp;
                     66:   }
                     67:   /* not reached */
                     68: }
                     69: 
                     70: /* key must be lowercase ASCII */
                     71: 
                     72: static int
                     73: matchkey(const char *start, const char *end, const char *key)
                     74: {
                     75:   if (!start)
                     76:     return 0;
                     77:   for (; start != end; start++, key++)
                     78:     if (*start != *key && *start != 'A' + (*key - 'a'))
                     79:       return 0;
                     80:   return *key == '\0';
                     81: }
                     82: 
                     83: void
                     84: getXMLCharset(const char *buf, char *charset)
                     85: {
                     86:   const char *next, *p;
                     87: 
                     88:   charset[0] = '\0';
                     89:   next = buf;
                     90:   p = getTok(&next);
                     91:   if (matchkey(p, next, "text"))
                     92:     strcpy(charset, "us-ascii");
                     93:   else if (!matchkey(p, next, "application"))
                     94:     return;
                     95:   p = getTok(&next);
                     96:   if (!p || *p != '/')
                     97:     return;
                     98:   p = getTok(&next);
                     99:   if (matchkey(p, next, "xml"))
                    100:     isXml = 1;
                    101:   p = getTok(&next);
                    102:   while (p) {
                    103:     if (*p == ';') {
                    104:       p = getTok(&next);
                    105:       if (matchkey(p, next, "charset")) {
                    106:         p = getTok(&next);
                    107:         if (p && *p == '=') {
                    108:           p = getTok(&next);
                    109:           if (p) {
                    110:             char *s = charset;
                    111:             if (*p == '"') {
                    112:               while (++p != next - 1) {
                    113:                 if (*p == '\\')
                    114:                   ++p;
                    115:                 if (s == charset + CHARSET_MAX - 1) {
                    116:                   charset[0] = '\0';
                    117:                   break;
                    118:                 }
                    119:                 *s++ = *p;
                    120:               }
                    121:               *s++ = '\0';
                    122:             }
                    123:             else {
                    124:               if (next - p > CHARSET_MAX - 1)
                    125:                 break;
                    126:               while (p != next)
                    127:                 *s++ = *p++;
                    128:               *s = 0;
                    129:               break;
                    130:             }
                    131:           }
                    132:         }
                    133:       }
                    134:     }
                    135:   else
                    136:     p = getTok(&next);
                    137:   }
                    138: }
                    139: 
                    140: int
                    141: main(int argc, char **argv)
                    142: {
                    143:   char buf[CHARSET_MAX];
                    144:   getXMLCharset(argv[1], buf);
                    145:   printf("charset = \"%s\"\n", buf);
                    146:   return 0;
                    147: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>