Lexer.java revision 9f8118474e9513f7a5b7d2a05e4a0fb15d1a6569
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Licensed to the Apache Software Foundation (ASF) under one
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * or more contributor license agreements. See the NOTICE file
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * distributed with this work for additional information
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * regarding copyright ownership. The ASF licenses this file
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * to you under the Apache License, Version 2.0 (the  "License");
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * you may not use this file except in compliance with the License.
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * You may obtain a copy of the License at
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *     http://www.apache.org/licenses/LICENSE-2.0
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Unless required by applicable law or agreed to in writing, software
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * distributed under the License is distributed on an "AS IS" BASIS,
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * See the License for the specific language governing permissions and
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * limitations under the License.
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * $Id: Lexer.java 524810 2007-04-02 15:51:55Z zongaro $
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpackage org.apache.xpath.compiler;
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport java.util.Vector;
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.apache.xml.utils.PrefixResolver;
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgimport org.apache.xpath.res.XPATHErrorResources;
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/**
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This class is in charge of lexical processing of the XPath
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * expression into tokens.
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass Lexer
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
36fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * The target XPath.
37fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   */
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private Compiler m_compiler;
39fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
40fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  /**
41fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * The prefix resolver to map prefixes to namespaces in the XPath.
42fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   */
43fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  PrefixResolver m_namespaceContext;
44fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
45fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  /**
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * The XPath processor object.
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
48fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  XPathParser m_processor;
49fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
51fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * This value is added to each element name in the TARGETEXTRA
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * that is a 'target' (right-most top-level element name).
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  static final int TARGETEXTRA = 10000;
55fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
56fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  /**
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Ignore this, it is going away.
58fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * This holds a map to the m_tokenQueue that tells where the top-level elements are.
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * It is used for pattern matching so the m_tokenQueue can be walked backwards.
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Each element that is a 'target', (right-most top level element name) has
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * TARGETEXTRA added to it.
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private int m_patternMap[] = new int[100];
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Ignore this, it is going away.
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * The number of elements that m_patternMap maps;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private int m_patternMapSize;
71fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
73fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * Create a Lexer object.
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param compiler The owning compiler for this lexer.
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param resolver The prefix resolver for mapping qualified name prefixes
77fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   *                 to namespace URIs.
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param xpathProcessor The parser that is processing strings to opcodes.
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Lexer(Compiler compiler, PrefixResolver resolver,
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        XPathParser xpathProcessor)
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_compiler = compiler;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_namespaceContext = resolver;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_processor = xpathProcessor;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Walk through the expression and build a token queue, and a map of the top-level
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * elements.
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param pat XSLT Expression.
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
94fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   * @throws javax.xml.transform.TransformerException
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
96fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  void tokenize(String pat) throws javax.xml.transform.TransformerException
97fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  {
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    tokenize(pat, null);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
100fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Walk through the expression and build a token queue, and a map of the top-level
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * elements.
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param pat XSLT Expression.
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param targetStrings Vector to hold Strings, may be null.
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @throws javax.xml.transform.TransformerException
108fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org   */
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void tokenize(String pat, Vector targetStrings)
110fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          throws javax.xml.transform.TransformerException
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
112fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
113fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    m_compiler.m_currentPattern = pat;
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_patternMapSize = 0;
115fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // This needs to grow too.  Use a conservative estimate that the OpMapVector
117fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    // needs about five time the length of the input path expression - to a
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // maximum of MAXTOKENQUEUESIZE*5.  If the OpMapVector needs to grow, grow
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // it freely (second argument to constructor).
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int initTokQueueSize = ((pat.length() < OpMap.MAXTOKENQUEUESIZE)
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 ? pat.length() :  OpMap.MAXTOKENQUEUESIZE) * 5;
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_compiler.m_opMap = new OpMapVector(initTokQueueSize,
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         OpMap.BLOCKTOKENQUEUESIZE * 5,
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         OpMap.MAPINDEX_LENGTH);
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int nChars = pat.length();
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int startSubstring = -1;
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int posOfNSSep = -1;
129fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    boolean isStartOfPat = true;
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    boolean isAttrName = false;
131fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    boolean isNum = false;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Nesting of '[' so we can know if the given element should be
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // counted inside the m_patternMap.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int nesting = 0;
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // char[] chars = pat.toCharArray();
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < nChars; i++)
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      char c = pat.charAt(i);
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      switch (c)
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '\"' :
145fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      {
146fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        if (startSubstring != -1)
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isNum = false;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
150fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          isAttrName = false;
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (-1 != posOfNSSep)
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addToTokenQueue(pat.substring(startSubstring, i));
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        startSubstring = i;
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\"'); i++);
165fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (c == '\"' && i < nChars)
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          addToTokenQueue(pat.substring(startSubstring, i + 1));
169fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          startSubstring = -1;
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          m_processor.error(XPATHErrorResources.ER_EXPECTED_DOUBLE_QUOTE,
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            null);  //"misquoted literal... expected double quote!");
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '\'' :
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (startSubstring != -1)
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isNum = false;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
184fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          isAttrName = false;
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          if (-1 != posOfNSSep)
187fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          {
188fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addToTokenQueue(pat.substring(startSubstring, i));
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
196fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        startSubstring = i;
197fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\''); i++);
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (c == '\'' && i < nChars)
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          addToTokenQueue(pat.substring(startSubstring, i + 1));
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          startSubstring = -1;
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          m_processor.error(XPATHErrorResources.ER_EXPECTED_SINGLE_QUOTE,
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            null);  //"misquoted literal... expected single quote!");
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case 0x0A :
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case 0x0D :
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case ' ' :
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '\t' :
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (startSubstring != -1)
217fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        {
218fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          isNum = false;
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isAttrName = false;
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (-1 != posOfNSSep)
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
224fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
225fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          }
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addToTokenQueue(pat.substring(startSubstring, i));
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
230fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          startSubstring = -1;
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '@' :
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        isAttrName = true;
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // fall-through on purpose
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '-' :
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if ('-' == c)
240fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        {
241fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          if (!(isNum || (startSubstring == -1)))
242fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          {
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
245fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isNum = false;
247fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        }
248fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
249fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      // fall-through on purpose
250fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '(' :
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '[' :
252fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case ')' :
253fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case ']' :
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '|' :
255fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '/' :
256fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '*' :
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '+' :
258fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '=' :
259fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case ',' :
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '\\' :  // Unused at the moment
261fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '^' :  // Unused at the moment
262fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '!' :  // Unused at the moment
263fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '$' :
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case '<' :
265fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case '>' :
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (startSubstring != -1)
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
268fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          isNum = false;
269fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isAttrName = false;
271fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (-1 != posOfNSSep)
273fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          {
274fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
275fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          }
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
278fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org            addToTokenQueue(pat.substring(startSubstring, i));
279fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          }
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          startSubstring = -1;
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else if (('/' == c) && isStartOfPat)
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else if ('*' == c)
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isAttrName = false;
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (0 == nesting)
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if ('|' == c)
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (null != targetStrings)
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              recordTokenString(targetStrings);
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            isStartOfPat = true;
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if ((')' == c) || (']' == c))
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          nesting--;
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else if (('(' == c) || ('[' == c))
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          nesting++;
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        addToTokenQueue(pat.substring(i, i + 1));
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case ':' :
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (i>0)
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (posOfNSSep == (i - 1))
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (startSubstring != -1)
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            {
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              if (startSubstring < (i - 1))
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                addToTokenQueue(pat.substring(startSubstring, i - 1));
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            }
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            isNum = false;
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            isAttrName = false;
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            startSubstring = -1;
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            posOfNSSep = -1;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addToTokenQueue(pat.substring(i - 1, i + 1));
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            posOfNSSep = i;
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // fall through on purpose
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default :
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (-1 == startSubstring)
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          startSubstring = i;
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isNum = Character.isDigit(c);
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else if (isNum)
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          isNum = Character.isDigit(c);
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (startSubstring != -1)
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      isNum = false;
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if ((-1 != posOfNSSep) ||
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org         ((m_namespaceContext != null) && (m_namespaceContext.handlesNullPrefixes())))
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, nChars);
366fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      }
367fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      else
368fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      {
369fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        addToTokenQueue(pat.substring(startSubstring, nChars));
370fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      }
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
372fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (0 == m_compiler.getTokenQueueSize())
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_processor.error(XPATHErrorResources.ER_EMPTY_EXPRESSION, null);  //"Empty expression!");
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else if (null != targetStrings)
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      recordTokenString(targetStrings);
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_processor.m_queueMark = 0;
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
384fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
385fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  /**
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Record the current position on the token queue as long as
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * this is a top-level element.  Must be called before the
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * next token is added to the m_tokenQueue.
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param nesting The nesting count for the pattern element.
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param isStart true if this is the start of a pattern.
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param isAttrName true if we have determined that this is an attribute name.
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @return true if this is the start of a pattern.
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private boolean mapPatternElemPos(int nesting, boolean isStart,
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                    boolean isAttrName)
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (0 == nesting)
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if(m_patternMapSize >= m_patternMap.length)
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int patternMap[] = m_patternMap;
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int len = m_patternMap.length;
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        m_patternMap = new int[m_patternMapSize + 100];
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        System.arraycopy(patternMap, 0, m_patternMap, 0, len);
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (!isStart)
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        m_patternMap[m_patternMapSize - 1] -= TARGETEXTRA;
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_patternMap[m_patternMapSize] =
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (m_compiler.getTokenQueueSize() - (isAttrName ? 1 : 0)) + TARGETEXTRA;
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_patternMapSize++;
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      isStart = false;
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return isStart;
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Given a map pos, return the corresponding token queue pos.
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param i The index in the m_patternMap.
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @return the token queue position.
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private int getTokenQueuePosFromMap(int i)
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int pos = m_patternMap[i];
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return (pos >= TARGETEXTRA) ? (pos - TARGETEXTRA) : pos;
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Reset token queue mark and m_token to a
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * given position.
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param mark The new position.
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private final void resetTokenMark(int mark)
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int qsz = m_compiler.getTokenQueueSize();
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_processor.m_queueMark = (mark > 0)
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              ? ((mark <= qsz) ? mark - 1 : mark) : 0;
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (m_processor.m_queueMark < qsz)
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_processor.m_token =
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        (String) m_compiler.getTokenQueue().elementAt(m_processor.m_queueMark++);
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_processor.m_tokenChar = m_processor.m_token.charAt(0);
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
460fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      m_processor.m_token = null;
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      m_processor.m_tokenChar = 0;
462fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    }
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
464fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Given a string, return the corresponding keyword token.
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param key The keyword.
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @return An opcode value.
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  final int getKeywordToken(String key)
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int tok;
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    try
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      Integer itok = (Integer) Keywords.getKeyWord(key);
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tok = (null != itok) ? itok.intValue() : 0;
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    catch (NullPointerException npe)
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tok = 0;
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    catch (ClassCastException cce)
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      tok = 0;
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return tok;
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Record the current token in the passed vector.
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param targetStrings Vector of string.
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
500fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  private void recordTokenString(Vector targetStrings)
501fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org  {
502fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int tokPos = getTokenQueuePosFromMap(m_patternMapSize - 1);
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    resetTokenMark(tokPos + 1);
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (m_processor.lookahead('(', 1))
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int tok = getKeywordToken(m_processor.m_token);
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      switch (tok)
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case OpCodes.NODETYPE_COMMENT :
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_COMMENT);
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
516fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case OpCodes.NODETYPE_TEXT :
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_TEXT);
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case OpCodes.NODETYPE_NODE :
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      case OpCodes.NODETYPE_ROOT :
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_ROOT);
524fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        break;
525fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case OpCodes.NODETYPE_ANYELEMENT :
526fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
528fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      case OpCodes.NODETYPE_PI :
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        break;
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default :
532fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (m_processor.tokenIs('@'))
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tokPos++;
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        resetTokenMark(tokPos + 1);
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
544fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      if (m_processor.lookahead(':', 1))
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        tokPos += 2;
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
549fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      targetStrings.addElement(m_compiler.getTokenQueue().elementAt(tokPos));
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * Add a token to the token queue.
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param s The token.
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private final void addToTokenQueue(String s)
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    m_compiler.getTokenQueue().addElement(s);
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /**
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * When a seperator token is found, see if there's a element name or
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * the like to map.
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param pat The XPath name string.
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param startSubstring The start of the name string.
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param posOfNSSep The position of the namespace seperator (':').
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @param posOfScan The end of the name index.
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @throws javax.xml.transform.TransformerException
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   *
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   * @return -1 always.
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   */
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  private int mapNSTokens(String pat, int startSubstring, int posOfNSSep,
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int posOfScan)
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           throws javax.xml.transform.TransformerException
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org {
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    String prefix = "";
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((startSubstring >= 0) && (posOfNSSep >= 0))
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       prefix = pat.substring(startSubstring, posOfNSSep);
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    String uName;
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((null != m_namespaceContext) &&!prefix.equals("*")
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            &&!prefix.equals("xmlns"))
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
593fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      try
594fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      {
595fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        if (prefix.length() > 0)
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          uName = ((PrefixResolver) m_namespaceContext).getNamespaceForPrefix(
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            prefix);
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        else
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Assume last was wildcard. This is not legal according
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // to the draft. Set the below to true to make namespace
603fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          // wildcards work.
604fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          if (false)
605fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          {
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            addToTokenQueue(":");
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            String s = pat.substring(posOfNSSep + 1, posOfScan);
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            if (s.length() > 0)
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              addToTokenQueue(s);
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
613fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org            return -1;
614fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org          }
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          else
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          {
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            uName =
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              ((PrefixResolver) m_namespaceContext).getNamespaceForPrefix(
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                prefix);
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      catch (ClassCastException cce)
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      {
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        uName = m_namespaceContext.getNamespaceForPrefix(prefix);
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      uName = prefix;
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if ((null != uName) && (uName.length() > 0))
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      addToTokenQueue(uName);
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      addToTokenQueue(":");
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      String s = pat.substring(posOfNSSep + 1, posOfScan);
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (s.length() > 0)
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        addToTokenQueue(s);
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    else
644fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    {
645fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org        // To older XPath code it doesn't matter if
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // error() is called or errorForDOM3().
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org		m_processor.errorForDOM3(XPATHErrorResources.ER_PREFIX_MUST_RESOLVE,
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org						 new String[] {prefix});  //"Prefix must resolve to a namespace: {0}";
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/** old code commented out 17-Sep-2004
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// error("Could not locate namespace for prefix: "+prefix);
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//		  m_processor.error(XPATHErrorResources.ER_PREFIX_MUST_RESOLVE,
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//					 new String[] {prefix});  //"Prefix must resolve to a namespace: {0}";
654fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org*/
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
656fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org      /***  Old code commented out 10-Jan-2001
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      addToTokenQueue(prefix);
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      addToTokenQueue(":");
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      String s = pat.substring(posOfNSSep + 1, posOfScan);
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (s.length() > 0)
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        addToTokenQueue(s);
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ***/
665fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org    }
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
670fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org