~ubuntu-branches/ubuntu/hardy/ghostscript/hardy

« back to all changes in this revision

Viewing changes to expat/xmlwf/ct.c

  • Committer: Bazaar Package Importer
  • Author(s): Till Kamppeter
  • Date: 2007-11-22 12:17:43 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20071122121743-cd70s3ypq0r243mp
Tags: 8.61.dfsg.1-0ubtuntu1
* New upstream release
  o Final 8.61 release
* debian/patches/09_ijs_krgb_support.dpatch: Adapted to upstream changes.
* debian/rules: Updated CUPS-related variables for "make install" calls.
* debian/rules: Remove /usr/include/ghostscript from the ghostscript
  package, they go into lings-dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}