19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: XStringForFSB.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.objects; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.FastStringBuffer; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLCharacterRecognizer; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLString; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XMLStringFactory; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class will wrap a FastStringBuffer and allow for 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XStringForFSB extends XString 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = -1533039186550674548L; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The start position in the fsb. */ 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int m_start; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The length of the string. */ 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int m_length; 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** If the str() function is called, the string will be cached here. */ 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected String m_strCache = null; 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** cached hash code */ 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected int m_hash = 0; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a XNodeSet object. 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param val FastStringBuffer object this will wrap, must be non-null. 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param start The start position in the array. 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param length The number of characters to read from the array. 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XStringForFSB(FastStringBuffer val, int start, int length) 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(val); 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_start = start; 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_length = length; 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == val) 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new IllegalArgumentException( 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FASTSTRINGBUFFER_CANNOT_BE_NULL, null)); 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a XNodeSet object. 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param val String object this will wrap. 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private XStringForFSB(String val) 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(val); 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new IllegalArgumentException( 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLMessages.createXPATHMessage(XPATHErrorResources.ER_FSB_CANNOT_TAKE_STRING, null)); // "XStringForFSB can not take a string for an argument!"); 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Cast result object to a string. 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The string this wraps or the empty string if null 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public FastStringBuffer fsb() 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return ((FastStringBuffer) m_obj); 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Cast result object to a string. 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The string this wraps or the empty string if null 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void appendToFsb(org.apache.xml.utils.FastStringBuffer fsb) 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %OPT% !!! FSB has to be updated to take partial fsb's for append. 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fsb.append(str()); 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this object contains a java String object. 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if this XMLString can return a string without creating one. 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean hasString() 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != m_strCache); 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// /** NEEDSDOC Field strCount */ 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// public static int strCount = 0; 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// /** NEEDSDOC Field xtable */ 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// static java.util.Hashtable xtable = new java.util.Hashtable(); 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Since this object is incomplete without the length and the offset, we 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * have to convert to a string when this function is called. 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The java String representation of this object. 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Object object() 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return str(); 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Cast result object to a string. 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The string this wraps or the empty string if null 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String str() 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_strCache) 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_strCache = fsb().getString(m_start, m_length); 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// strCount++; 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// RuntimeException e = new RuntimeException("Bad! Bad!"); 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// java.io.CharArrayWriter writer = new java.io.CharArrayWriter(); 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// java.io.PrintWriter pw = new java.io.PrintWriter(writer); 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// e.printStackTrace(pw); 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// String str = writer.toString(); 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// str = str.substring(0, 600); 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// if (null == xtable.get(str)) 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// { 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// xtable.put(str, str); 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// System.out.println(str); 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// } 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// System.out.println("strCount: " + strCount); 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// throw e; 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// e.printStackTrace(); 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.exit(-1); 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_strCache; 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Directly call the 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * characters method on the passed ContentHandler for the 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string-value. Multiple calls to the 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ContentHandler's characters methods may well occur for a single call to 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this method. 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ch A non-null reference to a ContentHandler. 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws org.xml.sax.SAXException 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void dispatchCharactersEvents(org.xml.sax.ContentHandler ch) 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fsb().sendSAXcharacters(ch, m_start, m_length); 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Directly call the 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * comment method on the passed LexicalHandler for the 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string-value. 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param lh A non-null reference to a LexicalHandler. 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws org.xml.sax.SAXException 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void dispatchAsComment(org.xml.sax.ext.LexicalHandler lh) 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fsb().sendSAXComment(lh, m_start, m_length); 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns the length of this string. 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the length of the sequence of characters represented by this 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * object. 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int length() 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_length; 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns the character at the specified index. An index ranges 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * from <code>0</code> to <code>length() - 1</code>. The first character 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of the sequence is at index <code>0</code>, the next at index 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>1</code>, and so on, as for array indexing. 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param index the index of the character. 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the character at the specified index of this string. 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The first character is at index <code>0</code>. 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception IndexOutOfBoundsException if the <code>index</code> 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * argument is negative or not less than the length of this 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string. 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public char charAt(int index) 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return fsb().charAt(m_start + index); 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Copies characters from this string into the destination character 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * array. 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param srcBegin index of the first character in the string 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to copy. 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param srcEnd index after the last character in the string 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to copy. 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dst the destination array. 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dstBegin the start offset in the destination array. 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception IndexOutOfBoundsException If any of the following 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is true: 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <ul><li><code>srcBegin</code> is negative. 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <li><code>srcBegin</code> is greater than <code>srcEnd</code> 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <li><code>srcEnd</code> is greater than the length of this 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <li><code>dstBegin</code> is negative 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <li><code>dstBegin+(srcEnd-srcBegin)</code> is larger than 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>dst.length</code></ul> 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception NullPointerException if <code>dst</code> is <code>null</code> 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %OPT% Need to call this on FSB when it is implemented. 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %UNTESTED% (I don't think anyone calls this yet?) 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = srcEnd - srcBegin; 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n > m_length) 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = m_length; 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n > (dst.length - dstBegin)) 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = (dst.length - dstBegin); 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int end = srcBegin + m_start + n; 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int d = dstBegin; 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = srcBegin + m_start; i < end; i++) 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dst[d++] = fsb.charAt(i); 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares this string to the specified object. 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The result is <code>true</code> if and only if the argument is not 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code> and is a <code>String</code> object that represents 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the same sequence of characters as this object. 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param obj2 the object to compare this <code>String</code> 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * against. 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return <code>true</code> if the <code>String </code>are equal; 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>false</code> otherwise. 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.String#compareTo(java.lang.String) 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.String#equalsIgnoreCase(java.lang.String) 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean equals(XMLString obj2) 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (this == obj2) 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_length; 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n == obj2.length()) 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i = m_start; 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int j = 0; 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (n-- != 0) 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fsb.charAt(i) != obj2.charAt(j)) 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson j++; 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if two objects are functionally equal. 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param obj2 Object to compare this to 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the two objects are equal 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean equals(XObject obj2) 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (this == obj2) 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(obj2.getType() == XObject.CLASS_NUMBER) 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return obj2.equals(this); 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String str = obj2.str(); 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_length; 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n == str.length()) 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i = m_start; 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int j = 0; 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (n-- != 0) 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fsb.charAt(i) != str.charAt(j)) 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson j++; 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if two objects are functionally equal. 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param anotherString Object to compare this to 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the two objects are equal 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean equals(String anotherString) 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_length; 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (n == anotherString.length()) 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i = m_start; 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int j = 0; 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (n-- != 0) 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fsb.charAt(i) != anotherString.charAt(j)) 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson j++; 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares this string to the specified object. 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The result is <code>true</code> if and only if the argument is not 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code> and is a <code>String</code> object that represents 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the same sequence of characters as this object. 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param obj2 the object to compare this <code>String</code> 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * against. 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return <code>true</code> if the <code>String </code>are equal; 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>false</code> otherwise. 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.String#compareTo(java.lang.String) 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.String#equalsIgnoreCase(java.lang.String) 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean equals(Object obj2) 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == obj2) 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(obj2 instanceof XNumber) 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return obj2.equals(this); 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // In order to handle the 'all' semantics of 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // nodeset comparisons, we always call the 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // nodeset function. 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (obj2 instanceof XNodeSet) 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return obj2.equals(this); 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (obj2 instanceof XStringForFSB) 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return equals((XMLString) obj2); 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return equals(obj2.toString()); 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares this <code>String</code> to another <code>String</code>, 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ignoring case considerations. Two strings are considered equal 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ignoring case if they are of the same length, and corresponding 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * characters in the two strings are equal ignoring case. 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param anotherString the <code>String</code> to compare this 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>String</code> against. 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return <code>true</code> if the argument is not <code>null</code> 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and the <code>String</code>s are equal, 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ignoring case; <code>false</code> otherwise. 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #equals(Object) 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.Character#toLowerCase(char) 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.lang.Character#toUpperCase(char) 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean equalsIgnoreCase(String anotherString) 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (m_length == anotherString.length()) 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? str().equalsIgnoreCase(anotherString) : false; 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares two strings lexicographically. 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xstr the <code>String</code> to be compared. 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the value <code>0</code> if the argument string is equal to 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this string; a value less than <code>0</code> if this string 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is lexicographically less than the string argument; and a 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * value greater than <code>0</code> if this string is 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * lexicographically greater than the string argument. 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception java.lang.NullPointerException if <code>anotherString</code> 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is <code>null</code>. 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int compareTo(XMLString xstr) 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len1 = m_length; 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len2 = xstr.length(); 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = Math.min(len1, len2); 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i = m_start; 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int j = 0; 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (n-- != 0) 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c1 = fsb.charAt(i); 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c2 = xstr.charAt(j); 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (c1 != c2) 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return c1 - c2; 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson j++; 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return len1 - len2; 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares two strings lexicographically, ignoring case considerations. 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This method returns an integer whose sign is that of 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>this.toUpperCase().toLowerCase().compareTo( 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * str.toUpperCase().toLowerCase())</code>. 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p> 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this method does <em>not</em> take locale into account, 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and will result in an unsatisfactory ordering for certain locales. 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The java.text package provides <em>collators</em> to allow 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * locale-sensitive ordering. 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xstr the <code>String</code> to be compared. 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a negative integer, zero, or a positive integer as the 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the specified String is greater than, equal to, or less 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * than this String, ignoring case considerations. 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see java.text.Collator#compare(String, String) 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @since 1.2 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int compareToIgnoreCase(XMLString xstr) 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len1 = m_length; 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len2 = xstr.length(); 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = Math.min(len1, len2); 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i = m_start; 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int j = 0; 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (n-- != 0) 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c1 = Character.toLowerCase(fsb.charAt(i)); 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c2 = Character.toLowerCase(xstr.charAt(j)); 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (c1 != c2) 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return c1 - c2; 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson j++; 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return len1 - len2; 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns a hashcode for this string. The hashcode for a 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>String</code> object is computed as 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <blockquote><pre> 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre></blockquote> 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * using <code>int</code> arithmetic, where <code>s[i]</code> is the 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <i>i</i>th character of the string, <code>n</code> is the length of 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the string, and <code>^</code> indicates exponentiation. 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (The hash value of the empty string is zero.) 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a hash code value for this object. 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int hashCode() 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Commenting this out because in JDK1.1.8 and VJ++ 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // we don't match XMLStrings. Defaulting to the super 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // causes us to create a string, but at this point 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // this only seems to get called in key processing. 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Maybe we can live with it? 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int h = m_hash; 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (h == 0) 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int off = m_start; 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len = m_length; 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < len; i++) 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson h = 31 * h + fsb.charAt(off); 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson off++; 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_hash = h; 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return super.hashCode(); // h; 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tests if this string starts with the specified prefix beginning 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a specified index. 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix the prefix. 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param toffset where to begin looking in the string. 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return <code>true</code> if the character sequence represented by the 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * argument is a prefix of the substring of this object starting 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * at index <code>toffset</code>; <code>false</code> otherwise. 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The result is <code>false</code> if <code>toffset</code> is 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * negative or greater than the length of this 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>String</code> object; otherwise the result is the same 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * as the result of the expression 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <pre> 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.subString(toffset).startsWith(prefix) 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre> 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception java.lang.NullPointerException if <code>prefix</code> is 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code>. 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean startsWith(XMLString prefix, int toffset) 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int to = m_start + toffset; 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int tlim = m_start + m_length; 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int po = 0; 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int pc = prefix.length(); 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: toffset might be near -1>>>1. 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((toffset < 0) || (toffset > m_length - pc)) 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (--pc >= 0) 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fsb.charAt(to) != prefix.charAt(po)) 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson to++; 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson po++; 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tests if this string starts with the specified prefix. 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix the prefix. 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return <code>true</code> if the character sequence represented by the 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * argument is a prefix of the character sequence represented by 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this string; <code>false</code> otherwise. 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note also that <code>true</code> will be returned if the 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * argument is an empty string or is equal to this 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>String</code> object as determined by the 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link #equals(Object)} method. 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception java.lang.NullPointerException if <code>prefix</code> is 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code>. 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @since JDK1. 0 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean startsWith(XMLString prefix) 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return startsWith(prefix, 0); 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns the index within this string of the first occurrence of the 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * specified character. If a character with value <code>ch</code> occurs 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in the character sequence represented by this <code>String</code> 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * object, then the index of the first such occurrence is returned -- 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that is, the smallest value <i>k</i> such that: 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <blockquote><pre> 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this.charAt(<i>k</i>) == ch 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre></blockquote> 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is <code>true</code>. If no such character occurs in this string, 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * then <code>-1</code> is returned. 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ch a character. 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the index of the first occurrence of the character in the 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * character sequence represented by this object, or 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>-1</code> if the character does not occur. 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int indexOf(int ch) 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return indexOf(ch, 0); 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns the index within this string of the first occurrence of the 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * specified character, starting the search at the specified index. 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p> 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * If a character with value <code>ch</code> occurs in the character 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * sequence represented by this <code>String</code> object at an index 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * no smaller than <code>fromIndex</code>, then the index of the first 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * such occurrence is returned--that is, the smallest value <i>k</i> 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * such that: 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <blockquote><pre> 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (this.charAt(<i>k</i>) == ch) && (<i>k</i> >= fromIndex) 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre></blockquote> 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is true. If no such character occurs in this string at or after 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * position <code>fromIndex</code>, then <code>-1</code> is returned. 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p> 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * There is no restriction on the value of <code>fromIndex</code>. If it 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * is negative, it has the same effect as if it were zero: this entire 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string may be searched. If it is greater than the length of this 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * string, it has the same effect as if it were equal to the length of 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this string: <code>-1</code> is returned. 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ch a character. 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param fromIndex the index to start the search from. 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the index of the first occurrence of the character in the 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * character sequence represented by this object that is greater 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * than or equal to <code>fromIndex</code>, or <code>-1</code> 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * if the character does not occur. 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int indexOf(int ch, int fromIndex) 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int max = m_start + m_length; 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fromIndex < 0) 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fromIndex = 0; 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (fromIndex >= m_length) 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Note: fromIndex might be near -1>>>1. 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -1; 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = m_start + fromIndex; i < max; i++) 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (fsb.charAt(i) == ch) 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return i - m_start; 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -1; 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns a new string that is a substring of this string. The 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * substring begins with the character at the specified index and 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * extends to the end of this string. <p> 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Examples: 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <blockquote><pre> 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * "unhappy".substring(2) returns "happy" 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * "Harbison".substring(3) returns "bison" 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * "emptiness".substring(9) returns "" (an empty string) 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre></blockquote> 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param beginIndex the beginning index, inclusive. 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the specified substring. 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception IndexOutOfBoundsException if 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>beginIndex</code> is negative or larger than the 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * length of this <code>String</code> object. 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XMLString substring(int beginIndex) 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len = m_length - beginIndex; 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (len <= 0) 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return XString.EMPTYSTRING; 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int start = m_start + beginIndex; 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return new XStringForFSB(fsb(), start, len); 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns a new string that is a substring of this string. The 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * substring begins at the specified <code>beginIndex</code> and 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * extends to the character at index <code>endIndex - 1</code>. 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Thus the length of the substring is <code>endIndex-beginIndex</code>. 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param beginIndex the beginning index, inclusive. 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param endIndex the ending index, exclusive. 7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the specified substring. 7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception IndexOutOfBoundsException if the 7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>beginIndex</code> is negative, or 7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>endIndex</code> is larger than the length of 7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this <code>String</code> object, or 7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>beginIndex</code> is larger than 7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>endIndex</code>. 7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XMLString substring(int beginIndex, int endIndex) 7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int len = endIndex - beginIndex; 7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (len > m_length) 7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson len = m_length; 7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (len <= 0) 7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return XString.EMPTYSTRING; 7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int start = m_start + beginIndex; 7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return new XStringForFSB(fsb(), start, len); 7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Concatenates the specified string to the end of this string. 8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param str the <code>String</code> that is concatenated to the end 8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of this <code>String</code>. 8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a string that represents the concatenation of this object's 8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * characters followed by the string argument's characters. 8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @exception java.lang.NullPointerException if <code>str</code> is 8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code>. 8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XMLString concat(String str) 8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %OPT% Make an FSB here? 8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return new XString(str().concat(str)); 8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Removes white space from both ends of this string. 8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return this string, with white space removed from the front and end. 8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XMLString trim() 8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return fixWhiteSpace(true, true, false); 8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns whether the specified <var>ch</var> conforms to the XML 1.0 definition 8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of whitespace. Refer to <A href="http://www.w3.org/TR/1998/REC-xml-19980210#NT-S"> 8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the definition of <CODE>S</CODE></A> for details. 8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ch Character to check as XML whitespace. 8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return =true if <var>ch</var> is XML whitespace; otherwise =false. 8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private static boolean isSpace(char ch) 8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return XMLCharacterRecognizer.isWhiteSpace(ch); // Take the easy way out for now. 8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Conditionally trim all leading and trailing whitespace in the specified String. 8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * All strings of white space are 8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * replaced by a single space character (#x20), except spaces after punctuation which 8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * receive double spaces if doublePunctuationSpaces is true. 8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function may be useful to a formatter, but to get first class 8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * results, the formatter should probably do it's own white space handling 8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * based on the semantics of the formatting object. 8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param trimHead Trim leading whitespace? 8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param trimTail Trim trailing whitespace? 8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param doublePunctuationSpaces Use double spaces for punctuation? 8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The trimmed string. 8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XMLString fixWhiteSpace(boolean trimHead, boolean trimTail, 8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean doublePunctuationSpaces) 8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int end = m_length + m_start; 8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char[] buf = new char[m_length]; 8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson FastStringBuffer fsb = fsb(); 8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean edit = false; 8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* replace S to ' '. and ' '+ -> single ' '. */ 8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int d = 0; 8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean pres = false; 8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int s = m_start; s < end; s++) 8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c = fsb.charAt(s); 8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (isSpace(c)) 8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!pres) 8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (' ' != c) 8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson edit = true; 8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf[d++] = ' '; 8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (doublePunctuationSpaces && (d != 0)) 8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char prevChar = buf[d - 1]; 8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!((prevChar == '.') || (prevChar == '!') 8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson || (prevChar == '?'))) 8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pres = true; 8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pres = true; 8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson edit = true; 9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pres = true; 9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf[d++] = c; 9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pres = false; 9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (trimTail && 1 <= d && ' ' == buf[d - 1]) 9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson edit = true; 9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson d--; 9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int start = 0; 9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (trimHead && 0 < d && ' ' == buf[0]) 9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson edit = true; 9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson start++; 9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLStringFactory xsf = XMLStringFactoryImpl.getFactory(); 9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return edit ? xsf.newstr(buf, start, d - start) : this; 9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Convert a string to a double -- Allowed input is in fixed 9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * notation ddd.fff. 9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %OPT% CHECK PERFORMANCE against generating a Java String and 9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * converting it to double. The advantage of running in native 9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * machine code -- perhaps even microcode, on some systems -- may 9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * more than make up for the cost of allocating and discarding the 9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * additional object. We need to benchmark this. 9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * %OPT% More importantly, we need to decide whether we _care_ about 9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the performance of this operation. Does XString.toDouble constitute 9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * any measurable percentage of our typical runtime? I suspect not! 9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A double value representation of the string, or return Double.NaN 9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * if the string can not be converted. */ 9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public double toDouble() 9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_length == 0) 9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Double.NaN; 9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int i; 9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson char c; 9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String valueString = fsb().getString(m_start,m_length); 9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The following are permitted in the Double.valueOf, but not by the XPath spec: 9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // - a plus sign 9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // - The use of e or E to indicate exponents 9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // - trailing f, F, d, or D 9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // See function comments; not sure if this is slower than actually doing the 9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // conversion ourselves (as was before). 9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (i=0;i<m_length;i++) 9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!XMLCharacterRecognizer.isWhiteSpace(valueString.charAt(i))) 9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (i == m_length) return Double.NaN; 9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (valueString.charAt(i) == '-') 9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson i++; 9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (;i<m_length;i++) { 9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson c = valueString.charAt(i); 9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (c != '.' && (c < '0' || c > '9')) 9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (;i<m_length;i++) 9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!XMLCharacterRecognizer.isWhiteSpace(valueString.charAt(i))) 9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (i != m_length) 9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Double.NaN; 9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try { 9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return new Double(valueString).doubleValue(); 9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } catch (NumberFormatException nfe) { 9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This should catch double periods, empty strings. 9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Double.NaN; 9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 987