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>