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