Annotation of embedaddon/expat/xmlwf/ct.c, revision 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>