mcabber/libjabber/xmltok_impl_c.h
author Mikael Berthe <mikael@lilotux.net>
Sat, 16 Jun 2007 11:48:56 +0200
changeset 1234 2b7a4d003057
parent 364 33b8e801ffa6
permissions -rw-r--r--
Update PL help files (Salvador)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     1
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     2
The contents of this file are subject to the Mozilla Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     3
Version 1.1 (the "License"); you may not use this file except in
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     4
compliance with the License. You may obtain a copy of the License at
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     5
http://www.mozilla.org/MPL/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     6
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     7
Software distributed under the License is distributed on an "AS IS"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     8
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     9
License for the specific language governing rights and limitations
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    10
under the License.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    11
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    12
The Original Code is expat.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    13
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    14
The Initial Developer of the Original Code is James Clark.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    15
Portions created by James Clark are Copyright (C) 1998, 1999
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    16
James Clark. All Rights Reserved.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    17
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    18
Contributor(s):
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    19
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    20
Alternatively, the contents of this file may be used under the terms
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    21
of the GNU General Public License (the "GPL"), in which case the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    22
provisions of the GPL are applicable instead of those above.  If you
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    23
wish to allow use of your version of this file only under the terms of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    24
the GPL and not to allow others to use your version of this file under
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    25
the MPL, indicate your decision by deleting the provisions above and
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    26
replace them with the notice and other provisions required by the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    27
GPL. If you do not delete the provisions above, a recipient may use
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    28
your version of this file under either the MPL or the GPL.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    29
*/
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    30
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    31
#ifndef IS_INVALID_CHAR
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    32
#define IS_INVALID_CHAR(enc, ptr, n) (0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    33
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    34
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    35
#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    36
    case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    37
      if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    38
    return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    39
      if (IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    40
        *(nextTokPtr) = (ptr); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    41
        return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    42
      } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    43
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    44
      break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    45
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    46
#define INVALID_CASES(ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    47
  INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    48
  INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    49
  INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    50
  case BT_NONXML: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    51
  case BT_MALFORM: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    52
  case BT_TRAIL: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    53
    *(nextTokPtr) = (ptr); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    54
    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    55
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    56
#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    57
   case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    58
     if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    59
       return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    60
     if (!IS_NAME_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    61
       *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    62
       return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    63
     } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    64
     ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    65
     break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    66
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    67
#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    68
  case BT_NONASCII: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    69
    if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    70
      *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    71
      return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    72
    } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    73
  case BT_NMSTRT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    74
  case BT_HEX: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    75
  case BT_DIGIT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    76
  case BT_NAME: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    77
  case BT_MINUS: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    78
    ptr += MINBPC(enc); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    79
    break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    80
  CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    81
  CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    82
  CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    83
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    84
#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    85
   case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    86
     if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    87
       return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    88
     if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    89
       *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    90
       return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    91
     } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    92
     ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    93
     break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    94
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    95
#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    96
  case BT_NONASCII: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    97
    if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    98
      *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    99
      return XML_TOK_INVALID; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   100
    } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   101
  case BT_NMSTRT: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   102
  case BT_HEX: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   103
    ptr += MINBPC(enc); \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   104
    break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   105
  CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   106
  CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   107
  CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   108
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   109
#ifndef PREFIX
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   110
#define PREFIX(ident) ident
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   111
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   112
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   113
/* ptr points to character following "<!-" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   114
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   115
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   116
int PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   117
                        const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   118
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   119
    if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   120
        if (!CHAR_MATCHES(enc, ptr, '-')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   121
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   122
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   123
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   124
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   125
        while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   126
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   127
                INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   128
            case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   129
                if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   130
                    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   131
                if (CHAR_MATCHES(enc, ptr, '-')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   132
                    if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   133
                        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   134
                    if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   135
                        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   136
                        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   137
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   138
                    *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   139
                    return XML_TOK_COMMENT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   140
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   141
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   142
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   143
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   144
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   145
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   146
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   147
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   148
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   149
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   150
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   151
/* ptr points to character following "<!" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   152
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   153
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   154
int PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   155
                     const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   156
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   157
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   158
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   159
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   160
    case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   161
        return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   162
    case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   163
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   164
        return XML_TOK_COND_SECT_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   165
    case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   166
    case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   167
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   168
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   169
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   170
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   171
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   172
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   173
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   174
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   175
        case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   176
            if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   177
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   178
            /* don't allow <!ENTITY% foo "whatever"> */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   179
            switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   180
case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   181
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   182
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   183
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   184
            /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   185
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   186
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   187
            return XML_TOK_DECL_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   188
        case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   189
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   190
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   191
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   192
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   193
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   194
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   195
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   196
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   197
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   198
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   199
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   200
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   201
int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   202
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   203
    int upper = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   204
    *tokPtr = XML_TOK_PI;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   205
    if (end - ptr != MINBPC(enc)*3)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   206
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   207
    switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   208
    case 'x':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   209
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   210
    case 'X':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   211
        upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   212
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   213
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   214
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   215
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   216
    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   217
    switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   218
    case 'm':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   219
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   220
    case 'M':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   221
        upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   222
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   223
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   224
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   225
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   226
    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   227
    switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   228
    case 'l':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   229
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   230
    case 'L':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   231
        upper = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   232
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   233
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   234
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   235
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   236
    if (upper)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   237
        return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   238
    *tokPtr = XML_TOK_XML_DECL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   239
    return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   240
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   241
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   242
/* ptr points to character following "<?" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   243
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   244
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   245
int PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   246
                   const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   247
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   248
    int tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   249
    const char *target = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   250
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   251
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   252
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   253
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   254
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   255
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   256
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   257
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   258
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   259
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   260
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   261
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   262
            if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   263
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   264
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   265
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   266
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   267
            while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   268
                switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   269
                    INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   270
                case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   271
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   272
                    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   273
                        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   274
                    if (CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   275
                        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   276
                        return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   277
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   278
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   279
                default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   280
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   281
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   282
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   283
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   284
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   285
        case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   286
            if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   287
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   288
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   289
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   290
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   291
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   292
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   293
            if (CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   294
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   295
                return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   296
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   297
            /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   298
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   299
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   300
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   301
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   302
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   303
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   304
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   305
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   306
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   307
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   308
int PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   309
                             const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   310
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   311
    int i;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   312
    /* CDATA[ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   313
    if (end - ptr < 6 * MINBPC(enc))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   314
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   315
    for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   316
        if (!CHAR_MATCHES(enc, ptr, "CDATA["[i])) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   317
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   318
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   319
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   320
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   321
    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   322
    return XML_TOK_CDATA_SECT_OPEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   323
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   324
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   325
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   326
int PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   327
                            const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   328
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   329
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   330
        return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   331
    if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   332
        size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   333
        if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   334
            n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   335
            if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   336
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   337
            end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   338
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   339
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   340
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   341
    case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   342
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   343
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   344
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   345
        if (!CHAR_MATCHES(enc, ptr, ']'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   346
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   347
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   348
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   349
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   350
        if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   351
            ptr -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   352
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   353
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   354
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   355
        return XML_TOK_CDATA_SECT_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   356
    case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   357
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   358
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   359
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   360
        if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   361
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   362
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   363
        return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   364
    case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   365
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   366
        return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   367
        INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   368
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   369
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   370
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   371
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   372
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   373
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   374
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   375
    case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   376
      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   377
    *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   378
    return XML_TOK_DATA_CHARS; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   379
      } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   380
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   381
      break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   382
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   383
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   384
        case BT_NONXML:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   385
        case BT_MALFORM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   386
        case BT_TRAIL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   387
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   388
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   389
        case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   390
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   391
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   392
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   393
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   394
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   395
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   396
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   397
    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   398
    return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   399
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   400
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   401
/* ptr points to character following "</" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   402
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   403
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   404
int PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   405
                       const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   406
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   407
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   408
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   409
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   410
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   411
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   412
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   413
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   414
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   415
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   416
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   417
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   418
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   419
            for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   420
                switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   421
        case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   422
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   423
                case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   424
                    *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   425
                    return XML_TOK_END_TAG;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   426
                default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   427
                    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   428
                    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   429
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   430
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   431
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   432
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   433
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   434
            /* no need to check qname syntax here, since end-tag must match exactly */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   435
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   436
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   437
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   438
        case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   439
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   440
            return XML_TOK_END_TAG;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   441
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   442
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   443
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   444
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   445
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   446
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   447
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   448
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   449
/* ptr points to character following "&#X" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   450
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   451
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   452
int PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   453
                           const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   454
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   455
    if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   456
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   457
        case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   458
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   459
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   460
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   461
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   462
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   463
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   464
        for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   465
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   466
            case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   467
            case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   468
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   469
            case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   470
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   471
                return XML_TOK_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   472
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   473
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   474
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   475
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   476
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   477
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   478
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   479
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   480
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   481
/* ptr points to character following "&#" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   482
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   483
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   484
int PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   485
                        const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   486
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   487
    if (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   488
        if (CHAR_MATCHES(enc, ptr, 'x'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   489
            return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   490
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   491
        case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   492
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   493
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   494
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   495
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   496
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   497
        for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   498
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   499
            case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   500
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   501
            case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   502
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   503
                return XML_TOK_CHAR_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   504
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   505
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   506
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   507
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   508
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   509
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   510
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   511
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   512
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   513
/* ptr points to character following "&" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   514
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   515
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   516
int PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   517
                    const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   518
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   519
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   520
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   521
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   522
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   523
    case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   524
        return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   525
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   526
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   527
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   528
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   529
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   530
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   531
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   532
        case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   533
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   534
            return XML_TOK_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   535
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   536
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   537
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   538
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   539
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   540
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   541
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   542
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   543
/* ptr points to character following first character of attribute name */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   544
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   545
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   546
int PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   547
                     const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   548
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   549
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   550
    int hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   551
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   552
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   553
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   554
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   555
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   556
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   557
            if (hadColon) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   558
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   559
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   560
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   561
            hadColon = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   562
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   563
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   564
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   565
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   566
                CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   567
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   568
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   569
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   570
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   571
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   572
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   573
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   574
            for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   575
                int t;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   576
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   577
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   578
                if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   579
                    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   580
                t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   581
                if (t == BT_EQUALS)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   582
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   583
                switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   584
                case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   585
                case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   586
                case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   587
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   588
                default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   589
                    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   590
                    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   591
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   592
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   593
            /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   594
        case BT_EQUALS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   595
            {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   596
                int open;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   597
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   598
                hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   599
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   600
                for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   601
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   602
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   603
                    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   604
                        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   605
                    open = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   606
                    if (open == BT_QUOT || open == BT_APOS)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   607
                        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   608
                    switch (open) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   609
                    case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   610
                    case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   611
                    case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   612
                        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   613
                    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   614
                        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   615
                        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   616
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   617
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   618
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   619
                /* in attribute value */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   620
                for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   621
                    int t;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   622
                    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   623
                        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   624
                    t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   625
                    if (t == open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   626
                        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   627
                    switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   628
                        INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   629
                    case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   630
                        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   631
                            int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   632
                            if (tok <= 0) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   633
                                if (tok == XML_TOK_INVALID)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   634
                                    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   635
                                return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   636
                            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   637
                            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   638
                        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   639
                    case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   640
                        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   641
                        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   642
                    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   643
                        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   644
                        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   645
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   646
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   647
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   648
                if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   649
                    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   650
                switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   651
                case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   652
                case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   653
                case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   654
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   655
                case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   656
                    goto sol;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   657
                case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   658
                    goto gt;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   659
                default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   660
                    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   661
                    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   662
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   663
                /* ptr points to closing quote */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   664
                for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   665
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   666
                    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   667
                        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   668
                    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   669
                        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   670
            case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   671
                        continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   672
                    case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   673
gt:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   674
                        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   675
                        return XML_TOK_START_TAG_WITH_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   676
                    case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   677
sol:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   678
                        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   679
                        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   680
                            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   681
                        if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   682
                            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   683
                            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   684
                        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   685
                        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   686
                        return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   687
                    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   688
                        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   689
                        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   690
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   691
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   692
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   693
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   694
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   695
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   696
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   697
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   698
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   699
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   700
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   701
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   702
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   703
/* ptr points to character following "<" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   704
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   705
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   706
int PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   707
                   const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   708
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   709
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   710
    int hadColon;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   711
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   712
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   713
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   714
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   715
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   716
    case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   717
        if ((ptr += MINBPC(enc)) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   718
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   719
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   720
        case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   721
            return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   722
        case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   723
            return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   724
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   725
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   726
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   727
    case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   728
        return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   729
    case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   730
        return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   731
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   732
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   733
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   734
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   735
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   736
    hadColon = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   737
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   738
    /* we have a start-tag */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   739
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   740
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   741
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   742
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   743
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   744
            if (hadColon) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   745
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   746
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   747
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   748
            hadColon = 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   749
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   750
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   751
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   752
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   753
                CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   754
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   755
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   756
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   757
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   758
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   759
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   760
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   761
            {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   762
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   763
                while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   764
                    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   765
                        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   766
                    case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   767
                        goto gt;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   768
                    case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   769
                        goto sol;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   770
            case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   771
                        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   772
                        continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   773
                    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   774
                        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   775
                        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   776
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   777
                    return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   778
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   779
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   780
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   781
        case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   782
gt:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   783
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   784
            return XML_TOK_START_TAG_NO_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   785
        case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   786
sol:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   787
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   788
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   789
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   790
            if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   791
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   792
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   793
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   794
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   795
            return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   796
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   797
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   798
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   799
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   800
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   801
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   802
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   803
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   804
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   805
int PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   806
                       const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   807
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   808
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   809
        return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   810
    if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   811
        size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   812
        if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   813
            n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   814
            if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   815
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   816
            end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   817
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   818
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   819
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   820
    case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   821
        return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   822
    case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   823
        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   824
    case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   825
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   826
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   827
            return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   828
        if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   829
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   830
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   831
        return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   832
    case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   833
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   834
        return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   835
    case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   836
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   837
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   838
            return XML_TOK_TRAILING_RSQB;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   839
        if (!CHAR_MATCHES(enc, ptr, ']'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   840
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   841
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   842
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   843
            return XML_TOK_TRAILING_RSQB;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   844
        if (!CHAR_MATCHES(enc, ptr, '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   845
            ptr -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   846
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   847
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   848
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   849
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   850
        INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   851
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   852
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   853
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   854
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   855
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   856
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   857
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   858
    case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   859
      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   860
    *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   861
    return XML_TOK_DATA_CHARS; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   862
      } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   863
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   864
      break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   865
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   866
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   867
        case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   868
            if (ptr + MINBPC(enc) != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   869
                if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ']')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   870
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   871
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   872
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   873
                if (ptr + 2*MINBPC(enc) != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   874
                    if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   875
                        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   876
                        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   877
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   878
                    *nextTokPtr = ptr + 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   879
                    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   880
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   881
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   882
            /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   883
        case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   884
        case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   885
        case BT_NONXML:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   886
        case BT_MALFORM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   887
        case BT_TRAIL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   888
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   889
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   890
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   891
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   892
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   893
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   894
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   895
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   896
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   897
    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   898
    return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   899
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   900
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   901
/* ptr points to character following "%" */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   902
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   903
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   904
int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   905
                        const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   906
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   907
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   908
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   909
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   910
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   911
case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   912
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   913
        return XML_TOK_PERCENT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   914
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   915
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   916
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   917
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   918
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   919
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   920
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   921
        case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   922
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   923
            return XML_TOK_PARAM_ENTITY_REF;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   924
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   925
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   926
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   927
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   928
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   929
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   930
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   931
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   932
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   933
int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   934
                          const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   935
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   936
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   937
        return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   938
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   939
        CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   940
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   941
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   942
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   943
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   944
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   945
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   946
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   947
case BT_CR: case BT_LF: case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   948
case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   949
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   950
            return XML_TOK_POUND_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   951
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   952
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   953
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   954
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   955
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   956
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   957
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   958
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   959
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   960
int PREFIX(scanLit)(int open, const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   961
                    const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   962
                    const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   963
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   964
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   965
        int t = BYTE_TYPE(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   966
        switch (t) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   967
            INVALID_CASES(ptr, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   968
        case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   969
        case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   970
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   971
            if (t != open)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   972
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   973
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   974
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   975
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   976
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   977
    case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   978
    case BT_GT: case BT_PERCNT: case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   979
                return XML_TOK_LITERAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   980
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   981
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   982
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   983
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   984
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   985
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   986
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   987
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   988
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   989
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   990
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   991
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   992
int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   993
                      const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   994
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   995
    int tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   996
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   997
        return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   998
    if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   999
        size_t n = end - ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1000
        if (n & (MINBPC(enc) - 1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1001
            n &= ~(MINBPC(enc) - 1);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1002
            if (n == 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1003
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1004
            end = ptr + n;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1005
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1006
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1007
    switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1008
    case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1009
        return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1010
    case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1011
        return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1012
    case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1013
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1014
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1015
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1016
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1017
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1018
            case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1019
                return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1020
            case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1021
                return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1022
            case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1023
            case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1024
            case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1025
            case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1026
            case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1027
            case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1028
                *nextTokPtr = ptr - MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1029
                return XML_TOK_INSTANCE_START;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1030
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1031
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1032
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1033
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1034
    case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1035
        if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1036
            return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1037
        /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1038
case BT_S: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1039
        for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1040
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1041
            if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1042
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1043
            switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1044
        case BT_S: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1045
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1046
            case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1047
                /* don't split CR/LF pair */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1048
                if (ptr + MINBPC(enc) != end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1049
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1050
                /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1051
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1052
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1053
                return XML_TOK_PROLOG_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1054
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1055
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1056
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1057
        return XML_TOK_PROLOG_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1058
    case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1059
        return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1060
    case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1061
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1062
        return XML_TOK_COMMA;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1063
    case BT_LSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1064
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1065
        return XML_TOK_OPEN_BRACKET;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1066
    case BT_RSQB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1067
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1068
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1069
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1070
        if (CHAR_MATCHES(enc, ptr, ']')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1071
            if (ptr + MINBPC(enc) == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1072
                return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1073
            if (CHAR_MATCHES(enc, ptr + MINBPC(enc), '>')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1074
                *nextTokPtr = ptr + 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1075
                return XML_TOK_COND_SECT_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1076
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1077
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1078
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1079
        return XML_TOK_CLOSE_BRACKET;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1080
    case BT_LPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1081
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1082
        return XML_TOK_OPEN_PAREN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1083
    case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1084
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1085
        if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1086
            return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1087
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1088
        case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1089
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1090
            return XML_TOK_CLOSE_PAREN_ASTERISK;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1091
        case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1092
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1093
            return XML_TOK_CLOSE_PAREN_QUESTION;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1094
        case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1095
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1096
            return XML_TOK_CLOSE_PAREN_PLUS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1097
case BT_CR: case BT_LF: case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1098
case BT_GT: case BT_COMMA: case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1099
        case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1100
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1101
            return XML_TOK_CLOSE_PAREN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1102
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1103
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1104
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1105
    case BT_VERBAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1106
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1107
        return XML_TOK_OR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1108
    case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1109
        *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1110
        return XML_TOK_DECL_CLOSE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1111
    case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1112
        return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1113
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1114
  case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1115
    if (end - ptr < n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1116
      return XML_TOK_PARTIAL_CHAR; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1117
    if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1118
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1119
      tok = XML_TOK_NAME; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1120
      break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1121
    } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1122
    if (IS_NAME_CHAR(enc, ptr, n)) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1123
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1124
      tok = XML_TOK_NMTOKEN; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1125
      break; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1126
    } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1127
    *nextTokPtr = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1128
    return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1129
        LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1130
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1131
    case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1132
    case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1133
        tok = XML_TOK_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1134
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1135
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1136
    case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1137
    case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1138
    case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1139
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1140
    case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1141
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1142
        tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1143
        ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1144
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1145
    case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1146
        if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1147
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1148
            tok = XML_TOK_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1149
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1150
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1151
        if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1152
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1153
            tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1154
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1155
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1156
        /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1157
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1158
        *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1159
        return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1160
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1161
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1162
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1163
            CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1164
case BT_GT: case BT_RPAR: case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1165
case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1166
case BT_S: case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1167
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1168
            return tok;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1169
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1170
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1171
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1172
            switch (tok) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1173
            case XML_TOK_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1174
                if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1175
                    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1176
                tok = XML_TOK_PREFIXED_NAME;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1177
                switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1178
                    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1179
                default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1180
                    tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1181
                    break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1182
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1183
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1184
            case XML_TOK_PREFIXED_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1185
                tok = XML_TOK_NMTOKEN;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1186
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1187
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1188
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1189
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1190
        case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1191
            if (tok == XML_TOK_NMTOKEN)  {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1192
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1193
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1194
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1195
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1196
            return XML_TOK_NAME_PLUS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1197
        case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1198
            if (tok == XML_TOK_NMTOKEN)  {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1199
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1200
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1201
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1202
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1203
            return XML_TOK_NAME_ASTERISK;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1204
        case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1205
            if (tok == XML_TOK_NMTOKEN)  {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1206
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1207
                return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1208
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1209
            *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1210
            return XML_TOK_NAME_QUESTION;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1211
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1212
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1213
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1214
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1215
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1216
    return XML_TOK_PARTIAL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1217
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1218
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1219
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1220
int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1221
                              const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1222
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1223
    const char *start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1224
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1225
        return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1226
    start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1227
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1228
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1229
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1230
    case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1231
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1232
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1233
        case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1234
            if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1235
                return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1236
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1237
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1238
        case BT_LT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1239
            /* this is for inside entity references */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1240
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1241
            return XML_TOK_INVALID;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1242
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1243
            if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1244
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1245
                return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1246
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1247
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1248
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1249
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1250
            if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1251
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1252
                if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1253
                    return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1254
                if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1255
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1256
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1257
                return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1258
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1259
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1260
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1261
        case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1262
            if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1263
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1264
                return XML_TOK_ATTRIBUTE_VALUE_S;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1265
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1266
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1267
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1268
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1269
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1270
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1271
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1272
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1273
    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1274
    return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1275
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1276
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1277
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1278
int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1279
                           const char **nextTokPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1280
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1281
    const char *start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1282
    if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1283
        return XML_TOK_NONE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1284
    start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1285
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1286
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1287
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1288
    case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1289
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1290
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1291
        case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1292
            if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1293
                return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1294
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1295
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1296
        case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1297
            if (ptr == start)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1298
                return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1299
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1300
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1301
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1302
            if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1303
                *nextTokPtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1304
                return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1305
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1306
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1307
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1308
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1309
            if (ptr == start) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1310
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1311
                if (ptr == end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1312
                    return XML_TOK_TRAILING_CR;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1313
                if (BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1314
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1315
                *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1316
                return XML_TOK_DATA_NEWLINE;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1317
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1318
            *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1319
            return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1320
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1321
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1322
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1323
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1324
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1325
    *nextTokPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1326
    return XML_TOK_DATA_CHARS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1327
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1328
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1329
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1330
int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1331
                       const char **badPtr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1332
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1333
    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1334
    end -= MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1335
    for (; ptr != end; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1336
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1337
        case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1338
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1339
        case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1340
        case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1341
        case BT_LPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1342
        case BT_RPAR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1343
        case BT_PLUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1344
        case BT_COMMA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1345
        case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1346
        case BT_EQUALS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1347
        case BT_QUEST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1348
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1349
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1350
        case BT_SEMI:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1351
        case BT_EXCL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1352
        case BT_AST:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1353
        case BT_PERCNT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1354
        case BT_NUM:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1355
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1356
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1357
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1358
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1359
        case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1360
            if (CHAR_MATCHES(enc, ptr, '\t')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1361
                *badPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1362
                return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1363
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1364
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1365
        case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1366
        case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1367
            if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1368
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1369
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1370
            switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1371
            case 0x24: /* $ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1372
            case 0x40: /* @ */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1373
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1374
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1375
                *badPtr = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1376
                return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1377
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1378
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1379
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1380
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1381
    return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1382
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1383
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1384
/* This must only be called for a well-formed start-tag or empty element tag.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1385
Returns the number of attributes.  Pointers to the first attsMax attributes 
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1386
are stored in atts. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1387
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1388
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1389
int PREFIX(getAtts)(const ENCODING *enc, const char *ptr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1390
                    int attsMax, ATTRIBUTE *atts)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1391
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1392
    enum { other, inName, inValue } state = inName;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1393
    int nAtts = 0;
348
f50d8b8c512b libjabber: `open' could be used uninitialized in xmltok_impl_c.h
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
  1394
    int open = 0;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1395
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1396
    for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1397
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1398
#define START_NAME \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1399
      if (state == other) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1400
    if (nAtts < attsMax) { \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1401
      atts[nAtts].name = ptr; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1402
      atts[nAtts].normalized = 1; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1403
    } \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1404
    state = inName; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1405
      }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1406
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1407
    case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1408
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1409
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1410
        case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1411
        case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1412
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1413
            START_NAME
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1414
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1415
#undef START_NAME
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1416
        case BT_QUOT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1417
            if (state != inValue) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1418
                if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1419
                    atts[nAtts].valuePtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1420
                state = inValue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1421
                open = BT_QUOT;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1422
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1423
            else if (open == BT_QUOT) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1424
                state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1425
                if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1426
                    atts[nAtts].valueEnd = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1427
                nAtts++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1428
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1429
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1430
        case BT_APOS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1431
            if (state != inValue) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1432
                if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1433
                    atts[nAtts].valuePtr = ptr + MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1434
                state = inValue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1435
                open = BT_APOS;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1436
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1437
            else if (open == BT_APOS) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1438
                state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1439
                if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1440
                    atts[nAtts].valueEnd = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1441
                nAtts++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1442
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1443
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1444
        case BT_AMP:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1445
            if (nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1446
                atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1447
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1448
        case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1449
            if (state == inName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1450
                state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1451
            else if (state == inValue
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1452
                     && nAtts < attsMax
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1453
                     && atts[nAtts].normalized
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1454
                     && (ptr == atts[nAtts].valuePtr
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1455
                         || BYTE_TO_ASCII(enc, ptr) != ' '
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1456
                         || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ' '
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1457
                         || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1458
                atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1459
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1460
    case BT_CR: case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1461
            /* This case ensures that the first attribute name is counted
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1462
               Apart from that we could just change state on the quote. */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1463
            if (state == inName)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1464
                state = other;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1465
            else if (state == inValue && nAtts < attsMax)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1466
                atts[nAtts].normalized = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1467
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1468
        case BT_GT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1469
        case BT_SOL:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1470
            if (state != inValue)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1471
                return nAtts;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1472
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1473
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1474
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1475
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1476
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1477
    /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1478
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1479
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1480
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1481
int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1482
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1483
    int result = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1484
    /* skip &# */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1485
    ptr += 2*MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1486
    if (CHAR_MATCHES(enc, ptr, 'x')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1487
        for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1488
            int c = BYTE_TO_ASCII(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1489
            switch (c) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1490
case '0': case '1': case '2': case '3': case '4':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1491
case '5': case '6': case '7': case '8': case '9':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1492
                result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1493
                result |= (c - '0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1494
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1495
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1496
                result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1497
                result += 10 + (c - 'A');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1498
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1499
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1500
                result <<= 4;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1501
                result += 10 + (c - 'a');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1502
                break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1503
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1504
            if (result >= 0x110000)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1505
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1506
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1507
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1508
    else {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1509
        for (; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1510
            int c = BYTE_TO_ASCII(enc, ptr);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1511
            result *= 10;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1512
            result += (c - '0');
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1513
            if (result >= 0x110000)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1514
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1515
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1516
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1517
    return checkCharRefNumber(result);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1518
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1519
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1520
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1521
int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1522
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1523
    switch ((end - ptr)/MINBPC(enc)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1524
    case 2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1525
        if (CHAR_MATCHES(enc, ptr + MINBPC(enc), 't')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1526
            switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1527
            case 'l':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1528
                return '<';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1529
            case 'g':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1530
                return '>';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1531
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1532
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1533
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1534
    case 3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1535
        if (CHAR_MATCHES(enc, ptr, 'a')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1536
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1537
            if (CHAR_MATCHES(enc, ptr, 'm')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1538
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1539
                if (CHAR_MATCHES(enc, ptr, 'p'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1540
                    return '&';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1541
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1542
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1543
        break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1544
    case 4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1545
        switch (BYTE_TO_ASCII(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1546
        case 'q':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1547
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1548
            if (CHAR_MATCHES(enc, ptr, 'u')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1549
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1550
                if (CHAR_MATCHES(enc, ptr, 'o')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1551
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1552
                    if (CHAR_MATCHES(enc, ptr, 't'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1553
                        return '"';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1554
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1555
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1556
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1557
        case 'a':
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1558
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1559
            if (CHAR_MATCHES(enc, ptr, 'p')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1560
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1561
                if (CHAR_MATCHES(enc, ptr, 'o')) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1562
                    ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1563
                    if (CHAR_MATCHES(enc, ptr, 's'))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1564
                        return '\'';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1565
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1566
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1567
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1568
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1569
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1570
    return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1571
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1572
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1573
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1574
int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1575
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1576
    for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1577
        switch (BYTE_TYPE(enc, ptr1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1578
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1579
    case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1580
      if (*ptr1++ != *ptr2++) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1581
    return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1582
            LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1583
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1584
            /* fall through */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1585
            if (*ptr1++ != *ptr2++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1586
                return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1587
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1588
        case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1589
        case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1590
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1591
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1592
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1593
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1594
        case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1595
        case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1596
        case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1597
            if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1598
                return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1599
            if (MINBPC(enc) > 1) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1600
                if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1601
                    return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1602
                if (MINBPC(enc) > 2) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1603
                    if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1604
                        return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1605
                    if (MINBPC(enc) > 3) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1606
                        if (*ptr2++ != *ptr1++)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1607
                            return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1608
                    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1609
                }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1610
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1611
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1612
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1613
            if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1614
                return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1615
            switch (BYTE_TYPE(enc, ptr2)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1616
            case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1617
            case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1618
            case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1619
            case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1620
            case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1621
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1622
            case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1623
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1624
            case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1625
            case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1626
            case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1627
            case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1628
                return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1629
            default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1630
                return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1631
            }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1632
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1633
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1634
    /* not reached */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1635
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1636
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1637
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1638
int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, const char *ptr2)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1639
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1640
    for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1641
        if (!CHAR_MATCHES(enc, ptr1, *ptr2))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1642
            return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1643
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1644
    switch (BYTE_TYPE(enc, ptr1)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1645
    case BT_LEAD2:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1646
    case BT_LEAD3:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1647
    case BT_LEAD4:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1648
    case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1649
    case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1650
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1651
    case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1652
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1653
    case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1654
    case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1655
    case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1656
    case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1657
        return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1658
    default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1659
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1660
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1661
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1662
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1663
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1664
int PREFIX(nameLength)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1665
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1666
    const char *start = ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1667
    for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1668
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1669
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1670
    case BT_LEAD ## n: ptr += n; break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1671
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1672
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1673
        case BT_NONASCII:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1674
        case BT_NMSTRT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1675
#ifdef XML_NS
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1676
        case BT_COLON:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1677
#endif
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1678
        case BT_HEX:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1679
        case BT_DIGIT:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1680
        case BT_NAME:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1681
        case BT_MINUS:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1682
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1683
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1684
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1685
            return ptr - start;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1686
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1687
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1688
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1689
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1690
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1691
const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1692
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1693
    for (;;) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1694
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1695
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1696
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1697
        case BT_S:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1698
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1699
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1700
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1701
            return ptr;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1702
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1703
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1704
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1705
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1706
static
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1707
void PREFIX(updatePosition)(const ENCODING *enc,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1708
                            const char *ptr,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1709
                            const char *end,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1710
                            POSITION *pos)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1711
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1712
    while (ptr != end) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1713
        switch (BYTE_TYPE(enc, ptr)) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1714
#define LEAD_CASE(n) \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1715
    case BT_LEAD ## n: \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1716
      ptr += n; \
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1717
      break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1718
            LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1719
#undef LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1720
        case BT_LF:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1721
            pos->columnNumber = (unsigned)-1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1722
            pos->lineNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1723
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1724
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1725
        case BT_CR:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1726
            pos->lineNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1727
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1728
            if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1729
                ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1730
            pos->columnNumber = (unsigned)-1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1731
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1732
        default:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1733
            ptr += MINBPC(enc);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1734
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1735
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1736
        pos->columnNumber++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1737
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1738
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1739
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1740
#undef DO_LEAD_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1741
#undef MULTIBYTE_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1742
#undef INVALID_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1743
#undef CHECK_NAME_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1744
#undef CHECK_NAME_CASES
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1745
#undef CHECK_NMSTRT_CASE
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
  1746
#undef CHECK_NMSTRT_CASES