aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java
diff options
context:
space:
mode:
authorMatthias Klose <doko@gcc.gnu.org>2008-10-21 17:55:01 +0000
committerMatthias Klose <doko@gcc.gnu.org>2008-10-21 17:55:01 +0000
commitcd6d4007aa4f72b51756e4a571abf876fa3e3133 (patch)
tree6de8da5758622565799768e49cd0de6698ca3cb8 /libjava/classpath/gnu/java
parentd9cc481a359c713f473a136730e4019124368d6b (diff)
downloadgcc-cd6d4007aa4f72b51756e4a571abf876fa3e3133.zip
gcc-cd6d4007aa4f72b51756e4a571abf876fa3e3133.tar.gz
gcc-cd6d4007aa4f72b51756e4a571abf876fa3e3133.tar.bz2
re PR libgcj/37636 (java tools are unable to find resource files)
libjava/ChangeLog: 2008-10-21 Andrew John Hughes <gnu_andrew@member.fsf.org> * sources.am, Makfile.in: Regenerate. 2008-10-17 Matthias Klose <doko@ubuntu.com> * configure.ac: Fix bashisms. * configure: Regenerate. 2008-10-15 Matthias Klose <doko@ubuntu.com> * configure.ac: Disable build of gjdoc, if configured without --with-antlr-jar or if no antlr.jar found. * configure: Regenerate. 2008-10-09 Andrew John Hughes <gnu_andrew@member.fsf.org> * classpath/configure.ac, * classpath/m4/ac_prog_antlr.m4, * classpath/m4/ac_prog_java.m4, * classpath/tools/Makefile.am: Ported --regen-gjdoc-parser patch and cantlr support from GNU Classpath. 2008-10-06 Andrew Haley <aph@redhat.com> * java/lang/Thread.java (Thread): Always create the ThreadLocalMap when creating a thread. (getThreadLocals) Don't lazily create the ThreadLocalMap. 2008-09-28 Andrew John Hughes <gnu_andrew@member.fsf.org> * classpath/java/lang/ThreadLocalMap.java, * java/lang/ThreadLocalMap$Entry.h, * java/lang/ThreadLocalMap.h, * lib/java/lang/ThreadLocalMap.class, * lib/java/lang/ThreadLocalMap$Entry.class: Add the new files for the ThreadLocal patch. 2008-09-28 Andrew John Hughes <gnu_andrew@member.fsf.org> * classpath/ChangeLog, * classpath/java/lang/InheritableThreadLocal.java, * classpath/java/lang/Thread.java, * classpath/java/lang/ThreadLocal.java: Merge Daniel Frampton's ThreadLocal patch. * gcj/javaprims.h: Updated. * java/lang/Thread.h: Regenerated. * java/lang/Thread.java: Replace WeakIdentityHashMap with ThreadLocalMap. (getThreadLocals()): Likewise. * java/lang/ThreadLocal.h: Regenerated. * java/lang/ThreadLocal.java: (computeNextHash()): New method. (ThreadLocal()): Initialise fastHash. (internalGet()): Updated to match Classpath's get(). (internalSet(Object)): Likewise for set(Object). (internalRemove()): Likewise for remove(). 2008-09-25 Andrew John Hughes <gnu_andrew@member.fsf.org> * classpath/configure, * classpath/configure.ac: Resynchronise with Classpath's configure. * classpath/examples/Makefile.in: Add equivalent support for building as in tools/Makefile.in. * classpath/java/nio/Buffer.java, * classpath/java/nio/ByteBuffer.java, * classpath/java/nio/ByteBufferImpl.java, * classpath/java/nio/CharBuffer.java, * classpath/java/nio/CharBufferImpl.java, * classpath/java/nio/CharSequenceBuffer.java, * classpath/java/nio/CharViewBufferImpl.java, * classpath/java/nio/DirectByteBufferImpl.java, * classpath/java/nio/DoubleBuffer.java, * classpath/java/nio/DoubleBufferImpl.java, * classpath/java/nio/DoubleViewBufferImpl.java, * classpath/java/nio/FloatBuffer.java, * classpath/java/nio/FloatBufferImpl.java, * classpath/java/nio/FloatViewBufferImpl.java, * classpath/java/nio/IntBuffer.java, * classpath/java/nio/IntBufferImpl.java, * classpath/java/nio/IntViewBufferImpl.java, * classpath/java/nio/LongBuffer.java, * classpath/java/nio/LongBufferImpl.java, * classpath/java/nio/LongViewBufferImpl.java, * classpath/java/nio/MappedByteBuffer.java, * classpath/java/nio/MappedByteBufferImpl.java, * classpath/java/nio/ShortBuffer.java, * classpath/java/nio/ShortBufferImpl.java, * classpath/java/nio/ShortViewBufferImpl.java: Replace use of gnu.classpath.Pointer with gnu.gcj.RawData, and fix some formatting issues. * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaLexer.java, * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaLexer.smap, * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaRecognizer.java, * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaRecognizer.smap, * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaTokenTypes.java, * classpath/tools/gnu/classpath/tools/gjdoc/expr/JavaTokenTypes.txt: Regenerated (later version of antlr). * java/nio/Buffer.h: Regenerated. * java/nio/Buffer.java: Ported changes from Classpath. * java/nio/ByteBuffer.h, * java/nio/CharBuffer.h: Regenerated. * java/nio/DirectByteBufferImpl.java: Ported changes from Classpath. * java/nio/DoubleBuffer.h, * java/nio/FloatBuffer.h, * java/nio/IntBuffer.h, * java/nio/LongBuffer.h, * java/nio/MappedByteBuffer.h, * java/nio/MappedByteBufferImpl.h: Regenerated. * java/nio/MappedByteBufferImpl.java: Ported changes from Classpath. * java/nio/ShortBuffer.h: Regenerated. 2008-09-24 Matthias Klose <doko@ubuntu.com> * configure.ac: Search for antlr.jar, if not configured. * configure: Regenerate. 2008-09-24 Matthias Klose <doko@ubuntu.com> * Makefile.am: Build a gjdoc binary, if enabled. * configure.ac: Add options --disable-gjdoc, --with-antlr-jar=file. * Makefile.in, */Makefile.in, configure: Regenerate. 2008-09-22 Andrew Haley <aph@redhat.com> * java/lang/String.java (toString(char[], int, int)): New method. 2008-09-14 Matthias Klose <doko@ubuntu.com> Import GNU Classpath (libgcj-import-20080914). * Regenerate class and header files. * Regenerate auto* files. * configure.ac: Don't pass --disable-gjdoc to classpath. * sources.am: Regenerated. * HACKING: Mention to build gjdoc in maintainer builds. * gnu/classpath/Configuration.java: Update classpath version. * gcj/javaprims.h: Update. 2008-09-08 Andrew John Hughes <gnu_andrew@member.fsf.org> * Makefile.am: Replace natStringBuffer.cc and natStringBuilder.cc with natAbstractStringBuffer.cc. * Makefile.in: Regenerated. * java/lang/AbstractStringBuffer.java: (append(int)): Made native. (regionMatches(int,String)): Likewise. * java/lang/StringBuffer.h: Regenerated. * java/lang/StringBuffer.java: Remerged with GNU Classpath. * java/lang/StringBuilder.h: Regenerated. * java/lang/StringBuilder.java: Remerged with GNU Classpath. * java/lang/natAbstractStringBuffer.cc: Provide common native methods for StringBuffer and StringBuilder. * java/lang/natStringBuffer.cc, * java/lang/natStringBuilder.cc: Removed. 2008-09-04 Andrew John Hughes <gnu_andrew@member.fsf.org> * Makefile.in, * classpath/configure: Regenerated. * gnu/gcj/util/natDebug.cc, * gnu/gcj/xlib/natColormap.cc, * gnu/gcj/xlib/natDisplay.cc, * gnu/gcj/xlib/natDrawable.cc, * gnu/gcj/xlib/natFont.cc, * gnu/gcj/xlib/natWMSizeHints.cc, * gnu/gcj/xlib/natWindow.cc, * gnu/gcj/xlib/natXImage.cc: Add :: prefix to namespaces. * java/io/CharArrayWriter.h, * java/lang/StringBuffer.h: Regenerated using patched gjavah. * java/lang/natStringBuffer.cc: Fix naming of append(jint). * java/sql/Timestamp.h: Regenerated using patched gjavah. * jni.cc: Rename p to functions to match change in GNU Classpath. * scripts/makemake.tcl: Switch gnu.java.math to BC compilation. * sources.am: Regenerated. 2008-08-21 Andrew John Hughes <gnu_andrew@member.fsf.org> * Makefile.in: Updated location of Configuration.java. * classpath/lib/gnu/java/locale/LocaleData.class: Regenerated. 2008-08-18 Andrew John Hughes <gnu_andrew@member.fsf.org> * Makefile.in: Updated with new Java files. * classpath/configure: Regenerated. * classpath/tools/Makefile.am: Add missing use of GJDOC_EX so --disable-gjdoc works. * classpath/tools/Makefile.in: Regenerated. 2008-08-15 Matthias Klose <doko@ubuntu.com> Import GNU Classpath (libgcj-import-20080811). * Regenerate class and header files. * Regenerate auto* files. * configure.ac: Don't pass --with-fastjar to classpath, substitute new dummy value in classpath/gnu/classpath/Configuration.java.in, pass --disable-gjdoc to classpath. * scripts/makemake.tcl: * sources.am: Regenerated. * java/lang/AbstractStringBuffer.java, gnu/java/lang/VMCPStringBuilder.java: New, copied from classpath, use System instead of VMSystem. * java/lang/StringBuffer.java: Merge from classpath. * java/lang/ClassLoader.java: Merge from classpath. * gcj/javaprims.h: Update class definitions, remove _Jv_jobjectRefType, jobjectRefType definitions. libjava/classpath/ChangeLog.gcj: 2008-10-21 Matthias Klose <doko@ubuntu.com> * classpath/tools/gnu/classpath/tools/gjdoc/expr/Java*: Move from ... * classpath/tools/generated/gnu/classpath/tools/gjdoc/expr/ ... here. * Update .class files. 2008-10-21 Andrew John Hughes <gnu_andrew@member.fsf.org> * tools/Makefile.am: Always generate parser in the srcdir. 2008-10-21 Matthias Klose <doko@ubuntu.com> * doc/Makefile.am (MAINTAINERCLEANFILES): Add gjdoc.1. * doc/Makefile.in: Regenerate. 2008-10-20 Matthias Klose <doko@ubuntu.com> * configure.ac: Don't check for working java, if not configured with --enable-java-maintainer-mode. * configure: Regenerate. 2008-10-19 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_java.m4: Revert previous change. * m4/ac_prog_javac.m4: Apply it here. * configure: Regenerate. 2008-10-19 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_javac.m4: Don't check for working javac, if not configured with --enable-java-maintainer-mode. * configure: Regenerate. * Makefile.in, */Makefile.in: Regenerate. 2008-09-30 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_antlr.m4: Check for cantlr binary as well. 2008-09-29 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_antlr.m4: Check for antlr binary as well. 2008-09-28 Matthias Klose <doko@ubuntu.com> * PR libgcj/37636. Revert: 2008-02-20 Matthias Klose <doko@ubuntu.com> * tools/Makefile.am ($(TOOLS_ZIP)): Revert part of previous change, Do copy resource files in JAVA_MAINTAINER_MODE only. * tools/Makefile.in: Regenerate. 2008-09-14 Matthias Klose <doko@ubuntu.com> * m4/ac_prog_javac_works.m4, m4/ac_prog_javac.m4, m4/acinclude.m4: Revert local changes. * m4/ac_prog_antlr.m4: Check for an runantlr binary. * tools/Makefile.am, lib/Makefile.am: Revert local changes (JCOMPILER). * tools/Makefile.am: Remove USE_JAVAC_FLAGS, pass ANTLR_JAR in GLIBJ_CLASSPATH. 2008-09-14 Matthias Klose <doko@ubuntu.com> Revert: Daniel Frampton <zyridium at zyridium.net> * AUTHORS: Added. * java/lang/InheritableThreadLocal.java, * java/lang/Thread.java, * java/lang/ThreadLocal.java: Modified to use java.lang.ThreadLocalMap. * java/lang/ThreadLocalMap.java: New cheaper ThreadLocal-specific WeakHashMap. 2008-08-15 Matthias Klose <doko@ubuntu.com> * m4/acinclude.m4 (CLASSPATH_JAVAC_MEM_CHECK): Remove unknown args for javac. libjava/classpath/ChangeLog: 2008-10-20 Andrew John Hughes <gnu_andrew@member.fsf.org> * m4/ac_prog_antlr.m4: Remove redundant checks. * tools/Makefile.am: Use gjdoc_gendir when calling antlr. 2008-10-15 Andrew John Hughes <gnu_andrew@member.fsf.org> * configure.ac: Remove superfluous AC_PROG_JAVA call. 2008-10-06 Andrew John Hughes <gnu_andrew@member.fsf.org> * m4/ac_prog_antlr: Check for cantlr as well. * tools/Makefile.am: Only build GJDoc parser when both CREATE_GJDOC and CREATE_GJDOC_PARSER are on. 2008-10-02 Andrew John Hughes <gnu_andrew@member.fsf.org> * configure.ac: Add regen-gjdoc-parser option, and separate antlr tests. * m4/ac_prog_antlr.m4: Turn single test into AC_LIB_ANTLR and AC_PROG_ANTLR. * m4/ac_prog_java.m4: Quote tests. * tools/Makefile.am: Support CREATE_GJDOC_PARSER option. 2008-09-14 Andrew John Hughes <gnu_andrew@member.fsf.org> * examples/Makefile.am: Check lib directly as well as glibj.zip for boot classes. * m4/acinclude.m4: Only require the class files to be built to allow the tools and examples to be built, not the installation of glibj.zip. * tools/Makefile.am: Check lib directly as well as glibj.zip for boot classes. 2008-09-13 Andrew John Hughes <gnu_andrew@member.fsf.org> * examples/Makefile.am, * lib/Makefile.am: Add GCJ rules. * m4/ac_prog_javac.m4: Check whether JAVAC is gcj. * m4/ac_prog_javac_works.m4: Add GCJ rules. * m4/acinclude.m4: Don't bother checking for -J if using GCJ. * tools/Makefile.am: Add GCJ rules. 2007-08-23 Daniel Frampton <zyridium@zyridium.net> * AUTHORS: Added. * java/lang/InheritableThreadLocal.java, * java/lang/Thread.java, * java/lang/ThreadLocal.java: Modified to use java.lang.ThreadLocalMap. * java/lang/ThreadLocalMap.java: New cheaper ThreadLocal-specific WeakHashMap. 2008-02-07 Ian Rogers <ian.rogers@manchester.ac.uk> * java/util/zip/ZipEntry.java: Use byte fields instead of integer fields, store the time as well as the DOS time and don't retain a global Calendar instance. (setDOSTime(int)): Set KNOWN_DOSTIME instead of KNOWN_TIME, and unset KNOWN_TIME. (getDOSTime()): Compute DOS time from UNIX time only when needed. (clone()): Provide cloning via the ZipEntry constructor where possible. (setTime(long)): Don't compute DOS time at this point. (getCalendar()): Removed. 2008-09-09 Andrew John Hughes <gnu_andrew@member.fsf.org> * tools/gnu/classpath/tools/getopt/Parser.java: (setHeader(String)): Make synchronized. (setFooter(String)): Likewise. * tools/gnu/classpath/tools/rmic/SourceGiopRmicCompiler.java, (reset()): Make synchronized. (name(Class)): Likewise. 2008-09-04 Robert Schuster <robertschuster@fsfe.org> * gnu/java/nio/charset/ByteDecodeLoopHelper: (arrayDecodeLoop): Added new break label, escape to that label. * gnu/java/nio/charset/ByteEncodeLoopHelper: (arrayDecodeLoop): Added new break label, escape to that label. 2008-09-04 Robert Schuster <robertschuster@fsfe.org> * java/text/DecimalFormat.java: (scanFix): Use 'i + 1' when looking at following character. (scanNegativePattern): Dito. 2008-09-02 Andrew John Hughes <gnu_andrew@member.fsf.org> * tools/gnu/classpath/tools/javah/ClassWrapper.java: (makeVtable()): Populate methodNameMap. (printMethods(CniPrintStream)): Always use pre-populated methodNameMap for bridge targets. 2008-09-01 Mario Torre <neugens@aicas.com> * gnu/java/awt/peer/x/XImage.java (XImageProducer): remove @Override annotation to allow compilation on javac < 1.6 and ecj < 3.4. 2008-09-01 Mario Torre <neugens@aicas.com> * gnu/java/awt/peer/x/XGraphicsDevice.java (getDisplay): fix to support new Escher API. * gnu/java/awt/peer/x/XImage.java (getSource): method implemented. * gnu/java/awt/peer/x/XImage.java (XImageProducer): implement ImageProducer for getSource. 2008-09-01 Andrew John Hughes <gnu_andrew@member.fsf.org> * gnu/java/util/regex/BacktrackStack.java, * gnu/java/util/regex/CharIndexed.java, * gnu/java/util/regex/CharIndexedCharArray.java, * gnu/java/util/regex/CharIndexedCharSequence.java, * gnu/java/util/regex/CharIndexedInputStream.java, * gnu/java/util/regex/CharIndexedString.java, * gnu/java/util/regex/CharIndexedStringBuffer.java, * gnu/java/util/regex/RE.java, * gnu/java/util/regex/REException.java, * gnu/java/util/regex/REFilterInputStream.java, * gnu/java/util/regex/REMatch.java, * gnu/java/util/regex/REMatchEnumeration.java, * gnu/java/util/regex/RESyntax.java, * gnu/java/util/regex/REToken.java, * gnu/java/util/regex/RETokenAny.java, * gnu/java/util/regex/RETokenBackRef.java, * gnu/java/util/regex/RETokenChar.java, * gnu/java/util/regex/RETokenEnd.java, * gnu/java/util/regex/RETokenEndOfPreviousMatch.java, * gnu/java/util/regex/RETokenEndSub.java, * gnu/java/util/regex/RETokenIndependent.java, * gnu/java/util/regex/RETokenLookAhead.java, * gnu/java/util/regex/RETokenLookBehind.java, * gnu/java/util/regex/RETokenNamedProperty.java, * gnu/java/util/regex/RETokenOneOf.java, * gnu/java/util/regex/RETokenPOSIX.java, * gnu/java/util/regex/RETokenRange.java, * gnu/java/util/regex/RETokenRepeated.java, * gnu/java/util/regex/RETokenStart.java, * gnu/java/util/regex/RETokenWordBoundary.java, * gnu/java/util/regex/UncheckedRE.java: Fix indentation. 2008-09-01 Andrew John Hughes <gnu_andrew@member.fsf.org> * gnu/java/util/regex/RETokenStart.java: (getMaximumLength()): Add Override annotation. (matchThis(CharIndexed, REMatch)): Likewise. (returnsFixedLengthMatches()): Renamed from returnsFixedLengthmatches and added Override annotation. (findFixedLengthMatches(CharIndexed,REMatch,int)): Add Override annotation. (dump(CPStringBuilder)): Likewise. * gnu/javax/print/ipp/IppRequest.java: (RequestWriter.writeOperationAttributes(AttributeSet)): Throw exception, don't just create and drop it. * javax/management/MBeanServerPermission.java: (MBeanServerPermissionCollection.add(Permission)): Compare against individual Strings not the entire array, and store the result of replace. * javax/swing/text/html/StyleSheet.java: (setBaseFontSize(size)): Store result of trim(). 2008-09-01 Andrew John Hughes <gnu_andrew@member.fsf.org> * javax/tools/FileObject.java: (openReader(boolean)): Document new parameter. 2008-03-27 Michael Franz <mvfranz@gmail.com> PR classpath/35690: * javax/tools/FileObject.java: (toUri()): Fix case from toURI. (openReader(boolean)): Add missing boolean argument. 2008-08-26 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/35487: * gnu/javax/management/Server.java: (beans): Change to ConcurrentHashMap. (defaultDomain): Make final. (outer): Likewise. (LazyListenersHolder): Added to wrap listeners, also now a ConcurrentHashMap, providing lazy initialisation safely. (sequenceNumber): Documented. (getBean(ObjectName)): Remove redundant cast. (addNotificationListener(ObjectName,NotificationListener, NotificationFilter,Object)): Remove map initialisation and use holder. (getObjectInstance(ObjectName)): Remove redundant cast. (registerMBean(Object,ObjectName)): Add bean atomically. (removeNotificationListener(ObjectName,NotificationListener)): Simplified. (removeNotificationListener(ObjectName,NotificationListener, NotificationFilter,Object)): Likewise. (notify(ObjectName,String)): Documented. 2008-08-26 Andrew John Hughes <gnu_andrew@member.fsf.org> * gnu/javax/management/Server.java: Genericised. 2008-08-26 Andrew John Hughes <gnu_andrew@member.fsf.org> * gnu/javax/management/Translator.java: Genericised. 2008-08-26 Andrew John Hughes <gnu_andrew@member.fsf.org> * javax/management/DefaultLoaderRepository.java, * javax/management/JMX.java, * javax/management/MBeanAttributeInfo.java, * javax/management/MBeanConstructorInfo.java, * javax/management/MBeanOperationInfo.java, * javax/management/MBeanServerDelegate.java: Fix warnings due to generics. 2008-08-25 Andrew John Hughes <gnu_andrew@member.fsf.org> * javax/management/MBeanPermission.java, * javax/management/MBeanServerDelegate.java, * javax/management/MBeanServerFactory.java, * javax/management/MBeanServerInvocationHandler.java, * javax/management/MBeanServerPermission.java: Fix warnings due to use of non-generic collections. 2008-08-25 Mario Torre <neugens@aicas.com> * gnu/javax/rmi/CORBA/RmiUtilities.java (readValue): check if sender is null to avoid NPE. 2008-08-22 Mario Torre <neugens@aicas.com> * gnu/CORBA/OrbFunctional.java (set_parameters): Fix NullPointerException checking when param is null. 2008-08-23 Andrew John Hughes <gnu_andrew@member.fsf.org> * java/util/regex/Matcher.java: (reset()): Reset append position so we don't try and append to the end of the old input. 2008-08-22 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/32028: * m4/acinclude.m4: Also allow versions of GJDoc from 0.8* on, as CVS is 0.8.0-pre. 2008-08-21 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/32028: * m4/acinclude.m4: (CLASSPATH_WITH_GJDOC): Ensure version 0.7.9 is being used. 2008-08-20 Andrew John Hughes <gnu_andrew@member.fsf.org> * tools/Makefile.am: Add taglets subdirectory to list of excluded paths when GJDoc is not compiled. 2008-08-19 David P Grove <groved@us.ibm.com> * scripts/check_jni_methods.sh.in: Fix build issue on AIX by splitting generation of method list. 2008-08-18 Andrew John Hughes <gnu_andrew@member.fsf.org> * native/jni/gstreamer-peer/gst_native_pipeline.c: (get_free_space(int)): Use #else not #elif when there is no condition. 2008-08-17 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/31895: * java/text/DecimalFormat.java: (setCurrency(Currency)): Update prefixes and suffixes when currency changes. * java/text/DecimalFormatSymbols.java: (DecimalFormatSymbols(Locale)): Set locale earlier so it can be used by setCurrency(Currency). (setCurrency(Currency)): Set the symbol correctly using the locale of the instance. * java/util/Currency.java: Throw error instead of just printing a message. 2008-08-17 Andrew John Hughes <gnu_andrew@member.fsf.org> * javax/activation/ActivationDataFlavor.java: Suppress warnings from public API. (mimeType): Made final. (representationClass): Added generic type and made final. (normalizeMimeTypeParameter(String,String)): Use CPStringBuilder. * javax/activation/CommandInfo.java: (verb): Made final. (className): Made final. * javax/activation/DataHandler.java: (dataSource): Made final. * javax/activation/FileDataSource.java: (file): Made final. * javax/activation/MailcapCommandMap.java: Use generics on collections and CPStringBuilder instead of StringBuffer. * javax/activation/MimeType.java: (toString()): Use CPStringBuilder. (getBaseType()): Likewise. * javax/activation/MimeTypeParameterList.java: Use generics on collections and CPStringBuilder instead of StringBuffer. * javax/activation/MimeTypeParseException.java: (MimeTypeParseException(String,String)): Use CPStringBuilder. * javax/activation/MimetypesFileTypeMap.java: Use generics on collections and CPStringBuilder instead of StringBuffer. * javax/activation/URLDataSource.java: (url): Made final. 2008-08-17 Andrew John Hughes <gnu_andrew@member.fsf.org> * gnu/javax/activation/viewers/ImageViewer.java, * gnu/javax/activation/viewers/TextEditor.java, * gnu/javax/activation/viewers/TextViewer.java, * javax/activation/ActivationDataFlavor.java, * javax/activation/CommandInfo.java, * javax/activation/CommandMap.java, * javax/activation/CommandObject.java, * javax/activation/DataContentHandler.java, * javax/activation/DataContentHandlerFactory.java, * javax/activation/DataHandler.java, * javax/activation/DataHandlerDataSource.java, * javax/activation/DataSource.java, * javax/activation/DataSourceDataContentHandler.java, * javax/activation/FileDataSource.java, * javax/activation/FileTypeMap.java, * javax/activation/MailcapCommandMap.java, * javax/activation/MimeType.java, * javax/activation/MimeTypeParameterList.java, * javax/activation/MimeTypeParseException.java, * javax/activation/MimetypesFileTypeMap.java, * javax/activation/ObjectDataContentHandler.java, * javax/activation/URLDataSource.java, * javax/activation/UnsupportedDataTypeException.java, * javax/activation/package.html, * resource/META-INF/mailcap.default, * resource/META-INF/mimetypes.default: Import GNU JAF CVS as of 17/08/2008. 2006-04-25 Archit Shah <ashah@redhat.com> * javax/activation/MimeTypeParameterList.java: Insert ';' separator before parameter list. 2005-06-29 Xavier Poinsard <xpoinsard@openpricer.com> * javax/activation/ObjectDataContentHandler.java: Fixed typo. 2005-05-28 Chris Burdess <dog@bluezoo.org> * javax/activation/CommandMap.java, * javax/activation/MailcapCommandMap.java: Updated to JAF 1.1. 2004-06-09 Chris Burdess <dog@bluezoo.org> * javax/activation/MailcapCommandMap.java: Fixed bug whereby x-java prefix was not attempted. 2008-08-17 Andrew John Hughes <gnu_andrew@member.fsf.org> * AUTHORS: Added Laszlo. 2008-04-20 Andrew John Hughes <gnu_andrew@member.fsf.org> PR classpath/30436: * java/util/Scanner.java: Fix package to be java.util and correct indentation. 2007-07-25 Laszlo Andras Hernadi <e0327023@student.tuwien.ac.at> PR classpath/30436: * java/util/Scanner.java: Initial implementation. 2008-08-17 Andrew John Hughes <gnu_andrew@member.fsf.org> * java/util/regex/Matcher.java: (toMatchResult()): Implemented. 2008-08-13 Joshua Sumali <jsumali@redhat.com> * doc/Makefile.am (gjdoc.pod): Generate gjdoc pod from cp-tools.texinfo instead of invoke.texi. Remove invoke.texi from EXTRA_DIST. * doc/invoke.texi: Removed and merged into ... * doc/cp-tools.texinfo: Here 2008-08-12 Robert Schuster <robertschuster@fsfe.org> * native/jni/java-net/local.c (local_bind): Removed fprintf call, fixed access outside of array bounds. From-SVN: r141271
Diffstat (limited to 'libjava/classpath/gnu/java')
-rw-r--r--libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java8
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Edge.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Segment.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Width.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java3
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java169
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java15
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java1
-rw-r--r--libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java6
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java21
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java13
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XEventPump.java346
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java3
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java28
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java9
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java27
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XImage.java71
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XToolkit.java50
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java37
-rw-r--r--libjava/classpath/gnu/java/lang/CPStringBuilder.java1161
-rw-r--r--libjava/classpath/gnu/java/lang/ClassHelper.java2
-rw-r--r--libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java16
-rw-r--r--libjava/classpath/gnu/java/lang/reflect/TypeSignature.java6
-rw-r--r--libjava/classpath/gnu/java/math/GMP.java474
-rw-r--r--libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java12
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Cookie.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java6
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Headers.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java34
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Request.java7
-rw-r--r--libjava/classpath/gnu/java/net/protocol/jar/Handler.java6
-rw-r--r--libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java6
-rw-r--r--libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java6
-rw-r--r--libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java6
-rw-r--r--libjava/classpath/gnu/java/rmi/server/RMIHashes.java4
-rw-r--r--libjava/classpath/gnu/java/security/Engine.java4
-rw-r--r--libjava/classpath/gnu/java/security/OID.java4
-rw-r--r--libjava/classpath/gnu/java/security/PolicyFile.java8
-rw-r--r--libjava/classpath/gnu/java/security/der/BitString.java4
-rw-r--r--libjava/classpath/gnu/java/security/der/DERReader.java8
-rw-r--r--libjava/classpath/gnu/java/security/hash/Whirlpool.java20
-rw-r--r--libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java5
-rw-r--r--libjava/classpath/gnu/java/security/util/ByteArray.java6
-rw-r--r--libjava/classpath/gnu/java/security/util/Util.java10
-rw-r--r--libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java4
-rw-r--r--libjava/classpath/gnu/java/security/x509/Util.java10
-rw-r--r--libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java10
-rw-r--r--libjava/classpath/gnu/java/text/AttributedFormatBuffer.java24
-rw-r--r--libjava/classpath/gnu/java/text/StringFormatBuffer.java2
-rw-r--r--libjava/classpath/gnu/java/util/Base64.java4
-rw-r--r--libjava/classpath/gnu/java/util/EmptyEnumeration.java18
-rw-r--r--libjava/classpath/gnu/java/util/prefs/EventDispatcher.java113
-rw-r--r--libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java6
-rw-r--r--libjava/classpath/gnu/java/util/prefs/NodeWriter.java4
-rw-r--r--libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java99
-rw-r--r--libjava/classpath/gnu/java/util/regex/BacktrackStack.java128
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexed.java29
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java12
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java130
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java346
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedString.java10
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java10
-rw-r--r--libjava/classpath/gnu/java/util/regex/RE.java3166
-rw-r--r--libjava/classpath/gnu/java/util/regex/REException.java66
-rw-r--r--libjava/classpath/gnu/java/util/regex/REFilterInputStream.java97
-rw-r--r--libjava/classpath/gnu/java/util/regex/REMatch.java382
-rw-r--r--libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java76
-rw-r--r--libjava/classpath/gnu/java/util/regex/RESyntax.java369
-rw-r--r--libjava/classpath/gnu/java/util/regex/REToken.java196
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenAny.java84
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenBackRef.java86
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenChar.java183
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEnd.java125
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java72
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEndSub.java61
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenIndependent.java45
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java50
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java114
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java519
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenOneOf.java371
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java174
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenRange.java105
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenRepeated.java975
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenStart.java194
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java169
-rw-r--r--libjava/classpath/gnu/java/util/regex/UncheckedRE.java31
102 files changed, 7255 insertions, 4120 deletions
diff --git a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
index 2d898a4..e812452 100644
--- a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
@@ -37,6 +37,10 @@ exception statement from your version. */
package gnu.java.awt.font;
+
+import gnu.java.awt.peer.ClasspathFontPeer;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.font.FontRenderContext;
@@ -61,8 +65,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import gnu.java.awt.peer.ClasspathFontPeer;
-
public class OpenTypeFontPeer
extends ClasspathFontPeer
{
@@ -422,7 +424,7 @@ public class OpenTypeFontPeer
*/
static String encodeFont(String name, int style)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('/');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
index d973665..6420fa1 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
class Edge
{
int fpos;
@@ -54,7 +56,7 @@ class Edge
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Edge] id");
s.append(hashCode());
s.append(", fpos: ");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
index 694fb24..2cf68b7 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class LatinBlue
{
static final int FLAG_BLUE_ACTIVE = 1 << 0;
@@ -48,7 +50,7 @@ public class LatinBlue
int flags;
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[BlueZone]");
s.append(" ref: ");
s.append(ref.org);
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
index 640e82c..9f9da67 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
@@ -40,6 +40,8 @@ package gnu.java.awt.font.autofit;
import gnu.java.awt.font.opentype.truetype.Point;
+import gnu.java.lang.CPStringBuilder;
+
class Segment
{
@@ -65,7 +67,7 @@ class Segment
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Segment] id: ");
s.append(hashCode());
s.append(", len:");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Width.java b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
index c890cf3..079f7b3 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Width.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class Width
{
int org;
@@ -50,7 +52,7 @@ public class Width
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Width] org: ");
s.append(org);
s.append(", cur: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
index ea4b8e2..c2b009d 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype;
+import gnu.java.lang.CPStringBuilder;
+
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.CharBuffer;
@@ -1077,7 +1079,7 @@ final class GlyphNamer
return name;
}
- StringBuffer buf = new StringBuffer(numChars * 8);
+ CPStringBuilder buf = new CPStringBuilder(numChars * 8);
for (int i = 0; i < numChars; i++)
{
if (i > 0)
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
index 287593e..87dfebd 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
/**
* A utility class for fixed-point arithmetics, where numbers are
@@ -164,7 +165,7 @@ public final class Fixed
public static String toString(int x, int y)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
sbuf.append('(');
sbuf.append(((float) x) / 64);
sbuf.append(", ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
index c9664d2..31c1203 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
/**
* Encapsulates information regarding one point on a glyph outline.
*/
@@ -234,7 +236,7 @@ public class Point
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Point] origX: ");
s.append(origX);
s.append(", origY: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
index 7e50b66..c88d4c6 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.FontFormatException;
import java.awt.geom.AffineTransform;
import java.nio.ByteBuffer;
@@ -514,7 +516,7 @@ class VirtualMachine
*/
private void dumpInstruction(ByteBuffer inst)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
int pc = inst.position();
int bcode = inst.get(pc) & 0xff;
int count;
diff --git a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
index 36ba0f4..8504659 100644
--- a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
@@ -46,6 +46,7 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
+import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
@@ -75,9 +76,12 @@ import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
+import java.awt.image.FilteredImageSource;
import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
+import java.awt.image.ReplicateScaleFilter;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.awt.image.renderable.RenderableImage;
@@ -86,6 +90,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
+import java.util.WeakHashMap;
/**
* This is a 100% Java implementation of the Java2D rendering pipeline. It is
@@ -154,7 +159,14 @@ public abstract class AbstractGraphics2D
extends Graphics2D
implements Cloneable, Pixelizer
{
-
+ /**
+ * Caches scaled versions of an image.
+ *
+ * @see #drawImage(Image, int, int, int, int, ImageObserver)
+ */
+ protected static final WeakHashMap<Image, HashMap<Dimension,Image>> imageCache =
+ new WeakHashMap<Image, HashMap<Dimension, Image>>();
+
/**
* Wether we use anti aliasing for rendering text by default or not.
*/
@@ -210,14 +222,20 @@ public abstract class AbstractGraphics2D
/**
* The paint context during rendering.
*/
- private PaintContext paintContext;
+ private PaintContext paintContext = null;
/**
* The background.
*/
- private Color background;
+ private Color background = Color.WHITE;
/**
+ * Foreground color, as set by setColor.
+ */
+ private Color foreground = Color.BLACK;
+ private boolean isForegroundColorNull = true;
+
+ /**
* The current font.
*/
private Font font;
@@ -266,15 +284,19 @@ public abstract class AbstractGraphics2D
private static final BasicStroke STANDARD_STROKE = new BasicStroke();
- private static final HashMap STANDARD_HINTS;
- static {
- HashMap hints = new HashMap();
- hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
- hints.put(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_DEFAULT);
- STANDARD_HINTS = hints;
- }
+ private static final HashMap<Key, Object> STANDARD_HINTS;
+ static
+ {
+
+ HashMap<Key, Object> hints = new HashMap<Key, Object>();
+ hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ hints.put(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+
+ STANDARD_HINTS = hints;
+ }
+
/**
* Creates a new AbstractGraphics2D instance.
*/
@@ -626,14 +648,29 @@ public abstract class AbstractGraphics2D
if (p != null)
{
paint = p;
-
+
if (! (paint instanceof Color))
- isOptimized = false;
+ {
+ isOptimized = false;
+ }
else
{
+ this.foreground = (Color) paint;
+ isForegroundColorNull = false;
updateOptimization();
}
}
+ else
+ {
+ this.foreground = Color.BLACK;
+ isForegroundColorNull = true;
+ }
+
+ // free resources if needed, then put the paint context to null
+ if (this.paintContext != null)
+ this.paintContext.dispose();
+
+ this.paintContext = null;
}
/**
@@ -1058,10 +1095,10 @@ public abstract class AbstractGraphics2D
*/
public Color getColor()
{
- Color c = null;
- if (paint instanceof Color)
- c = (Color) paint;
- return c;
+ if (isForegroundColorNull)
+ return null;
+
+ return this.foreground;
}
/**
@@ -1070,8 +1107,8 @@ public abstract class AbstractGraphics2D
* @param color the foreground to set
*/
public void setColor(Color color)
- {
- setPaint(color);
+ {
+ this.setPaint(color);
}
public void setPaintMode()
@@ -1468,11 +1505,19 @@ public abstract class AbstractGraphics2D
ImageObserver observer)
{
AffineTransform t = new AffineTransform();
- t.translate(x, y);
- double scaleX = (double) width / (double) image.getWidth(observer);
- double scaleY = (double) height / (double) image.getHeight(observer);
- t.scale(scaleX, scaleY);
- return drawImage(image, t, observer);
+ int imWidth = image.getWidth(observer);
+ int imHeight = image.getHeight(observer);
+ if (imWidth == width && imHeight == height)
+ {
+ // No need to scale, fall back to non-scaling loops.
+ return drawImage(image, x, y, observer);
+ }
+ else
+ {
+ Image scaled = prepareImage(image, width, height);
+ // Ideally, this should notify the observer about the scaling progress.
+ return drawImage(scaled, x, y, observer);
+ }
}
/**
@@ -1639,10 +1684,7 @@ public abstract class AbstractGraphics2D
*
* @return the bounds of the target
*/
- protected Rectangle getDeviceBounds()
- {
- return destinationRaster.getBounds();
- }
+ protected abstract Rectangle getDeviceBounds();
/**
* Draws a line in optimization mode. The implementation should respect the
@@ -1763,7 +1805,8 @@ public abstract class AbstractGraphics2D
*/
public void renderScanline(int y, ScanlineCoverage c)
{
- PaintContext pCtx = paintContext;
+ PaintContext pCtx = getPaintContext();
+
int x0 = c.getMinX();
int x1 = c.getMaxX();
Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
@@ -1797,9 +1840,11 @@ public abstract class AbstractGraphics2D
CompositeContext cCtx = composite.createContext(paintColorModel,
getColorModel(),
renderingHints);
- WritableRaster targetChild = destinationRaster.createWritableTranslatedChild(-x0,- y);
+ WritableRaster raster = getDestinationRaster();
+ WritableRaster targetChild = raster.createWritableTranslatedChild(-x0, -y);
+
cCtx.compose(paintRaster, targetChild, targetChild);
- updateRaster(destinationRaster, x0, y, x1 - x0, 1);
+ updateRaster(raster, x0, y, x1 - x0, 1);
cCtx.dispose();
}
@@ -1986,4 +2031,64 @@ public abstract class AbstractGraphics2D
}
}
+ private PaintContext getPaintContext()
+ {
+ if (this.paintContext == null)
+ {
+ this.paintContext =
+ this.foreground.createContext(getColorModel(),
+ getDeviceBounds(),
+ getClipBounds(),
+ getTransform(),
+ getRenderingHints());
+ }
+
+ return this.paintContext;
+ }
+
+ /**
+ * Scales an image to the specified width and height. This should also
+ * be used to implement
+ * {@link Toolkit#prepareImage(Image, int, int, ImageObserver)}.
+ * This uses {@link Toolkit#createImage(ImageProducer)} to create the actual
+ * image.
+ *
+ * @param image the image to prepare
+ * @param w the width
+ * @param h the height
+ *
+ * @return the scaled image
+ */
+ public static Image prepareImage(Image image, int w, int h)
+ {
+ // Try to find cached scaled image.
+ HashMap<Dimension,Image> scaledTable = imageCache.get(image);
+ Dimension size = new Dimension(w, h);
+ Image scaled = null;
+ if (scaledTable != null)
+ {
+ scaled = scaledTable.get(size);
+ }
+ if (scaled == null)
+ {
+ // No cached scaled image. Start scaling image now.
+ ImageProducer source = image.getSource();
+ ReplicateScaleFilter scaler = new ReplicateScaleFilter(w, h);
+ FilteredImageSource filteredSource =
+ new FilteredImageSource(source, scaler);
+ // Ideally, this should asynchronously scale the image.
+ Image scaledImage =
+ Toolkit.getDefaultToolkit().createImage(filteredSource);
+ scaled = scaledImage;
+ // Put scaled image in cache.
+ if (scaledTable == null)
+ {
+ scaledTable = new HashMap<Dimension,Image>();
+ imageCache.put(image, scaledTable);
+ }
+ scaledTable.put(size, scaledImage);
+ }
+ return scaled;
+ }
+
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
index 4d1e777..efe1966 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.java2d;
+import gnu.java.lang.CPStringBuilder;
+
/**
* A collection of active edges for scanline conversion.
*/
@@ -183,7 +185,7 @@ final class ActiveEdges
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[ActiveEdges] ");
for (int i = 0; i < numActiveEdges; i++)
{
diff --git a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
index 98d47b4..04eb55e 100644
--- a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
+++ b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.awt.java2d;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
@@ -71,6 +72,15 @@ public class RasterGraphics
init();
}
+ @Override
+ public void renderScanline(int y, ScanlineCoverage c)
+ {
+ if (y >= getDeviceBounds().width)
+ return;
+
+ super.renderScanline(y, c);
+ }
+
/**
* Returns the color model of this Graphics object.
*
@@ -100,4 +110,9 @@ public class RasterGraphics
return null;
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ return this.raster.getBounds();
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
index cc4bbef..b00a15c 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
@@ -206,6 +206,7 @@ public final class ScanlineConverter
// Ok, now we can perform the actual scanlining.
int realY = Fixed.intValue(FIXED_DIGITS, y + resolution);
boolean push = lastRealY != realY;
+
doScanline(p, y, push, haveClip);
// Remove obsolete active edges.
diff --git a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
index be21631..cc41f74 100644
--- a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -124,7 +126,7 @@ public class GnomeDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
index 30dd89b..8bc3e65 100644
--- a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
@@ -104,7 +106,7 @@ public class KDEDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
index 28fb841..826cfbe 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
@@ -45,6 +45,8 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.font.opentype.NameDecoder;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Toolkit;
@@ -211,7 +213,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next())
sb.append(c);
return sb.toString();
@@ -219,7 +221,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter, int begin, int limit)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next(), i++)
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
index e417546..e248b6d 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
@@ -38,10 +38,25 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Image;
-import java.awt.datatransfer.*;
-import java.io.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Iterator;
@@ -247,7 +262,7 @@ public class GtkClipboard extends Clipboard
Reader r = plainText.getReaderForText(contents);
if (r != null)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
char[] cs = new char[1024];
int l = r.read(cs);
while (l != -1)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
index c80c85c..dde5b91 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
@@ -39,7 +39,9 @@ package gnu.java.awt.peer.x;
import java.awt.Color;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
+import java.util.Map;
import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.x11.extension.glx.GL;
@@ -70,7 +72,8 @@ public class GLGraphics extends AbstractGraphics2D
public void setBackground(Color b)
{
super.setBackground(b);
- gl.clear_color(b.getRed() / 255.F, b.getGreen() / 255.F,
+
+ gl.clearColor(b.getRed() / 255.F, b.getGreen() / 255.F,
b.getBlue() / 255.F, b.getAlpha() / 255.F);
}
@@ -120,4 +123,12 @@ public class GLGraphics extends AbstractGraphics2D
throw new UnsupportedOperationException("Not yet implemented");
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ // FIXME: not sure it's correct
+ return new Rectangle(0, 0,
+ gl.display.default_screen.width,
+ gl.display.default_screen.height);
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
index 7f98435..37983919 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Container;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
@@ -47,18 +50,26 @@ import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
+import java.awt.event.WindowEvent;
import java.util.HashMap;
+import gnu.java.awt.ComponentReshapeEvent;
+import gnu.x11.Atom;
import gnu.x11.Display;
import gnu.x11.event.ButtonPress;
import gnu.x11.event.ButtonRelease;
+import gnu.x11.event.ClientMessage;
import gnu.x11.event.ConfigureNotify;
+import gnu.x11.event.DestroyNotify;
import gnu.x11.event.Event;
import gnu.x11.event.Expose;
import gnu.x11.event.Input;
import gnu.x11.event.KeyPress;
import gnu.x11.event.KeyRelease;
import gnu.x11.event.MotionNotify;
+import gnu.x11.event.PropertyNotify;
+import gnu.x11.event.ResizeRequest;
+import gnu.x11.event.UnmapNotify;
/**
* Fetches events from X, translates them to AWT events and pumps them up
@@ -148,122 +159,217 @@ public class XEventPump
windows.remove(new Integer(xWindow.id));
}
- private void handleEvent(Event xEvent)
+ private void handleButtonPress(ButtonPress event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ // Create and post the mouse event.
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = button;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mp = new MouseEvent(target, MouseEvent.MOUSE_PRESSED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ }
+
+ private void handleButtonRelease(ButtonRelease event)
{
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
- Integer key = null;
- Window awtWindow = null;
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = -1;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mr = new MouseEvent(target, MouseEvent.MOUSE_RELEASED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ }
+
+
+ private void handleMotionNotify(MotionNotify event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+
+ MouseEvent mm = null;
+ if (drag == -1)
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ else
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(drag),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
+ }
+
+ // FIME: refactor and make faster, maybe caching the event and handle
+ // and/or check timing (timing is generated for PropertyChange)?
+ private void handleExpose(Expose event)
+ {
+ Integer key = new Integer(event.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ if (XToolkit.DEBUG)
+ System.err.println("expose request for window id: " + key);
+
+ Rectangle r = new Rectangle(event.x(), event.y(), event.width(),
+ event.height());
+ // We need to clear the background of the exposed rectangle.
+ assert awtWindow != null : "awtWindow == null for window ID: " + key;
+
+ Graphics g = awtWindow.getGraphics();
+ g.clearRect(r.x, r.y, r.width, r.height);
+ g.dispose();
+
+ XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
+ Insets i = xwindow.insets();
+ if (event.width() != awtWindow.getWidth() - i.left - i.right
+ || event.height() != awtWindow.getHeight() - i.top - i.bottom)
+ {
+ int w = event.width();
+ int h = event.height();
+ int x = xwindow.xwindow.x;
+ int y = xwindow.xwindow.y;
+
+ if (XToolkit.DEBUG)
+ System.err.println("Setting size on AWT window: " + w
+ + ", " + h + ", " + awtWindow.getWidth()
+ + ", " + awtWindow.getHeight());
+
+ // new width and height
+ xwindow.xwindow.width = w;
+ xwindow.xwindow.height = h;
+
+ // reshape the window
+ ComponentReshapeEvent cre =
+ new ComponentReshapeEvent(awtWindow, x, y, w, h);
+ awtWindow.dispatchEvent(cre);
+ }
+
+ ComponentEvent ce =
+ new ComponentEvent(awtWindow, ComponentEvent.COMPONENT_RESIZED);
+ awtWindow.dispatchEvent(ce);
+
+ PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.UPDATE, r);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ }
+
+ private void handleDestroyNotify(DestroyNotify destroyNotify)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("DestroyNotify event: " + destroyNotify);
+
+ Integer key = new Integer(destroyNotify.event_window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+
+ private void handleClientMessage(ClientMessage clientMessage)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage event: " + clientMessage);
+
+ if (clientMessage.delete_window())
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage is a delete_window event");
+
+ Integer key = new Integer(clientMessage.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSING);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+ }
+
+ private void handleEvent(Event xEvent)
+ {
if (XToolkit.DEBUG)
System.err.println("fetched event: " + xEvent);
- switch (xEvent.code())
+
+ switch (xEvent.code() & 0x7f)
{
case ButtonPress.CODE:
- ButtonPress bp = (ButtonPress) xEvent;
- key= new Integer(bp.event_window_id);
- awtWindow = (Window) windows.get(key);
- // Create and post the mouse event.
- int button = bp.detail();
-
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = button;
-
- MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(bp.state()) | buttonToModifier(button),
- bp.event_x(), bp.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ this.handleButtonPress((ButtonPress) xEvent);
break;
case ButtonRelease.CODE:
- ButtonRelease br = (ButtonRelease) xEvent;
- key= new Integer(br.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- button = br.detail();
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = -1;
- MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(br.state()) | buttonToModifier(button),
- br.event_x(), br.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ this.handleButtonRelease((ButtonRelease) xEvent);
break;
case MotionNotify.CODE:
- MotionNotify mn = (MotionNotify) xEvent;
- key= new Integer(mn.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- MouseEvent mm;
- if (drag == -1)
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- else
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
- break;
- case ConfigureNotify.CODE:
- key= new Integer(((ConfigureNotify) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
- ConfigureNotify c = (ConfigureNotify) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("resize request for window id: " + key);
-
- // Detect and report size changes.
- XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
- Insets i = xwindow.insets();
- if (c.width() != awtWindow.getWidth() - i.left - i.right
- || c.height() != awtWindow.getHeight() - i.top - i.bottom)
- {
- if (XToolkit.DEBUG)
- System.err.println("Setting size on AWT window: " + c.width()
- + ", " + c.height() + ", " + awtWindow.getWidth()
- + ", " + awtWindow.getHeight());
- xwindow.callback = true;
- xwindow.xwindow.width = c.width();
- xwindow.xwindow.height = c.height();
- awtWindow.setSize(c.width() + i.left + i.right,
- c.height() + i.top + i.bottom);
- xwindow.callback = false;
- }
+ this.handleMotionNotify((MotionNotify) xEvent);
break;
case Expose.CODE:
- key= new Integer(((Expose) xEvent).window_id);
- awtWindow = (Window) windows.get(key);
- Expose exp = (Expose) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("expose request for window id: " + key);
- Rectangle r = new Rectangle(exp.x(), exp.y(), exp.width(),
- exp.height());
- //System.err.println("expose paint: " + r);
- // We need to clear the background of the exposed rectangle.
- assert awtWindow != null : "awtWindow == null for window ID: " + key;
- Graphics g = awtWindow.getGraphics();
- g.clearRect(r.x, r.y, r.width, r.height);
- g.dispose();
- PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.PAINT, r);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ this.handleExpose((Expose) xEvent);
break;
case KeyPress.CODE:
case KeyRelease.CODE:
- key = new Integer(((Input) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
+ Integer key = new Integer(((Input) xEvent).getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
handleKeyEvent(xEvent, awtWindow);
break;
+ case DestroyNotify.CODE:
+ this.handleDestroyNotify((DestroyNotify) xEvent);
+ break;
+ case ClientMessage.CODE:
+ this.handleClientMessage((ClientMessage) xEvent);
+ break;
+ case PropertyNotify.CODE:
+ key = new Integer (((PropertyNotify) xEvent).getWindowID());
+ awtWindow = (Window) windows.get(key);
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_STATE_CHANGED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ break;
default:
if (XToolkit.DEBUG)
System.err.println("Unhandled X event: " + xEvent);
@@ -280,7 +386,7 @@ public class XEventPump
{
Input keyEvent = (Input) xEvent;
int xKeyCode = keyEvent.detail();
- int xMods = keyEvent.state();
+ int xMods = keyEvent.getState();
int keyCode = KeyboardMapping.mapToKeyCode(xEvent.display.input, xKeyCode,
xMods);
char keyChar = KeyboardMapping.mapToKeyChar(xEvent.display.input, xKeyCode,
@@ -334,5 +440,47 @@ public class XEventPump
return 0;
}
+
+ /**
+ * Finds the heavyweight mouse event target.
+ *
+ * @param src the original source of the event
+ *
+ * @param pt the event coordinates
+ *
+ * @return the real mouse event target
+ */
+ private Component findMouseEventTarget(Component src, int x, int y)
+ {
+ Component found = null;
+ if (src instanceof Container)
+ {
+ Container cont = (Container) src;
+ int numChildren = cont.getComponentCount();
+ for (int i = 0; i < numChildren && found == null; i++)
+ {
+ Component child = cont.getComponent(i);
+ if (child != null && child.isVisible()
+ && child.contains(x - child.getX(), y - child.getY()))
+ {
+ if (child instanceof Container)
+ {
+ Component deeper = findMouseEventTarget(child,
+ x - child.getX(),
+ y - child.getY());
+ if (deeper != null)
+ found = deeper;
+ }
+ else if (! child.isLightweight())
+ found = child;
+ }
+ }
+ }
+
+ // Consider the source itself.
+ if (found == null && src.contains(x, y) && ! src.isLightweight())
+ found = src;
+ return found;
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
index 0a96a61..4372c965 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.AWTError;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -675,7 +677,7 @@ public class XFontPeer
*/
static String encodeFont(String name, int style, int size)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('.');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
index 7424dc6..a355c68 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
@@ -93,8 +93,7 @@ public class XFramePeer
public int getState()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return 0;
}
public void setState(int state)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
index 9512966..0339a42 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
@@ -313,7 +313,7 @@ public class XGraphics2D
{
// TODO: Optimize for different standard bit-depths.
Color c = (Color) p;
- XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
+ /* XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
HashMap colorMap = tk.colorMap;
gnu.x11.Color col = (gnu.x11.Color) colorMap.get(c);
if (col == null)
@@ -323,8 +323,10 @@ public class XGraphics2D
c.getGreen() * 256,
c.getBlue() * 256);
colorMap.put(c, col);
- }
- xgc.set_foreground(col);
+ }*/
+ //xgc.set_foreground(col);
+
+ xgc.set_foreground(c.getRGB());
foreground = c;
}
}
@@ -392,9 +394,23 @@ public class XGraphics2D
xdrawable.put_image(xgc, zpixmap, x, y);
imageCache.put(image, zpixmap);
} else {
- ZPixmap zpixmap = (ZPixmap) xdrawable.image(x, y, w, h,
- 0xffffffff,
- gnu.x11.image.Image.Format.ZPIXMAP);
+
+ // TODO optimize reusing the rectangles
+ Rectangle source =
+ new Rectangle(0, 0, xdrawable.width, xdrawable.height);
+ Rectangle target = new Rectangle(x, y, w, h);
+
+ Rectangle destination = source.intersection(target);
+
+ x = destination.x;
+ y = destination.y;
+ w = destination.width;
+ h = destination.height;
+
+ ZPixmap zpixmap =
+ (ZPixmap) xdrawable.image(x, y, w, h,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
for (int yy = 0; yy < h; yy++)
{
for (int xx = 0; xx < w; xx++)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
index 85f72a4..becb92a 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
@@ -146,8 +146,7 @@ public class XGraphicsConfiguration
public AffineTransform getDefaultTransform()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new AffineTransform();
}
public AffineTransform getNormalizingTransform()
@@ -158,8 +157,10 @@ public class XGraphicsConfiguration
public Rectangle getBounds()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ Display d = device.getDisplay();
+ Screen screen = d.default_screen;
+
+ return new Rectangle(0, 0, screen.width, screen.height);
}
/**
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
index eff5902..ca37f3a 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
@@ -39,6 +39,7 @@ package gnu.java.awt.peer.x;
import gnu.classpath.SystemProperties;
import gnu.x11.Display;
+import gnu.x11.EscherServerConnectionException;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
@@ -127,9 +128,16 @@ public class XGraphicsDevice
Socket socket = createLocalSocket();
if (socket != null)
{
- display = new Display(socket, "localhost",
- displayName.display_no,
- displayName.screen_no);
+ try
+ {
+ display = new Display(socket, "localhost",
+ displayName.display_no,
+ displayName.screen_no);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
}
}
@@ -137,8 +145,17 @@ public class XGraphicsDevice
// when the connection is probably remote or when we couldn't load
// the LocalSocket class stuff.
if (display == null)
- display = new Display(displayName);
-
+ {
+ try
+ {
+ display = new Display(displayName);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
+ }
+
eventPump = new XEventPump(display);
}
return display;
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XImage.java b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
index 7d4636b..fa94d00 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XImage.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
@@ -39,13 +39,19 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
import gnu.x11.Pixmap;
+import gnu.x11.image.ZPixmap;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ImageConsumer;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
+
import java.util.Hashtable;
+import java.util.Vector;
public class XImage
extends Image
@@ -75,8 +81,7 @@ public class XImage
public ImageProducer getSource()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new XImageProducer();
}
/**
@@ -108,4 +113,66 @@ public class XImage
{
pixmap.free();
}
+
+ protected class XImageProducer implements ImageProducer
+ {
+ private Vector<ImageConsumer> consumers = new Vector<ImageConsumer>();
+
+ public void addConsumer(ImageConsumer ic)
+ {
+ if (ic != null && !isConsumer(ic))
+ this.consumers.add(ic);
+ }
+
+ public boolean isConsumer(ImageConsumer ic)
+ {
+ return this.consumers.contains(ic);
+ }
+
+ public void removeConsumer(ImageConsumer ic)
+ {
+ if (ic != null)
+ this.consumers.remove(ic);
+ }
+
+ public void requestTopDownLeftRightResend(ImageConsumer ic)
+ {
+ /* just ignore the call */
+ }
+
+ public void startProduction(ImageConsumer ic)
+ {
+ this.addConsumer(ic);
+
+ for (ImageConsumer consumer : this.consumers)
+ {
+ int width = XImage.this.getWidth(null);
+ int height = XImage.this.getHeight(null);
+
+ XGraphics2D graphics = (XGraphics2D) getGraphics();
+ ColorModel model = graphics.getColorModel();
+ graphics.dispose();
+
+ ZPixmap zpixmap = (ZPixmap)
+ XImage.this.pixmap.image(0, 0, width, height,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
+
+ int size = zpixmap.get_data_length();
+ System.out.println("size: " + size + ", w = " + width + ", h = " + height);
+
+ int [] pixel = new int[size];
+ for (int i = 0; i < size; i++)
+ pixel[i] = zpixmap.get_data_element(i);
+
+ consumer.setHints(ImageConsumer.SINGLEPASS);
+
+ consumer.setDimensions(width, height);
+ consumer.setPixels(0, 0, width, height, model, pixel, 0, width);
+ consumer.imageComplete(ImageConsumer.STATICIMAGEDONE);
+ }
+
+ System.out.println("done!");
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
index c1724aa..af12574 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
@@ -54,6 +54,7 @@ import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Label;
import java.awt.List;
@@ -120,11 +121,16 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.EmbeddedWindow;
import gnu.java.awt.font.OpenTypeFontPeer;
import gnu.java.awt.image.ImageConverter;
+import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.peer.EmbeddedWindowPeer;
+import gnu.java.awt.peer.swing.SwingButtonPeer;
import gnu.java.awt.peer.swing.SwingCanvasPeer;
+import gnu.java.awt.peer.swing.SwingCheckboxPeer;
import gnu.java.awt.peer.swing.SwingLabelPeer;
import gnu.java.awt.peer.swing.SwingPanelPeer;
+import gnu.java.awt.peer.swing.SwingTextAreaPeer;
+import gnu.java.awt.peer.swing.SwingTextFieldPeer;
public class XToolkit
extends ClasspathToolkit
@@ -232,18 +238,24 @@ public class XToolkit
protected ButtonPeer createButton(Button target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No ButtonPeer can be created in an headless" +
+ "graphics environment.");
+
+ return new SwingButtonPeer(target);
}
protected TextFieldPeer createTextField(TextField target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextFieldPeer can be created in an headless " +
+ "graphics environment.");
+
+ return new SwingTextFieldPeer(target);
}
protected LabelPeer createLabel(Label target)
{
+ checkHeadLess("No LabelPeer can be created in an headless graphics " +
+ "environment.");
return new SwingLabelPeer(target);
}
@@ -255,8 +267,10 @@ public class XToolkit
protected CheckboxPeer createCheckbox(Checkbox target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No CheckboxPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingCheckboxPeer(target);
}
protected ScrollbarPeer createScrollbar(Scrollbar target)
@@ -273,8 +287,10 @@ public class XToolkit
protected TextAreaPeer createTextArea(TextArea target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextAreaPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingTextAreaPeer(target);
}
protected ChoicePeer createChoice(Choice target)
@@ -514,14 +530,14 @@ public class XToolkit
public boolean prepareImage(Image image, int width, int height, ImageObserver observer)
{
- // Images are loaded synchronously, so we don't bother and return true.
- return true;
+ Image scaled = AbstractGraphics2D.prepareImage(image, width, height);
+ return checkImage(image, width, height, observer) == ImageObserver.ALLBITS;
}
public int checkImage(Image image, int width, int height, ImageObserver observer)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ // Images are loaded synchronously, so we don't bother and return true.
+ return ImageObserver.ALLBITS;
}
public Image createImage(ImageProducer producer)
@@ -638,4 +654,14 @@ public class XToolkit
return false;
}
+ private void checkHeadLess(String message) throws HeadlessException
+ {
+ if(GraphicsEnvironment.isHeadless())
+ {
+ if(message == null)
+ message = "This method cannot be called in headless mode.";
+
+ throw new HeadlessException(message);
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
index f9184ed..930247d 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
@@ -71,21 +71,16 @@ public class XWindowPeer
private static int standardSelect = Event.BUTTON_PRESS_MASK
| Event.BUTTON_RELEASE_MASK
| Event.POINTER_MOTION_MASK
- //| Event.RESIZE_REDIRECT_MASK
+ // | Event.RESIZE_REDIRECT_MASK //
| Event.EXPOSURE_MASK
- //| Event.PROPERTY_CHANGE_MASK
- | Event.STRUCTURE_NOTIFY_MASK
+ | Event.PROPERTY_CHANGE_MASK
+ //| Event.STRUCTURE_NOTIFY_MASK
+ //| Event.SUBSTRUCTURE_NOTIFY_MASK
| Event.KEY_PRESS_MASK
| Event.KEY_RELEASE_MASK
+ //| Event.VISIBILITY_CHANGE_MASK //
;
-
- /**
- * Indicates if we are in callback mode, that is when a property (like size)
- * is changed in reponse to a request from the X server and doesn't need
- * to be propagated back to the X server.
- */
- boolean callback = false;
-
+
/**
* The X window.
*/
@@ -110,8 +105,10 @@ public class XWindowPeer
int h = Math.max(window.getHeight(), 1);
xwindow = new Window(dev.getDisplay().default_root, x, y, w, h, 0, atts);
xwindow.select_input(standardSelect);
+
dev.getEventPump().registerWindow(xwindow, window);
-
+ xwindow.set_wm_delete_window();
+
boolean undecorated;
if (awtComponent instanceof Frame)
{
@@ -269,14 +266,9 @@ public class XWindowPeer
*/
public void reshape(int x, int y, int width, int height)
{
- // Need to substract insets because AWT size is including insets,
- // and X size is excluding insets.
- if (! callback)
- {
- Insets i = insets;
- xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
- height - i.top - i.bottom);
- }
+ Insets i = insets;
+ xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
+ height - i.top - i.bottom);
}
public Insets insets()
@@ -303,4 +295,9 @@ public class XWindowPeer
XGraphicsDevice dev = XToolkit.getDefaultDevice();
dev.getEventPump().unregisterWindow(xwindow);
}
+
+ public Window getXwindow()
+ {
+ return xwindow;
+ }
}
diff --git a/libjava/classpath/gnu/java/lang/CPStringBuilder.java b/libjava/classpath/gnu/java/lang/CPStringBuilder.java
new file mode 100644
index 0000000..27e7d2c
--- /dev/null
+++ b/libjava/classpath/gnu/java/lang/CPStringBuilder.java
@@ -0,0 +1,1161 @@
+/* ClasspathStringBuffer.java -- Growable strings without locking or copying
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+ Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang;
+
+import gnu.classpath.SystemProperties;
+
+import java.io.Serializable;
+
+/**
+ * This class is based on java.lang.AbstractStringBuffer but
+ * without the copying of the string by toString.
+ * If you modify this, please consider also modifying that code.
+ * This code is not thread-safe; limit its use to internal use within
+ * methods.
+ */
+public final class CPStringBuilder
+ implements Serializable, CharSequence, Appendable
+{
+
+ /**
+ * Index of next available character (and thus the size of the current
+ * string contents). Note that this has permissions set this way so that
+ * String can get the value.
+ *
+ * @serial the number of characters in the buffer
+ */
+ private int count;
+
+ /**
+ * The buffer. Note that this has permissions set this way so that String
+ * can get the value.
+ *
+ * @serial the buffer
+ */
+ private char[] value;
+
+ /**
+ * A flag to denote whether the string being created has been
+ * allocated to a {@link String} object. On construction,
+ * the character array, {@link #value} is referenced only
+ * by this class. Once {@link #toString()},
+ * {@link #substring(int)} or {@link #substring(int,int)}
+ * are called, the array is also referenced by a {@link String}
+ * object and this flag is set. Subsequent modifications to
+ * this buffer cause a new array to be allocated and the flag
+ * to be reset.
+ */
+ private boolean allocated = false;
+
+ /**
+ * The default capacity of a buffer.
+ * This can be configured using gnu.classpath.cpstringbuilder.capacity
+ */
+ private static final int DEFAULT_CAPACITY;
+
+ static
+ {
+ String cap =
+ SystemProperties.getProperty("gnu.classpath.cpstringbuilder.capacity");
+ if (cap == null)
+ DEFAULT_CAPACITY = 32;
+ else
+ DEFAULT_CAPACITY = Integer.parseInt(cap);
+ }
+
+ /**
+ * Create a new CPStringBuilder with the default capacity.
+ */
+ public CPStringBuilder()
+ {
+ this(DEFAULT_CAPACITY);
+ }
+
+ /**
+ * Create an empty <code>CPStringBuilder</code> with the specified initial
+ * capacity.
+ *
+ * @param capacity the initial capacity
+ * @throws NegativeArraySizeException if capacity is negative
+ */
+ public CPStringBuilder(int capacity)
+ {
+ value = new char[capacity];
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>String</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(String str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>StringBuffer</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(StringBuffer str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>StringBuilder</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(StringBuilder str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>CharSequence</code>. Initial capacity will be the
+ * length of the sequence plus the default capacity; if the sequence
+ * reports a length less than or equal to 0, then the initial capacity
+ * will be the default.
+ *
+ * @param seq the initializing <code>CharSequence</code>
+ * @throws NullPointerException if str is null
+ * @since 1.5
+ */
+ public CPStringBuilder(CharSequence seq)
+ {
+ int len = seq.length();
+ count = len <= 0 ? 0 : len;
+ value = new char[count + DEFAULT_CAPACITY];
+ for (int i = 0; i < len; ++i)
+ value[i] = seq.charAt(i);
+ }
+
+ /**
+ * Set the length of this StringBuffer. If the new length is greater than
+ * the current length, all the new characters are set to '\0'. If the new
+ * length is less than the current length, the first <code>newLength</code>
+ * characters of the old array will be preserved, and the remaining
+ * characters are truncated.
+ *
+ * @param newLength the new length
+ * @throws IndexOutOfBoundsException if the new length is negative
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ * @see #length()
+ */
+ public void setLength(int newLength)
+ {
+ if (newLength < 0)
+ throw new StringIndexOutOfBoundsException(newLength);
+
+ int valueLength = value.length;
+
+ /* Always call ensureCapacity in order to preserve
+ copy-on-write semantics, except when the position
+ is simply being reset
+ */
+ if (newLength > 0)
+ ensureCapacity(newLength);
+
+ if (newLength < valueLength)
+ {
+ /* If the StringBuffer's value just grew, then we know that
+ value is newly allocated and the region between count and
+ newLength is filled with '\0'. */
+ count = newLength;
+ }
+ else
+ {
+ /* The StringBuffer's value doesn't need to grow. However,
+ we should clear out any cruft that may exist. */
+ while (count < newLength)
+ value[count++] = '\0';
+ }
+ }
+
+ /**
+ * Get the character at the specified index.
+ *
+ * @param index the index of the character to get, starting at 0
+ * @return the character at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public char charAt(int index)
+ {
+ if (index < 0 || index >= count)
+ throw new StringIndexOutOfBoundsException(index);
+ return value[index];
+ }
+
+ /**
+ * Get the code point at the specified index. This is like #charAt(int),
+ * but if the character is the start of a surrogate pair, and the
+ * following character completes the pair, then the corresponding
+ * supplementary code point is returned.
+ * @param index the index of the codepoint to get, starting at 0
+ * @return the codepoint at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * @since 1.5
+ */
+ public int codePointAt(int index)
+ {
+ return Character.codePointAt(value, index, count);
+ }
+
+ /**
+ * Get the code point before the specified index. This is like
+ * #codePointAt(int), but checks the characters at <code>index-1</code> and
+ * <code>index-2</code> to see if they form a supplementary code point.
+ * @param index the index just past the codepoint to get, starting at 0
+ * @return the codepoint at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * @since 1.5
+ */
+ public int codePointBefore(int index)
+ {
+ // Character.codePointBefore() doesn't perform this check. We
+ // could use the CharSequence overload, but this is just as easy.
+ if (index >= count)
+ throw new IndexOutOfBoundsException();
+ return Character.codePointBefore(value, index, 1);
+ }
+
+ /**
+ * Get the specified array of characters. <code>srcOffset - srcEnd</code>
+ * characters will be copied into the array you pass in.
+ *
+ * @param srcOffset the index to start copying from (inclusive)
+ * @param srcEnd the index to stop copying from (exclusive)
+ * @param dst the array to copy into
+ * @param dstOffset the index to start copying into
+ * @throws NullPointerException if dst is null
+ * @throws IndexOutOfBoundsException if any source or target indices are
+ * out of range (while unspecified, source problems cause a
+ * StringIndexOutOfBoundsException, and dest problems cause an
+ * ArrayIndexOutOfBoundsException)
+ * @see System#arraycopy(Object, int, Object, int, int)
+ */
+ public void getChars(int srcOffset, int srcEnd,
+ char[] dst, int dstOffset)
+ {
+ if (srcOffset < 0 || srcEnd > count || srcEnd < srcOffset)
+ throw new StringIndexOutOfBoundsException();
+ System.arraycopy(value, srcOffset, dst, dstOffset, srcEnd - srcOffset);
+ }
+
+ /**
+ * Set the character at the specified index.
+ *
+ * @param index the index of the character to set starting at 0
+ * @param ch the value to set that character to
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public void setCharAt(int index, char ch)
+ {
+ if (index < 0 || index >= count)
+ throw new StringIndexOutOfBoundsException(index);
+ // Call ensureCapacity to enforce copy-on-write.
+ ensureCapacity(count);
+ value[index] = ch;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param obj the <code>Object</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(Object)
+ * @see #append(String)
+ */
+ public CPStringBuilder append(Object obj)
+ {
+ return append(String.valueOf(obj));
+ }
+
+ /**
+ * Append the <code>String</code> to this <code>StringBuffer</code>. If
+ * str is null, the String "null" is appended.
+ *
+ * @param str the <code>String</code> to append
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder append(String str)
+ {
+ if (str == null)
+ str = "null";
+ int len = str.length();
+ ensureCapacity(count + len);
+ str.getChars(0, len, value, count);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Append the <code>StringBuilder</code> value of the argument to this
+ * <code>StringBuilder</code>. This behaves the same as
+ * <code>append((Object) stringBuffer)</code>, except it is more efficient.
+ *
+ * @param stringBuffer the <code>StringBuilder</code> to convert and append
+ * @return this <code>StringBuilder</code>
+ * @see #append(Object)
+ */
+ public CPStringBuilder append(StringBuffer stringBuffer)
+ {
+ if (stringBuffer == null)
+ return append("null");
+ synchronized (stringBuffer)
+ {
+ int len = stringBuffer.length();
+ ensureCapacity(count + len);
+ stringBuffer.getChars(0, len, value, count);
+ count += len;
+ }
+ return this;
+ }
+
+ /**
+ * Append the <code>char</code> array to this <code>StringBuffer</code>.
+ * This is similar (but more efficient) than
+ * <code>append(new String(data))</code>, except in the case of null.
+ *
+ * @param data the <code>char[]</code> to append
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @see #append(char[], int, int)
+ */
+ public CPStringBuilder append(char[] data)
+ {
+ return append(data, 0, data.length);
+ }
+
+ /**
+ * Append part of the <code>char</code> array to this
+ * <code>StringBuffer</code>. This is similar (but more efficient) than
+ * <code>append(new String(data, offset, count))</code>, except in the case
+ * of null.
+ *
+ * @param data the <code>char[]</code> to append
+ * @param offset the start location in <code>str</code>
+ * @param count the number of characters to get from <code>str</code>
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @throws IndexOutOfBoundsException if offset or count is out of range
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public CPStringBuilder append(char[] data, int offset, int count)
+ {
+ if (offset < 0 || count < 0 || offset > data.length - count)
+ throw new StringIndexOutOfBoundsException();
+ ensureCapacity(this.count + count);
+ System.arraycopy(data, offset, value, this.count, count);
+ this.count += count;
+ return this;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param bool the <code>boolean</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(boolean)
+ */
+ public CPStringBuilder append(boolean bool)
+ {
+ return append(bool ? "true" : "false");
+ }
+
+ /**
+ * Append the <code>char</code> to this <code>StringBuffer</code>.
+ *
+ * @param ch the <code>char</code> to append
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder append(char ch)
+ {
+ ensureCapacity(count + 1);
+ value[count++] = ch;
+ return this;
+ }
+
+ /**
+ * Append the characters in the <code>CharSequence</code> to this
+ * buffer.
+ *
+ * @param seq the <code>CharSequence</code> providing the characters
+ * @return this <code>StringBuffer</code>
+ * @since 1.5
+ */
+ public CPStringBuilder append(CharSequence seq)
+ {
+ return append(seq, 0, seq.length());
+ }
+
+ /**
+ * Append some characters from the <code>CharSequence</code> to this
+ * buffer. If the argument is null, the four characters "null" are
+ * appended.
+ *
+ * @param seq the <code>CharSequence</code> providing the characters
+ * @param start the starting index
+ * @param end one past the final index
+ * @return this <code>StringBuffer</code>
+ * @since 1.5
+ */
+ public CPStringBuilder append(CharSequence seq, int start, int end)
+ {
+ if (seq == null)
+ return append("null");
+ if (end - start > 0)
+ {
+ ensureCapacity(count + end - start);
+ for (; start < end; ++start)
+ value[count++] = seq.charAt(start);
+ }
+ return this;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param inum the <code>int</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(int)
+ */
+ // This is native in libgcj, for efficiency.
+ public CPStringBuilder append(int inum)
+ {
+ return append(String.valueOf(inum));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param lnum the <code>long</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(long)
+ */
+ public CPStringBuilder append(long lnum)
+ {
+ return append(Long.toString(lnum, 10));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param fnum the <code>float</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(float)
+ */
+ public CPStringBuilder append(float fnum)
+ {
+ return append(Float.toString(fnum));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param dnum the <code>double</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(double)
+ */
+ public CPStringBuilder append(double dnum)
+ {
+ return append(Double.toString(dnum));
+ }
+
+ /**
+ * Append the code point to this <code>StringBuffer</code>.
+ * This is like #append(char), but will append two characters
+ * if a supplementary code point is given.
+ *
+ * @param code the code point to append
+ * @return this <code>StringBuffer</code>
+ * @see Character#toChars(int, char[], int)
+ * @since 1.5
+ */
+ public CPStringBuilder appendCodePoint(int code)
+ {
+ int len = Character.charCount(code);
+ ensureCapacity(count + len);
+ Character.toChars(code, value, count);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Delete characters from this <code>StringBuffer</code>.
+ * <code>delete(10, 12)</code> will delete 10 and 11, but not 12. It is
+ * harmless for end to be larger than length().
+ *
+ * @param start the first character to delete
+ * @param end the index after the last character to delete
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if start or end are out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder delete(int start, int end)
+ {
+ if (start < 0 || start > count || start > end)
+ throw new StringIndexOutOfBoundsException(start);
+ if (end > count)
+ end = count;
+ ensureCapacity(count);
+ if (count - end != 0)
+ System.arraycopy(value, end, value, start, count - end);
+ count -= end - start;
+ return this;
+ }
+
+ /**
+ * Delete a character from this <code>StringBuffer</code>.
+ *
+ * @param index the index of the character to delete
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if index is out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder deleteCharAt(int index)
+ {
+ return delete(index, index + 1);
+ }
+
+ /**
+ * Replace characters between index <code>start</code> (inclusive) and
+ * <code>end</code> (exclusive) with <code>str</code>. If <code>end</code>
+ * is larger than the size of this StringBuffer, all characters after
+ * <code>start</code> are replaced.
+ *
+ * @param start the beginning index of characters to delete (inclusive)
+ * @param end the ending index of characters to delete (exclusive)
+ * @param str the new <code>String</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if start or end are out of bounds
+ * @throws NullPointerException if str is null
+ * @since 1.2
+ */
+ public CPStringBuilder replace(int start, int end, String str)
+ {
+ if (start < 0 || start > count || start > end)
+ throw new StringIndexOutOfBoundsException(start);
+
+ int len = str.length();
+ // Calculate the difference in 'count' after the replace.
+ int delta = len - (end > count ? count : end) + start;
+ ensureCapacity(count + delta);
+
+ if (delta != 0 && end < count)
+ System.arraycopy(value, end, value, end + delta, count - end);
+
+ str.getChars(0, len, value, start);
+ count += delta;
+ return this;
+ }
+
+ /**
+ * Insert a subarray of the <code>char[]</code> argument into this
+ * <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param str the <code>char[]</code> to insert
+ * @param str_offset the index in <code>str</code> to start inserting from
+ * @param len the number of characters to insert
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @throws StringIndexOutOfBoundsException if any index is out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder insert(int offset, char[] str, int str_offset, int len)
+ {
+ if (offset < 0 || offset > count || len < 0
+ || str_offset < 0 || str_offset > str.length - len)
+ throw new StringIndexOutOfBoundsException();
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ System.arraycopy(str, str_offset, value, offset, len);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param obj the <code>Object</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @exception StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(Object)
+ */
+ public CPStringBuilder insert(int offset, Object obj)
+ {
+ return insert(offset, obj == null ? "null" : obj.toString());
+ }
+
+ /**
+ * Insert the <code>String</code> argument into this
+ * <code>StringBuffer</code>. If str is null, the String "null" is used
+ * instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param str the <code>String</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ */
+ public CPStringBuilder insert(int offset, String str)
+ {
+ if (offset < 0 || offset > count)
+ throw new StringIndexOutOfBoundsException(offset);
+ if (str == null)
+ str = "null";
+ int len = str.length();
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ str.getChars(0, len, value, offset);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>CharSequence</code> argument into this
+ * <code>StringBuffer</code>. If the sequence is null, the String
+ * "null" is used instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param sequence the <code>CharSequence</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws IndexOutOfBoundsException if offset is out of bounds
+ * @since 1.5
+ */
+ public CPStringBuilder insert(int offset, CharSequence sequence)
+ {
+ if (sequence == null)
+ sequence = "null";
+ return insert(offset, sequence, 0, sequence.length());
+ }
+
+ /**
+ * Insert a subsequence of the <code>CharSequence</code> argument into this
+ * <code>StringBuffer</code>. If the sequence is null, the String
+ * "null" is used instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param sequence the <code>CharSequence</code> to insert
+ * @param start the starting index of the subsequence
+ * @param end one past the ending index of the subsequence
+ * @return this <code>StringBuffer</code>
+ * @throws IndexOutOfBoundsException if offset, start,
+ * or end are out of bounds
+ * @since 1.5
+ */
+ public CPStringBuilder insert(int offset, CharSequence sequence, int start, int end)
+ {
+ if (sequence == null)
+ sequence = "null";
+ if (start < 0 || end < 0 || start > end || end > sequence.length())
+ throw new IndexOutOfBoundsException();
+ int len = end - start;
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ for (int i = start; i < end; ++i)
+ value[offset++] = sequence.charAt(i);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>char[]</code> argument into this
+ * <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param data the <code>char[]</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>data</code> is <code>null</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see #insert(int, char[], int, int)
+ */
+ public CPStringBuilder insert(int offset, char[] data)
+ {
+ return insert(offset, data, 0, data.length);
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param bool the <code>boolean</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(boolean)
+ */
+ public CPStringBuilder insert(int offset, boolean bool)
+ {
+ return insert(offset, bool ? "true" : "false");
+ }
+
+ /**
+ * Insert the <code>char</code> argument into this <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param ch the <code>char</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ */
+ public CPStringBuilder insert(int offset, char ch)
+ {
+ if (offset < 0 || offset > count)
+ throw new StringIndexOutOfBoundsException(offset);
+ ensureCapacity(count + 1);
+ System.arraycopy(value, offset, value, offset + 1, count - offset);
+ value[offset] = ch;
+ count++;
+ return this;
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param inum the <code>int</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(int)
+ */
+ public CPStringBuilder insert(int offset, int inum)
+ {
+ return insert(offset, String.valueOf(inum));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param lnum the <code>long</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(long)
+ */
+ public CPStringBuilder insert(int offset, long lnum)
+ {
+ return insert(offset, Long.toString(lnum, 10));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param fnum the <code>float</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(float)
+ */
+ public CPStringBuilder insert(int offset, float fnum)
+ {
+ return insert(offset, Float.toString(fnum));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param dnum the <code>double</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(double)
+ */
+ public CPStringBuilder insert(int offset, double dnum)
+ {
+ return insert(offset, Double.toString(dnum));
+ }
+
+ /**
+ * Finds the first instance of a substring in this StringBuilder.
+ *
+ * @param str String to find
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @see #indexOf(String, int)
+ */
+ public int indexOf(String str)
+ {
+ return indexOf(str, 0);
+ }
+
+ /**
+ * Finds the first instance of a String in this StringBuffer, starting at
+ * a given index. If starting index is less than 0, the search starts at
+ * the beginning of this String. If the starting index is greater than the
+ * length of this String, or the substring is not found, -1 is returned.
+ *
+ * @param str String to find
+ * @param fromIndex index to start the search
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @since 1.4
+ */
+ public int indexOf(String str, int fromIndex)
+ {
+ if (fromIndex < 0)
+ fromIndex = 0;
+ int olength = str.length();
+ int limit = count - olength;
+ String s = VMCPStringBuilder.toString(value, 0, count);
+ for (; fromIndex <= limit; ++fromIndex)
+ if (s.regionMatches(fromIndex, str, 0, olength))
+ return fromIndex;
+ return -1;
+ }
+
+ /**
+ * Finds the last instance of a substring in this StringBuffer.
+ *
+ * @param str String to find
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @see #lastIndexOf(String, int)
+ * @since 1.4
+ */
+ public int lastIndexOf(String str)
+ {
+ return lastIndexOf(str, count - str.length());
+ }
+
+ /**
+ * Finds the last instance of a String in this StringBuffer, starting at a
+ * given index. If starting index is greater than the maximum valid index,
+ * then the search begins at the end of this String. If the starting index
+ * is less than zero, or the substring is not found, -1 is returned.
+ *
+ * @param str String to find
+ * @param fromIndex index to start the search
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @since 1.4
+ */
+ public int lastIndexOf(String str, int fromIndex)
+ {
+ fromIndex = Math.min(fromIndex, count - str.length());
+ String s = VMCPStringBuilder.toString(value, 0, count);
+ int olength = str.length();
+ for ( ; fromIndex >= 0; fromIndex--)
+ if (s.regionMatches(fromIndex, str, 0, olength))
+ return fromIndex;
+ return -1;
+ }
+
+ /**
+ * Reverse the characters in this StringBuffer. The same sequence of
+ * characters exists, but in the reverse index ordering.
+ *
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder reverse()
+ {
+ // Call ensureCapacity to enforce copy-on-write.
+ ensureCapacity(count);
+ for (int i = count >> 1, j = count - i; --i >= 0; ++j)
+ {
+ char c = value[i];
+ value[i] = value[j];
+ value[j] = c;
+ }
+ return this;
+ }
+
+ /**
+ * This may reduce the amount of memory used by the StringBuffer,
+ * by resizing the internal array to remove unused space. However,
+ * this method is not required to resize, so this behavior cannot
+ * be relied upon.
+ * @since 1.5
+ */
+ public void trimToSize()
+ {
+ int wouldSave = value.length - count;
+ // Some random heuristics: if we save less than 20 characters, who
+ // cares.
+ if (wouldSave < 20)
+ return;
+ // If we save more than 200 characters, shrink.
+ // If we save more than 1/4 of the buffer, shrink.
+ if (wouldSave > 200 || wouldSave * 4 > value.length)
+ allocateArray(count);
+ }
+
+ /**
+ * Return the number of code points between two indices in the
+ * <code>StringBuffer</code>. An unpaired surrogate counts as a
+ * code point for this purpose. Characters outside the indicated
+ * range are not examined, even if the range ends in the middle of a
+ * surrogate pair.
+ *
+ * @param start the starting index
+ * @param end one past the ending index
+ * @return the number of code points
+ * @since 1.5
+ */
+ public int codePointCount(int start, int end)
+ {
+ if (start < 0 || end >= count || start > end)
+ throw new StringIndexOutOfBoundsException();
+
+ int count = 0;
+ while (start < end)
+ {
+ char base = value[start];
+ if (base < Character.MIN_HIGH_SURROGATE
+ || base > Character.MAX_HIGH_SURROGATE
+ || start == end
+ || start == count
+ || value[start + 1] < Character.MIN_LOW_SURROGATE
+ || value[start + 1] > Character.MAX_LOW_SURROGATE)
+ {
+ // Nothing.
+ }
+ else
+ {
+ // Surrogate pair.
+ ++start;
+ }
+ ++start;
+ ++count;
+ }
+ return count;
+ }
+
+ /**
+ * Starting at the given index, this counts forward by the indicated
+ * number of code points, and then returns the resulting index. An
+ * unpaired surrogate counts as a single code point for this
+ * purpose.
+ *
+ * @param start the starting index
+ * @param codePoints the number of code points
+ * @return the resulting index
+ * @since 1.5
+ */
+ public int offsetByCodePoints(int start, int codePoints)
+ {
+ while (codePoints > 0)
+ {
+ char base = value[start];
+ if (base < Character.MIN_HIGH_SURROGATE
+ || base > Character.MAX_HIGH_SURROGATE
+ || start == count
+ || value[start + 1] < Character.MIN_LOW_SURROGATE
+ || value[start + 1] > Character.MAX_LOW_SURROGATE)
+ {
+ // Nothing.
+ }
+ else
+ {
+ // Surrogate pair.
+ ++start;
+ }
+ ++start;
+ --codePoints;
+ }
+ return start;
+ }
+
+ /**
+ * Increase the capacity of this <code>StringBuilder</code>. This will
+ * ensure that an expensive growing operation will not occur until either
+ * <code>minimumCapacity</code> is reached or the array has been allocated.
+ * The buffer is grown to either <code>minimumCapacity * 2</code>, if
+ * the array has been allocated or the larger of <code>minimumCapacity</code> and
+ * <code>capacity() * 2 + 2</code>, if it is not already large enough.
+ *
+ * @param minimumCapacity the new capacity
+ * @see #length()
+ */
+ public void ensureCapacity(int minimumCapacity)
+ {
+ if (allocated || minimumCapacity > value.length)
+ {
+ if (minimumCapacity > value.length)
+ {
+ int max = value.length * 2 + 2;
+ minimumCapacity = (minimumCapacity < max ? max : minimumCapacity);
+ }
+ else
+ minimumCapacity *= 2;
+ allocateArray(minimumCapacity);
+ }
+ }
+
+ /**
+ * Allocates a new character array. This method is triggered when
+ * a write is attempted after the array has been passed to a
+ * {@link String} object, so that the builder does not modify
+ * the immutable {@link String}.
+ *
+ * @param capacity the size of the new array.
+ */
+ private void allocateArray(int capacity)
+ {
+ char[] nb = new char[capacity];
+ System.arraycopy(value, 0, nb, 0, count);
+ value = nb;
+ allocated = false;
+ }
+
+ /**
+ * Get the length of the <code>String</code> this <code>StringBuilder</code>
+ * would create. Not to be confused with the <em>capacity</em> of the
+ * <code>StringBuilder</code>.
+ *
+ * @return the length of this <code>StringBuilder</code>
+ * @see #capacity()
+ * @see #setLength(int)
+ */
+ public int length()
+ {
+ return count;
+ }
+
+ /**
+ * Creates a substring of this StringBuilder, starting at a specified index
+ * and ending at one character before a specified index. This is implemented
+ * the same as <code>substring(beginIndex, endIndex)</code>, to satisfy
+ * the CharSequence interface.
+ *
+ * @param beginIndex index to start at (inclusive, base 0)
+ * @param endIndex index to end at (exclusive)
+ * @return new String which is a substring of this StringBuilder
+ * @throws IndexOutOfBoundsException if beginIndex or endIndex is out of
+ * bounds
+ * @see #substring(int, int)
+ */
+ public CharSequence subSequence(int beginIndex, int endIndex)
+ {
+ return substring(beginIndex, endIndex);
+ }
+
+ /**
+ * Creates a substring of this CPStringBuilder, starting at a specified index
+ * and ending at the end of this StringBuilder.
+ *
+ * @param beginIndex index to start substring (base 0)
+ * @return new String which is a substring of this StringBuilder
+ * @throws StringIndexOutOfBoundsException if beginIndex is out of bounds
+ * @see #substring(int, int)
+ */
+ public String substring(int beginIndex)
+ {
+ return substring(beginIndex, count);
+ }
+
+ /**
+ * Creates a substring of this CPStringBuilder, starting at a specified index
+ * and ending at one character before a specified index.
+ *
+ * @param beginIndex index to start at (inclusive, base 0)
+ * @param endIndex index to end at (exclusive)
+ * @return new String which is a substring of this StringBuilder
+ * @throws StringIndexOutOfBoundsException if beginIndex or endIndex is out
+ * of bounds
+ */
+ public String substring(int beginIndex, int endIndex)
+ {
+ if (beginIndex < 0 || endIndex > count || endIndex < beginIndex)
+ throw new StringIndexOutOfBoundsException();
+ int len = endIndex - beginIndex;
+ if (len == 0)
+ return "";
+ allocated = true;
+ return VMCPStringBuilder.toString(value, beginIndex, len);
+ }
+
+ /**
+ * Convert this <code>CPStringBuilder</code> to a <code>String</code>. The
+ * String is composed of the characters currently in this StringBuilder. Note
+ * that the result is not a copy, so we flag this here and make sure to
+ * allocate a new array on the next write attempt (see {@link #ensureCapacity(int)}).
+ *
+ * @return the characters in this StringBuilder
+ */
+ public String toString()
+ {
+ allocated = true;
+ return VMCPStringBuilder.toString(value, 0, count);
+ }
+
+}
diff --git a/libjava/classpath/gnu/java/lang/ClassHelper.java b/libjava/classpath/gnu/java/lang/ClassHelper.java
index 49dce21..e190889 100644
--- a/libjava/classpath/gnu/java/lang/ClassHelper.java
+++ b/libjava/classpath/gnu/java/lang/ClassHelper.java
@@ -102,7 +102,7 @@ public class ClassHelper
String name = klass.getName();
if (arrayCount == 0)
return name;
- StringBuilder b = new StringBuilder(name.length() + 2 * arrayCount);
+ CPStringBuilder b = new CPStringBuilder(name.length() + 2 * arrayCount);
b.append(name);
for (int i = 0; i < arrayCount; ++i)
b.append("[]");
diff --git a/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java b/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
index 06bc9e4a..e413c76 100644
--- a/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
+++ b/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
@@ -38,7 +38,19 @@ exception statement from your version. */
package gnu.java.lang.reflect;
-import java.lang.reflect.*;
+import gnu.java.lang.CPStringBuilder;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.GenericSignatureFormatError;
+import java.lang.reflect.MalformedParameterizedTypeException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+
import java.util.ArrayList;
import java.util.Arrays;
@@ -184,7 +196,7 @@ final class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType
public String toString()
{
- StringBuilder sb = new StringBuilder();
+ CPStringBuilder sb = new CPStringBuilder();
if (owner != null)
{
sb.append(owner);
diff --git a/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java b/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
index 78c1718..612058d 100644
--- a/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
+++ b/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.lang.reflect;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
@@ -239,7 +241,7 @@ public class TypeSignature
public static String getEncodingOfMethod(Method m)
{
Class[] paramTypes = m.getParameterTypes();
- StringBuilder buf = new StringBuilder("(");
+ CPStringBuilder buf = new CPStringBuilder("(");
for (int i = 0; i < paramTypes.length; i++)
buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
buf.append(')').append(getEncodingOfClass(m.getReturnType().getName(),
@@ -261,7 +263,7 @@ public class TypeSignature
public static String getEncodingOfConstructor(Constructor c)
{
Class[] paramTypes = c.getParameterTypes();
- StringBuilder buf = new StringBuilder("(");
+ CPStringBuilder buf = new CPStringBuilder("(");
for (int i = 0; i < paramTypes.length; i++)
buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
buf.append(")V");
diff --git a/libjava/classpath/gnu/java/math/GMP.java b/libjava/classpath/gnu/java/math/GMP.java
new file mode 100644
index 0000000..6fb4936
--- /dev/null
+++ b/libjava/classpath/gnu/java/math/GMP.java
@@ -0,0 +1,474 @@
+/* gnu.java.math.GMP -- Arbitary precision integers using GMP
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.math;
+
+import gnu.classpath.Pointer;
+
+/**
+ * Implement BigInteger using GMP
+ */
+public final class GMP
+{
+ private Pointer native_ptr;
+ private int refCount = 1;
+
+ public GMP()
+ {
+ super();
+
+ natInitialize();
+ }
+
+ private synchronized void acquireRef()
+ {
+ refCount++;
+ }
+
+ private synchronized void releaseRef()
+ {
+ refCount--;
+ if (refCount == 0)
+ {
+ natFinalize();
+ native_ptr = null;
+ }
+ }
+
+ protected void finalize()
+ {
+ releaseRef();
+ }
+
+
+ public void fromByteArray(byte[] v)
+ {
+ acquireRef();
+ natFromByteArray(v);
+ releaseRef();
+ }
+
+ public void fromBI(GMP x)
+ {
+ acquireRef();
+ x.acquireRef();
+ natFromBI(x.native_ptr);
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void fromLong(long n)
+ {
+ acquireRef();
+ natFromLong(n);
+ releaseRef();
+ }
+
+ public int fromString(String s, int rdx)
+ {
+ acquireRef();
+ int result = natFromString(s, rdx);
+ releaseRef();
+ return result;
+ }
+
+ public void fromSignedMagnitude(byte[] m, boolean isNegative)
+ {
+ acquireRef();
+ natFromSignedMagnitude(m, isNegative);
+ releaseRef();
+ }
+
+ public String toString(int b)
+ {
+ acquireRef();
+ String result = natToString(b);
+ releaseRef();
+ return result;
+ }
+
+ public void toByteArray(byte[] r)
+ {
+ acquireRef();
+ natToByteArray(r);
+ releaseRef();
+ }
+
+ public double doubleValue()
+ {
+ acquireRef();
+ double result = natDoubleValue();
+ releaseRef();
+ return result;
+ }
+
+ public int absIntValue()
+ {
+ acquireRef();
+ int result = natAbsIntValue();
+ releaseRef();
+ return result;
+ }
+
+ public int compare(GMP x)
+ {
+ acquireRef();
+ x.acquireRef();
+ int result = natCompare(x.native_ptr);
+ x.releaseRef();
+ releaseRef();
+ return result;
+ }
+
+ public void add(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAdd(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void subtract(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natSubtract(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void multiply(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natMultiply(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void quotient(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natQuotient(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void remainder(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natRemainder(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void quotientAndRemainder(GMP x, GMP q, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ q.acquireRef();
+ r.acquireRef();
+ natQuotientAndRemainder(x.native_ptr, q.native_ptr, r.native_ptr);
+ r.releaseRef();
+ q.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void modulo(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natModulo(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void pow(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natPow(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void modPow(GMP e, GMP m, GMP r)
+ {
+ acquireRef();
+ e.acquireRef();
+ m.acquireRef();
+ r.acquireRef();
+ natModPow(e.native_ptr, m.native_ptr, r.native_ptr);
+ r.releaseRef();
+ m.releaseRef();
+ e.releaseRef();
+ releaseRef();
+ }
+
+ public void modInverse(GMP m, GMP r)
+ {
+ acquireRef();
+ m.acquireRef();
+ r.acquireRef();
+ natModInverse(m.native_ptr, r.native_ptr);
+ r.releaseRef();
+ m.releaseRef();
+ releaseRef();
+ }
+
+ public void gcd(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natGCD(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void shiftLeft(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natShiftLeft(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void shiftRight(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natShiftRight(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void abs(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natAbs(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void negate(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natNegate(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int bitLength()
+ {
+ acquireRef();
+ int result = natBitLength();
+ releaseRef();
+ return result;
+ }
+
+ public int bitCount()
+ {
+ acquireRef();
+ int result = natSetBitCount();
+ releaseRef();
+ return result;
+ }
+
+ public void and(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAnd(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void or(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natOr(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void xor(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natXor(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void andNot(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAndNot(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void not(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natNot(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void flipBit(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natFlipBit(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int testBit(int n)
+ {
+ acquireRef();
+ int result = natTestBit(n);
+ releaseRef();
+ return result;
+ }
+
+ public void setBit(int n, boolean setIt, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natSetBit(n, setIt, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int testPrimality(int certainty)
+ {
+ acquireRef();
+ int result = natTestPrimality(certainty);
+ releaseRef();
+ return result;
+ }
+
+ public int lowestSetBit()
+ {
+ acquireRef();
+ int result = natLowestSetBit();
+ releaseRef();
+ return result;
+ }
+
+ // Native methods .........................................................
+
+ public static native void natInitializeLibrary();
+
+ private native void natInitialize();
+ private native void natFinalize();
+
+ private native void natFromLong(long n);
+ private native void natFromBI(Pointer x);
+ private native void natFromByteArray(byte[] v);
+ private native int natFromString(String s, int rdx);
+ private native void natFromSignedMagnitude(byte[] m, boolean isNegative);
+
+ private native String natToString(int base);
+ private native void natToByteArray(byte[] r);
+ private native int natAbsIntValue();
+ private native double natDoubleValue();
+
+ private native int natCompare(Pointer y);
+ private native void natAdd(Pointer x, Pointer r);
+ private native void natSubtract(Pointer x, Pointer r);
+ private native void natMultiply(Pointer x, Pointer r);
+ private native void natQuotient(Pointer x, Pointer r);
+ private native void natRemainder(Pointer x, Pointer r);
+ private native void natQuotientAndRemainder(Pointer x, Pointer q, Pointer r);
+ private native void natModulo(Pointer m, Pointer r);
+ private native void natPow(int n, Pointer r);
+ private native void natModPow(Pointer e, Pointer m, Pointer r);
+ private native void natModInverse(Pointer x, Pointer r);
+ private native void natGCD(Pointer x, Pointer r);
+ private native int natTestPrimality(int c);
+ private native void natShiftLeft(int n, Pointer r);
+ private native void natShiftRight(int n, Pointer r);
+ private native int natLowestSetBit();
+ private native void natAbs(Pointer r);
+ private native void natNegate(Pointer r);
+ private native int natBitLength();
+ private native int natSetBitCount();
+ private native void natXor(Pointer x, Pointer r);
+ private native void natOr(Pointer x, Pointer r);
+ private native void natAnd(Pointer x, Pointer r);
+ private native void natAndNot(Pointer x, Pointer r);
+ private native void natFlipBit(int n, Pointer r);
+ private native int natTestBit(int n);
+ private native void natSetBit(int n, boolean setIt, Pointer r);
+ private native void natNot(Pointer r);
+}
diff --git a/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java b/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
index fd79019..98e8a86 100644
--- a/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
+++ b/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.ftp;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.CRLFInputStream;
import gnu.java.net.CRLFOutputStream;
import gnu.java.net.EmptyX509TrustManager;
@@ -621,7 +623,7 @@ public class FTPConnection
}
// Send PORT command
- StringBuffer buf = new StringBuffer(PORT);
+ CPStringBuilder buf = new CPStringBuilder(PORT);
buf.append(' ');
// Construct the address/port string form
byte[] address = localhost.getAddress();
@@ -686,7 +688,7 @@ public class FTPConnection
public void setRepresentationType(int type)
throws IOException
{
- StringBuffer buf = new StringBuffer(TYPE);
+ CPStringBuilder buf = new CPStringBuilder(TYPE);
buf.append(' ');
switch (type)
{
@@ -732,7 +734,7 @@ public class FTPConnection
public void setFileStructure(int structure)
throws IOException
{
- StringBuffer buf = new StringBuffer(STRU);
+ CPStringBuilder buf = new CPStringBuilder(STRU);
buf.append(' ');
switch (structure)
{
@@ -776,7 +778,7 @@ public class FTPConnection
public void setTransferMode(int mode)
throws IOException
{
- StringBuffer buf = new StringBuffer(MODE);
+ CPStringBuilder buf = new CPStringBuilder(MODE);
buf.append(' ');
switch (mode)
{
@@ -1286,7 +1288,7 @@ public class FTPConnection
}
else if (c == '-')
{
- StringBuffer buf = new StringBuffer(line.substring(4));
+ CPStringBuilder buf = new CPStringBuilder(line.substring(4));
buf.append('\n');
while(true)
{
diff --git a/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java b/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
index 8abef71..8a30e51 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.ProtocolException;
@@ -113,7 +115,7 @@ public class ChunkedInputStream
// Read chunk header
int c, last = 0;
boolean seenSemi = false;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
do
{
c = in.read();
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Cookie.java b/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
index 0be7a09..4482a12 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Date;
/**
@@ -139,7 +141,7 @@ public class Cookie
public String toString(boolean showPath, boolean showDomain)
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(name);
buf.append('=');
buf.append(value);
diff --git a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java b/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
index 9d19bfb..44b1a60 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
@@ -39,6 +39,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
import gnu.classpath.SystemProperties;
+
+import gnu.java.lang.CPStringBuilder;
import gnu.java.net.EmptyX509TrustManager;
import java.io.BufferedInputStream;
@@ -668,7 +670,7 @@ public class HTTPConnection
Cookie[] cookies = cookieManager.getCookies(hostname, secure, path);
if (cookies != null && cookies.length > 0)
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append("$Version=1");
for (int i = 0; i < cookies.length; i++)
{
@@ -827,7 +829,7 @@ public class HTTPConnection
*/
protected String getURI()
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(secure ? "https://" : "http://");
buf.append(hostname);
if (secure)
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Headers.java b/libjava/classpath/gnu/java/net/protocol/http/Headers.java
index c8736bb..690a0c6 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Headers.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Headers.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.LineInputStream;
import java.io.IOException;
@@ -280,7 +282,7 @@ class Headers implements Iterable<Headers.HeaderElement>
(LineInputStream) in : new LineInputStream(in);
String name = null;
- StringBuilder value = new StringBuilder();
+ CPStringBuilder value = new CPStringBuilder();
while (true)
{
String line = lin.readLine();
diff --git a/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java b/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
index 16cf56a2..568f830 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
@@ -1,5 +1,5 @@
/* LimitedLengthInputStream.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2008 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-
+
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
@@ -57,20 +57,17 @@ class LimitedLengthInputStream
private boolean eof;
private InputStream in;
private boolean doClose;
-
-
+
private void handleClose()
throws IOException
{
eof = true;
+
if (doClose)
- {
- in.close();
- }
+ in.close();
else
- {
- connection.release();
- }
+ connection.release();
+
in = null;
connection = null;
}
@@ -85,7 +82,7 @@ class LimitedLengthInputStream
* @param restrictLen if true the number of bytes that can be read
* from this stream will be limited to maxLen, otherwise the number
* of bytes is not restricted.
- *
+ *
* @param con the HTTPConnection associated with this stream
*
* @param doClose if true con will be closed when finished reading,
@@ -98,7 +95,6 @@ class LimitedLengthInputStream
HTTPConnection con,
boolean doClose)
throws IOException
-
{
this.in = in;
this.remainingLen = maxLen;
@@ -122,7 +118,7 @@ class LimitedLengthInputStream
return -1; // EOF
int r;
-
+
if (restrictLen)
{
r = in.read();
@@ -138,7 +134,7 @@ class LimitedLengthInputStream
if (r == -1)
handleClose();
}
-
+
return r;
}
@@ -156,12 +152,12 @@ class LimitedLengthInputStream
if (restrictLen && length > remainingLen)
length = (int) remainingLen;
-
+
int r = in.read(buffer, offset, length);
-
+
if (-1 == r)
handleClose();
-
+
if (restrictLen && r > 0)
{
remainingLen -= r;
@@ -182,7 +178,7 @@ class LimitedLengthInputStream
n = remainingLen;
long r = in.skip(n);
-
+
if (restrictLen)
{
remainingLen -= r;
@@ -214,7 +210,7 @@ class LimitedLengthInputStream
// it away.
doClose = true;
-
+
handleClose();
}
}
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Request.java b/libjava/classpath/gnu/java/net/protocol/http/Request.java
index 90e3b7a..88e2fd0 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Request.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Request.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
import gnu.java.net.LineInputStream;
import gnu.java.util.Base64;
@@ -628,7 +629,7 @@ public class Request
{
int len = text.length();
String key = null;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
Properties ret = new Properties();
boolean inQuote = false;
for (int i = 0; i < len; i++)
@@ -681,7 +682,7 @@ public class Request
{
int nc = connection.getNonceCount(nonce);
String hex = Integer.toHexString(nc);
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 8 - hex.length(); i > 0; i--)
{
buf.append('0');
@@ -752,7 +753,7 @@ public class Request
int len = text.length();
String attr = null;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
boolean inQuote = false;
for (int i = 0; i <= len; i++)
{
diff --git a/libjava/classpath/gnu/java/net/protocol/jar/Handler.java b/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
index c57d0a3..66f0fb6 100644
--- a/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
+++ b/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.jar;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.URLParseError;
import java.io.IOException;
@@ -180,7 +182,7 @@ public class Handler extends URLStreamHandler
tokens.add(token);
}
- StringBuffer path = new StringBuffer(url_string.length());
+ CPStringBuilder path = new CPStringBuilder(url_string.length());
path.append(url_string.substring(0, jar_stop + 1));
Iterator<String> it = tokens.iterator();
@@ -205,7 +207,7 @@ public class Handler extends URLStreamHandler
// Do the concatenation manually to avoid resize StringBuffer's
// internal buffer. The length of ref is not taken into consideration
// as it's a rare path.
- StringBuffer sb = new StringBuffer (file.length() + 5);
+ CPStringBuilder sb = new CPStringBuilder (file.length() + 5);
sb.append ("jar:");
sb.append (file);
if (ref != null)
diff --git a/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java b/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
index 33dfa02..a1eb5e2 100644
--- a/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
+++ b/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
@@ -119,6 +119,8 @@ public abstract class ByteDecodeLoopHelper
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -129,7 +131,7 @@ public abstract class ByteDecodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
@@ -147,7 +149,7 @@ public abstract class ByteDecodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
diff --git a/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java b/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
index 5f703b1..b1a4f10 100644
--- a/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
+++ b/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
@@ -120,6 +120,8 @@ public abstract class ByteEncodeLoopHelper
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -130,7 +132,7 @@ public abstract class ByteEncodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;
@@ -148,7 +150,7 @@ public abstract class ByteEncodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;
diff --git a/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java b/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
index 4d5e1b0..9c3edef 100644
--- a/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
+++ b/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.rmi.server;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.net.URL;
@@ -69,7 +71,7 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi
if (urls.length == 0)
return null;
- StringBuffer annotation = new StringBuffer (64 * urls.length);
+ CPStringBuilder annotation = new CPStringBuilder (64 * urls.length);
for (int i = 0; i < urls.length; i++)
{
@@ -337,7 +339,7 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi
if (urls.length == 0)
return null;
- StringBuffer annotation = new StringBuffer (64 * urls.length);
+ CPStringBuilder annotation = new CPStringBuilder (64 * urls.length);
for (int i = 0; i < urls.length; i++)
{
diff --git a/libjava/classpath/gnu/java/rmi/server/RMIHashes.java b/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
index 5a41440..c3665a4 100644
--- a/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
+++ b/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.rmi.server;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.lang.reflect.TypeSignature;
import java.io.ByteArrayOutputStream;
@@ -61,7 +63,7 @@ public class RMIHashes
ByteArrayOutputStream digest_out = new ByteArrayOutputStream();
DataOutputStream data_out = new DataOutputStream (digest_out);
- StringBuffer sbuf = new StringBuffer();
+ CPStringBuilder sbuf = new CPStringBuilder();
sbuf.append(meth.getName());
sbuf.append('(');
Class params[] = meth.getParameterTypes();
diff --git a/libjava/classpath/gnu/java/security/Engine.java b/libjava/classpath/gnu/java/security/Engine.java
index 2cb2183..6c39d46 100644
--- a/libjava/classpath/gnu/java/security/Engine.java
+++ b/libjava/classpath/gnu/java/security/Engine.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.security;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -150,7 +152,7 @@ public final class Engine
String alias;
int count = 0;
boolean algorithmFound = false;
- StringBuilder sb = new StringBuilder();
+ CPStringBuilder sb = new CPStringBuilder();
while (enumer.hasMoreElements())
{
key = (String) enumer.nextElement();
diff --git a/libjava/classpath/gnu/java/security/OID.java b/libjava/classpath/gnu/java/security/OID.java
index f61cf0f..a3d70e2 100644
--- a/libjava/classpath/gnu/java/security/OID.java
+++ b/libjava/classpath/gnu/java/security/OID.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.der.DEREncodingException;
import java.io.ByteArrayOutputStream;
@@ -359,7 +361,7 @@ public class OID implements Cloneable, Comparable, java.io.Serializable
return strRep;
else
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 0; i < components.length; i++)
{
buf.append((long) components[i] & 0xFFFFFFFFL);
diff --git a/libjava/classpath/gnu/java/security/PolicyFile.java b/libjava/classpath/gnu/java/security/PolicyFile.java
index 8da3a7d..e9c8116 100644
--- a/libjava/classpath/gnu/java/security/PolicyFile.java
+++ b/libjava/classpath/gnu/java/security/PolicyFile.java
@@ -39,6 +39,8 @@ package gnu.java.security;
import gnu.classpath.debug.Component;
import gnu.classpath.debug.SystemLogger;
+
+import gnu.java.lang.CPStringBuilder;
import gnu.java.security.action.GetPropertyAction;
import java.io.File;
@@ -150,7 +152,7 @@ public final class PolicyFile extends Policy
protected static final Logger logger = SystemLogger.SYSTEM;
// Added to cut redundant AccessController.doPrivileged calls
- private static GetPropertyAction prop = new GetPropertyAction("file.seperator");
+ private static GetPropertyAction prop = new GetPropertyAction("file.separator");
private static final String fs = (String) AccessController.doPrivileged(prop);
private static final String DEFAULT_POLICY =
@@ -629,8 +631,8 @@ public final class PolicyFile extends Policy
*/
private static String expand(final String s)
{
- final StringBuffer result = new StringBuffer();
- final StringBuffer prop = new StringBuffer();
+ final CPStringBuilder result = new CPStringBuilder();
+ final CPStringBuilder prop = new CPStringBuilder();
int state = 0;
for (int i = 0; i < s.length(); i++)
{
diff --git a/libjava/classpath/gnu/java/security/der/BitString.java b/libjava/classpath/gnu/java/security/der/BitString.java
index 02b1c03..ac10be2 100644
--- a/libjava/classpath/gnu/java/security/der/BitString.java
+++ b/libjava/classpath/gnu/java/security/der/BitString.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.der;
+import gnu.java.lang.CPStringBuilder;
+
import java.math.BigInteger;
import java.util.Arrays;
@@ -314,7 +316,7 @@ public class BitString implements Cloneable, Comparable
public String toString()
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
for (int i = 0, j = 7, k = 0; i < size(); i++)
{
sb.append((bytes[k] & 1 << j) != 0 ? "1" : "0");
diff --git a/libjava/classpath/gnu/java/security/der/DERReader.java b/libjava/classpath/gnu/java/security/der/DERReader.java
index 09ec1e2..cd552c8 100644
--- a/libjava/classpath/gnu/java/security/der/DERReader.java
+++ b/libjava/classpath/gnu/java/security/der/DERReader.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.der;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.OID;
import java.io.BufferedInputStream;
@@ -286,7 +288,7 @@ public class DERReader implements DER
private static String fromIso88591(byte[] bytes)
{
- StringBuffer str = new StringBuffer(bytes.length);
+ CPStringBuilder str = new CPStringBuilder(bytes.length);
for (int i = 0; i < bytes.length; i++)
str.append((char) (bytes[i] & 0xFF));
return str.toString();
@@ -296,7 +298,7 @@ public class DERReader implements DER
{
if ((bytes.length & 0x01) != 0)
throw new IOException("UTF-16 bytes are odd in length");
- StringBuffer str = new StringBuffer(bytes.length / 2);
+ CPStringBuilder str = new CPStringBuilder(bytes.length / 2);
for (int i = 0; i < bytes.length; i += 2)
{
char c = (char) ((bytes[i] << 8) & 0xFF);
@@ -308,7 +310,7 @@ public class DERReader implements DER
private static String fromUtf8(byte[] bytes) throws IOException
{
- StringBuffer str = new StringBuffer((int)(bytes.length / 1.5));
+ CPStringBuilder str = new CPStringBuilder((int)(bytes.length / 1.5));
for (int i = 0; i < bytes.length; )
{
char c = 0;
diff --git a/libjava/classpath/gnu/java/security/hash/Whirlpool.java b/libjava/classpath/gnu/java/security/hash/Whirlpool.java
index 89df5c5..aebe1ac 100644
--- a/libjava/classpath/gnu/java/security/hash/Whirlpool.java
+++ b/libjava/classpath/gnu/java/security/hash/Whirlpool.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.hash;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
@@ -177,10 +179,10 @@ public final class Whirlpool
{
log.fine("Static data");
log.fine("T0[]:");
- StringBuilder sb;
+ CPStringBuilder sb;
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T0[i * 4 + j])).append(", ");
@@ -189,7 +191,7 @@ public final class Whirlpool
log.fine("T1[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T1[i * 4 + j])).append(", ");
@@ -198,7 +200,7 @@ public final class Whirlpool
log.fine("T2[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T2[i * 4 + j])).append(", ");
@@ -207,7 +209,7 @@ public final class Whirlpool
log.fine("T3[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T3[i * 4 + j])).append(", ");
@@ -216,7 +218,7 @@ public final class Whirlpool
log.fine("\nT4[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T4[i * 4 + j])).append(", ");
@@ -225,7 +227,7 @@ public final class Whirlpool
log.fine("T5[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
@@ -234,7 +236,7 @@ public final class Whirlpool
log.fine("T6[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
@@ -243,7 +245,7 @@ public final class Whirlpool
log.fine("T7[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
diff --git a/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java b/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
index eaccb00..8a1cb4c 100644
--- a/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
+++ b/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.jce.sig;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.der.DER;
import gnu.java.security.der.DERReader;
@@ -195,7 +197,7 @@ public class DSSParameters
protected String engineToString()
{
- StringBuffer sb = new StringBuffer("p=");
+ CPStringBuilder sb = new CPStringBuilder("p=");
if (p == null)
sb.append("???");
else
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
index 657de8d..d4cf365 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.util.FormatUtil;
@@ -181,7 +183,7 @@ public abstract class DSSKey
if (str == null)
{
String ls = (String) AccessController.doPrivileged(new GetPropertyAction("line.separator"));
- StringBuilder sb = new StringBuilder(ls)
+ CPStringBuilder sb = new CPStringBuilder(ls)
.append("defaultFormat=").append(defaultFormat).append(",")
.append(ls);
if (hasInheritedParameters())
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
index 6ed8de8..633fcf7 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
@@ -191,7 +193,7 @@ public class DSSPrivateKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("x=0x").append(Configuration.DEBUG ? x.toString(16)
: "**...*").append(ls)
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
index 9e1c4cf..e5c5346 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.key.IKeyPairCodec;
@@ -190,7 +192,7 @@ public class DSSPublicKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("y=0x").append(y.toString(16)).append(ls)
.append(")")
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
index 4bdce40..0419ac9 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.util.FormatUtil;
@@ -163,7 +165,7 @@ public abstract class GnuRSAKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(ls)
+ str = new CPStringBuilder(ls)
.append("defaultFormat=").append(defaultFormat).append(",").append(ls)
.append("n=0x").append(n.toString(16)).append(",").append(ls)
.append("e=0x").append(e.toString(16))
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
index 00a1b82..e554f2f 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.Registry;
@@ -289,7 +291,7 @@ public class GnuRSAPrivateKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("d=0x").append(Configuration.DEBUG ? d.toString(16)
: "**...*").append(ls)
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
index fe28d0b..3217130 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.key.IKeyPairCodec;
@@ -178,7 +180,7 @@ public class GnuRSAPublicKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append(")")
.toString();
diff --git a/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java b/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
index 7d61779..6440331 100644
--- a/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
+++ b/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.security.provider;
import gnu.java.io.Base64InputStream;
+import gnu.java.lang.CPStringBuilder;
import gnu.java.security.x509.X509CRL;
import gnu.java.security.x509.X509CertPath;
import gnu.java.security.x509.X509Certificate;
@@ -193,7 +194,7 @@ public class X509CertificateFactory
if (i != 0x30)
{
inStream.reset();
- StringBuffer line = new StringBuffer(80);
+ CPStringBuilder line = new CPStringBuilder(80);
do
{
line.setLength(0);
@@ -252,7 +253,7 @@ public class X509CertificateFactory
if (i != 0x30)
{
inStream.reset();
- StringBuffer line = new StringBuffer(80);
+ CPStringBuilder line = new CPStringBuilder(80);
do
{
line.setLength(0);
diff --git a/libjava/classpath/gnu/java/security/util/ByteArray.java b/libjava/classpath/gnu/java/security/util/ByteArray.java
index 0d04d91..5144920 100644
--- a/libjava/classpath/gnu/java/security/util/ByteArray.java
+++ b/libjava/classpath/gnu/java/security/util/ByteArray.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -86,7 +88,7 @@ public final class ByteArray
public static String toHexString (byte[] buf, int off, int len, char sep)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append (Character.forDigit (buf[i+off] >>> 4 & 0x0F, 16));
@@ -100,7 +102,7 @@ public final class ByteArray
public static String formatInt (int value, int radix, int len)
{
String s = Integer.toString (value, radix);
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
for (int j = 0; j < len - s.length(); j++)
buf.append ("0");
buf.append (s);
diff --git a/libjava/classpath/gnu/java/security/util/Util.java b/libjava/classpath/gnu/java/security/util/Util.java
index c7a6810f..50d4466 100644
--- a/libjava/classpath/gnu/java/security/util/Util.java
+++ b/libjava/classpath/gnu/java/security/util/Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.math.BigInteger;
/**
@@ -296,7 +298,7 @@ public class Util
*/
public static final String toUnicodeString(byte[] ba, int offset, int length)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
int j = 0;
int k;
@@ -328,7 +330,7 @@ public class Util
*/
public static String toUnicodeString(int[] ia)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
int j = 0;
int k;
@@ -385,7 +387,7 @@ public class Util
{
if (data == null)
return m + "null\n";
- StringBuffer sb = new StringBuffer(length * 3);
+ CPStringBuilder sb = new CPStringBuilder(length * 3);
if (length > 32)
sb.append(m).append("Hexadecimal dump of ")
.append(length).append(" bytes...\n");
@@ -466,7 +468,7 @@ public class Util
b2 = buffer[1];
break;
}
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int c;
boolean notleading = false;
do
diff --git a/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java b/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
index 72cb4a9..60d3557 100644
--- a/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
+++ b/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
import java.security.cert.PolicyNode;
import java.security.cert.PolicyQualifierInfo;
@@ -186,7 +188,7 @@ public final class PolicyNodeImpl implements PolicyNode
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 0; i < depth; i++)
buf.append(" ");
buf.append("(");
diff --git a/libjava/classpath/gnu/java/security/x509/Util.java b/libjava/classpath/gnu/java/security/x509/Util.java
index 1bd268a..7b6c89f 100644
--- a/libjava/classpath/gnu/java/security/x509/Util.java
+++ b/libjava/classpath/gnu/java/security/x509/Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
/**
* A collection of useful class methods.
*
@@ -65,7 +67,7 @@ public final class Util
*/
public static String toHexString(byte[] buf, int off, int len)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append(HEX.charAt(buf[i+off] >>> 4 & 0x0F));
@@ -94,7 +96,7 @@ public final class Util
*/
public static String toHexString(byte[] buf, int off, int len, char sep)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append(HEX.charAt(buf[i+off] >>> 4 & 0x0F));
@@ -130,7 +132,7 @@ public final class Util
public static String hexDump(byte[] buf, int off, int len, String prefix)
{
String nl = System.getProperty("line.separator");
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
int i = 0;
while (i < len)
{
@@ -174,7 +176,7 @@ public final class Util
public static String formatInt(int i, int radix, int len)
{
String s = Integer.toString(i, radix);
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int j = 0; j < len - s.length(); j++)
buf.append("0");
buf.append(s);
diff --git a/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java b/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
index 02adad7..e2e05c5 100644
--- a/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
+++ b/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.OID;
import gnu.java.security.der.DER;
import gnu.java.security.der.DERReader;
@@ -285,7 +287,7 @@ public class X500DistinguishedName implements Principal
{
if (fixed && stringRep != null)
return stringRep;
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (Iterator it = components.iterator(); it.hasNext(); )
{
Map m = (Map) it.next();
@@ -377,7 +379,7 @@ public class X500DistinguishedName implements Principal
private String readAttributeType(Reader in) throws IOException
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int ch;
while ((ch = in.read()) != '=')
{
@@ -399,7 +401,7 @@ public class X500DistinguishedName implements Principal
private String readAttributeValue(Reader in) throws IOException
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int ch = in.read();
if (ch == '#')
{
@@ -537,7 +539,7 @@ public class X500DistinguishedName implements Principal
private static String compressWS(String str)
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
char lastChar = 0;
for (int i = 0; i < str.length(); i++)
{
diff --git a/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java b/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
index ae3e6ef..c2aae96 100644
--- a/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
+++ b/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
@@ -36,21 +36,25 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.text;
+import gnu.java.lang.CPStringBuilder;
+
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.HashMap;
/**
* This class is an implementation of a FormatBuffer with attributes.
- *
+ * Note that this class is not thread-safe; external synchronisation
+ * should be used if an instance is to be accessed from multiple threads.
+ *
* @author Guilhem Lavaux <guilhem@kaffe.org>
* @date April 10, 2004
*/
public class AttributedFormatBuffer implements FormatBuffer
{
- private StringBuffer buffer;
- private ArrayList ranges;
- private ArrayList attributes;
+ private final CPStringBuilder buffer;
+ private final ArrayList ranges;
+ private final ArrayList attributes;
private int[] a_ranges;
private HashMap[] a_attributes;
private int startingRange;
@@ -60,9 +64,9 @@ public class AttributedFormatBuffer implements FormatBuffer
* This constructor accepts a StringBuffer. If the buffer contains
* already some characters they will not be attributed.
*/
- public AttributedFormatBuffer(StringBuffer buffer)
+ public AttributedFormatBuffer(CPStringBuilder buffer)
{
- this.buffer = buffer;
+ this.buffer = new CPStringBuilder(buffer);
this.ranges = new ArrayList();
this.attributes = new ArrayList();
this.defaultAttr = null;
@@ -77,7 +81,7 @@ public class AttributedFormatBuffer implements FormatBuffer
public AttributedFormatBuffer(int prebuffer)
{
- this(new StringBuffer(prebuffer));
+ this(new CPStringBuilder(prebuffer));
}
public AttributedFormatBuffer()
@@ -214,12 +218,12 @@ public class AttributedFormatBuffer implements FormatBuffer
}
/**
- * This method returns the internal StringBuffer describing
+ * This method returns the internal CPStringBuilder describing
* the attributed string.
*
- * @return An instance of StringBuffer which contains the string.
+ * @return An instance of CPStringBuilder which contains the string.
*/
- public StringBuffer getBuffer()
+ public CPStringBuilder getBuffer()
{
return buffer;
}
diff --git a/libjava/classpath/gnu/java/text/StringFormatBuffer.java b/libjava/classpath/gnu/java/text/StringFormatBuffer.java
index 19b621c..fc8d08e 100644
--- a/libjava/classpath/gnu/java/text/StringFormatBuffer.java
+++ b/libjava/classpath/gnu/java/text/StringFormatBuffer.java
@@ -47,7 +47,7 @@ import java.util.HashMap;
*/
public class StringFormatBuffer implements FormatBuffer
{
- private StringBuffer buffer;
+ private final StringBuffer buffer;
private AttributedCharacterIterator.Attribute defaultAttr;
public StringFormatBuffer(int prebuffer)
diff --git a/libjava/classpath/gnu/java/util/Base64.java b/libjava/classpath/gnu/java/util/Base64.java
index 592696b..4401a15 100644
--- a/libjava/classpath/gnu/java/util/Base64.java
+++ b/libjava/classpath/gnu/java/util/Base64.java
@@ -83,6 +83,8 @@ DAMAGES. */
package gnu.java.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -143,7 +145,7 @@ public final class Base64
int srcLength = buf.length - offset;
byte[] input = new byte[3];
int[] output = new int[4];
- StringBuffer out = new StringBuffer();
+ CPStringBuilder out = new CPStringBuilder();
int i = offset;
int chars = 0;
diff --git a/libjava/classpath/gnu/java/util/EmptyEnumeration.java b/libjava/classpath/gnu/java/util/EmptyEnumeration.java
index 46a82d6..ca2c56d73 100644
--- a/libjava/classpath/gnu/java/util/EmptyEnumeration.java
+++ b/libjava/classpath/gnu/java/util/EmptyEnumeration.java
@@ -51,25 +51,19 @@ import java.util.NoSuchElementException;
*
* @author Mark Wielaard (mark@klomp.org)
*/
-public final class EmptyEnumeration implements Enumeration, Serializable
+public final class EmptyEnumeration<T> implements Enumeration<T>, Serializable
{
/** The only instance of this class */
- private static final EmptyEnumeration instance = new EmptyEnumeration();
+ private static final EmptyEnumeration<Object> instance =
+ new EmptyEnumeration<Object>();
/**
- * Private constructor that creates a new empty Enumeration.
- */
- private EmptyEnumeration()
- {
- }
-
- /**
- * Returns the only instance of this class.
+ * Returns an instance of this class for Object.
* It can be shared by multiple objects and threads.
*
* @return the common empty enumeration
*/
- public static EmptyEnumeration getInstance()
+ public static EmptyEnumeration<Object> getInstance()
{
return instance;
}
@@ -89,7 +83,7 @@ public final class EmptyEnumeration implements Enumeration, Serializable
*
* @throws NoSuchElementException this is empty
*/
- public Object nextElement()
+ public T nextElement()
{
throw new NoSuchElementException();
}
diff --git a/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java b/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java
deleted file mode 100644
index f73c3e70..0000000
--- a/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* EventDispatcher.java -- Dispatch events for prefs
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.util.prefs;
-
-import java.util.ArrayList;
-
-/**
- * This is a helper class used for dispatching events for
- * the prefs package.
- */
-public class EventDispatcher extends Thread
-{
- // This is a singleton class. We dispatch all events via a
- // new Thread which is created on demand.
- private static final Thread dispatchThread = new EventDispatcher();
-
- // This is a queue of events to dispatch. This thread waits on
- // the queue and when notified will remove events until the queue
- // is empty.
- private static final ArrayList<Runnable> queue = new ArrayList<Runnable>();
-
- // FIXME: this thread probably ought to go in some classpath-internal
- // ThreadGroup. But we don't have that yet.
- private EventDispatcher()
- {
- setDaemon(true);
- start();
- }
-
- public void run()
- {
- while (true)
- {
- Runnable r;
- synchronized (queue)
- {
- while (queue.size() == 0)
- {
- try
- {
- queue.wait();
- }
- catch (InterruptedException _)
- {
- // Ignore.
- }
- }
- r = queue.remove(0);
- }
- // Invoke outside the synchronization, so that
- // we aren't blocking other threads from posting events.
- try
- {
- r.run();
- }
- catch (Throwable _)
- {
- // Ignore.
- }
- }
- }
-
- /**
- * Add a new runnable to the event dispatch queue. The
- * runnable will be invoked in the event dispatch queue
- * without any locks held.
- * @param runner the Runnable to dispatch
- */
- public static void dispatch(Runnable runner)
- {
- synchronized (queue)
- {
- queue.add(runner);
- queue.notify();
- }
- }
-}
diff --git a/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java b/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
index 0fd4df3..c26fe63 100644
--- a/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
+++ b/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
@@ -165,11 +165,7 @@ public class GConfBasedPreferences
GConfBasedPreferences preferenceNode
= new GConfBasedPreferences(this, name, this.isUser);
-
- // register the node for to GConf so that it can listen
- // events outside the scope of the application
- backend.startWatchingNode(this.node);
-
+
return preferenceNode;
}
diff --git a/libjava/classpath/gnu/java/util/prefs/NodeWriter.java b/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
index 231c047..d3c0953 100644
--- a/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
+++ b/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.prefs;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
@@ -273,7 +275,7 @@ public class NodeWriter {
throws BackingStoreException, IOException
{
// construct String used for indentation
- StringBuffer indentBuffer = new StringBuffer(2*indent);
+ CPStringBuilder indentBuffer = new CPStringBuilder(2*indent);
for (int i=0; i < indent; i++)
indentBuffer.append(" ");
String indentString = indentBuffer.toString();
diff --git a/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java b/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
index 5e12c71..3c02919 100644
--- a/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
+++ b/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
@@ -49,19 +49,11 @@ import java.util.prefs.BackingStoreException;
public final class GConfNativePeer
{
/**
- * Object to achieve locks for methods that need to be synchronized.
- */
- private static final Object[] semaphore = new Object[0];
-
- /**
* Creates a new instance of GConfNativePeer
*/
public GConfNativePeer()
{
- synchronized (semaphore)
- {
- init_class();
- }
+ init_class();
}
/**
@@ -72,31 +64,7 @@ public final class GConfNativePeer
*/
public boolean nodeExist(String node)
{
- return gconf_client_dir_exists(node);
- }
-
- /**
- * Add the node <code>node</code> to the list of nodes the GConf will watch.
- * An event is raised everytime this node is changed. You can add a node
- * multiple times.
- *
- * @param node the node to track.
- */
- public void startWatchingNode(String node)
- {
- gconf_client_add_dir(node);
- }
-
- /**
- * Remove the node <code>node</code> to the list of nodes the GConf is
- * watching. Note that if a node has been added multiple times, you must
- * remove it the same number of times before the remove takes effect.
- *
- * @param node the node you don't want to track anymore.
- */
- public void stopWatchingNode(String node)
- {
- gconf_client_remove_dir(node);
+ return gconf_dir_exists(node);
}
/**
@@ -111,7 +79,7 @@ public final class GConfNativePeer
*/
public boolean setString(String key, String value)
{
- return gconf_client_set_string(key, value);
+ return gconf_set_string(key, value);
}
/**
@@ -124,7 +92,7 @@ public final class GConfNativePeer
*/
public boolean unset(String key)
{
- return gconf_client_unset(key);
+ return gconf_unset(key);
}
/**
@@ -135,7 +103,7 @@ public final class GConfNativePeer
*/
public String getKey(String key)
{
- return gconf_client_get_string(key);
+ return gconf_get_string(key);
}
/**
@@ -149,7 +117,7 @@ public final class GConfNativePeer
*/
public List<String> getKeys(String node) throws BackingStoreException
{
- return gconf_client_all_keys(node);
+ return gconf_all_keys(node);
}
/**
@@ -161,7 +129,7 @@ public final class GConfNativePeer
*/
public List<String> getChildrenNodes(String node) throws BackingStoreException
{
- return gconf_client_all_nodes(node);
+ return gconf_all_nodes(node);
}
/**
@@ -185,17 +153,14 @@ public final class GConfNativePeer
*/
public void suggestSync() throws BackingStoreException
{
- gconf_client_suggest_sync();
+ gconf_suggest_sync();
}
protected void finalize() throws Throwable
{
try
{
- synchronized (semaphore)
- {
- finalize_class();
- }
+ finalize_class();
}
finally
{
@@ -215,18 +180,18 @@ public final class GConfNativePeer
* Initialize the GConf native peer and enable the object cache.
* It is meant to be used by the static initializer.
*/
- native static final private void init_id_cache();
+ native synchronized static final private void init_id_cache();
/**
* Initialize the GConf native peer. This is meant to be used by the
* class constructor.
*/
- native static final private void init_class();
+ native synchronized static final private void init_class();
/**
* Class finalizer.
*/
- native static final private void finalize_class();
+ native synchronized static final private void finalize_class();
/**
* Queries the GConf database to see if the given node exists, returning
@@ -235,23 +200,8 @@ public final class GConfNativePeer
* @param node the node to query for existence.
* @return true if the node exist, false otherwise.
*/
- native static final protected boolean gconf_client_dir_exists(String node);
-
- /**
- * Adds the given node to the list of nodes that GConf watches for
- * changes.
- *
- * @param node the node to watch for changes.
- */
- native static final protected void gconf_client_add_dir(String node);
-
- /**
- * Removes the given node from the list of nodes that GConf watches for
- * changes.
- *
- * @param node the node to remove from from the list of watched nodes.
- */
- native static final protected void gconf_client_remove_dir(String node);
+ native synchronized
+ static final protected boolean gconf_dir_exists(String node);
/**
* Sets the given key/value pair into the GConf database.
@@ -261,8 +211,8 @@ public final class GConfNativePeer
* @param value the value to associate to the given key.
* @return true if the change has effect, false otherwise.
*/
- native static final protected boolean gconf_client_set_string(String key,
- String value);
+ native synchronized
+ static final protected boolean gconf_set_string(String key, String value);
/**
* Returns the key associated to the given key. Null is returned if the
@@ -271,7 +221,8 @@ public final class GConfNativePeer
* @param key the key to return the value of.
* @return The value associated to the given key, or null.
*/
- native static final protected String gconf_client_get_string(String key);
+ native synchronized
+ static final protected String gconf_get_string(String key);
/**
* Usets the given key, removing the key from the database.
@@ -279,13 +230,13 @@ public final class GConfNativePeer
* @param key the key to remove.
* @return true if the operation success, false otherwise.
*/
- native static final protected boolean gconf_client_unset(String key);
+ native synchronized static final protected boolean gconf_unset(String key);
/**
* Suggest to the GConf native peer a sync with the database.
*
*/
- native static final protected void gconf_client_suggest_sync()
+ native synchronized static final protected void gconf_suggest_sync()
throws BackingStoreException;
/**
@@ -295,7 +246,7 @@ public final class GConfNativePeer
* @return A list of nodes under the given source node.
*/
native
- static final protected List<String> gconf_client_all_nodes(String node)
+ static synchronized final protected List<String> gconf_all_nodes(String node)
throws BackingStoreException;
/**
@@ -304,8 +255,8 @@ public final class GConfNativePeer
* @param node the source node.
* @return A list of all keys stored in the given node.
*/
- native
- static final protected List<String> gconf_client_all_keys(String node)
+ native synchronized
+ static final protected List<String> gconf_all_keys(String node)
throws BackingStoreException;
/**
@@ -314,7 +265,7 @@ public final class GConfNativePeer
* @param plain the String to escape.
* @return An escaped String for use with GConf.
*/
- native
+ native synchronized
static final protected String gconf_escape_key(String plain);
/**
@@ -324,7 +275,7 @@ public final class GConfNativePeer
* @param escaped key as returned by gconf_escape_key
* @return An unescaped key.
*/
- native
+ native synchronized
static final protected String gconf_unescape_key(String escaped);
static
diff --git a/libjava/classpath/gnu/java/util/regex/BacktrackStack.java b/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
index d711945..6847261 100644
--- a/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
+++ b/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
@@ -44,69 +44,81 @@ package gnu.java.util.regex;
*
* @author Ito Kazumitsu</A>
*/
-final class BacktrackStack {
+final class BacktrackStack
+{
/** A set of data to be used for backtracking. */
- static class Backtrack {
- /** REToken to which to go back */
- REToken token;
+ static class Backtrack
+ {
+ /** REToken to which to go back */
+ REToken token;
/** CharIndexed on which matches are being searched for. */
- CharIndexed input;
+ CharIndexed input;
/** REMatch to be used by the REToken token. */
- REMatch match;
+ REMatch match;
/** Some parameter used by the token's backtrack method. */
- Object param;
- Backtrack(REToken token, CharIndexed input, REMatch match, Object param) {
- this.token = token;
- this.input = input;
- // REMatch may change before backtracking is needed. So we
- // keep a clone of it.
- this.match = (REMatch) match.clone();
- this.param = param;
- }
- }
-
- Backtrack[] stack;
- private int size;
- private int capacity;
- private static final int INITIAL_CAPACITY = 32;
- private static final int CAPACITY_INCREMENT = 16;
-
- BacktrackStack() {
- stack = new Backtrack[INITIAL_CAPACITY];
- size = 0;
- capacity = INITIAL_CAPACITY;
- }
-
- boolean empty() {
- return size == 0;
- }
-
- Backtrack peek() {
- return stack[size - 1];
- }
-
- Backtrack pop() {
- Backtrack bt = stack[--size];
- stack[size] = null;
- return bt;
- }
-
- void clear() {
- for (int i = 0; i < size; i++) {
- stack[i] = null;
- }
- size = 0;
- }
-
- void push(Backtrack bt) {
- if (size >= capacity) {
- capacity += CAPACITY_INCREMENT;
- Backtrack[] newStack = new Backtrack[capacity];
- System.arraycopy(stack, 0, newStack, 0, size);
- stack = newStack;
- }
- stack[size++] = bt;
+ Object param;
+ Backtrack (REToken token, CharIndexed input, REMatch match,
+ Object param)
+ {
+ this.token = token;
+ this.input = input;
+ // REMatch may change before backtracking is needed. So we
+ // keep a clone of it.
+ this.match = (REMatch) match.clone ();
+ this.param = param;
}
+ }
+
+ Backtrack[] stack;
+ private int size;
+ private int capacity;
+ private static final int INITIAL_CAPACITY = 32;
+ private static final int CAPACITY_INCREMENT = 16;
+
+ BacktrackStack ()
+ {
+ stack = new Backtrack[INITIAL_CAPACITY];
+ size = 0;
+ capacity = INITIAL_CAPACITY;
+ }
+
+ boolean empty ()
+ {
+ return size == 0;
+ }
+
+ Backtrack peek ()
+ {
+ return stack[size - 1];
+ }
+
+ Backtrack pop ()
+ {
+ Backtrack bt = stack[--size];
+ stack[size] = null;
+ return bt;
+ }
+
+ void clear ()
+ {
+ for (int i = 0; i < size; i++)
+ {
+ stack[i] = null;
+ }
+ size = 0;
+ }
+
+ void push (Backtrack bt)
+ {
+ if (size >= capacity)
+ {
+ capacity += CAPACITY_INCREMENT;
+ Backtrack[]newStack = new Backtrack[capacity];
+ System.arraycopy (stack, 0, newStack, 0, size);
+ stack = newStack;
+ }
+ stack[size++] = bt;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexed.java b/libjava/classpath/gnu/java/util/regex/CharIndexed.java
index 27e07b2..070547d 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexed.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexed.java
@@ -48,13 +48,14 @@ package gnu.java.util.regex;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public interface CharIndexed {
+public interface CharIndexed
+{
/**
* Defines a constant (0xFFFF was somewhat arbitrarily chosen)
* that can be returned by the charAt() function indicating that
* the specified index is out of range.
*/
- char OUT_OF_BOUNDS = '\uFFFF';
+ char OUT_OF_BOUNDS = '\uFFFF';
/**
* Returns the character at the given offset past the current cursor
@@ -68,66 +69,66 @@ public interface CharIndexed {
* @return the character at the specified index, or the OUT_OF_BOUNDS
* character defined by this interface.
*/
- char charAt(int index);
+ char charAt (int index);
/**
* Shifts the input buffer by a given number of positions. Returns
* true if the new cursor position is valid.
*/
- boolean move(int index);
+ boolean move (int index);
/**
* Shifts the input buffer by a given number of positions. Returns
* true if the new cursor position is valid or cursor position is at
* the end of input.
*/
- boolean move1(int index); // I cannot think of a better name for this.
+ boolean move1 (int index); // I cannot think of a better name for this.
/**
* Returns true if the most recent move() operation placed the cursor
* position at a valid position in the input.
*/
- boolean isValid();
+ boolean isValid ();
/**
* Returns another CharIndexed containing length characters to the left
* of the given index. The given length is an expected maximum and
* the returned CharIndexed may not necessarily contain so many characters.
*/
- CharIndexed lookBehind(int index, int length);
+ CharIndexed lookBehind (int index, int length);
/**
* Returns the effective length of this CharIndexed
*/
- int length();
+ int length ();
/**
* Sets the REMatch last found on this input.
*/
- void setLastMatch(REMatch match);
+ void setLastMatch (REMatch match);
/**
* Returns the REMatch last found on this input.
*/
- REMatch getLastMatch();
+ REMatch getLastMatch ();
/**
* Sets the information used for hitEnd().
*/
- void setHitEnd(REMatch match);
+ void setHitEnd (REMatch match);
/**
* Returns whether the matcher has hit the end of input.
*/
- boolean hitEnd();
+ boolean hitEnd ();
/**
* Returns the anchor.
*/
- int getAnchor();
+ int getAnchor ();
/**
* Sets the anchor.
*/
- void setAnchor(int anchor);
+ void setAnchor (int anchor);
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java b/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
index 6f74c99..5657738 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
@@ -38,9 +38,11 @@ exception statement from your version. */
package gnu.java.util.regex;
import java.nio.CharBuffer;
-class CharIndexedCharArray extends CharIndexedCharSequence {
-
- CharIndexedCharArray(char[] str, int index) {
- super(CharBuffer.wrap(str), index);
- }
+class CharIndexedCharArray extends CharIndexedCharSequence
+{
+
+ CharIndexedCharArray (char[]str, int index)
+ {
+ super (CharBuffer.wrap (str), index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java b/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
index 8a0578e..bc3cbbd 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
@@ -38,58 +38,82 @@ exception statement from your version. */
package gnu.java.util.regex;
import java.io.Serializable;
-class CharIndexedCharSequence implements CharIndexed, Serializable {
- private CharSequence s;
- private int anchor;
- private int len;
-
- CharIndexedCharSequence(CharSequence s, int index) {
- this.s = s;
- len = s.length();
- anchor = index;
- }
-
- public char charAt(int index) {
- int pos = anchor + index;
- return ((pos < len) && (pos >= 0)) ? s.charAt(pos) : OUT_OF_BOUNDS;
- }
-
- public boolean isValid() {
- return (anchor < len);
- }
-
- public boolean move(int index) {
- return ((anchor += index) < len);
- }
-
- public boolean move1(int index) {
- return ((anchor += index) <= len);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- if (length > (anchor + index)) length = anchor + index;
- return new CharIndexedCharSequence(s, anchor + index - length);
- }
-
- public int length() {
- return len - anchor;
- }
-
- private REMatch lastMatch;
- public void setLastMatch(REMatch match) {
- lastMatch = (REMatch)match.clone();
- lastMatch.anchor = anchor;
- }
- public REMatch getLastMatch() { return lastMatch; }
-
- private int rightmostTriedPosition = 0;
- public void setHitEnd(REMatch match) {
- int pos = anchor + match.index;
- if (pos > rightmostTriedPosition) rightmostTriedPosition = pos;
- }
- public boolean hitEnd() { return rightmostTriedPosition >= len; }
-
- public int getAnchor() { return anchor; }
- public void setAnchor(int anchor) { this.anchor = anchor; }
+class CharIndexedCharSequence implements CharIndexed, Serializable
+{
+ private CharSequence s;
+ private int anchor;
+ private int len;
+
+ CharIndexedCharSequence (CharSequence s, int index)
+ {
+ this.s = s;
+ len = s.length ();
+ anchor = index;
+ }
+
+ public char charAt (int index)
+ {
+ int pos = anchor + index;
+ return ((pos < len) && (pos >= 0)) ? s.charAt (pos) : OUT_OF_BOUNDS;
+ }
+
+ public boolean isValid ()
+ {
+ return (anchor < len);
+ }
+
+ public boolean move (int index)
+ {
+ return ((anchor += index) < len);
+ }
+
+ public boolean move1 (int index)
+ {
+ return ((anchor += index) <= len);
+ }
+
+ public CharIndexed lookBehind (int index, int length)
+ {
+ if (length > (anchor + index))
+ length = anchor + index;
+ return new CharIndexedCharSequence (s, anchor + index - length);
+ }
+
+ public int length ()
+ {
+ return len - anchor;
+ }
+
+ private REMatch lastMatch;
+ public void setLastMatch (REMatch match)
+ {
+ lastMatch = (REMatch) match.clone ();
+ lastMatch.anchor = anchor;
+ }
+ public REMatch getLastMatch ()
+ {
+ return lastMatch;
+ }
+
+ private int rightmostTriedPosition = 0;
+ public void setHitEnd (REMatch match)
+ {
+ int pos = anchor + match.index;
+ if (pos > rightmostTriedPosition)
+ rightmostTriedPosition = pos;
+ }
+ public boolean hitEnd ()
+ {
+ return rightmostTriedPosition >= len;
+ }
+
+ public int getAnchor ()
+ {
+ return anchor;
+ }
+ public void setAnchor (int anchor)
+ {
+ this.anchor = anchor;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
index 844fada..e42710b 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
@@ -42,154 +42,212 @@ import java.io.InputStream;
// TODO: move(x) shouldn't rely on calling next() x times
-class CharIndexedInputStream implements CharIndexed {
- private static final int BUFFER_INCREMENT = 1024;
- private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
-
- private BufferedInputStream br;
-
- // so that we don't try to reset() right away
- private int index = -1;
-
- private int bufsize = BUFFER_INCREMENT;
-
- private int end = UNKNOWN;
-
- private char cached = OUT_OF_BOUNDS;
-
- // Big enough for a \r\n pair
- // lookBehind[0] = most recent
- // lookBehind[1] = second most recent
- private char[] lookBehind = new char[] { OUT_OF_BOUNDS, OUT_OF_BOUNDS };
-
- CharIndexedInputStream(InputStream str, int index) {
- if (str instanceof BufferedInputStream) br = (BufferedInputStream) str;
- else br = new BufferedInputStream(str,BUFFER_INCREMENT);
- next();
- if (index > 0) move(index);
- }
-
- private boolean next() {
- if (end == 1) return false;
- end--; // closer to end
-
- try {
- if (index != -1) {
- br.reset();
- }
- int i = br.read();
- br.mark(bufsize);
- if (i == -1) {
- end = 1;
- cached = OUT_OF_BOUNDS;
- return false;
- }
- cached = (char) i;
- index = 1;
- } catch (IOException e) {
- e.printStackTrace();
- cached = OUT_OF_BOUNDS;
- return false;
+class CharIndexedInputStream implements CharIndexed
+{
+ private static final int BUFFER_INCREMENT = 1024;
+ private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
+
+ private BufferedInputStream br;
+
+ // so that we don't try to reset() right away
+ private int index = -1;
+
+ private int bufsize = BUFFER_INCREMENT;
+
+ private int end = UNKNOWN;
+
+ private char cached = OUT_OF_BOUNDS;
+
+ // Big enough for a \r\n pair
+ // lookBehind[0] = most recent
+ // lookBehind[1] = second most recent
+ private char[] lookBehind = new char[]{ OUT_OF_BOUNDS, OUT_OF_BOUNDS };
+
+ CharIndexedInputStream (InputStream str, int index)
+ {
+ if (str instanceof BufferedInputStream)
+ br = (BufferedInputStream) str;
+ else
+ br = new BufferedInputStream (str, BUFFER_INCREMENT);
+ next ();
+ if (index > 0)
+ move (index);
+ }
+
+ private boolean next ()
+ {
+ if (end == 1)
+ return false;
+ end--; // closer to end
+
+ try
+ {
+ if (index != -1)
+ {
+ br.reset ();
}
- return true;
- }
-
- public char charAt(int index) {
- if (index == 0) {
- return cached;
- } else if (index >= end) {
- return OUT_OF_BOUNDS;
- } else if (index == -1) {
- return lookBehind[0];
- } else if (index == -2) {
- return lookBehind[1];
- } else if (index < -2) {
- return OUT_OF_BOUNDS;
- } else if (index >= bufsize) {
- // Allocate more space in the buffer.
- try {
- while (bufsize <= index) bufsize += BUFFER_INCREMENT;
- br.reset();
- br.mark(bufsize);
- br.skip(index-1);
- } catch (IOException e) { }
- } else if (this.index != index) {
- try {
- br.reset();
- br.skip(index-1);
- } catch (IOException e) { }
+ int i = br.read ();
+ br.mark (bufsize);
+ if (i == -1)
+ {
+ end = 1;
+ cached = OUT_OF_BOUNDS;
+ return false;
}
- char ch = OUT_OF_BOUNDS;
-
- try {
- int i = br.read();
- this.index = index+1; // this.index is index of next pos relative to charAt(0)
- if (i == -1) {
- // set flag that next should fail next time?
- end = index;
- return ch;
- }
- ch = (char) i;
- } catch (IOException ie) { }
-
- return ch;
- }
-
- public boolean move(int index) {
- // move read position [index] clicks from 'charAt(0)'
- boolean retval = true;
- while (retval && (index-- > 0)) retval = next();
- return retval;
- }
-
- public boolean isValid() {
- return (cached != OUT_OF_BOUNDS);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- throw new UnsupportedOperationException(
- "difficult to look behind for an input stream");
- }
-
- public int length() {
- throw new UnsupportedOperationException(
- "difficult to tell the length for an input stream");
- }
-
- public void setLastMatch(REMatch match) {
- throw new UnsupportedOperationException(
- "difficult to support setLastMatch for an input stream");
- }
-
- public REMatch getLastMatch() {
- throw new UnsupportedOperationException(
- "difficult to support getLastMatch for an input stream");
- }
-
- public void setHitEnd(REMatch match) {
- throw new UnsupportedOperationException(
- "difficult to support setHitEnd for an input stream");
- }
-
- public boolean hitEnd() {
- throw new UnsupportedOperationException(
- "difficult to support hitEnd for an input stream");
+ cached = (char) i;
+ index = 1;
+ } catch (IOException e)
+ {
+ e.printStackTrace ();
+ cached = OUT_OF_BOUNDS;
+ return false;
}
-
- public int getAnchor() {
- throw new UnsupportedOperationException(
- "difficult to support getAnchor for an input stream");
- }
-
- public void setAnchor(int anchor) {
- throw new UnsupportedOperationException(
- "difficult to support setAnchor for an input stream");
+ return true;
+ }
+
+ public char charAt (int index)
+ {
+ if (index == 0)
+ {
+ return cached;
+ }
+ else if (index >= end)
+ {
+ return OUT_OF_BOUNDS;
+ }
+ else if (index == -1)
+ {
+ return lookBehind[0];
+ }
+ else if (index == -2)
+ {
+ return lookBehind[1];
+ }
+ else if (index < -2)
+ {
+ return OUT_OF_BOUNDS;
+ }
+ else if (index >= bufsize)
+ {
+ // Allocate more space in the buffer.
+ try
+ {
+ while (bufsize <= index)
+ bufsize += BUFFER_INCREMENT;
+ br.reset ();
+ br.mark (bufsize);
+ br.skip (index - 1);
+ }
+ catch (IOException e)
+ {
+ }
+ }
+ else if (this.index != index)
+ {
+ try
+ {
+ br.reset ();
+ br.skip (index - 1);
+ }
+ catch (IOException e)
+ {
+ }
+ }
+ char ch = OUT_OF_BOUNDS;
+
+ try
+ {
+ int i = br.read ();
+ this.index = index + 1; // this.index is index of next pos relative to charAt(0)
+ if (i == -1)
+ {
+ // set flag that next should fail next time?
+ end = index;
+ return ch;
+ }
+ ch = (char) i;
+ } catch (IOException ie)
+ {
}
- public boolean move1(int index) {
- throw new UnsupportedOperationException(
- "difficult to support move1 for an input stream");
- }
+ return ch;
+ }
+
+ public boolean move (int index)
+ {
+ // move read position [index] clicks from 'charAt(0)'
+ boolean retval = true;
+ while (retval && (index-- > 0))
+ retval = next ();
+ return retval;
+ }
+
+ public boolean isValid ()
+ {
+ return (cached != OUT_OF_BOUNDS);
+ }
+
+ public CharIndexed lookBehind (int index, int length)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to look behind for an input stream");
+ }
+
+ public int length ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to tell the length for an input stream");
+ }
+
+ public void setLastMatch (REMatch match)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setLastMatch for an input stream");
+ }
+
+ public REMatch getLastMatch ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support getLastMatch for an input stream");
+ }
+
+ public void setHitEnd (REMatch match)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setHitEnd for an input stream");
+ }
+
+ public boolean hitEnd ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support hitEnd for an input stream");
+ }
+
+ public int getAnchor ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support getAnchor for an input stream");
+ }
+
+ public void setAnchor (int anchor)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setAnchor for an input stream");
+ }
+
+ public boolean move1 (int index)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support move1 for an input stream");
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedString.java b/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
index fab6d78..7a56f48 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
@@ -37,8 +37,10 @@ exception statement from your version. */
package gnu.java.util.regex;
-class CharIndexedString extends CharIndexedCharSequence {
- CharIndexedString(String str, int index) {
- super(str, index);
- }
+class CharIndexedString extends CharIndexedCharSequence
+{
+ CharIndexedString (String str, int index)
+ {
+ super (str, index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java b/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
index 10005b6..d6484f8 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
@@ -37,9 +37,11 @@ exception statement from your version. */
package gnu.java.util.regex;
-class CharIndexedStringBuffer extends CharIndexedCharSequence {
+class CharIndexedStringBuffer extends CharIndexedCharSequence
+{
- CharIndexedStringBuffer(StringBuffer str, int index) {
- super(str, index);
- }
+ CharIndexedStringBuffer (StringBuffer str, int index)
+ {
+ super (str, index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RE.java b/libjava/classpath/gnu/java/util/regex/RE.java
index 421640f..d064f7a 100644
--- a/libjava/classpath/gnu/java/util/regex/RE.java
+++ b/libjava/classpath/gnu/java/util/regex/RE.java
@@ -36,12 +36,17 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.InputStream;
import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
-import java.util.Vector;
/**
* RE provides the user interface for compiling and matching regular
@@ -114,13 +119,16 @@ import java.util.Vector;
* @version 1.1.5-dev, to be released
*/
-public class RE extends REToken {
+public class RE extends REToken
+{
- private static final class IntPair implements Serializable {
+ private static final class IntPair implements Serializable
+ {
public int first, second;
}
- private static final class CharUnit implements Serializable {
+ private static final class CharUnit implements Serializable
+ {
public char ch;
public boolean bk;
}
@@ -144,8 +152,8 @@ public class RE extends REToken {
private int numSubs;
/** Minimum length, in characters, of any possible match. */
- private int minimumLength;
- private int maximumLength;
+ private int minimumLength;
+ private int maximumLength;
/**
* Compilation flag. Do not differentiate case. Subsequent
@@ -263,15 +271,18 @@ public class RE extends REToken {
public static final int REG_FIX_STARTING_POSITION = 0x1000;
/** Returns a string representing the version of the gnu.regexp package. */
- public static final String version() {
+ public static final String version ()
+ {
return VERSION;
}
// Retrieves a message from the ResourceBundle
- static final String getLocalizedMessage(String key) {
+ static final String getLocalizedMessage (String key)
+ {
if (messages == null)
- messages = PropertyResourceBundle.getBundle(bundle, Locale.getDefault());
- return messages.getString(key);
+ messages =
+ PropertyResourceBundle.getBundle (bundle, Locale.getDefault ());
+ return messages.getString (key);
}
/**
@@ -284,8 +295,9 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern) throws REException {
- this(pattern,0,RESyntax.RE_SYNTAX_PERL5,0,0);
+ public RE (Object pattern) throws REException
+ {
+ this (pattern, 0, RESyntax.RE_SYNTAX_PERL5, 0, 0);
}
/**
@@ -299,8 +311,9 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern, int cflags) throws REException {
- this(pattern,cflags,RESyntax.RE_SYNTAX_PERL5,0,0);
+ public RE (Object pattern, int cflags) throws REException
+ {
+ this (pattern, cflags, RESyntax.RE_SYNTAX_PERL5, 0, 0);
}
/**
@@ -315,47 +328,75 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern, int cflags, RESyntax syntax) throws REException {
- this(pattern,cflags,syntax,0,0);
+ public RE (Object pattern, int cflags, RESyntax syntax) throws REException
+ {
+ this (pattern, cflags, syntax, 0, 0);
}
// internal constructor used for alternation
- private RE(REToken first, REToken last,int subs, int subIndex, int minLength, int maxLength) {
- super(subIndex);
+ private RE (REToken first, REToken last, int subs, int subIndex,
+ int minLength, int maxLength)
+ {
+ super (subIndex);
firstToken = first;
lastToken = last;
numSubs = subs;
minimumLength = minLength;
maximumLength = maxLength;
- addToken(new RETokenEndSub(subIndex));
+ addToken (new RETokenEndSub (subIndex));
}
- private RE(Object patternObj, int cflags, RESyntax syntax, int myIndex, int nextSub) throws REException {
- super(myIndex); // Subexpression index of this token.
- initialize(patternObj, cflags, syntax, myIndex, nextSub);
+ private RE (Object patternObj, int cflags, RESyntax syntax, int myIndex,
+ int nextSub) throws REException
+ {
+ super (myIndex); // Subexpression index of this token.
+ initialize (patternObj, cflags, syntax, myIndex, nextSub);
}
- // For use by subclasses
- protected RE() { super(0); }
-
- // The meat of construction
- protected void initialize(Object patternObj, int cflags, RESyntax syntax, int myIndex, int nextSub) throws REException {
- char[] pattern;
- if (patternObj instanceof String) {
- pattern = ((String) patternObj).toCharArray();
- } else if (patternObj instanceof char[]) {
- pattern = (char[]) patternObj;
- } else if (patternObj instanceof StringBuffer) {
- pattern = new char [((StringBuffer) patternObj).length()];
- ((StringBuffer) patternObj).getChars(0,pattern.length,pattern,0);
- } else {
- pattern = patternObj.toString().toCharArray();
- }
+ // For use by subclasses
+ protected RE ()
+ {
+ super (0);
+ }
+
+ // The meat of construction
+ protected void initialize (Object patternObj, int cflags, RESyntax syntax,
+ int myIndex, int nextSub) throws REException
+ {
+ char[] pattern;
+ if (patternObj instanceof String)
+ {
+ pattern = ((String) patternObj).toCharArray ();
+ }
+ else if (patternObj instanceof char[])
+ {
+ pattern = (char[]) patternObj;
+ }
+ else if (patternObj instanceof StringBuffer)
+ {
+ pattern = new char[((StringBuffer) patternObj).length ()];
+ ((StringBuffer) patternObj).getChars (0, pattern.length, pattern, 0);
+ }
+ else if (patternObj instanceof StringBuilder)
+ {
+ pattern = new char[((StringBuilder) patternObj).length ()];
+ ((StringBuilder) patternObj).getChars (0, pattern.length, pattern, 0);
+ }
+ else if (patternObj instanceof CPStringBuilder)
+ {
+ pattern = new char[((CPStringBuilder) patternObj).length ()];
+ ((CPStringBuilder) patternObj).getChars (0, pattern.length, pattern,
+ 0);
+ }
+ else
+ {
+ pattern = patternObj.toString ().toCharArray ();
+ }
int pLength = pattern.length;
- numSubs = 0; // Number of subexpressions in this token.
- Vector branches = null;
+ numSubs = 0; // Number of subexpressions in this token.
+ ArrayList < REToken > branches = null;
// linked list of tokens (sort of -- some closed loops can exist)
firstToken = lastToken = null;
@@ -372,14 +413,13 @@ public class RE extends REToken {
int index = 0;
// this will be the current parse character (pattern[index])
- CharUnit unit = new CharUnit();
+ CharUnit unit = new CharUnit ();
// This is used for {x,y} calculations
- IntPair minMax = new IntPair();
+ IntPair minMax = new IntPair ();
// Buffer a token so we can create a TokenRepeated, etc.
REToken currentToken = null;
- char ch;
boolean quot = false;
// Saved syntax and flags.
@@ -387,652 +427,862 @@ public class RE extends REToken {
int savedCflags = 0;
boolean flagsSaved = false;
- while (index < pLength) {
- // read the next character unit (including backslash escapes)
- index = getCharUnit(pattern,index,unit,quot);
-
- if (unit.bk)
- if (unit.ch == 'Q') {
- quot = true;
- continue;
- } else if (unit.ch == 'E') {
- quot = false;
- continue;
- }
- if (quot)
- unit.bk = false;
-
- if (((cflags & REG_X_COMMENTS) > 0) && (!unit.bk) && (!quot)) {
- if (Character.isWhitespace(unit.ch)) {
- continue;
- }
- if (unit.ch == '#') {
- for (int i = index; i < pLength; i++) {
- if (pattern[i] == '\n') {
- index = i + 1;
+ while (index < pLength)
+ {
+ // read the next character unit (including backslash escapes)
+ index = getCharUnit (pattern, index, unit, quot);
+
+ if (unit.bk)
+ if (unit.ch == 'Q')
+ {
+ quot = true;
continue;
}
- else if (pattern[i] == '\r') {
- if (i + 1 < pLength && pattern[i + 1] == '\n') {
- index = i + 2;
- }
- else {
- index = i + 1;
- }
+ else if (unit.ch == 'E')
+ {
+ quot = false;
continue;
}
+ if (quot)
+ unit.bk = false;
+
+ if (((cflags & REG_X_COMMENTS) > 0) && (!unit.bk) && (!quot))
+ {
+ if (Character.isWhitespace (unit.ch))
+ {
+ continue;
+ }
+ if (unit.ch == '#')
+ {
+ for (int i = index; i < pLength; i++)
+ {
+ if (pattern[i] == '\n')
+ {
+ index = i + 1;
+ continue;
+ }
+ else if (pattern[i] == '\r')
+ {
+ if (i + 1 < pLength && pattern[i + 1] == '\n')
+ {
+ index = i + 2;
+ }
+ else
+ {
+ index = i + 1;
+ }
+ continue;
+ }
+ }
+ index = pLength;
+ continue;
+ }
}
- index = pLength;
- continue;
- }
- }
- // ALTERNATION OPERATOR
- // \| or | (if RE_NO_BK_VBAR) or newline (if RE_NEWLINE_ALT)
- // not available if RE_LIMITED_OPS is set
-
- // TODO: the '\n' literal here should be a test against REToken.newline,
- // which unfortunately may be more than a single character.
- if ( ( (unit.ch == '|' && (syntax.get(RESyntax.RE_NO_BK_VBAR) ^ (unit.bk || quot)))
- || (syntax.get(RESyntax.RE_NEWLINE_ALT) && (unit.ch == '\n') && !(unit.bk || quot)) )
- && !syntax.get(RESyntax.RE_LIMITED_OPS)) {
- // make everything up to here be a branch. create vector if nec.
- addToken(currentToken);
- RE theBranch = new RE(firstToken, lastToken, numSubs, subIndex, minimumLength, maximumLength);
- minimumLength = 0;
- maximumLength = 0;
- if (branches == null) {
- branches = new Vector();
- }
- branches.addElement(theBranch);
- firstToken = lastToken = currentToken = null;
- }
-
- // INTERVAL OPERATOR:
- // {x} | {x,} | {x,y} (RE_INTERVALS && RE_NO_BK_BRACES)
- // \{x\} | \{x,\} | \{x,y\} (RE_INTERVALS && !RE_NO_BK_BRACES)
- //
- // OPEN QUESTION:
- // what is proper interpretation of '{' at start of string?
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*){2,}", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '{') && syntax.get(RESyntax.RE_INTERVALS) && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ (unit.bk || quot))) {
- int newIndex = getMinMax(pattern,index,minMax,syntax);
- if (newIndex > index) {
- if (minMax.first > minMax.second)
- throw new REException(getLocalizedMessage("interval.order"),REException.REG_BADRPT,newIndex);
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,newIndex);
- if (currentToken instanceof RETokenRepeated)
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,newIndex);
- if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,newIndex);
- index = newIndex;
- currentToken = setRepeated(currentToken,minMax.first,minMax.second,index);
- }
- else {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,unit.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
- }
-
- // LIST OPERATOR:
- // [...] | [^...]
-
- else if ((unit.ch == '[') && !(unit.bk || quot)) {
- // Create a new RETokenOneOf
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index, pLength, cflags, syntax, 0);
- addToken(currentToken);
- currentToken = result.token;
- index = result.index;
- }
+ // ALTERNATION OPERATOR
+ // \| or | (if RE_NO_BK_VBAR) or newline (if RE_NEWLINE_ALT)
+ // not available if RE_LIMITED_OPS is set
+
+ // TODO: the '\n' literal here should be a test against REToken.newline,
+ // which unfortunately may be more than a single character.
+ if (((unit.ch == '|'
+ && (syntax.get (RESyntax.RE_NO_BK_VBAR) ^ (unit.bk || quot)))
+ || (syntax.get (RESyntax.RE_NEWLINE_ALT) && (unit.ch == '\n')
+ && !(unit.bk || quot)))
+ && !syntax.get (RESyntax.RE_LIMITED_OPS))
+ {
+ // make everything up to here be a branch. create vector if nec.
+ addToken (currentToken);
+ RE theBranch =
+ new RE (firstToken, lastToken, numSubs, subIndex, minimumLength,
+ maximumLength);
+ minimumLength = 0;
+ maximumLength = 0;
+ if (branches == null)
+ {
+ branches = new ArrayList < REToken > ();
+ }
+ branches.add (theBranch);
+ firstToken = lastToken = currentToken = null;
+ }
- // SUBEXPRESSIONS
- // (...) | \(...\) depending on RE_NO_BK_PARENS
-
- else if ((unit.ch == '(') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))) {
- boolean pure = false;
- boolean comment = false;
- boolean lookAhead = false;
- boolean lookBehind = false;
- boolean independent = false;
- boolean negativelh = false;
- boolean negativelb = false;
- if ((index+1 < pLength) && (pattern[index] == '?')) {
- switch (pattern[index+1]) {
- case '!':
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- negativelh = true;
- lookAhead = true;
- index += 2;
- }
- break;
- case '=':
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- lookAhead = true;
- index += 2;
- }
- break;
- case '<':
- // We assume that if the syntax supports look-ahead,
- // it also supports look-behind.
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- index++;
- switch (pattern[index +1]) {
- case '!':
- pure = true;
- negativelb = true;
- lookBehind = true;
- index += 2;
- break;
- case '=':
- pure = true;
- lookBehind = true;
- index += 2;
- }
- }
- break;
- case '>':
- // We assume that if the syntax supports look-ahead,
- // it also supports independent group.
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- independent = true;
- index += 2;
- }
- break;
- case 'i':
- case 'd':
- case 'm':
- case 's':
- case 'u':
- case 'x':
- case '-':
- if (!syntax.get(RESyntax.RE_EMBEDDED_FLAGS)) break;
- // Set or reset syntax flags.
- int flagIndex = index + 1;
- int endFlag = -1;
- RESyntax newSyntax = new RESyntax(syntax);
- int newCflags = cflags;
- boolean negate = false;
- while (flagIndex < pLength && endFlag < 0) {
- switch(pattern[flagIndex]) {
- case 'i':
- if (negate)
- newCflags &= ~REG_ICASE;
- else
- newCflags |= REG_ICASE;
- flagIndex++;
- break;
- case 'd':
- if (negate)
- newSyntax.setLineSeparator(RESyntax.DEFAULT_LINE_SEPARATOR);
- else
- newSyntax.setLineSeparator("\n");
- flagIndex++;
- break;
- case 'm':
- if (negate)
- newCflags &= ~REG_MULTILINE;
- else
- newCflags |= REG_MULTILINE;
- flagIndex++;
- break;
- case 's':
- if (negate)
- newCflags &= ~REG_DOT_NEWLINE;
- else
- newCflags |= REG_DOT_NEWLINE;
- flagIndex++;
- break;
- case 'u':
- if (negate)
- newCflags |= REG_ICASE_USASCII;
- else
- newCflags &= ~REG_ICASE_USASCII;
- flagIndex++;
- break;
- case 'x':
- if (negate)
- newCflags &= ~REG_X_COMMENTS;
- else
- newCflags |= REG_X_COMMENTS;
- flagIndex++;
- break;
- case '-':
- negate = true;
- flagIndex++;
- break;
- case ':':
- case ')':
- endFlag = pattern[flagIndex];
- break;
- default:
- throw new REException(getLocalizedMessage("repeat.no.token"), REException.REG_BADRPT, index);
+ // INTERVAL OPERATOR:
+ // {x} | {x,} | {x,y} (RE_INTERVALS && RE_NO_BK_BRACES)
+ // \{x\} | \{x,\} | \{x,y\} (RE_INTERVALS && !RE_NO_BK_BRACES)
+ //
+ // OPEN QUESTION:
+ // what is proper interpretation of '{' at start of string?
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*){2,}", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '{') && syntax.get (RESyntax.RE_INTERVALS)
+ && (syntax.
+ get (RESyntax.RE_NO_BK_BRACES) ^ (unit.bk || quot)))
+ {
+ int newIndex = getMinMax (pattern, index, minMax, syntax);
+ if (newIndex > index)
+ {
+ if (minMax.first > minMax.second)
+ throw new
+ REException (getLocalizedMessage ("interval.order"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken == null)
+ throw new
+ REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken instanceof RETokenRepeated)
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new
+ REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, newIndex);
+ index = newIndex;
+ currentToken =
+ setRepeated (currentToken, minMax.first, minMax.second,
+ index);
+ }
+ else
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, unit.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
+ }
+
+ // LIST OPERATOR:
+ // [...] | [^...]
+
+ else if ((unit.ch == '[') && !(unit.bk || quot))
+ {
+ // Create a new RETokenOneOf
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index, pLength, cflags,
+ syntax, 0);
+ addToken (currentToken);
+ currentToken = result.token;
+ index = result.index;
+ }
+
+ // SUBEXPRESSIONS
+ // (...) | \(...\) depending on RE_NO_BK_PARENS
+
+ else if ((unit.ch == '(')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
+ {
+ boolean pure = false;
+ boolean comment = false;
+ boolean lookAhead = false;
+ boolean lookBehind = false;
+ boolean independent = false;
+ boolean negativelh = false;
+ boolean negativelb = false;
+ if ((index + 1 < pLength) && (pattern[index] == '?'))
+ {
+ switch (pattern[index + 1])
+ {
+ case '!':
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ negativelh = true;
+ lookAhead = true;
+ index += 2;
+ }
+ break;
+ case '=':
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ lookAhead = true;
+ index += 2;
+ }
+ break;
+ case '<':
+ // We assume that if the syntax supports look-ahead,
+ // it also supports look-behind.
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ index++;
+ switch (pattern[index + 1])
+ {
+ case '!':
+ pure = true;
+ negativelb = true;
+ lookBehind = true;
+ index += 2;
+ break;
+ case '=':
+ pure = true;
+ lookBehind = true;
+ index += 2;
+ }
+ }
+ break;
+ case '>':
+ // We assume that if the syntax supports look-ahead,
+ // it also supports independent group.
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ independent = true;
+ index += 2;
+ }
+ break;
+ case 'i':
+ case 'd':
+ case 'm':
+ case 's':
+ case 'u':
+ case 'x':
+ case '-':
+ if (!syntax.get (RESyntax.RE_EMBEDDED_FLAGS))
+ break;
+ // Set or reset syntax flags.
+ int flagIndex = index + 1;
+ int endFlag = -1;
+ RESyntax newSyntax = new RESyntax (syntax);
+ int newCflags = cflags;
+ boolean negate = false;
+ while (flagIndex < pLength && endFlag < 0)
+ {
+ switch (pattern[flagIndex])
+ {
+ case 'i':
+ if (negate)
+ newCflags &= ~REG_ICASE;
+ else
+ newCflags |= REG_ICASE;
+ flagIndex++;
+ break;
+ case 'd':
+ if (negate)
+ newSyntax.setLineSeparator (RESyntax.
+ DEFAULT_LINE_SEPARATOR);
+ else
+ newSyntax.setLineSeparator ("\n");
+ flagIndex++;
+ break;
+ case 'm':
+ if (negate)
+ newCflags &= ~REG_MULTILINE;
+ else
+ newCflags |= REG_MULTILINE;
+ flagIndex++;
+ break;
+ case 's':
+ if (negate)
+ newCflags &= ~REG_DOT_NEWLINE;
+ else
+ newCflags |= REG_DOT_NEWLINE;
+ flagIndex++;
+ break;
+ case 'u':
+ if (negate)
+ newCflags |= REG_ICASE_USASCII;
+ else
+ newCflags &= ~REG_ICASE_USASCII;
+ flagIndex++;
+ break;
+ case 'x':
+ if (negate)
+ newCflags &= ~REG_X_COMMENTS;
+ else
+ newCflags |= REG_X_COMMENTS;
+ flagIndex++;
+ break;
+ case '-':
+ negate = true;
+ flagIndex++;
+ break;
+ case ':':
+ case ')':
+ endFlag = pattern[flagIndex];
+ break;
+ default:
+ throw new
+ REException (getLocalizedMessage
+ ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ }
+ }
+ if (endFlag == ')')
+ {
+ syntax = newSyntax;
+ cflags = newCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ // This can be treated as though it were a comment.
+ comment = true;
+ index = flagIndex - 1;
+ break;
+ }
+ if (endFlag == ':')
+ {
+ savedSyntax = syntax;
+ savedCflags = cflags;
+ flagsSaved = true;
+ syntax = newSyntax;
+ cflags = newCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ index = flagIndex - 1;
+ // Fall through to the next case.
+ }
+ else
+ {
+ throw new
+ REException (getLocalizedMessage
+ ("unmatched.paren"),
+ REException.REG_ESUBREG, index);
+ }
+ case ':':
+ if (syntax.get (RESyntax.RE_PURE_GROUPING))
+ {
+ pure = true;
+ index += 2;
+ }
+ break;
+ case '#':
+ if (syntax.get (RESyntax.RE_COMMENTS))
+ {
+ comment = true;
+ }
+ break;
+ default:
+ throw new
+ REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ }
+ }
+
+ if (index >= pLength)
+ {
+ throw new
+ REException (getLocalizedMessage ("unmatched.paren"),
+ REException.REG_ESUBREG, index);
+ }
+
+ // find end of subexpression
+ int endIndex = index;
+ int nextIndex = index;
+ int nested = 0;
+
+ while (((nextIndex =
+ getCharUnit (pattern, endIndex, unit, false)) > 0)
+ && !(nested == 0 && (unit.ch == ')')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot))))
+ {
+ if ((endIndex = nextIndex) >= pLength)
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
+ else
+ if ((unit.ch == '[') && !(unit.bk || quot))
+ {
+ // I hate to do something similar to the LIST OPERATOR matters
+ // above, but ...
+ int listIndex = nextIndex;
+ if (listIndex < pLength && pattern[listIndex] == '^')
+ listIndex++;
+ if (listIndex < pLength && pattern[listIndex] == ']')
+ listIndex++;
+ int listEndIndex = -1;
+ int listNest = 0;
+ while (listIndex < pLength && listEndIndex < 0)
+ {
+ switch (pattern[listIndex++])
+ {
+ case '\\':
+ listIndex++;
+ break;
+ case '[':
+ // Sun's API document says that regexp like "[a-d[m-p]]"
+ // is legal. Even something like "[[[^]]]]" is accepted.
+ listNest++;
+ if (listIndex < pLength
+ && pattern[listIndex] == '^')
+ listIndex++;
+ if (listIndex < pLength
+ && pattern[listIndex] == ']')
+ listIndex++;
+ break;
+ case ']':
+ if (listNest == 0)
+ listEndIndex = listIndex;
+ listNest--;
+ break;
+ }
+ }
+ if (listEndIndex >= 0)
+ {
+ nextIndex = listEndIndex;
+ if ((endIndex = nextIndex) >= pLength)
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
+ else
+ continue;
+ }
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
}
- }
- if (endFlag == ')') {
- syntax = newSyntax;
- cflags = newCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- // This can be treated as though it were a comment.
- comment = true;
- index = flagIndex - 1;
- break;
- }
- if (endFlag == ':') {
- savedSyntax = syntax;
- savedCflags = cflags;
- flagsSaved = true;
- syntax = newSyntax;
- cflags = newCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- index = flagIndex -1;
- // Fall through to the next case.
- }
- else {
- throw new REException(getLocalizedMessage("unmatched.paren"), REException.REG_ESUBREG,index);
- }
- case ':':
- if (syntax.get(RESyntax.RE_PURE_GROUPING)) {
- pure = true;
- index += 2;
- }
- break;
- case '#':
- if (syntax.get(RESyntax.RE_COMMENTS)) {
- comment = true;
- }
- break;
- default:
- throw new REException(getLocalizedMessage("repeat.no.token"), REException.REG_BADRPT, index);
+ else if (unit.ch == '('
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot)))
+ nested++;
+ else if (unit.ch == ')'
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot)))
+ nested--;
+ }
+
+ // endIndex is now position at a ')','\)'
+ // nextIndex is end of string or position after ')' or '\)'
+
+ if (comment)
+ index = nextIndex;
+ else
+ { // not a comment
+ // create RE subexpression as token.
+ addToken (currentToken);
+ if (!pure)
+ {
+ numSubs++;
+ }
+
+ int useIndex = (pure || lookAhead || lookBehind
+ || independent) ? 0 : nextSub + numSubs;
+ currentToken =
+ new RE (String.valueOf (pattern, index, endIndex - index).
+ toCharArray (), cflags, syntax, useIndex,
+ nextSub + numSubs);
+ numSubs += ((RE) currentToken).getNumSubs ();
+
+ if (lookAhead)
+ {
+ currentToken =
+ new RETokenLookAhead (currentToken, negativelh);
+ }
+ else if (lookBehind)
+ {
+ currentToken =
+ new RETokenLookBehind (currentToken, negativelb);
+ }
+ else if (independent)
+ {
+ currentToken = new RETokenIndependent (currentToken);
+ }
+
+ index = nextIndex;
+ if (flagsSaved)
+ {
+ syntax = savedSyntax;
+ cflags = savedCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ flagsSaved = false;
+ }
+ } // not a comment
+ } // subexpression
+
+ // UNMATCHED RIGHT PAREN
+ // ) or \) throw exception if
+ // !syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
+ else if (!syntax.get (RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
+ && ((unit.ch == ')')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))))
+ {
+ throw new REException (getLocalizedMessage ("unmatched.paren"),
+ REException.REG_EPAREN, index);
}
- }
-
- if (index >= pLength) {
- throw new REException(getLocalizedMessage("unmatched.paren"), REException.REG_ESUBREG,index);
- }
-
- // find end of subexpression
- int endIndex = index;
- int nextIndex = index;
- int nested = 0;
-
- while ( ((nextIndex = getCharUnit(pattern,endIndex,unit,false)) > 0)
- && !(nested == 0 && (unit.ch == ')') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))) ) {
- if ((endIndex = nextIndex) >= pLength)
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
- else if ((unit.ch == '[') && !(unit.bk || quot)) {
- // I hate to do something similar to the LIST OPERATOR matters
- // above, but ...
- int listIndex = nextIndex;
- if (listIndex < pLength && pattern[listIndex] == '^') listIndex++;
- if (listIndex < pLength && pattern[listIndex] == ']') listIndex++;
- int listEndIndex = -1;
- int listNest = 0;
- while (listIndex < pLength && listEndIndex < 0) {
- switch(pattern[listIndex++]) {
- case '\\':
- listIndex++;
- break;
- case '[':
- // Sun's API document says that regexp like "[a-d[m-p]]"
- // is legal. Even something like "[[[^]]]]" is accepted.
- listNest++;
- if (listIndex < pLength && pattern[listIndex] == '^') listIndex++;
- if (listIndex < pLength && pattern[listIndex] == ']') listIndex++;
- break;
- case ']':
- if (listNest == 0)
- listEndIndex = listIndex;
- listNest--;
- break;
+
+ // START OF LINE OPERATOR
+ // ^
+
+ else if ((unit.ch == '^') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken = null;
+ RETokenStart token = null;
+ if ((cflags & REG_MULTILINE) > 0)
+ {
+ String sep = syntax.getLineSeparator ();
+ if (sep == null)
+ {
+ token = new RETokenStart (subIndex, null, true);
+ }
+ else
+ {
+ token = new RETokenStart (subIndex, sep);
+ }
}
- }
- if (listEndIndex >= 0) {
- nextIndex = listEndIndex;
- if ((endIndex = nextIndex) >= pLength)
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
- else
- continue;
- }
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
+ else
+ {
+ token = new RETokenStart (subIndex, null);
+ }
+ addToken (token);
}
- else if (unit.ch == '(' && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
- nested++;
- else if (unit.ch == ')' && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
- nested--;
- }
-
- // endIndex is now position at a ')','\)'
- // nextIndex is end of string or position after ')' or '\)'
-
- if (comment) index = nextIndex;
- else { // not a comment
- // create RE subexpression as token.
- addToken(currentToken);
- if (!pure) {
- numSubs++;
+
+ // END OF LINE OPERATOR
+ // $
+
+ else if ((unit.ch == '$') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken = null;
+ RETokenEnd token = null;
+ if ((cflags & REG_MULTILINE) > 0)
+ {
+ String sep = syntax.getLineSeparator ();
+ if (sep == null)
+ {
+ token = new RETokenEnd (subIndex, null, true);
+ }
+ else
+ {
+ token = new RETokenEnd (subIndex, sep);
+ }
+ }
+ else
+ {
+ token = new RETokenEnd (subIndex, null);
+ }
+ addToken (token);
}
- int useIndex = (pure || lookAhead || lookBehind || independent) ?
- 0 : nextSub + numSubs;
- currentToken = new RE(String.valueOf(pattern,index,endIndex-index).toCharArray(),cflags,syntax,useIndex,nextSub + numSubs);
- numSubs += ((RE) currentToken).getNumSubs();
+ // MATCH-ANY-CHARACTER OPERATOR (except possibly newline and null)
+ // .
- if (lookAhead) {
- currentToken = new RETokenLookAhead(currentToken,negativelh);
+ else if ((unit.ch == '.') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenAny (subIndex, syntax.get (RESyntax.RE_DOT_NEWLINE)
+ || ((cflags & REG_DOT_NEWLINE) > 0),
+ syntax.get (RESyntax.RE_DOT_NOT_NULL));
}
- else if (lookBehind) {
- currentToken = new RETokenLookBehind(currentToken,negativelb);
- }
- else if (independent) {
- currentToken = new RETokenIndependent(currentToken);
+
+ // ZERO-OR-MORE REPEAT OPERATOR
+ // *
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*)*", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '*') && !(unit.bk || quot))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ if (currentToken instanceof RETokenRepeated)
+ throw new REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+ if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ currentToken =
+ setRepeated (currentToken, 0, Integer.MAX_VALUE, index);
}
- index = nextIndex;
- if (flagsSaved) {
- syntax = savedSyntax;
- cflags = savedCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- flagsSaved = false;
+ // ONE-OR-MORE REPEAT OPERATOR / POSSESSIVE MATCHING OPERATOR
+ // + | \+ depending on RE_BK_PLUS_QM
+ // not available if RE_LIMITED_OPS is set
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*)+", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '+') && !syntax.get (RESyntax.RE_LIMITED_OPS)
+ && (!syntax.
+ get (RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot)))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+
+ // Check for possessive matching on RETokenRepeated
+ if (currentToken instanceof RETokenRepeated)
+ {
+ RETokenRepeated tokenRep = (RETokenRepeated) currentToken;
+ if (syntax.get (RESyntax.RE_POSSESSIVE_OPS)
+ && !tokenRep.isPossessive () && !tokenRep.isStingy ())
+ tokenRep.makePossessive ();
+ else
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+
+ }
+ else if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ else
+ currentToken =
+ setRepeated (currentToken, 1, Integer.MAX_VALUE, index);
}
- } // not a comment
- } // subexpression
-
- // UNMATCHED RIGHT PAREN
- // ) or \) throw exception if
- // !syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
- else if (!syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD) && ((unit.ch == ')') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))) {
- throw new REException(getLocalizedMessage("unmatched.paren"),REException.REG_EPAREN,index);
- }
- // START OF LINE OPERATOR
- // ^
-
- else if ((unit.ch == '^') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = null;
- RETokenStart token = null;
- if ((cflags & REG_MULTILINE) > 0) {
- String sep = syntax.getLineSeparator();
- if (sep == null) {
- token = new RETokenStart(subIndex, null, true);
- }
- else {
- token = new RETokenStart(subIndex, sep);
- }
- }
- else {
- token = new RETokenStart(subIndex, null);
- }
- addToken(token);
- }
+ // ZERO-OR-ONE REPEAT OPERATOR / STINGY MATCHING OPERATOR
+ // ? | \? depending on RE_BK_PLUS_QM
+ // not available if RE_LIMITED_OPS is set
+ // stingy matching if RE_STINGY_OPS is set and it follows a quantifier
+
+ else if ((unit.ch == '?') && !syntax.get (RESyntax.RE_LIMITED_OPS)
+ && (!syntax.
+ get (RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot)))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+
+ // Check for stingy matching on RETokenRepeated
+ if (currentToken instanceof RETokenRepeated)
+ {
+ RETokenRepeated tokenRep = (RETokenRepeated) currentToken;
+ if (syntax.get (RESyntax.RE_STINGY_OPS)
+ && !tokenRep.isStingy () && !tokenRep.isPossessive ())
+ tokenRep.makeStingy ();
+ else
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+ }
+ else if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ else
+ currentToken = setRepeated (currentToken, 0, 1, index);
+ }
- // END OF LINE OPERATOR
- // $
-
- else if ((unit.ch == '$') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = null;
- RETokenEnd token = null;
- if ((cflags & REG_MULTILINE) > 0) {
- String sep = syntax.getLineSeparator();
- if (sep == null) {
- token = new RETokenEnd(subIndex, null, true);
- }
- else {
- token = new RETokenEnd(subIndex, sep);
- }
- }
- else {
- token = new RETokenEnd(subIndex, null);
- }
- addToken(token);
- }
+ // OCTAL CHARACTER
+ // \0377
+
+ else if (unit.bk && (unit.ch == '0')
+ && syntax.get (RESyntax.RE_OCTAL_CHAR))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 2, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid octal character",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + ce.len;
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, ce.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
- // MATCH-ANY-CHARACTER OPERATOR (except possibly newline and null)
- // .
+ // BACKREFERENCE OPERATOR
+ // \1 \2 ... \9 and \10 \11 \12 ...
+ // not available if RE_NO_BK_REFS is set
+ // Perl recognizes \10, \11, and so on only if enough number of
+ // parentheses have opened before it, otherwise they are treated
+ // as aliases of \010, \011, ... (octal characters). In case of
+ // Sun's JDK, octal character expression must always begin with \0.
+ // We will do as JDK does. But FIXME, take a look at "(a)(b)\29".
+ // JDK treats \2 as a back reference to the 2nd group because
+ // there are only two groups. But in our poor implementation,
+ // we cannot help but treat \29 as a back reference to the 29th group.
+
+ else if (unit.bk && Character.isDigit (unit.ch)
+ && !syntax.get (RESyntax.RE_NO_BK_REFS))
+ {
+ addToken (currentToken);
+ int numBegin = index - 1;
+ int numEnd = pLength;
+ for (int i = index; i < pLength; i++)
+ {
+ if (!Character.isDigit (pattern[i]))
+ {
+ numEnd = i;
+ break;
+ }
+ }
+ int num = parseInt (pattern, numBegin, numEnd - numBegin, 10);
- else if ((unit.ch == '.') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = new RETokenAny(subIndex,syntax.get(RESyntax.RE_DOT_NEWLINE) || ((cflags & REG_DOT_NEWLINE) > 0),syntax.get(RESyntax.RE_DOT_NOT_NULL));
- }
+ currentToken = new RETokenBackRef (subIndex, num, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ index = numEnd;
+ }
- // ZERO-OR-MORE REPEAT OPERATOR
- // *
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*)*", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '*') && !(unit.bk || quot)) {
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenRepeated)
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- currentToken = setRepeated(currentToken,0,Integer.MAX_VALUE,index);
- }
+ // START OF STRING OPERATOR
+ // \A if RE_STRING_ANCHORS is set
- // ONE-OR-MORE REPEAT OPERATOR / POSSESSIVE MATCHING OPERATOR
- // + | \+ depending on RE_BK_PLUS_QM
- // not available if RE_LIMITED_OPS is set
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*)+", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '+') && !syntax.get(RESyntax.RE_LIMITED_OPS) && (!syntax.get(RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot))) {
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
-
- // Check for possessive matching on RETokenRepeated
- if (currentToken instanceof RETokenRepeated) {
- RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
- if (syntax.get(RESyntax.RE_POSSESSIVE_OPS) && !tokenRep.isPossessive() && !tokenRep.isStingy())
- tokenRep.makePossessive();
- else
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
-
- }
- else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- else
- currentToken = setRepeated(currentToken,1,Integer.MAX_VALUE,index);
- }
+ else if (unit.bk && (unit.ch == 'A')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenStart (subIndex, null);
+ }
- // ZERO-OR-ONE REPEAT OPERATOR / STINGY MATCHING OPERATOR
- // ? | \? depending on RE_BK_PLUS_QM
- // not available if RE_LIMITED_OPS is set
- // stingy matching if RE_STINGY_OPS is set and it follows a quantifier
-
- else if ((unit.ch == '?') && !syntax.get(RESyntax.RE_LIMITED_OPS) && (!syntax.get(RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot))) {
- if (currentToken == null) throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
-
- // Check for stingy matching on RETokenRepeated
- if (currentToken instanceof RETokenRepeated) {
- RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
- if (syntax.get(RESyntax.RE_STINGY_OPS) && !tokenRep.isStingy() && !tokenRep.isPossessive())
- tokenRep.makeStingy();
- else
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- }
- else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- else
- currentToken = setRepeated(currentToken,0,1,index);
- }
+ // WORD BREAK OPERATOR
+ // \b if ????
+
+ else if (unit.bk && (unit.ch == 'b')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex,
+ RETokenWordBoundary.
+ BEGIN | RETokenWordBoundary.END,
+ false);
+ }
- // OCTAL CHARACTER
- // \0377
-
- else if (unit.bk && (unit.ch == '0') && syntax.get(RESyntax.RE_OCTAL_CHAR)) {
- CharExpression ce = getCharExpression(pattern, index - 2, pLength, syntax);
- if (ce == null)
- throw new REException("invalid octal character", REException.REG_ESCAPE, index);
- index = index - 2 + ce.len;
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,ce.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // WORD BEGIN OPERATOR
+ // \< if ????
+ else if (unit.bk && (unit.ch == '<'))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex, RETokenWordBoundary.BEGIN,
+ false);
+ }
- // BACKREFERENCE OPERATOR
- // \1 \2 ... \9 and \10 \11 \12 ...
- // not available if RE_NO_BK_REFS is set
- // Perl recognizes \10, \11, and so on only if enough number of
- // parentheses have opened before it, otherwise they are treated
- // as aliases of \010, \011, ... (octal characters). In case of
- // Sun's JDK, octal character expression must always begin with \0.
- // We will do as JDK does. But FIXME, take a look at "(a)(b)\29".
- // JDK treats \2 as a back reference to the 2nd group because
- // there are only two groups. But in our poor implementation,
- // we cannot help but treat \29 as a back reference to the 29th group.
-
- else if (unit.bk && Character.isDigit(unit.ch) && !syntax.get(RESyntax.RE_NO_BK_REFS)) {
- addToken(currentToken);
- int numBegin = index - 1;
- int numEnd = pLength;
- for (int i = index; i < pLength; i++) {
- if (! Character.isDigit(pattern[i])) {
- numEnd = i;
- break;
- }
- }
- int num = parseInt(pattern, numBegin, numEnd-numBegin, 10);
+ // WORD END OPERATOR
+ // \> if ????
+ else if (unit.bk && (unit.ch == '>'))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex, RETokenWordBoundary.END,
+ false);
+ }
- currentToken = new RETokenBackRef(subIndex,num,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- index = numEnd;
- }
+ // NON-WORD BREAK OPERATOR
+ // \B if ????
+
+ else if (unit.bk && (unit.ch == 'B')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex,
+ RETokenWordBoundary.
+ BEGIN | RETokenWordBoundary.END, true);
+ }
- // START OF STRING OPERATOR
- // \A if RE_STRING_ANCHORS is set
-
- else if (unit.bk && (unit.ch == 'A') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenStart(subIndex,null);
- }
- // WORD BREAK OPERATOR
- // \b if ????
-
- else if (unit.bk && (unit.ch == 'b') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN | RETokenWordBoundary.END, false);
- }
-
- // WORD BEGIN OPERATOR
- // \< if ????
- else if (unit.bk && (unit.ch == '<')) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN, false);
- }
-
- // WORD END OPERATOR
- // \> if ????
- else if (unit.bk && (unit.ch == '>')) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.END, false);
- }
-
- // NON-WORD BREAK OPERATOR
- // \B if ????
-
- else if (unit.bk && (unit.ch == 'B') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN | RETokenWordBoundary.END, true);
- }
-
-
- // DIGIT OPERATOR
- // \d if RE_CHAR_CLASS_ESCAPES is set
-
- else if (unit.bk && (unit.ch == 'd') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // DIGIT OPERATOR
+ // \d if RE_CHAR_CLASS_ESCAPES is set
- // NON-DIGIT OPERATOR
- // \D
+ else if (unit.bk && (unit.ch == 'd')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.DIGIT, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
- else if (unit.bk && (unit.ch == 'D') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // NON-DIGIT OPERATOR
+ // \D
+
+ else if (unit.bk && (unit.ch == 'D')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.DIGIT, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NEWLINE ESCAPE
- // \n
+ // \n
- else if (unit.bk && (unit.ch == 'n')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\n',false);
- }
+ else if (unit.bk && (unit.ch == 'n'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\n', false);
+ }
// RETURN ESCAPE
- // \r
+ // \r
- else if (unit.bk && (unit.ch == 'r')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\r',false);
- }
+ else if (unit.bk && (unit.ch == 'r'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\r', false);
+ }
// WHITESPACE OPERATOR
- // \s if RE_CHAR_CLASS_ESCAPES is set
-
- else if (unit.bk && (unit.ch == 's') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \s if RE_CHAR_CLASS_ESCAPES is set
+
+ else if (unit.bk && (unit.ch == 's')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.SPACE, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NON-WHITESPACE OPERATOR
- // \S
-
- else if (unit.bk && (unit.ch == 'S') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \S
+
+ else if (unit.bk && (unit.ch == 'S')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.SPACE, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// TAB ESCAPE
- // \t
+ // \t
- else if (unit.bk && (unit.ch == 't')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\t',false);
- }
+ else if (unit.bk && (unit.ch == 't'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\t', false);
+ }
// ALPHANUMERIC OPERATOR
- // \w
-
- else if (unit.bk && (unit.ch == 'w') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \w
+
+ else if (unit.bk && (unit.ch == 'w')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.ALNUM, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NON-ALPHANUMERIC OPERATOR
- // \W
-
- else if (unit.bk && (unit.ch == 'W') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \W
+
+ else if (unit.bk && (unit.ch == 'W')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.ALNUM, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// END OF STRING OPERATOR
- // \Z, \z
+ // \Z, \z
// FIXME: \Z and \z are different in that if the input string
// ends with a line terminator, \Z matches the position before
@@ -1040,77 +1290,106 @@ public class RE extends REToken {
// to be implemented.
else if (unit.bk && (unit.ch == 'Z' || unit.ch == 'z') &&
- syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenEnd(subIndex,null);
- }
-
- // HEX CHARACTER, UNICODE CHARACTER
- // \x1B, \u1234
-
- else if ((unit.bk && (unit.ch == 'x') && syntax.get(RESyntax.RE_HEX_CHAR)) ||
- (unit.bk && (unit.ch == 'u') && syntax.get(RESyntax.RE_UNICODE_CHAR))) {
- CharExpression ce = getCharExpression(pattern, index - 2, pLength, syntax);
- if (ce == null)
- throw new REException("invalid hex character", REException.REG_ESCAPE, index);
- index = index - 2 + ce.len;
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,ce.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenEnd (subIndex, null);
+ }
+
+ // HEX CHARACTER, UNICODE CHARACTER
+ // \x1B, \u1234
+
+ else
+ if ((unit.bk && (unit.ch == 'x')
+ && syntax.get (RESyntax.RE_HEX_CHAR)) || (unit.bk
+ && (unit.ch == 'u')
+ && syntax.
+ get (RESyntax.
+ RE_UNICODE_CHAR)))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 2, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid hex character",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + ce.len;
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, ce.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NAMED PROPERTY
// \p{prop}, \P{prop}
- else if ((unit.bk && (unit.ch == 'p') && syntax.get(RESyntax.RE_NAMED_PROPERTY)) ||
- (unit.bk && (unit.ch == 'P') && syntax.get(RESyntax.RE_NAMED_PROPERTY))) {
- NamedProperty np = getNamedProperty(pattern, index - 2, pLength);
- if (np == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- index = index - 2 + np.len;
- addToken(currentToken);
- currentToken = getRETokenNamedProperty(subIndex,np,insens,index);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ else
+ if ((unit.bk && (unit.ch == 'p')
+ && syntax.get (RESyntax.RE_NAMED_PROPERTY)) || (unit.bk
+ && (unit.ch ==
+ 'P')
+ && syntax.
+ get (RESyntax.
+ RE_NAMED_PROPERTY)))
+ {
+ NamedProperty np = getNamedProperty (pattern, index - 2, pLength);
+ if (np == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + np.len;
+ addToken (currentToken);
+ currentToken =
+ getRETokenNamedProperty (subIndex, np, insens, index);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// END OF PREVIOUS MATCH
- // \G
+ // \G
else if (unit.bk && (unit.ch == 'G') &&
- syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenEndOfPreviousMatch(subIndex);
- }
+ syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenEndOfPreviousMatch (subIndex);
+ }
// NON-SPECIAL CHARACTER (or escape to make literal)
- // c | \* for example
+ // c | \* for example
- else { // not a special character
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,unit.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
- } // end while
+ else
+ { // not a special character
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, unit.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
+ } // end while
// Add final buffered token and an EndSub marker
- addToken(currentToken);
-
- if (branches != null) {
- branches.addElement(new RE(firstToken,lastToken,numSubs,subIndex,minimumLength, maximumLength));
- branches.trimToSize(); // compact the Vector
+ addToken (currentToken);
+
+ if (branches != null)
+ {
+ branches.
+ add (new
+ RE (firstToken, lastToken, numSubs, subIndex, minimumLength,
+ maximumLength));
+ branches.trimToSize (); // compact the Vector
minimumLength = 0;
maximumLength = 0;
firstToken = lastToken = null;
- addToken(new RETokenOneOf(subIndex,branches,false));
- }
- else addToken(new RETokenEndSub(subIndex));
+ addToken (new RETokenOneOf (subIndex, branches, false));
+ }
+ else
+ addToken (new RETokenEndSub (subIndex));
}
- private static class ParseCharClassResult {
- RETokenOneOf token;
- int index;
- boolean returnAtAndOperator = false;
+ private static class ParseCharClassResult
+ {
+ RETokenOneOf token;
+ int index;
+ boolean returnAtAndOperator = false;
}
/**
@@ -1123,223 +1402,315 @@ public class RE extends REToken {
* @param pflags Flags that affect the behavior of this method.
* @param syntax Syntax used to parse the pattern.
*/
- private static ParseCharClassResult parseCharClass(int subIndex,
- char[] pattern, int index,
- int pLength, int cflags, RESyntax syntax, int pflags)
- throws REException {
-
- boolean insens = ((cflags & REG_ICASE) > 0);
- boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- Vector options = new Vector();
- Vector addition = new Vector();
- boolean additionAndAppeared = false;
- final int RETURN_AT_AND = 0x01;
- boolean returnAtAndOperator = ((pflags & RETURN_AT_AND) != 0);
- boolean negative = false;
- char ch;
-
- char lastChar = 0;
- boolean lastCharIsSet = false;
- if (index == pLength) throw new REException(getLocalizedMessage("unmatched.bracket"),REException.REG_EBRACK,index);
-
- // Check for initial caret, negation
- if ((ch = pattern[index]) == '^') {
- negative = true;
- if (++index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
+ private static ParseCharClassResult parseCharClass (int subIndex,
+ char[]pattern,
+ int index, int pLength,
+ int cflags,
+ RESyntax syntax,
+ int pflags) throws
+ REException
+ {
+
+ boolean insens = ((cflags & REG_ICASE) > 0);
+ boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ final ArrayList < REToken > options = new ArrayList < REToken > ();
+ ArrayList < Object > addition = new ArrayList < Object > ();
+ boolean additionAndAppeared = false;
+ final int RETURN_AT_AND = 0x01;
+ boolean returnAtAndOperator = ((pflags & RETURN_AT_AND) != 0);
+ boolean negative = false;
+ char ch;
+
+ char lastChar = 0;
+ boolean lastCharIsSet = false;
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("unmatched.bracket"),
+ REException.REG_EBRACK, index);
+
+ // Check for initial caret, negation
+ if ((ch = pattern[index]) == '^')
+ {
+ negative = true;
+ if (++index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
ch = pattern[index];
- }
-
- // Check for leading right bracket literal
- if (ch == ']') {
- lastChar = ch; lastCharIsSet = true;
- if (++index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- }
-
- while ((ch = pattern[index++]) != ']') {
- if ((ch == '-') && (lastCharIsSet)) {
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- if ((ch = pattern[index]) == ']') {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- lastChar = '-';
- } else {
- if ((ch == '\\') && syntax.get(RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS)) {
- CharExpression ce = getCharExpression(pattern, index, pLength, syntax);
- if (ce == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- ch = ce.ch;
- index = index + ce.len - 1;
+ }
+
+ // Check for leading right bracket literal
+ if (ch == ']')
+ {
+ lastChar = ch;
+ lastCharIsSet = true;
+ if (++index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ }
+
+ while ((ch = pattern[index++]) != ']')
+ {
+ if ((ch == '-') && (lastCharIsSet))
+ {
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ if ((ch = pattern[index]) == ']')
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ lastChar = '-';
}
- RETokenRange t = new RETokenRange(subIndex,lastChar,ch,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- lastChar = 0; lastCharIsSet = false;
- index++;
- }
- } else if ((ch == '\\') && syntax.get(RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS)) {
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
+ else
+ {
+ if ((ch == '\\')
+ && syntax.get (RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ ch = ce.ch;
+ index = index + ce.len - 1;
+ }
+ RETokenRange t =
+ new RETokenRange (subIndex, lastChar, ch, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ lastChar = 0;
+ lastCharIsSet = false;
+ index++;
+ }
+ }
+ else if ((ch == '\\')
+ && syntax.get (RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS))
+ {
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
int posixID = -1;
boolean negate = false;
- char asciiEsc = 0;
+ char asciiEsc = 0;
boolean asciiEscIsSet = false;
NamedProperty np = null;
- if (("dswDSW".indexOf(pattern[index]) != -1) && syntax.get(RESyntax.RE_CHAR_CLASS_ESC_IN_LISTS)) {
- switch (pattern[index]) {
- case 'D':
- negate = true;
- case 'd':
- posixID = RETokenPOSIX.DIGIT;
- break;
- case 'S':
- negate = true;
- case 's':
- posixID = RETokenPOSIX.SPACE;
- break;
- case 'W':
- negate = true;
- case 'w':
- posixID = RETokenPOSIX.ALNUM;
- break;
+ if (("dswDSW".indexOf (pattern[index]) != -1)
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESC_IN_LISTS))
+ {
+ switch (pattern[index])
+ {
+ case 'D':
+ negate = true;
+ case 'd':
+ posixID = RETokenPOSIX.DIGIT;
+ break;
+ case 'S':
+ negate = true;
+ case 's':
+ posixID = RETokenPOSIX.SPACE;
+ break;
+ case 'W':
+ negate = true;
+ case 'w':
+ posixID = RETokenPOSIX.ALNUM;
+ break;
+ }
+ }
+ if (("pP".indexOf (pattern[index]) != -1)
+ && syntax.get (RESyntax.RE_NAMED_PROPERTY))
+ {
+ np = getNamedProperty (pattern, index - 1, pLength);
+ if (np == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ index = index - 1 + np.len - 1;
+ }
+ else
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 1, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ asciiEsc = ce.ch;
+ asciiEscIsSet = true;
+ index = index - 1 + ce.len - 1;
+ }
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+
+ if (posixID != -1)
+ {
+ RETokenPOSIX t =
+ new RETokenPOSIX (subIndex, posixID, insens, negate);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ else if (np != null)
+ {
+ RETokenNamedProperty t =
+ getRETokenNamedProperty (subIndex, np, insens, index);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ else if (asciiEscIsSet)
+ {
+ lastChar = asciiEsc;
+ lastCharIsSet = true;
+ }
+ else
+ {
+ lastChar = pattern[index];
+ lastCharIsSet = true;
}
- }
- if (("pP".indexOf(pattern[index]) != -1) && syntax.get(RESyntax.RE_NAMED_PROPERTY)) {
- np = getNamedProperty(pattern, index - 1, pLength);
- if (np == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- index = index - 1 + np.len - 1;
- }
- else {
- CharExpression ce = getCharExpression(pattern, index - 1, pLength, syntax);
- if (ce == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- asciiEsc = ce.ch; asciiEscIsSet = true;
- index = index - 1 + ce.len - 1;
- }
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
-
- if (posixID != -1) {
- RETokenPOSIX t = new RETokenPOSIX(subIndex,posixID,insens,negate);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- } else if (np != null) {
- RETokenNamedProperty t = getRETokenNamedProperty(subIndex,np,insens,index);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- } else if (asciiEscIsSet) {
- lastChar = asciiEsc; lastCharIsSet = true;
- } else {
- lastChar = pattern[index]; lastCharIsSet = true;
- }
++index;
- } else if ((ch == '[') && (syntax.get(RESyntax.RE_CHAR_CLASSES)) && (index < pLength) && (pattern[index] == ':')) {
- StringBuffer posixSet = new StringBuffer();
- index = getPosixSet(pattern,index+1,posixSet);
- int posixId = RETokenPOSIX.intValue(posixSet.toString());
- if (posixId != -1) {
- RETokenPOSIX t = new RETokenPOSIX(subIndex,posixId,insens,false);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
- } else if ((ch == '[') && (syntax.get(RESyntax.RE_NESTED_CHARCLASS))) {
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index, pLength, cflags, syntax, 0);
- addition.addElement(result.token);
- addition.addElement("|");
- index = result.index;
- } else if ((ch == '&') &&
- (syntax.get(RESyntax.RE_NESTED_CHARCLASS)) &&
- (index < pLength) && (pattern[index] == '&')) {
- if (returnAtAndOperator) {
- ParseCharClassResult result = new ParseCharClassResult();
- options.trimToSize();
- if (additionAndAppeared) addition.addElement("&");
- if (addition.size() == 0) addition = null;
- result.token = new RETokenOneOf(subIndex,
- options, addition, negative);
- result.index = index - 1;
- result.returnAtAndOperator = true;
- return result;
- }
- // The precedence of the operator "&&" is the lowest.
- // So we postpone adding "&" until other elements
- // are added. And we insert Boolean.FALSE at the
- // beginning of the list of tokens following "&&".
- // So, "&&[a-b][k-m]" will be stored in the Vecter
- // addition in this order:
- // Boolean.FALSE, [a-b], "|", [k-m], "|", "&"
- if (additionAndAppeared) addition.addElement("&");
- addition.addElement(Boolean.FALSE);
- additionAndAppeared = true;
-
- // The part on which "&&" operates may be either
- // (1) explicitly enclosed by []
- // or
- // (2) not enclosed by [] and terminated by the
- // next "&&" or the end of the character list.
- // Let the preceding else if block do the case (1).
- // We must do something in case of (2).
- if ((index + 1 < pLength) && (pattern[index + 1] != '[')) {
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index+1, pLength, cflags, syntax,
- RETURN_AT_AND);
- addition.addElement(result.token);
- addition.addElement("|");
- // If the method returned at the next "&&", it is OK.
- // Otherwise we have eaten the mark of the end of this
- // character list "]". In this case we must give back
- // the end mark.
- index = (result.returnAtAndOperator ?
- result.index: result.index - 1);
- }
- } else {
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
- lastChar = ch; lastCharIsSet = true;
}
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- } // while in list
- // Out of list, index is one past ']'
-
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
-
- ParseCharClassResult result = new ParseCharClassResult();
- // Create a new RETokenOneOf
- options.trimToSize();
- if (additionAndAppeared) addition.addElement("&");
- if (addition.size() == 0) addition = null;
- result.token = new RETokenOneOf(subIndex,options, addition, negative);
- result.index = index;
- return result;
+ else if ((ch == '[') && (syntax.get (RESyntax.RE_CHAR_CLASSES))
+ && (index < pLength) && (pattern[index] == ':'))
+ {
+ CPStringBuilder posixSet = new CPStringBuilder ();
+ index = getPosixSet (pattern, index + 1, posixSet);
+ int posixId = RETokenPOSIX.intValue (posixSet.toString ());
+ if (posixId != -1)
+ {
+ RETokenPOSIX t =
+ new RETokenPOSIX (subIndex, posixId, insens, false);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ }
+ else if ((ch == '[') && (syntax.get (RESyntax.RE_NESTED_CHARCLASS)))
+ {
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index, pLength, cflags,
+ syntax, 0);
+ addition.add (result.token);
+ addition.add ("|");
+ index = result.index;
+ }
+ else if ((ch == '&') &&
+ (syntax.get (RESyntax.RE_NESTED_CHARCLASS)) &&
+ (index < pLength) && (pattern[index] == '&'))
+ {
+ if (returnAtAndOperator)
+ {
+ ParseCharClassResult result = new ParseCharClassResult ();
+ options.trimToSize ();
+ if (additionAndAppeared)
+ addition.add ("&");
+ if (addition.size () == 0)
+ addition = null;
+ result.token = new RETokenOneOf (subIndex,
+ options, addition, negative);
+ result.index = index - 1;
+ result.returnAtAndOperator = true;
+ return result;
+ }
+ // The precedence of the operator "&&" is the lowest.
+ // So we postpone adding "&" until other elements
+ // are added. And we insert Boolean.FALSE at the
+ // beginning of the list of tokens following "&&".
+ // So, "&&[a-b][k-m]" will be stored in the Vecter
+ // addition in this order:
+ // Boolean.FALSE, [a-b], "|", [k-m], "|", "&"
+ if (additionAndAppeared)
+ addition.add ("&");
+ addition.add (Boolean.FALSE);
+ additionAndAppeared = true;
+
+ // The part on which "&&" operates may be either
+ // (1) explicitly enclosed by []
+ // or
+ // (2) not enclosed by [] and terminated by the
+ // next "&&" or the end of the character list.
+ // Let the preceding else if block do the case (1).
+ // We must do something in case of (2).
+ if ((index + 1 < pLength) && (pattern[index + 1] != '['))
+ {
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index + 1, pLength,
+ cflags, syntax,
+ RETURN_AT_AND);
+ addition.add (result.token);
+ addition.add ("|");
+ // If the method returned at the next "&&", it is OK.
+ // Otherwise we have eaten the mark of the end of this
+ // character list "]". In this case we must give back
+ // the end mark.
+ index = (result.returnAtAndOperator ?
+ result.index : result.index - 1);
+ }
+ }
+ else
+ {
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ lastChar = ch;
+ lastCharIsSet = true;
+ }
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ } // while in list
+ // Out of list, index is one past ']'
+
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+
+ ParseCharClassResult result = new ParseCharClassResult ();
+ // Create a new RETokenOneOf
+ options.trimToSize ();
+ if (additionAndAppeared)
+ addition.add ("&");
+ if (addition.size () == 0)
+ addition = null;
+ result.token = new RETokenOneOf (subIndex, options, addition, negative);
+ result.index = index;
+ return result;
}
- private static int getCharUnit(char[] input, int index, CharUnit unit, boolean quot) throws REException {
+ private static int getCharUnit (char[]input, int index, CharUnit unit,
+ boolean quot) throws REException
+ {
unit.ch = input[index++];
unit.bk = (unit.ch == '\\'
&& (!quot || index >= input.length || input[index] == 'E'));
if (unit.bk)
if (index < input.length)
unit.ch = input[index++];
- else throw new REException(getLocalizedMessage("ends.with.backslash"),REException.REG_ESCAPE,index);
+ else
+ throw new REException (getLocalizedMessage ("ends.with.backslash"),
+ REException.REG_ESCAPE, index);
return index;
}
- private static int parseInt(char[] input, int pos, int len, int radix) {
+ private static int parseInt (char[]input, int pos, int len, int radix)
+ {
int ret = 0;
- for (int i = pos; i < pos + len; i++) {
- ret = ret * radix + Character.digit(input[i], radix);
- }
+ for (int i = pos; i < pos + len; i++)
+ {
+ ret = ret * radix + Character.digit (input[i], radix);
+ }
return ret;
}
@@ -1350,88 +1721,109 @@ public class RE extends REToken {
* "\x1b" : Hex char 0x1b
* "\u1234" : Unicode char \u1234
*/
- private static class CharExpression {
+ private static class CharExpression
+ {
/** character represented by this expression */
char ch;
/** String expression */
String expr;
/** length of this expression */
int len;
- public String toString() { return expr; }
+ public String toString ()
+ {
+ return expr;
+ }
}
- private static CharExpression getCharExpression(char[] input, int pos, int lim,
- RESyntax syntax) {
- CharExpression ce = new CharExpression();
+ private static CharExpression getCharExpression (char[]input, int pos,
+ int lim, RESyntax syntax)
+ {
+ CharExpression ce = new CharExpression ();
char c = input[pos];
- if (c == '\\') {
- if (pos + 1 >= lim) return null;
- c = input[pos + 1];
- switch(c) {
- case 't':
- ce.ch = '\t';
- ce.len = 2;
- break;
- case 'n':
- ce.ch = '\n';
- ce.len = 2;
- break;
- case 'r':
- ce.ch = '\r';
- ce.len = 2;
- break;
- case 'x':
- case 'u':
- if ((c == 'x' && syntax.get(RESyntax.RE_HEX_CHAR)) ||
- (c == 'u' && syntax.get(RESyntax.RE_UNICODE_CHAR))) {
- int l = 0;
- int expectedLength = (c == 'x' ? 2 : 4);
- for (int i = pos + 2; i < pos + 2 + expectedLength; i++) {
- if (i >= lim) break;
- if (!((input[i] >= '0' && input[i] <= '9') ||
- (input[i] >= 'A' && input[i] <= 'F') ||
- (input[i] >= 'a' && input[i] <= 'f')))
- break;
- l++;
- }
- if (l != expectedLength) return null;
- ce.ch = (char)(parseInt(input, pos + 2, l, 16));
- ce.len = l + 2;
- }
- else {
- ce.ch = c;
- ce.len = 2;
- }
- break;
- case '0':
- if (syntax.get(RESyntax.RE_OCTAL_CHAR)) {
- int l = 0;
- for (int i = pos + 2; i < pos + 2 + 3; i++) {
- if (i >= lim) break;
- if (input[i] < '0' || input[i] > '7') break;
- l++;
- }
- if (l == 3 && input[pos + 2] > '3') l--;
- if (l <= 0) return null;
- ce.ch = (char)(parseInt(input, pos + 2, l, 8));
- ce.len = l + 2;
- }
- else {
- ce.ch = c;
- ce.len = 2;
- }
- break;
- default:
- ce.ch = c;
- ce.len = 2;
- break;
+ if (c == '\\')
+ {
+ if (pos + 1 >= lim)
+ return null;
+ c = input[pos + 1];
+ switch (c)
+ {
+ case 't':
+ ce.ch = '\t';
+ ce.len = 2;
+ break;
+ case 'n':
+ ce.ch = '\n';
+ ce.len = 2;
+ break;
+ case 'r':
+ ce.ch = '\r';
+ ce.len = 2;
+ break;
+ case 'x':
+ case 'u':
+ if ((c == 'x' && syntax.get (RESyntax.RE_HEX_CHAR)) ||
+ (c == 'u' && syntax.get (RESyntax.RE_UNICODE_CHAR)))
+ {
+ int l = 0;
+ int expectedLength = (c == 'x' ? 2 : 4);
+ for (int i = pos + 2; i < pos + 2 + expectedLength; i++)
+ {
+ if (i >= lim)
+ break;
+ if (!((input[i] >= '0' && input[i] <= '9') ||
+ (input[i] >= 'A' && input[i] <= 'F') ||
+ (input[i] >= 'a' && input[i] <= 'f')))
+ break;
+ l++;
+ }
+ if (l != expectedLength)
+ return null;
+ ce.ch = (char) (parseInt (input, pos + 2, l, 16));
+ ce.len = l + 2;
+ }
+ else
+ {
+ ce.ch = c;
+ ce.len = 2;
+ }
+ break;
+ case '0':
+ if (syntax.get (RESyntax.RE_OCTAL_CHAR))
+ {
+ int l = 0;
+ for (int i = pos + 2; i < pos + 2 + 3; i++)
+ {
+ if (i >= lim)
+ break;
+ if (input[i] < '0' || input[i] > '7')
+ break;
+ l++;
+ }
+ if (l == 3 && input[pos + 2] > '3')
+ l--;
+ if (l <= 0)
+ return null;
+ ce.ch = (char) (parseInt (input, pos + 2, l, 8));
+ ce.len = l + 2;
+ }
+ else
+ {
+ ce.ch = c;
+ ce.len = 2;
+ }
+ break;
+ default:
+ ce.ch = c;
+ ce.len = 2;
+ break;
+ }
}
- }
- else {
- ce.ch = input[pos];
- ce.len = 1;
- }
- ce.expr = new String(input, pos, ce.len);
+ else
+ {
+ ce.ch = input[pos];
+ ce.len = 1;
+ }
+ ce.expr = new String (input, pos, ce.len);
return ce;
}
@@ -1443,7 +1835,8 @@ public class RE extends REToken {
* "\PA" : Property named "A" (Negated)
* "\P{prop}" : Property named "prop" (Negated)
*/
- private static class NamedProperty {
+ private static class NamedProperty
+ {
/** Property name */
String name;
/** Negated or not */
@@ -1452,56 +1845,73 @@ public class RE extends REToken {
int len;
}
- private static NamedProperty getNamedProperty(char[] input, int pos, int lim) {
- NamedProperty np = new NamedProperty();
+ private static NamedProperty getNamedProperty (char[]input, int pos,
+ int lim)
+ {
+ NamedProperty np = new NamedProperty ();
char c = input[pos];
- if (c == '\\') {
- if (++pos >= lim) return null;
- c = input[pos++];
- switch(c) {
- case 'p':
- np.negate = false;
- break;
- case 'P':
- np.negate = true;
- break;
- default:
- return null;
- }
- c = input[pos++];
- if (c == '{') {
- int p = -1;
- for (int i = pos; i < lim; i++) {
- if (input[i] == '}') {
- p = i;
- break;
+ if (c == '\\')
+ {
+ if (++pos >= lim)
+ return null;
+ c = input[pos++];
+ switch (c)
+ {
+ case 'p':
+ np.negate = false;
+ break;
+ case 'P':
+ np.negate = true;
+ break;
+ default:
+ return null;
+ }
+ c = input[pos++];
+ if (c == '{')
+ {
+ int p = -1;
+ for (int i = pos; i < lim; i++)
+ {
+ if (input[i] == '}')
+ {
+ p = i;
+ break;
+ }
}
+ if (p < 0)
+ return null;
+ int len = p - pos;
+ np.name = new String (input, pos, len);
+ np.len = len + 4;
}
- if (p < 0) return null;
- int len = p - pos;
- np.name = new String(input, pos, len);
- np.len = len + 4;
- }
- else {
- np.name = new String(input, pos - 1, 1);
- np.len = 3;
+ else
+ {
+ np.name = new String (input, pos - 1, 1);
+ np.len = 3;
+ }
+ return np;
}
- return np;
- }
- else return null;
+ else
+ return null;
}
- private static RETokenNamedProperty getRETokenNamedProperty(
- int subIndex, NamedProperty np, boolean insens, int index)
- throws REException {
- try {
- return new RETokenNamedProperty(subIndex, np.name, insens, np.negate);
+ private static RETokenNamedProperty getRETokenNamedProperty (int subIndex,
+ NamedProperty
+ np,
+ boolean insens,
+ int index)
+ throws REException
+ {
+ try
+ {
+ return new RETokenNamedProperty (subIndex, np.name, insens, np.negate);
}
- catch (REException e) {
- REException ree;
- ree = new REException(e.getMessage(), REException.REG_ESCAPE, index);
- ree.initCause(e);
- throw ree;
+ catch (REException e)
+ {
+ REException ree;
+ ree = new REException (e.getMessage (), REException.REG_ESCAPE, index);
+ ree.initCause (e);
+ throw ree;
}
}
@@ -1510,10 +1920,11 @@ public class RE extends REToken {
*
* @param input The input text.
*/
- public boolean isMatch(Object input) {
- return isMatch(input,0,0);
+ public boolean isMatch (Object input)
+ {
+ return isMatch (input, 0, 0);
}
-
+
/**
* Checks if the input string, starting from index, is an exact match of
* this regular expression.
@@ -1521,10 +1932,11 @@ public class RE extends REToken {
* @param input The input text.
* @param index The offset index at which the search should be begin.
*/
- public boolean isMatch(Object input,int index) {
- return isMatch(input,index,0);
+ public boolean isMatch (Object input, int index)
+ {
+ return isMatch (input, index, 0);
}
-
+
/**
* Checks if the input, starting from index and using the specified
@@ -1534,45 +1946,56 @@ public class RE extends REToken {
* @param index The offset index at which the search should be begin.
* @param eflags The logical OR of any execution flags above.
*/
- public boolean isMatch(Object input,int index,int eflags) {
- return isMatchImpl(makeCharIndexed(input,index),index,eflags);
+ public boolean isMatch (Object input, int index, int eflags)
+ {
+ return isMatchImpl (makeCharIndexed (input, index), index, eflags);
}
- private boolean isMatchImpl(CharIndexed input, int index, int eflags) {
- if (firstToken == null) // Trivial case
- return (input.charAt(0) == CharIndexed.OUT_OF_BOUNDS);
- REMatch m = new REMatch(numSubs, index, eflags);
- if (firstToken.match(input, m)) {
- if (m != null) {
- if (input.charAt(m.index) == CharIndexed.OUT_OF_BOUNDS) {
+ private boolean isMatchImpl (CharIndexed input, int index, int eflags)
+ {
+ if (firstToken == null) // Trivial case
+ return (input.charAt (0) == CharIndexed.OUT_OF_BOUNDS);
+ REMatch m = new REMatch (numSubs, index, eflags);
+ if (firstToken.match (input, m))
+ {
+ if (m != null)
+ {
+ if (input.charAt (m.index) == CharIndexed.OUT_OF_BOUNDS)
+ {
return true;
- }
- }
- }
+ }
+ }
+ }
return false;
}
-
+
/**
* Returns the maximum number of subexpressions in this regular expression.
* If the expression contains branches, the value returned will be the
* maximum subexpressions in any of the branches.
*/
- public int getNumSubs() {
+ public int getNumSubs ()
+ {
return numSubs;
}
// Overrides REToken.setUncle
- void setUncle(REToken uncle) {
- if (lastToken != null) {
- lastToken.setUncle(uncle);
- } else super.setUncle(uncle); // to deal with empty subexpressions
+ void setUncle (REToken uncle)
+ {
+ if (lastToken != null)
+ {
+ lastToken.setUncle (uncle);
+ }
+ else
+ super.setUncle (uncle); // to deal with empty subexpressions
}
// Overrides REToken.chain
- boolean chain(REToken next) {
- super.chain(next);
- setUncle(next);
+ boolean chain (REToken next)
+ {
+ super.chain (next);
+ setUncle (next);
return true;
}
@@ -1580,12 +2003,14 @@ public class RE extends REToken {
* Returns the minimum number of characters that could possibly
* constitute a match of this regular expression.
*/
- public int getMinimumLength() {
- return minimumLength;
+ public int getMinimumLength ()
+ {
+ return minimumLength;
}
- public int getMaximumLength() {
- return maximumLength;
+ public int getMaximumLength ()
+ {
+ return maximumLength;
}
/**
@@ -1597,8 +2022,9 @@ public class RE extends REToken {
* @param input The input text.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input) {
- return getAllMatches(input,0,0);
+ public REMatch[] getAllMatches (Object input)
+ {
+ return getAllMatches (input, 0, 0);
}
/**
@@ -1612,8 +2038,9 @@ public class RE extends REToken {
* @param index The offset index at which the search should be begin.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input, int index) {
- return getAllMatches(input,index,0);
+ public REMatch[] getAllMatches (Object input, int index)
+ {
+ return getAllMatches (input, index, 0);
}
/**
@@ -1629,52 +2056,62 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input, int index, int eflags) {
- return getAllMatchesImpl(makeCharIndexed(input,index),index,eflags);
+ public REMatch[] getAllMatches (Object input, int index, int eflags)
+ {
+ return getAllMatchesImpl (makeCharIndexed (input, index), index, eflags);
}
// this has been changed since 1.03 to be non-overlapping matches
- private REMatch[] getAllMatchesImpl(CharIndexed input, int index, int eflags) {
- Vector all = new Vector();
+ private REMatch[] getAllMatchesImpl (CharIndexed input, int index,
+ int eflags)
+ {
+ List < REMatch > all = new ArrayList < REMatch > ();
REMatch m = null;
- while ((m = getMatchImpl(input,index,eflags,null)) != null) {
- all.addElement(m);
- index = m.getEndIndex();
- if (m.end[0] == 0) { // handle pathological case of zero-length match
- index++;
- input.move(1);
- } else {
- input.move(m.end[0]);
+ while ((m = getMatchImpl (input, index, eflags, null)) != null)
+ {
+ all.add (m);
+ index = m.getEndIndex ();
+ if (m.end[0] == 0)
+ { // handle pathological case of zero-length match
+ index++;
+ input.move (1);
+ }
+ else
+ {
+ input.move (m.end[0]);
+ }
+ if (!input.isValid ())
+ break;
}
- if (!input.isValid()) break;
- }
- REMatch[] mset = new REMatch[all.size()];
- all.copyInto(mset);
- return mset;
+ return all.toArray (new REMatch[all.size ()]);
}
-
- /* Implements abstract method REToken.match() */
- boolean match(CharIndexed input, REMatch mymatch) {
- input.setHitEnd(mymatch);
- if (firstToken == null) {
- return next(input, mymatch);
- }
-
- // Note the start of this subexpression
- mymatch.start1[subIndex] = mymatch.index;
-
- return firstToken.match(input, mymatch);
- }
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
- boolean b = match(input, mymatch);
- if (b) {
- return mymatch;
- }
- return null;
- }
+ /* Implements abstract method REToken.match() */
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ input.setHitEnd (mymatch);
+ if (firstToken == null)
+ {
+ return next (input, mymatch);
+ }
+
+ // Note the start of this subexpression
+ mymatch.start1[subIndex] = mymatch.index;
+
+ return firstToken.match (input, mymatch);
+ }
+
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+ boolean b = match (input, mymatch);
+ if (b)
+ {
+ return mymatch;
+ }
+ return null;
+ }
/**
* Returns the first match found in the input. If no match is found,
@@ -1683,10 +2120,11 @@ public class RE extends REToken {
* @param input The input text.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input) {
- return getMatch(input,0,0);
+ public REMatch getMatch (Object input)
+ {
+ return getMatch (input, 0, 0);
}
-
+
/**
* Returns the first match found in the input, beginning
* the search at the specified index. If no match is found,
@@ -1696,10 +2134,11 @@ public class RE extends REToken {
* @param index The offset within the text to begin looking for a match.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input, int index) {
- return getMatch(input,index,0);
+ public REMatch getMatch (Object input, int index)
+ {
+ return getMatch (input, index, 0);
}
-
+
/**
* Returns the first match found in the input, beginning
* the search at the specified index, and using the specified
@@ -1710,8 +2149,9 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input, int index, int eflags) {
- return getMatch(input,index,eflags,null);
+ public REMatch getMatch (Object input, int index, int eflags)
+ {
+ return getMatch (input, index, eflags, null);
}
/**
@@ -1727,70 +2167,82 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @param buffer The StringBuffer to save pre-match text in.
* @return An REMatch instance referencing the match, or null if none. */
- public REMatch getMatch(Object input, int index, int eflags, StringBuffer buffer) {
- return getMatchImpl(makeCharIndexed(input,index),index,eflags,buffer);
+ public REMatch getMatch (Object input, int index, int eflags,
+ CPStringBuilder buffer)
+ {
+ return getMatchImpl (makeCharIndexed (input, index), index, eflags,
+ buffer);
}
- REMatch getMatchImpl(CharIndexed input, int anchor, int eflags, StringBuffer buffer) {
- boolean tryEntireMatch = ((eflags & REG_TRY_ENTIRE_MATCH) != 0);
- boolean doMove = ((eflags & REG_FIX_STARTING_POSITION) == 0);
- RE re = (tryEntireMatch ? (RE) this.clone() : this);
- if (tryEntireMatch) {
- RETokenEnd reEnd = new RETokenEnd(0, null);
- reEnd.setFake(true);
- re.chain(reEnd);
+ REMatch getMatchImpl (CharIndexed input, int anchor, int eflags,
+ CPStringBuilder buffer)
+ {
+ boolean tryEntireMatch = ((eflags & REG_TRY_ENTIRE_MATCH) != 0);
+ boolean doMove = ((eflags & REG_FIX_STARTING_POSITION) == 0);
+ RE re = (tryEntireMatch ? (RE) this.clone () : this);
+ if (tryEntireMatch)
+ {
+ RETokenEnd reEnd = new RETokenEnd (0, null);
+ reEnd.setFake (true);
+ re.chain (reEnd);
}
- // Create a new REMatch to hold results
- REMatch mymatch = new REMatch(numSubs, anchor, eflags);
- do {
- /* The following potimization is commented out because
- the matching should be tried even if the length of
- input is obviously too short in order that
- java.util.regex.Matcher#hitEnd() may work correctly.
- // Optimization: check if anchor + minimumLength > length
- if (minimumLength == 0 || input.charAt(minimumLength-1) != CharIndexed.OUT_OF_BOUNDS) {
- */
- if (re.match(input, mymatch)) {
- REMatch best = mymatch;
- // We assume that the match that coms first is the best.
- // And the following "The longer, the better" rule has
- // been commented out. The longest is not neccesarily
- // the best. For example, "a" out of "aaa" is the best
- // match for /a+?/.
- /*
- // Find best match of them all to observe leftmost longest
- while ((mymatch = mymatch.next) != null) {
- if (mymatch.index > best.index) {
- best = mymatch;
- }
- }
- */
- best.end[0] = best.index;
- best.finish(input);
- input.setLastMatch(best);
- return best;
- }
- /* End of the optimization commented out
- }
- */
- mymatch.clear(++anchor);
- // Append character to buffer if needed
- if (buffer != null && input.charAt(0) != CharIndexed.OUT_OF_BOUNDS) {
- buffer.append(input.charAt(0));
+ // Create a new REMatch to hold results
+ REMatch mymatch = new REMatch (numSubs, anchor, eflags);
+ do
+ {
+ /* The following potimization is commented out because
+ the matching should be tried even if the length of
+ input is obviously too short in order that
+ java.util.regex.Matcher#hitEnd() may work correctly.
+ // Optimization: check if anchor + minimumLength > length
+ if (minimumLength == 0 || input.charAt(minimumLength-1) != CharIndexed.OUT_OF_BOUNDS) {
+ */
+ if (re.match (input, mymatch))
+ {
+ REMatch best = mymatch;
+ // We assume that the match that coms first is the best.
+ // And the following "The longer, the better" rule has
+ // been commented out. The longest is not neccesarily
+ // the best. For example, "a" out of "aaa" is the best
+ // match for /a+?/.
+ /*
+ // Find best match of them all to observe leftmost longest
+ while ((mymatch = mymatch.next) != null) {
+ if (mymatch.index > best.index) {
+ best = mymatch;
+ }
+ }
+ */
+ best.end[0] = best.index;
+ best.finish (input);
+ input.setLastMatch (best);
+ return best;
}
- // java.util.regex.Matcher#hitEnd() requires that the search should
- // be tried at the end of input, so we use move1(1) instead of move(1)
- } while (doMove && input.move1(1));
-
- // Special handling at end of input for e.g. "$"
- if (minimumLength == 0) {
- if (match(input, mymatch)) {
- mymatch.finish(input);
- return mymatch;
+ /* End of the optimization commented out
+ }
+ */
+ mymatch.clear (++anchor);
+ // Append character to buffer if needed
+ if (buffer != null && input.charAt (0) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ buffer.append (input.charAt (0));
+ }
+ // java.util.regex.Matcher#hitEnd() requires that the search should
+ // be tried at the end of input, so we use move1(1) instead of move(1)
+ }
+ while (doMove && input.move1 (1));
+
+ // Special handling at end of input for e.g. "$"
+ if (minimumLength == 0)
+ {
+ if (match (input, mymatch))
+ {
+ mymatch.finish (input);
+ return mymatch;
}
}
- return null;
+ return null;
}
/**
@@ -1800,8 +2252,9 @@ public class RE extends REToken {
* @param input The input text.
* @return A non-null REMatchEnumeration instance.
*/
- public REMatchEnumeration getMatchEnumeration(Object input) {
- return getMatchEnumeration(input,0,0);
+ public REMatchEnumeration getMatchEnumeration (Object input)
+ {
+ return getMatchEnumeration (input, 0, 0);
}
@@ -1814,8 +2267,9 @@ public class RE extends REToken {
* @return A non-null REMatchEnumeration instance, with its input cursor
* set to the index position specified.
*/
- public REMatchEnumeration getMatchEnumeration(Object input, int index) {
- return getMatchEnumeration(input,index,0);
+ public REMatchEnumeration getMatchEnumeration (Object input, int index)
+ {
+ return getMatchEnumeration (input, index, 0);
}
/**
@@ -1828,8 +2282,11 @@ public class RE extends REToken {
* @return A non-null REMatchEnumeration instance, with its input cursor
* set to the index position specified.
*/
- public REMatchEnumeration getMatchEnumeration(Object input, int index, int eflags) {
- return new REMatchEnumeration(this,makeCharIndexed(input,index),index,eflags);
+ public REMatchEnumeration getMatchEnumeration (Object input, int index,
+ int eflags)
+ {
+ return new REMatchEnumeration (this, makeCharIndexed (input, index),
+ index, eflags);
}
@@ -1841,8 +2298,9 @@ public class RE extends REToken {
* @return A String interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace) {
- return substitute(input,replace,0,0);
+ public String substitute (Object input, String replace)
+ {
+ return substitute (input, replace, 0, 0);
}
/**
@@ -1858,8 +2316,9 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace,int index) {
- return substitute(input,replace,index,0);
+ public String substitute (Object input, String replace, int index)
+ {
+ return substitute (input, replace, index, 0);
}
/**
@@ -1875,23 +2334,32 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace,int index,int eflags) {
- return substituteImpl(makeCharIndexed(input,index),replace,index,eflags);
+ public String substitute (Object input, String replace, int index,
+ int eflags)
+ {
+ return substituteImpl (makeCharIndexed (input, index), replace, index,
+ eflags);
}
- private String substituteImpl(CharIndexed input,String replace,int index,int eflags) {
- StringBuffer buffer = new StringBuffer();
- REMatch m = getMatchImpl(input,index,eflags,buffer);
- if (m==null) return buffer.toString();
- buffer.append(getReplacement(replace, m, eflags));
- if (input.move(m.end[0])) {
- do {
- buffer.append(input.charAt(0));
- } while (input.move(1));
- }
- return buffer.toString();
+ private String substituteImpl (CharIndexed input, String replace, int index,
+ int eflags)
+ {
+ CPStringBuilder buffer = new CPStringBuilder ();
+ REMatch m = getMatchImpl (input, index, eflags, buffer);
+ if (m == null)
+ return buffer.toString ();
+ buffer.append (getReplacement (replace, m, eflags));
+ if (input.move (m.end[0]))
+ {
+ do
+ {
+ buffer.append (input.charAt (0));
+ }
+ while (input.move (1));
+ }
+ return buffer.toString ();
}
-
+
/**
* Substitutes the replacement text for each non-overlapping match found
* in the input text.
@@ -1901,8 +2369,9 @@ public class RE extends REToken {
* @return A String interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace) {
- return substituteAll(input,replace,0,0);
+ public String substituteAll (Object input, String replace)
+ {
+ return substituteAll (input, replace, 0, 0);
}
/**
@@ -1919,10 +2388,11 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace,int index) {
- return substituteAll(input,replace,index,0);
+ public String substituteAll (Object input, String replace, int index)
+ {
+ return substituteAll (input, replace, index, 0);
}
-
+
/**
* Substitutes the replacement text for each non-overlapping match found
* in the input text, starting at the specified index and using the
@@ -1936,218 +2406,270 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace,int index,int eflags) {
- return substituteAllImpl(makeCharIndexed(input,index),replace,index,eflags);
+ public String substituteAll (Object input, String replace, int index,
+ int eflags)
+ {
+ return substituteAllImpl (makeCharIndexed (input, index), replace, index,
+ eflags);
}
- private String substituteAllImpl(CharIndexed input,String replace,int index,int eflags) {
- StringBuffer buffer = new StringBuffer();
+ private String substituteAllImpl (CharIndexed input, String replace,
+ int index, int eflags)
+ {
+ CPStringBuilder buffer = new CPStringBuilder ();
REMatch m;
- while ((m = getMatchImpl(input,index,eflags,buffer)) != null) {
- buffer.append(getReplacement(replace, m, eflags));
- index = m.getEndIndex();
- if (m.end[0] == 0) {
- char ch = input.charAt(0);
- if (ch != CharIndexed.OUT_OF_BOUNDS)
- buffer.append(ch);
- input.move(1);
- } else {
- input.move(m.end[0]);
- }
+ while ((m = getMatchImpl (input, index, eflags, buffer)) != null)
+ {
+ buffer.append (getReplacement (replace, m, eflags));
+ index = m.getEndIndex ();
+ if (m.end[0] == 0)
+ {
+ char ch = input.charAt (0);
+ if (ch != CharIndexed.OUT_OF_BOUNDS)
+ buffer.append (ch);
+ input.move (1);
+ }
+ else
+ {
+ input.move (m.end[0]);
+ }
- if (!input.isValid()) break;
- }
- return buffer.toString();
+ if (!input.isValid ())
+ break;
+ }
+ return buffer.toString ();
}
- public static String getReplacement(String replace, REMatch m, int eflags) {
+ public static String getReplacement (String replace, REMatch m, int eflags)
+ {
if ((eflags & REG_NO_INTERPOLATE) > 0)
return replace;
- else {
- if ((eflags & REG_REPLACE_USE_BACKSLASHESCAPE) > 0) {
- StringBuffer sb = new StringBuffer();
- int l = replace.length();
- for (int i = 0; i < l; i++) {
- char c = replace.charAt(i);
- switch(c) {
- case '\\':
- i++;
- // Let StringIndexOutOfBoundsException be thrown.
- sb.append(replace.charAt(i));
- break;
- case '$':
- int i1 = i + 1;
- while (i1 < replace.length() &&
- Character.isDigit(replace.charAt(i1))) i1++;
- sb.append(m.substituteInto(replace.substring(i, i1)));
- i = i1 - 1;
- break;
- default:
- sb.append(c);
- }
- }
- return sb.toString();
+ else
+ {
+ if ((eflags & REG_REPLACE_USE_BACKSLASHESCAPE) > 0)
+ {
+ CPStringBuilder sb = new CPStringBuilder ();
+ int l = replace.length ();
+ for (int i = 0; i < l; i++)
+ {
+ char c = replace.charAt (i);
+ switch (c)
+ {
+ case '\\':
+ i++;
+ // Let StringIndexOutOfBoundsException be thrown.
+ sb.append (replace.charAt (i));
+ break;
+ case '$':
+ int i1 = i + 1;
+ while (i1 < replace.length () &&
+ Character.isDigit (replace.charAt (i1)))
+ i1++;
+ sb.append (m.substituteInto (replace.substring (i, i1)));
+ i = i1 - 1;
+ break;
+ default:
+ sb.append (c);
+ }
+ }
+ return sb.toString ();
+ }
+ else
+ return m.substituteInto (replace);
}
- else
- return m.substituteInto(replace);
- }
- }
-
+ }
+
/* Helper function for constructor */
- private void addToken(REToken next) {
- if (next == null) return;
- minimumLength += next.getMinimumLength();
- int nmax = next.getMaximumLength();
+ private void addToken (REToken next)
+ {
+ if (next == null)
+ return;
+ minimumLength += next.getMinimumLength ();
+ int nmax = next.getMaximumLength ();
if (nmax < Integer.MAX_VALUE && maximumLength < Integer.MAX_VALUE)
- maximumLength += nmax;
- else
- maximumLength = Integer.MAX_VALUE;
+ maximumLength += nmax;
+ else
+ maximumLength = Integer.MAX_VALUE;
- if (firstToken == null) {
+ if (firstToken == null)
+ {
lastToken = firstToken = next;
- } else {
- // if chain returns false, it "rejected" the token due to
- // an optimization, and next was combined with lastToken
- if (lastToken.chain(next)) {
- lastToken = next;
}
- }
+ else
+ {
+ // if chain returns false, it "rejected" the token due to
+ // an optimization, and next was combined with lastToken
+ if (lastToken.chain (next))
+ {
+ lastToken = next;
+ }
+ }
}
- private static REToken setRepeated(REToken current, int min, int max, int index) throws REException {
- if (current == null) throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
- return new RETokenRepeated(current.subIndex,current,min,max);
+ private static REToken setRepeated (REToken current, int min, int max,
+ int index) throws REException
+ {
+ if (current == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ return new RETokenRepeated (current.subIndex, current, min, max);
}
- private static int getPosixSet(char[] pattern,int index,StringBuffer buf) {
+ private static int getPosixSet (char[]pattern, int index,
+ CPStringBuilder buf)
+ {
// Precondition: pattern[index-1] == ':'
// we will return pos of closing ']'.
int i;
- for (i=index; i<(pattern.length-1); i++) {
- if ((pattern[i] == ':') && (pattern[i+1] == ']'))
- return i+2;
- buf.append(pattern[i]);
- }
- return index; // didn't match up
+ for (i = index; i < (pattern.length - 1); i++)
+ {
+ if ((pattern[i] == ':') && (pattern[i + 1] == ']'))
+ return i + 2;
+ buf.append (pattern[i]);
+ }
+ return index; // didn't match up
}
- private int getMinMax(char[] input,int index,IntPair minMax,RESyntax syntax) throws REException {
+ private int getMinMax (char[]input, int index, IntPair minMax,
+ RESyntax syntax) throws REException
+ {
// Precondition: input[index-1] == '{', minMax != null
- boolean mustMatch = !syntax.get(RESyntax.RE_NO_BK_BRACES);
+ boolean mustMatch = !syntax.get (RESyntax.RE_NO_BK_BRACES);
int startIndex = index;
- if (index == input.length) {
- if (mustMatch)
- throw new REException(getLocalizedMessage("unmatched.brace"),REException.REG_EBRACE,index);
- else
- return startIndex;
- }
-
- int min,max=0;
- CharUnit unit = new CharUnit();
- StringBuffer buf = new StringBuffer();
-
+ if (index == input.length)
+ {
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("unmatched.brace"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ }
+
+ int min, max = 0;
+ CharUnit unit = new CharUnit ();
+ CPStringBuilder buf = new CPStringBuilder ();
+
// Read string of digits
- do {
- index = getCharUnit(input,index,unit,false);
- if (Character.isDigit(unit.ch))
- buf.append(unit.ch);
- } while ((index != input.length) && Character.isDigit(unit.ch));
+ do
+ {
+ index = getCharUnit (input, index, unit, false);
+ if (Character.isDigit (unit.ch))
+ buf.append (unit.ch);
+ }
+ while ((index != input.length) && Character.isDigit (unit.ch));
// Check for {} tomfoolery
- if (buf.length() == 0) {
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
- else
- return startIndex;
- }
+ if (buf.length () == 0)
+ {
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ }
- min = Integer.parseInt(buf.toString());
-
- if ((unit.ch == '}') && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ unit.bk))
+ min = Integer.parseInt (buf.toString ());
+
+ if ((unit.ch == '}') && (syntax.get (RESyntax.RE_NO_BK_BRACES) ^ unit.bk))
max = min;
else if (index == input.length)
if (mustMatch)
- throw new REException(getLocalizedMessage("interval.no.end"),REException.REG_EBRACE,index);
- else
- return startIndex;
- else if ((unit.ch == ',') && !unit.bk) {
- buf = new StringBuffer();
+ throw new REException (getLocalizedMessage ("interval.no.end"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ else
+ if ((unit.ch == ',') && !unit.bk)
+ {
+ buf = new CPStringBuilder ();
// Read string of digits
- while (((index = getCharUnit(input,index,unit,false)) != input.length) && Character.isDigit(unit.ch))
- buf.append(unit.ch);
-
- if (!((unit.ch == '}') && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ unit.bk)))
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
- else
- return startIndex;
+ while (((index =
+ getCharUnit (input, index, unit, false)) != input.length)
+ && Character.isDigit (unit.ch))
+ buf.append (unit.ch);
+
+ if (!
+ ((unit.ch == '}')
+ && (syntax.get (RESyntax.RE_NO_BK_BRACES) ^ unit.bk)))
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
// This is the case of {x,}
- if (buf.length() == 0) max = Integer.MAX_VALUE;
- else max = Integer.parseInt(buf.toString());
- } else
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
+ if (buf.length () == 0)
+ max = Integer.MAX_VALUE;
else
- return startIndex;
+ max = Integer.parseInt (buf.toString ());
+ }
+ else if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
- // We know min and max now, and they are valid.
+ // We know min and max now, and they are valid.
- minMax.first = min;
- minMax.second = max;
+ minMax.first = min;
+ minMax.second = max;
- // return the index following the '}'
- return index;
+ // return the index following the '}'
+ return index;
}
/**
* Return a human readable form of the compiled regular expression,
* useful for debugging.
*/
- public String toString() {
- StringBuffer sb = new StringBuffer();
- dump(sb);
- return sb.toString();
- }
-
- void dump(StringBuffer os) {
- os.append("(?#startRE subIndex=" + subIndex + ")");
+ public String toString ()
+ {
+ CPStringBuilder sb = new CPStringBuilder ();
+ dump (sb);
+ return sb.toString ();
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?#startRE subIndex=" + subIndex + ")");
if (subIndex == 0)
- os.append("?:");
+ os.append ("?:");
if (firstToken != null)
- firstToken.dumpAll(os);
+ firstToken.dumpAll (os);
if (subIndex == 0)
- os.append(")");
- os.append("(?#endRE subIndex=" + subIndex + ")");
+ os.append (")");
+ os.append ("(?#endRE subIndex=" + subIndex + ")");
}
// Cast input appropriately or throw exception
// This method was originally a private method, but has been made
// public because java.util.regex.Matcher uses this.
- public static CharIndexed makeCharIndexed(Object input, int index) {
- // The case where input is already a CharIndexed is supposed
- // be the most likely because this is the case with
- // java.util.regex.Matcher.
- // We could let a String or a CharSequence fall through
- // to final input, but since it'a very likely input type,
- // we check it first.
- if (input instanceof CharIndexed) {
+ public static CharIndexed makeCharIndexed (Object input, int index)
+ {
+ // The case where input is already a CharIndexed is supposed
+ // be the most likely because this is the case with
+ // java.util.regex.Matcher.
+ // We could let a String or a CharSequence fall through
+ // to final input, but since it'a very likely input type,
+ // we check it first.
+ if (input instanceof CharIndexed)
+ {
CharIndexed ci = (CharIndexed) input;
- ci.setAnchor(index);
+ ci.setAnchor (index);
return ci;
- }
+ }
else if (input instanceof CharSequence)
- return new CharIndexedCharSequence((CharSequence) input,index);
+ return new CharIndexedCharSequence ((CharSequence) input, index);
else if (input instanceof String)
- return new CharIndexedString((String) input,index);
+ return new CharIndexedString ((String) input, index);
else if (input instanceof char[])
- return new CharIndexedCharArray((char[]) input,index);
+ return new CharIndexedCharArray ((char[]) input, index);
else if (input instanceof StringBuffer)
- return new CharIndexedStringBuffer((StringBuffer) input,index);
+ return new CharIndexedStringBuffer ((StringBuffer) input, index);
else if (input instanceof InputStream)
- return new CharIndexedInputStream((InputStream) input,index);
- else
- return new CharIndexedString(input.toString(), index);
+ return new CharIndexedInputStream ((InputStream) input, index);
+ else
+ return new CharIndexedString (input.toString (), index);
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REException.java b/libjava/classpath/gnu/java/util/regex/REException.java
index 7a277ca..5681cee 100644
--- a/libjava/classpath/gnu/java/util/regex/REException.java
+++ b/libjava/classpath/gnu/java/util/regex/REException.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
import java.text.MessageFormat;
/**
@@ -53,7 +55,8 @@ import java.text.MessageFormat;
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public class REException extends Exception {
+public class REException extends Exception
+{
private int type;
private int pos;
@@ -64,25 +67,25 @@ public class REException extends Exception {
* Invalid use of repetition operators such as using
* `*' as the first character.
*/
- public static final int REG_BADRPT = 1;
+ public static final int REG_BADRPT = 1;
/**
* Error flag.
* Invalid use of back reference operator.
*/
- public static final int REG_BADBR = 2;
+ public static final int REG_BADBR = 2;
/**
* Error flag.
* Un-matched brace interval operators.
*/
- public static final int REG_EBRACE = 3;
+ public static final int REG_EBRACE = 3;
/**
* Error flag.
* Un-matched bracket list operators.
*/
- public static final int REG_EBRACK = 4;
+ public static final int REG_EBRACK = 4;
/**
* Error flag.
@@ -90,65 +93,67 @@ public class REException extends Exception {
* point of the range occurs prior to the starting
* point.
*/
- public static final int REG_ERANGE = 5;
+ public static final int REG_ERANGE = 5;
/**
* Error flag.
* Unknown character class name. <B>Not implemented</B>.
*/
- public static final int REG_ECTYPE = 6;
+ public static final int REG_ECTYPE = 6;
/**
* Error flag.
* Un-matched parenthesis group operators.
*/
- public static final int REG_EPAREN = 7;
+ public static final int REG_EPAREN = 7;
/**
* Error flag.
* Invalid back reference to a subexpression.
*/
- public static final int REG_ESUBREG = 8;
+ public static final int REG_ESUBREG = 8;
/**
* Error flag.
* Non specific error. <B>Not implemented</B>.
*/
- public static final int REG_EEND = 9;
+ public static final int REG_EEND = 9;
/**
* Error flag.
* Invalid escape sequence. <B>Not implemented</B>.
*/
- public static final int REG_ESCAPE = 10;
+ public static final int REG_ESCAPE = 10;
/**
* Error flag.
* Invalid use of pattern operators such as group or list.
*/
- public static final int REG_BADPAT = 11;
+ public static final int REG_BADPAT = 11;
/**
* Error flag.
* Compiled regular expression requires a pattern
* buffer larger than 64Kb. <B>Not implemented</B>.
*/
- public static final int REG_ESIZE = 12;
+ public static final int REG_ESIZE = 12;
/**
* Error flag.
* The regex routines ran out of memory. <B>Not implemented</B>.
*/
- public static final int REG_ESPACE = 13;
+ public static final int REG_ESPACE = 13;
- REException(String msg, int type, int position) {
- super(msg);
+ REException (String msg, int type, int position)
+ {
+ super (msg);
this.type = type;
this.pos = position;
}
- REException(String msg, Throwable cause, int type, int position) {
- super(msg, cause);
+ REException (String msg, Throwable cause, int type, int position)
+ {
+ super (msg, cause);
this.type = type;
this.pos = position;
}
@@ -157,7 +162,8 @@ public class REException extends Exception {
* Returns the type of the exception, one of the constants listed above.
*/
- public int getType() {
+ public int getType ()
+ {
return type;
}
@@ -167,7 +173,8 @@ public class REException extends Exception {
* where the error was detected, not necessarily the starting index of
* a bad subexpression.
*/
- public int getPosition() {
+ public int getPosition ()
+ {
return pos;
}
@@ -176,13 +183,16 @@ public class REException extends Exception {
* as well as its index position in the string or character array
* being compiled.
*/
- public String getMessage() {
- Object[] args = {new Integer(pos)};
- StringBuffer sb = new StringBuffer();
- String prefix = RE.getLocalizedMessage("error.prefix");
- sb.append(MessageFormat.format(prefix, args));
- sb.append('\n');
- sb.append(super.getMessage());
- return sb.toString();
+ public String getMessage ()
+ {
+ Object[]args =
+ {
+ new Integer (pos)};
+ CPStringBuilder sb = new CPStringBuilder ();
+ String prefix = RE.getLocalizedMessage ("error.prefix");
+ sb.append (MessageFormat.format (prefix, args));
+ sb.append ('\n');
+ sb.append (super.getMessage ());
+ return sb.toString ();
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java b/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
index abe8630..c7acb71 100644
--- a/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
+++ b/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
@@ -51,14 +51,15 @@ import java.io.InputStream;
* class instead.
*/
-public class REFilterInputStream extends FilterInputStream {
+public class REFilterInputStream extends FilterInputStream
+{
- private RE expr;
- private String replace;
- private String buffer;
- private int bufpos;
- private int offset;
- private CharIndexedInputStream stream;
+ private RE expr;
+ private String replace;
+ private String buffer;
+ private int bufpos;
+ private int offset;
+ private CharIndexedInputStream stream;
/**
* Creates an REFilterInputStream. When reading from this stream,
@@ -71,9 +72,10 @@ public class REFilterInputStream extends FilterInputStream {
* @param expr The regular expression to search for.
* @param replace The text pattern to replace matches with.
*/
- public REFilterInputStream(InputStream stream, RE expr, String replace) {
- super(stream);
- this.stream = new CharIndexedInputStream(stream,0);
+ public REFilterInputStream (InputStream stream, RE expr, String replace)
+ {
+ super (stream);
+ this.stream = new CharIndexedInputStream (stream, 0);
this.expr = expr;
this.replace = replace;
}
@@ -82,32 +84,38 @@ public class REFilterInputStream extends FilterInputStream {
* Reads the next byte from the stream per the general contract of
* InputStream.read(). Returns -1 on error or end of stream.
*/
- public int read() {
+ public int read ()
+ {
// If we have buffered replace data, use it.
- if ((buffer != null) && (bufpos < buffer.length())) {
- return (int) buffer.charAt(bufpos++);
- }
+ if ((buffer != null) && (bufpos < buffer.length ()))
+ {
+ return (int) buffer.charAt (bufpos++);
+ }
// check if input is at a valid position
- if (!stream.isValid()) return -1;
-
- REMatch mymatch = new REMatch(expr.getNumSubs(),offset,0);
- if (expr.match(stream, mymatch)) {
- mymatch.end[0] = mymatch.index;
- mymatch.finish(stream);
- stream.move(mymatch.toString().length());
- offset += mymatch.toString().length();
- buffer = mymatch.substituteInto(replace);
- bufpos = 1;
-
- // This is prone to infinite loops if replace string turns out empty.
- if (buffer.length() > 0) {
- return buffer.charAt(0);
+ if (!stream.isValid ())
+ return -1;
+
+ REMatch mymatch = new REMatch (expr.getNumSubs (), offset, 0);
+ if (expr.match (stream, mymatch))
+ {
+ mymatch.end[0] = mymatch.index;
+ mymatch.finish (stream);
+ stream.move (mymatch.toString ().length ());
+ offset += mymatch.toString ().length ();
+ buffer = mymatch.substituteInto (replace);
+ bufpos = 1;
+
+ // This is prone to infinite loops if replace string turns out empty.
+ if (buffer.length () > 0)
+ {
+ return buffer.charAt (0);
+ }
}
- }
- char ch = stream.charAt(0);
- if (ch == CharIndexed.OUT_OF_BOUNDS) return -1;
- stream.move(1);
+ char ch = stream.charAt (0);
+ if (ch == CharIndexed.OUT_OF_BOUNDS)
+ return -1;
+ stream.move (1);
offset++;
return ch;
}
@@ -116,25 +124,30 @@ public class REFilterInputStream extends FilterInputStream {
* Returns false. REFilterInputStream does not support mark() and
* reset() methods.
*/
- public boolean markSupported() {
+ public boolean markSupported ()
+ {
return false;
}
/** Reads from the stream into the provided array. */
- public int read(byte[] b, int off, int len) {
+ public int read (byte[]b, int off, int len)
+ {
int i;
int ok = 0;
- while (len-- > 0) {
- i = read();
- if (i == -1) return (ok == 0) ? -1 : ok;
- b[off++] = (byte) i;
- ok++;
- }
+ while (len-- > 0)
+ {
+ i = read ();
+ if (i == -1)
+ return (ok == 0) ? -1 : ok;
+ b[off++] = (byte) i;
+ ok++;
+ }
return ok;
}
/** Reads from the stream into the provided array. */
- public int read(byte[] b) {
- return read(b,0,b.length);
+ public int read (byte[]b)
+ {
+ return read (b, 0, b.length);
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REMatch.java b/libjava/classpath/gnu/java/util/regex/REMatch.java
index d899482..d29972e 100644
--- a/libjava/classpath/gnu/java/util/regex/REMatch.java
+++ b/libjava/classpath/gnu/java/util/regex/REMatch.java
@@ -37,6 +37,9 @@ exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
/**
@@ -47,100 +50,112 @@ import java.io.Serializable;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public final class REMatch implements Serializable, Cloneable {
- private String matchedText;
- private CharIndexed matchedCharIndexed;
-
- // These variables are package scope for fast access within the engine
- int eflags; // execution flags this match was made using
-
- // Offset in source text where match was tried. This is zero-based;
- // the actual position in the source text is given by (offset + anchor).
- int offset;
-
- // Anchor position refers to the index into the source input
- // at which the matching operation began.
- // This is also useful for the ANCHORINDEX option.
- int anchor;
-
- // Package scope; used by RE.
- int index; // used while matching to mark current match position in input
- // start1[i] is set when the i-th subexp starts. And start1[i] is copied
- // to start[i] when the i-th subexp ends. So start[i] keeps the previously
- // assigned value while the i-th subexp is being processed. This makes
- // backreference to the i-th subexp within the i-th subexp possible.
- int[] start; // start positions (relative to offset) for each (sub)exp.
- int[] start1; // start positions (relative to offset) for each (sub)exp.
- int[] end; // end positions for the same
- // start[i] == -1 or end[i] == -1 means that the start/end position is void.
- // start[i] == p or end[i] == p where p < 0 and p != -1 means that
- // the actual start/end position is (p+1). Start/end positions may
- // become negative when the subexpression is in a RETokenLookBehind.
- boolean empty; // empty string matched. This flag is used only within
- // RETokenRepeated.
-
- BacktrackStack backtrackStack;
-
- public Object clone() {
- try {
- REMatch copy = (REMatch) super.clone();
-
- copy.start = (int[]) start.clone();
- copy.start1 = (int[]) start1.clone();
- copy.end = (int[]) end.clone();
-
- return copy;
- } catch (CloneNotSupportedException e) {
- throw new Error(); // doesn't happen
- }
- }
+public final class REMatch implements Serializable, Cloneable
+{
+ private String matchedText;
+ private CharIndexed matchedCharIndexed;
- void assignFrom(REMatch other) {
- start = other.start;
- start1 = other.start1;
- end = other.end;
- index = other.index;
- backtrackStack = other.backtrackStack;
- }
+ // These variables are package scope for fast access within the engine
+ int eflags; // execution flags this match was made using
- REMatch(int subs, int anchor, int eflags) {
- start = new int[subs+1];
- start1 = new int[subs+1];
- end = new int[subs+1];
- this.anchor = anchor;
- this.eflags = eflags;
- clear(anchor);
- }
+ // Offset in source text where match was tried. This is zero-based;
+ // the actual position in the source text is given by (offset + anchor).
+ int offset;
- void finish(CharIndexed text) {
- start[0] = 0;
- StringBuffer sb = new StringBuffer();
- int i;
- for (i = 0; i < end[0]; i++)
- sb.append(text.charAt(i));
- matchedText = sb.toString();
- matchedCharIndexed = text;
- for (i = 0; i < start.length; i++) {
- // If any subexpressions didn't terminate, they don't count
- // TODO check if this code ever gets hit
- if ((start[i] == -1) ^ (end[i] == -1)) {
- start[i] = -1;
- end[i] = -1;
- }
- }
- backtrackStack = null;
+ // Anchor position refers to the index into the source input
+ // at which the matching operation began.
+ // This is also useful for the ANCHORINDEX option.
+ int anchor;
+
+ // Package scope; used by RE.
+ int index; // used while matching to mark current match position in input
+ // start1[i] is set when the i-th subexp starts. And start1[i] is copied
+ // to start[i] when the i-th subexp ends. So start[i] keeps the previously
+ // assigned value while the i-th subexp is being processed. This makes
+ // backreference to the i-th subexp within the i-th subexp possible.
+ int[] start; // start positions (relative to offset) for each (sub)exp.
+ int[] start1; // start positions (relative to offset) for each (sub)exp.
+ int[] end; // end positions for the same
+ // start[i] == -1 or end[i] == -1 means that the start/end position is void.
+ // start[i] == p or end[i] == p where p < 0 and p != -1 means that
+ // the actual start/end position is (p+1). Start/end positions may
+ // become negative when the subexpression is in a RETokenLookBehind.
+ boolean empty; // empty string matched. This flag is used only within
+ // RETokenRepeated.
+
+ BacktrackStack backtrackStack;
+
+ public Object clone ()
+ {
+ try
+ {
+ REMatch copy = (REMatch) super.clone ();
+
+ copy.start = (int[]) start.clone ();
+ copy.start1 = (int[]) start1.clone ();
+ copy.end = (int[]) end.clone ();
+
+ return copy;
}
-
- /** Clears the current match and moves the offset to the new index. */
- void clear(int index) {
- offset = index;
- this.index = 0;
- for (int i = 0; i < start.length; i++) {
- start[i] = start1[i] = end[i] = -1;
- }
- backtrackStack = null;
+ catch (CloneNotSupportedException e)
+ {
+ throw new Error (); // doesn't happen
}
-
+ }
+
+ void assignFrom (REMatch other)
+ {
+ start = other.start;
+ start1 = other.start1;
+ end = other.end;
+ index = other.index;
+ backtrackStack = other.backtrackStack;
+ }
+
+ REMatch (int subs, int anchor, int eflags)
+ {
+ start = new int[subs + 1];
+ start1 = new int[subs + 1];
+ end = new int[subs + 1];
+ this.anchor = anchor;
+ this.eflags = eflags;
+ clear (anchor);
+ }
+
+ void finish (CharIndexed text)
+ {
+ start[0] = 0;
+ CPStringBuilder sb = new CPStringBuilder ();
+ int i;
+ for (i = 0; i < end[0]; i++)
+ sb.append (text.charAt (i));
+ matchedText = sb.toString ();
+ matchedCharIndexed = text;
+ for (i = 0; i < start.length; i++)
+ {
+ // If any subexpressions didn't terminate, they don't count
+ // TODO check if this code ever gets hit
+ if ((start[i] == -1) ^ (end[i] == -1))
+ {
+ start[i] = -1;
+ end[i] = -1;
+ }
+ }
+ backtrackStack = null;
+ }
+
+ /** Clears the current match and moves the offset to the new index. */
+ void clear (int index)
+ {
+ offset = index;
+ this.index = 0;
+ for (int i = 0; i < start.length; i++)
+ {
+ start[i] = start1[i] = end[i] = -1;
+ }
+ backtrackStack = null;
+ }
+
/**
* Returns the string matching the pattern. This makes it convenient
* to write code like the following:
@@ -150,18 +165,20 @@ public final class REMatch implements Serializable, Cloneable {
* if (myMatch != null) System.out.println("Regexp found: "+myMatch);
* </code>
*/
- public String toString() {
- return matchedText;
- }
-
+ public String toString ()
+ {
+ return matchedText;
+ }
+
/**
* Returns the index within the input text where the match in its entirety
* began.
*/
- public int getStartIndex() {
- return offset + start[0];
- }
-
+ public int getStartIndex ()
+ {
+ return offset + start[0];
+ }
+
/**
* Returns the index within the input string where the match in
* its entirety ends. The return value is the next position after
@@ -179,10 +196,11 @@ public final class REMatch implements Serializable, Cloneable {
* But you can save yourself that work, since the <code>toString()</code>
* method (above) does exactly that for you.
*/
- public int getEndIndex() {
- return offset + end[0];
- }
-
+ public int getEndIndex ()
+ {
+ return offset + end[0];
+ }
+
/**
* Returns the string matching the given subexpression. The subexpressions
* are indexed starting with one, not zero. That is, the subexpression
@@ -191,25 +209,30 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param sub Index of the subexpression.
*/
- public String toString(int sub) {
- if ((sub >= start.length) || sub < 0)
- throw new IndexOutOfBoundsException("No group " + sub);
- if (start[sub] == -1) return null;
- if (start[sub] >= 0 && end[sub] <= matchedText.length())
- return (matchedText.substring(start[sub],end[sub]));
- else {
+ public String toString (int sub)
+ {
+ if ((sub >= start.length) || sub < 0)
+ throw new IndexOutOfBoundsException ("No group " + sub);
+ if (start[sub] == -1)
+ return null;
+ if (start[sub] >= 0 && end[sub] <= matchedText.length ())
+ return (matchedText.substring (start[sub], end[sub]));
+ else
+ {
// This case occurs with RETokenLookAhead or RETokenLookBehind.
- StringBuffer sb = new StringBuffer();
- int s = start[sub];
- int e = end[sub];
- if (s < 0) s += 1;
- if (e < 0) e += 1;
- for (int i = start[0] + s; i < start[0] + e; i++)
- sb.append(matchedCharIndexed.charAt(i));
- return sb.toString();
- }
- }
-
+ CPStringBuilder sb = new CPStringBuilder ();
+ int s = start[sub];
+ int e = end[sub];
+ if (s < 0)
+ s += 1;
+ if (e < 0)
+ e += 1;
+ for (int i = start[0] + s; i < start[0] + e; i++)
+ sb.append (matchedCharIndexed.charAt (i));
+ return sb.toString ();
+ }
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> begins, or <code>-1</code> if
@@ -218,13 +241,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @deprecated Use getStartIndex(int) instead.
*/
- public int getSubStartIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = start[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getSubStartIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = start[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> begins, or <code>-1</code> if
@@ -233,13 +257,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @since gnu.regexp 1.1.0
*/
- public int getStartIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = start[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getStartIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = start[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> ends, or <code>-1</code> if
@@ -248,13 +273,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @deprecated Use getEndIndex(int) instead
*/
- public int getSubEndIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = end[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getSubEndIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = end[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> ends, or <code>-1</code> if
@@ -262,13 +288,14 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param sub Subexpression index
*/
- public int getEndIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = end[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getEndIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = end[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Substitute the results of this match to create a new string.
* This is patterned after PERL, so the tokens to watch out for are
@@ -280,31 +307,42 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param input A string consisting of literals and <code>$<i>n</i></code> tokens.
*/
- public String substituteInto(String input) {
- // a la Perl, $0 is whole thing, $1 - $9 are subexpressions
- StringBuffer output = new StringBuffer();
- int pos;
- for (pos = 0; pos < input.length()-1; pos++) {
- if ((input.charAt(pos) == '$') && (Character.isDigit(input.charAt(pos+1)))) {
- int val = Character.digit(input.charAt(++pos),10);
- int pos1 = pos + 1;
- while (pos1 < input.length() &&
- Character.isDigit(input.charAt(pos1))) {
- int val1 = val*10 + Character.digit(input.charAt(pos1),10);
- if (val1 >= start.length) break;
- pos1++;
- val = val1;
- }
- pos = pos1 - 1;
-
- if (val < start.length) {
- output.append(toString(val));
- }
- } else output.append(input.charAt(pos));
- }
- if (pos < input.length()) output.append(input.charAt(pos));
- return output.toString();
- }
+ public String substituteInto (String input)
+ {
+ // a la Perl, $0 is whole thing, $1 - $9 are subexpressions
+ CPStringBuilder output = new CPStringBuilder ();
+ int pos;
+ for (pos = 0; pos < input.length () - 1; pos++)
+ {
+ if ((input.charAt (pos) == '$')
+ && (Character.isDigit (input.charAt (pos + 1))))
+ {
+ int val = Character.digit (input.charAt (++pos), 10);
+ int pos1 = pos + 1;
+ while (pos1 < input.length () &&
+ Character.isDigit (input.charAt (pos1)))
+ {
+ int val1 =
+ val * 10 + Character.digit (input.charAt (pos1), 10);
+ if (val1 >= start.length)
+ break;
+ pos1++;
+ val = val1;
+ }
+ pos = pos1 - 1;
+
+ if (val < start.length)
+ {
+ output.append (toString (val));
+ }
+ }
+ else
+ output.append (input.charAt (pos));
+ }
+ if (pos < input.length ())
+ output.append (input.charAt (pos));
+ return output.toString ();
+ }
/* The following are used for debugging purpose
public static String d(REMatch m) {
diff --git a/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java b/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
index bc700be..f0c78be 100644
--- a/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
+++ b/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
@@ -36,6 +36,9 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
import java.util.Enumeration;
import java.util.NoSuchElementException;
@@ -66,20 +69,23 @@ import java.util.NoSuchElementException;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public class REMatchEnumeration implements Enumeration, Serializable {
+public class REMatchEnumeration
+ implements Enumeration < REMatch >, Serializable
+{
private static final int YES = 1;
private static final int MAYBE = 0;
private static final int NO = -1;
-
+
private int more;
private REMatch match;
- private RE expr;
- private CharIndexed input;
- private int eflags;
- private int index;
+ private final RE expr;
+ private final CharIndexed input;
+ private final int eflags;
+ private int index;
// Package scope constructor is used by RE.getMatchEnumeration()
- REMatchEnumeration(RE expr, CharIndexed input, int index, int eflags) {
+ REMatchEnumeration (RE expr, CharIndexed input, int index, int eflags)
+ {
more = MAYBE;
this.expr = expr;
this.input = input;
@@ -88,48 +94,48 @@ public class REMatchEnumeration implements Enumeration, Serializable {
}
/** Returns true if there are more matches in the input text. */
- public boolean hasMoreElements() {
- return hasMoreMatches(null);
+ public boolean hasMoreElements ()
+ {
+ return hasMoreMatches (null);
}
/** Returns true if there are more matches in the input text. */
- public boolean hasMoreMatches() {
- return hasMoreMatches(null);
+ public boolean hasMoreMatches ()
+ {
+ return hasMoreMatches (null);
}
/** Returns true if there are more matches in the input text.
* Saves the text leading up to the match (or to the end of the input)
* in the specified buffer.
*/
- public boolean hasMoreMatches(StringBuffer buffer) {
- if (more == MAYBE) {
- match = expr.getMatchImpl(input,index,eflags,buffer);
- if (match != null) {
- input.move((match.end[0] > 0) ? match.end[0] : 1);
-
- index = (match.end[0] > 0) ? match.end[0] + match.offset : index + 1;
+ public boolean hasMoreMatches (CPStringBuilder buffer)
+ {
+ if (more == MAYBE)
+ {
+ match = expr.getMatchImpl (input, index, eflags, buffer);
+ if (match != null)
+ {
+ input.move ((match.end[0] > 0) ? match.end[0] : 1);
+
+ index =
+ (match.end[0] > 0) ? match.end[0] + match.offset : index + 1;
more = YES;
- } else more = NO;
- }
+ }
+ else
+ more = NO;
+ }
return (more == YES);
}
/** Returns the next match in the input text. */
- public Object nextElement() throws NoSuchElementException {
- return nextMatch();
- }
-
- /**
- * Returns the next match in the input text. This method is provided
- * for convenience to avoid having to explicitly cast the return value
- * to class REMatch.
- */
- public REMatch nextMatch() throws NoSuchElementException {
- if (hasMoreElements()) {
- more = (input.isValid()) ? MAYBE : NO;
+ public REMatch nextElement () throws NoSuchElementException
+ {
+ if (hasMoreElements ())
+ {
+ more = (input.isValid ())? MAYBE : NO;
return match;
- }
- throw new NoSuchElementException();
+ }
+ throw new NoSuchElementException ();
}
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RESyntax.java b/libjava/classpath/gnu/java/util/regex/RESyntax.java
index db11e2d..38d7056 100644
--- a/libjava/classpath/gnu/java/util/regex/RESyntax.java
+++ b/libjava/classpath/gnu/java/util/regex/RESyntax.java
@@ -51,102 +51,104 @@ import java.util.BitSet;
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public final class RESyntax implements Serializable {
- static final String DEFAULT_LINE_SEPARATOR = System.getProperty("line.separator");
+public final class RESyntax implements Serializable
+{
+ static final String DEFAULT_LINE_SEPARATOR =
+ System.getProperty ("line.separator");
- private BitSet bits;
+ private BitSet bits;
- // true for the constant defined syntaxes
- private boolean isFinal = false;
+ // true for the constant defined syntaxes
+ private boolean isFinal = false;
- private String lineSeparator = DEFAULT_LINE_SEPARATOR;
+ private String lineSeparator = DEFAULT_LINE_SEPARATOR;
// Values for constants are bit indexes
/**
* Syntax bit. Backslash is an escape character in lists.
*/
- public static final int RE_BACKSLASH_ESCAPE_IN_LISTS = 0;
+ public static final int RE_BACKSLASH_ESCAPE_IN_LISTS = 0;
/**
* Syntax bit. Use \? instead of ? and \+ instead of +.
*/
- public static final int RE_BK_PLUS_QM = 1;
+ public static final int RE_BK_PLUS_QM = 1;
/**
* Syntax bit. POSIX character classes ([:...:]) in lists are allowed.
*/
- public static final int RE_CHAR_CLASSES = 2;
+ public static final int RE_CHAR_CLASSES = 2;
/**
* Syntax bit. ^ and $ are special everywhere.
* <B>Not implemented.</B>
*/
- public static final int RE_CONTEXT_INDEP_ANCHORS = 3;
+ public static final int RE_CONTEXT_INDEP_ANCHORS = 3;
/**
* Syntax bit. Repetition operators are only special in valid positions.
* <B>Not implemented.</B>
*/
- public static final int RE_CONTEXT_INDEP_OPS = 4;
+ public static final int RE_CONTEXT_INDEP_OPS = 4;
/**
* Syntax bit. Repetition and alternation operators are invalid
* at start and end of pattern and other places.
* <B>Not implemented</B>.
*/
- public static final int RE_CONTEXT_INVALID_OPS = 5;
+ public static final int RE_CONTEXT_INVALID_OPS = 5;
/**
* Syntax bit. Match-any-character operator (.) matches a newline.
*/
- public static final int RE_DOT_NEWLINE = 6;
+ public static final int RE_DOT_NEWLINE = 6;
/**
* Syntax bit. Match-any-character operator (.) does not match a null.
*/
- public static final int RE_DOT_NOT_NULL = 7;
+ public static final int RE_DOT_NOT_NULL = 7;
/**
* Syntax bit. Intervals ({x}, {x,}, {x,y}) are allowed.
*/
- public static final int RE_INTERVALS = 8;
+ public static final int RE_INTERVALS = 8;
/**
* Syntax bit. No alternation (|), match one-or-more (+), or
* match zero-or-one (?) operators.
*/
- public static final int RE_LIMITED_OPS = 9;
+ public static final int RE_LIMITED_OPS = 9;
/**
* Syntax bit. Newline is an alternation operator.
*/
- public static final int RE_NEWLINE_ALT = 10; // impl.
+ public static final int RE_NEWLINE_ALT = 10; // impl.
/**
* Syntax bit. Intervals use { } instead of \{ \}
*/
- public static final int RE_NO_BK_BRACES = 11;
+ public static final int RE_NO_BK_BRACES = 11;
/**
* Syntax bit. Grouping uses ( ) instead of \( \).
*/
- public static final int RE_NO_BK_PARENS = 12;
+ public static final int RE_NO_BK_PARENS = 12;
/**
* Syntax bit. Backreferences not allowed.
*/
- public static final int RE_NO_BK_REFS = 13;
+ public static final int RE_NO_BK_REFS = 13;
/**
* Syntax bit. Alternation uses | instead of \|
*/
- public static final int RE_NO_BK_VBAR = 14;
+ public static final int RE_NO_BK_VBAR = 14;
/**
* Syntax bit. <B>Not implemented</B>.
*/
- public static final int RE_NO_EMPTY_RANGES = 15;
+ public static final int RE_NO_EMPTY_RANGES = 15;
/**
* Syntax bit. An unmatched right parenthesis (')' or '\)', depending
@@ -157,80 +159,80 @@ public final class RESyntax implements Serializable {
/**
* Syntax bit. <B>Not implemented.</B>
*/
- public static final int RE_HAT_LISTS_NOT_NEWLINE = 17;
+ public static final int RE_HAT_LISTS_NOT_NEWLINE = 17;
/**
* Syntax bit. Stingy matching is allowed (+?, *?, ??, {x,y}?).
*/
- public static final int RE_STINGY_OPS = 18;
+ public static final int RE_STINGY_OPS = 18;
/**
* Syntax bit. Allow character class escapes (\d, \D, \s, \S, \w, \W).
*/
- public static final int RE_CHAR_CLASS_ESCAPES = 19;
+ public static final int RE_CHAR_CLASS_ESCAPES = 19;
/**
* Syntax bit. Allow use of (?:xxx) grouping (subexpression is not saved).
*/
- public static final int RE_PURE_GROUPING = 20;
+ public static final int RE_PURE_GROUPING = 20;
/**
* Syntax bit. Allow use of (?=xxx) and (?!xxx) apply the subexpression
* to the text following the current position without consuming that text.
*/
- public static final int RE_LOOKAHEAD = 21;
+ public static final int RE_LOOKAHEAD = 21;
/**
* Syntax bit. Allow beginning- and end-of-string anchors (\A, \Z).
*/
- public static final int RE_STRING_ANCHORS = 22;
+ public static final int RE_STRING_ANCHORS = 22;
/**
* Syntax bit. Allow embedded comments, (?#comment), as in Perl5.
*/
- public static final int RE_COMMENTS = 23;
+ public static final int RE_COMMENTS = 23;
/**
* Syntax bit. Allow character class escapes within lists, as in Perl5.
*/
- public static final int RE_CHAR_CLASS_ESC_IN_LISTS = 24;
+ public static final int RE_CHAR_CLASS_ESC_IN_LISTS = 24;
/**
* Syntax bit. Possessive matching is allowed (++, *+, ?+, {x,y}+).
*/
- public static final int RE_POSSESSIVE_OPS = 25;
+ public static final int RE_POSSESSIVE_OPS = 25;
/**
* Syntax bit. Allow embedded flags, (?is-x), as in Perl5.
*/
- public static final int RE_EMBEDDED_FLAGS = 26;
+ public static final int RE_EMBEDDED_FLAGS = 26;
/**
* Syntax bit. Allow octal char (\0377), as in Perl5.
*/
- public static final int RE_OCTAL_CHAR = 27;
+ public static final int RE_OCTAL_CHAR = 27;
/**
* Syntax bit. Allow hex char (\x1b), as in Perl5.
*/
- public static final int RE_HEX_CHAR = 28;
+ public static final int RE_HEX_CHAR = 28;
/**
* Syntax bit. Allow Unicode char (\u1234), as in Java 1.4.
*/
- public static final int RE_UNICODE_CHAR = 29;
+ public static final int RE_UNICODE_CHAR = 29;
/**
* Syntax bit. Allow named property (\p{P}, \P{p}), as in Perl5.
*/
- public static final int RE_NAMED_PROPERTY = 30;
+ public static final int RE_NAMED_PROPERTY = 30;
/**
* Syntax bit. Allow nested characterclass ([a-z&&[^p-r]]), as in Java 1.4.
*/
- public static final int RE_NESTED_CHARCLASS = 31;
+ public static final int RE_NESTED_CHARCLASS = 31;
- private static final int BIT_TOTAL = 32;
+ private static final int BIT_TOTAL = 32;
/**
* Predefined syntax.
@@ -315,13 +317,13 @@ public final class RESyntax implements Serializable {
* Emulates regular expression support in Larry Wall's perl, version 4,
* using single line mode (/s modifier).
*/
- public static final RESyntax RE_SYNTAX_PERL4_S; // single line mode (/s)
+ public static final RESyntax RE_SYNTAX_PERL4_S; // single line mode (/s)
/**
* Predefined syntax.
* Emulates regular expression support in Larry Wall's perl, version 5.
*/
- public static final RESyntax RE_SYNTAX_PERL5;
+ public static final RESyntax RE_SYNTAX_PERL5;
/**
* Predefined syntax.
@@ -335,145 +337,109 @@ public final class RESyntax implements Serializable {
* Emulates regular expression support in Java 1.4's java.util.regex
* package.
*/
- public static final RESyntax RE_SYNTAX_JAVA_1_4;
-
- static {
- // Define syntaxes
-
- RE_SYNTAX_EMACS = new RESyntax().makeFinal();
-
- RESyntax RE_SYNTAX_POSIX_COMMON = new RESyntax()
- .set(RE_CHAR_CLASSES)
- .set(RE_DOT_NEWLINE)
- .set(RE_DOT_NOT_NULL)
- .set(RE_INTERVALS)
- .set(RE_NO_EMPTY_RANGES)
- .makeFinal();
-
- RE_SYNTAX_POSIX_BASIC = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_BK_PLUS_QM)
- .makeFinal();
-
- RE_SYNTAX_POSIX_EXTENDED = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- RE_SYNTAX_AWK = new RESyntax()
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .set(RE_DOT_NOT_NULL)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_REFS)
- .set(RE_NO_BK_VBAR)
- .set(RE_NO_EMPTY_RANGES)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- RE_SYNTAX_POSIX_AWK = new RESyntax(RE_SYNTAX_POSIX_EXTENDED)
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .makeFinal();
-
- RE_SYNTAX_GREP = new RESyntax()
- .set(RE_BK_PLUS_QM)
- .set(RE_CHAR_CLASSES)
- .set(RE_HAT_LISTS_NOT_NEWLINE)
- .set(RE_INTERVALS)
- .set(RE_NEWLINE_ALT)
- .makeFinal();
-
- RE_SYNTAX_EGREP = new RESyntax()
- .set(RE_CHAR_CLASSES)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS)
- .set(RE_HAT_LISTS_NOT_NEWLINE)
- .set(RE_NEWLINE_ALT)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .makeFinal();
-
- RE_SYNTAX_POSIX_EGREP = new RESyntax(RE_SYNTAX_EGREP)
- .set(RE_INTERVALS)
- .set(RE_NO_BK_BRACES)
- .makeFinal();
-
- /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
-
- RE_SYNTAX_ED = new RESyntax(RE_SYNTAX_POSIX_BASIC)
- .makeFinal();
-
- RE_SYNTAX_SED = new RESyntax(RE_SYNTAX_POSIX_BASIC)
- .makeFinal();
-
- RE_SYNTAX_POSIX_MINIMAL_BASIC = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_LIMITED_OPS)
- .makeFinal();
-
- /* Differs from RE_SYNTAX_POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
- replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
-
- RE_SYNTAX_POSIX_MINIMAL_EXTENDED = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INVALID_OPS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_REFS)
- .set(RE_NO_BK_VBAR)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- /* There is no official Perl spec, but here's a "best guess" */
-
- RE_SYNTAX_PERL4 = new RESyntax()
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS) // except for '{', apparently
- .set(RE_INTERVALS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .set(RE_NO_EMPTY_RANGES)
- .set(RE_CHAR_CLASS_ESCAPES) // \d,\D,\w,\W,\s,\S
- .makeFinal();
-
- RE_SYNTAX_PERL4_S = new RESyntax(RE_SYNTAX_PERL4)
- .set(RE_DOT_NEWLINE)
- .makeFinal();
-
- RE_SYNTAX_PERL5 = new RESyntax(RE_SYNTAX_PERL4)
- .set(RE_PURE_GROUPING) // (?:)
- .set(RE_STINGY_OPS) // *?,??,+?,{}?
- .set(RE_LOOKAHEAD) // (?=)(?!)
- .set(RE_STRING_ANCHORS) // \A,\Z
- .set(RE_CHAR_CLASS_ESC_IN_LISTS)// \d,\D,\w,\W,\s,\S within []
- .set(RE_COMMENTS) // (?#)
- .set(RE_EMBEDDED_FLAGS) // (?imsx-imsx)
- .set(RE_OCTAL_CHAR) // \0377
- .set(RE_HEX_CHAR) // \x1b
- .set(RE_NAMED_PROPERTY) // \p{prop}, \P{prop}
- .makeFinal();
-
- RE_SYNTAX_PERL5_S = new RESyntax(RE_SYNTAX_PERL5)
- .set(RE_DOT_NEWLINE)
- .makeFinal();
-
- RE_SYNTAX_JAVA_1_4 = new RESyntax(RE_SYNTAX_PERL5)
- // XXX
- .set(RE_POSSESSIVE_OPS) // *+,?+,++,{}+
- .set(RE_UNICODE_CHAR) // \u1234
- .set(RE_NESTED_CHARCLASS) // [a-z&&[^p-r]]
- .makeFinal();
+ public static final RESyntax RE_SYNTAX_JAVA_1_4;
+
+ static
+ {
+ // Define syntaxes
+
+ RE_SYNTAX_EMACS = new RESyntax ().makeFinal ();
+
+ RESyntax RE_SYNTAX_POSIX_COMMON =
+ new RESyntax ().set (RE_CHAR_CLASSES).set (RE_DOT_NEWLINE).
+ set (RE_DOT_NOT_NULL).set (RE_INTERVALS).set (RE_NO_EMPTY_RANGES).
+ makeFinal ();
+
+ RE_SYNTAX_POSIX_BASIC =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_BK_PLUS_QM).makeFinal ();
+
+ RE_SYNTAX_POSIX_EXTENDED =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INDEP_OPS).set (RE_NO_BK_BRACES).set (RE_NO_BK_PARENS).
+ set (RE_NO_BK_VBAR).set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ RE_SYNTAX_AWK =
+ new RESyntax ().set (RE_BACKSLASH_ESCAPE_IN_LISTS).
+ set (RE_DOT_NOT_NULL).set (RE_NO_BK_PARENS).set (RE_NO_BK_REFS).
+ set (RE_NO_BK_VBAR).set (RE_NO_EMPTY_RANGES).
+ set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ RE_SYNTAX_POSIX_AWK =
+ new RESyntax (RE_SYNTAX_POSIX_EXTENDED).
+ set (RE_BACKSLASH_ESCAPE_IN_LISTS).makeFinal ();
+
+ RE_SYNTAX_GREP =
+ new RESyntax ().set (RE_BK_PLUS_QM).set (RE_CHAR_CLASSES).
+ set (RE_HAT_LISTS_NOT_NEWLINE).set (RE_INTERVALS).set (RE_NEWLINE_ALT).
+ makeFinal ();
+
+ RE_SYNTAX_EGREP =
+ new RESyntax ().set (RE_CHAR_CLASSES).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INDEP_OPS).set (RE_HAT_LISTS_NOT_NEWLINE).
+ set (RE_NEWLINE_ALT).set (RE_NO_BK_PARENS).set (RE_NO_BK_VBAR).
+ makeFinal ();
+
+ RE_SYNTAX_POSIX_EGREP =
+ new RESyntax (RE_SYNTAX_EGREP).set (RE_INTERVALS).set (RE_NO_BK_BRACES).
+ makeFinal ();
+
+ /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+
+ RE_SYNTAX_ED = new RESyntax (RE_SYNTAX_POSIX_BASIC).makeFinal ();
+
+ RE_SYNTAX_SED = new RESyntax (RE_SYNTAX_POSIX_BASIC).makeFinal ();
+
+ RE_SYNTAX_POSIX_MINIMAL_BASIC =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_LIMITED_OPS).makeFinal ();
+
+ /* Differs from RE_SYNTAX_POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+ replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
+
+ RE_SYNTAX_POSIX_MINIMAL_EXTENDED =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INVALID_OPS).set (RE_NO_BK_BRACES).
+ set (RE_NO_BK_PARENS).set (RE_NO_BK_REFS).set (RE_NO_BK_VBAR).
+ set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ /* There is no official Perl spec, but here's a "best guess" */
+
+ RE_SYNTAX_PERL4 = new RESyntax ().set (RE_BACKSLASH_ESCAPE_IN_LISTS).set (RE_CONTEXT_INDEP_ANCHORS).set (RE_CONTEXT_INDEP_OPS) // except for '{', apparently
+ .set (RE_INTERVALS).set (RE_NO_BK_BRACES).set (RE_NO_BK_PARENS).set (RE_NO_BK_VBAR).set (RE_NO_EMPTY_RANGES).set (RE_CHAR_CLASS_ESCAPES) // \d,\D,\w,\W,\s,\S
+ .makeFinal ();
+
+ RE_SYNTAX_PERL4_S =
+ new RESyntax (RE_SYNTAX_PERL4).set (RE_DOT_NEWLINE).makeFinal ();
+
+ RE_SYNTAX_PERL5 = new RESyntax (RE_SYNTAX_PERL4).set (RE_PURE_GROUPING) // (?:)
+ .set (RE_STINGY_OPS) // *?,??,+?,{}?
+ .set (RE_LOOKAHEAD) // (?=)(?!)
+ .set (RE_STRING_ANCHORS) // \A,\Z
+ .set (RE_CHAR_CLASS_ESC_IN_LISTS) // \d,\D,\w,\W,\s,\S within []
+ .set (RE_COMMENTS) // (?#)
+ .set (RE_EMBEDDED_FLAGS) // (?imsx-imsx)
+ .set (RE_OCTAL_CHAR) // \0377
+ .set (RE_HEX_CHAR) // \x1b
+ .set (RE_NAMED_PROPERTY) // \p{prop}, \P{prop}
+ .makeFinal ();
+
+ RE_SYNTAX_PERL5_S =
+ new RESyntax (RE_SYNTAX_PERL5).set (RE_DOT_NEWLINE).makeFinal ();
+
+ RE_SYNTAX_JAVA_1_4 = new RESyntax (RE_SYNTAX_PERL5)
+ // XXX
+ .set (RE_POSSESSIVE_OPS) // *+,?+,++,{}+
+ .set (RE_UNICODE_CHAR) // \u1234
+ .set (RE_NESTED_CHARCLASS) // [a-z&&[^p-r]]
+ .makeFinal ();
}
/**
* Construct a new syntax object with all bits turned off.
* This is equivalent to RE_SYNTAX_EMACS.
*/
- public RESyntax() {
- bits = new BitSet(BIT_TOTAL);
+ public RESyntax ()
+ {
+ bits = new BitSet (BIT_TOTAL);
}
/**
@@ -484,24 +450,27 @@ public final class RESyntax implements Serializable {
*
* @return this object for convenient chaining
*/
- public RESyntax makeFinal() {
- isFinal = true;
- return this;
- }
+ public RESyntax makeFinal ()
+ {
+ isFinal = true;
+ return this;
+ }
/**
* Construct a new syntax object with all bits set the same
* as the other syntax.
*/
- public RESyntax(RESyntax other) {
- bits = (BitSet) other.bits.clone();
+ public RESyntax (RESyntax other)
+ {
+ bits = (BitSet) other.bits.clone ();
}
/**
* Check if a given bit is set in this syntax.
*/
- public boolean get(int index) {
- return bits.get(index);
+ public boolean get (int index)
+ {
+ return bits.get (index);
}
/**
@@ -510,10 +479,11 @@ public final class RESyntax implements Serializable {
* @param index the constant (RESyntax.RE_xxx) bit to set.
* @return a reference to this object for easy chaining.
*/
- public RESyntax set(int index) {
+ public RESyntax set (int index)
+ {
if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- bits.set(index);
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ bits.set (index);
return this;
}
@@ -523,11 +493,12 @@ public final class RESyntax implements Serializable {
* @param index the constant (RESyntax.RE_xxx) bit to clear.
* @return a reference to this object for easy chaining.
*/
- public RESyntax clear(int index) {
- if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- bits.clear(index);
- return this;
+ public RESyntax clear (int index)
+ {
+ if (isFinal)
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ bits.clear (index);
+ return this;
}
/**
@@ -547,18 +518,20 @@ public final class RESyntax implements Serializable {
*
* @return this object for convenient chaining
*/
- public RESyntax setLineSeparator(String aSeparator) {
- if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- lineSeparator = aSeparator;
- return this;
- }
+ public RESyntax setLineSeparator (String aSeparator)
+ {
+ if (isFinal)
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ lineSeparator = aSeparator;
+ return this;
+ }
/**
* Returns the currently active line separator string. The default
* is the platform-dependent system property "line.separator".
*/
- public String getLineSeparator() {
- return lineSeparator;
- }
+ public String getLineSeparator ()
+ {
+ return lineSeparator;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/REToken.java b/libjava/classpath/gnu/java/util/regex/REToken.java
index addc622..681ac51 100644
--- a/libjava/classpath/gnu/java/util/regex/REToken.java
+++ b/libjava/classpath/gnu/java/util/regex/REToken.java
@@ -36,65 +36,84 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
-abstract class REToken implements Serializable, Cloneable {
+abstract class REToken implements Serializable, Cloneable
+{
protected REToken next = null;
protected REToken uncle = null;
protected int subIndex;
protected boolean unicodeAware = true;
- public Object clone() {
- try {
- REToken copy = (REToken) super.clone();
- return copy;
- } catch (CloneNotSupportedException e) {
- throw new Error(); // doesn't happen
+ public Object clone ()
+ {
+ try
+ {
+ REToken copy = (REToken) super.clone ();
+ return copy;
+ }
+ catch (CloneNotSupportedException e)
+ {
+ throw new Error (); // doesn't happen
}
}
- protected REToken(int subIndex) {
- this.subIndex = subIndex;
+ protected REToken (int subIndex)
+ {
+ this.subIndex = subIndex;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 0;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return Integer.MAX_VALUE;
}
- void setUncle(REToken anUncle) {
+ void setUncle (REToken anUncle)
+ {
uncle = anUncle;
}
/** Returns true if the match succeeded, false if it failed. */
- boolean match(CharIndexed input, REMatch mymatch) {
- return match(input, mymatch, false);
- }
- boolean matchFake(CharIndexed input, REMatch mymatch) {
- return match(input, mymatch, true);
- }
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ return match (input, mymatch, false);
+ }
+ boolean matchFake (CharIndexed input, REMatch mymatch)
+ {
+ return match (input, mymatch, true);
+ }
- private boolean match(CharIndexed input, REMatch mymatch, boolean fake) {
- if (!fake) {
- setHitEnd(input, mymatch);
- }
- REMatch m = matchThis(input, mymatch);
- if (m == null) return false;
- if (next(input, m)) {
- mymatch.assignFrom(m);
- return true;
- }
- return false;
- }
+ private boolean match (CharIndexed input, REMatch mymatch, boolean fake)
+ {
+ if (!fake)
+ {
+ setHitEnd (input, mymatch);
+ }
+ REMatch m = matchThis (input, mymatch);
+ if (m == null)
+ return false;
+ if (next (input, m))
+ {
+ mymatch.assignFrom (m);
+ return true;
+ }
+ return false;
+ }
/** Sets whether the matching occurs at the end of input */
- void setHitEnd(CharIndexed input, REMatch mymatch) {
- input.setHitEnd(mymatch);
- }
+ void setHitEnd (CharIndexed input, REMatch mymatch)
+ {
+ input.setHitEnd (mymatch);
+ }
/** Returns true if the match succeeded, false if it failed.
* The matching is done against this REToken only. Chained
@@ -106,22 +125,27 @@ abstract class REToken implements Serializable, Cloneable {
* subclasses of REToken, which needs a special match method,
* do not have to implement this method.
*/
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- throw new UnsupportedOperationException(
- "This REToken does not have a matchThis method");
- }
-
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ throw new
+ UnsupportedOperationException
+ ("This REToken does not have a matchThis method");
+ }
+
/** Returns true if the rest of the tokens match, false if they fail. */
- protected boolean next(CharIndexed input, REMatch mymatch) {
- REToken nextToken = getNext();
- if (nextToken == null) return true;
- return nextToken.match(input, mymatch);
- }
+ protected boolean next (CharIndexed input, REMatch mymatch)
+ {
+ REToken nextToken = getNext ();
+ if (nextToken == null)
+ return true;
+ return nextToken.match (input, mymatch);
+ }
/** Returns the next REToken chained to this REToken. */
- REToken getNext() {
- return (next != null ? next : uncle);
- }
+ REToken getNext ()
+ {
+ return (next != null ? next : uncle);
+ }
/** Finds a match at the position specified by the given REMatch.
* If necessary, adds a BacktrackStack.Backtrack object to backtrackStack
@@ -132,45 +156,55 @@ abstract class REToken implements Serializable, Cloneable {
* @param mymatch Position at which a match should be found
* @return REMatch object if a match was found, null otherwise.
*/
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- boolean b = match(input, mymatch);
- if (b) return mymatch;
- return null;
- }
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ boolean b = match (input, mymatch);
+ if (b)
+ return mymatch;
+ return null;
+ }
- boolean returnsFixedLengthMatches() {
- return false;
- }
+ boolean returnsFixedLengthMatches ()
+ {
+ return false;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- throw new UnsupportedOperationException(
- "This token does not support findFixedLengthMatches");
- }
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ throw new
+ UnsupportedOperationException
+ ("This token does not support findFixedLengthMatches");
+ }
/**
* Backtrack to another possibility.
* Ordinary REToken cannot do anything if this method is called.
*/
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- throw new IllegalStateException("This token cannot be backtracked to");
- }
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ throw new IllegalStateException ("This token cannot be backtracked to");
+ }
- boolean chain(REToken token) {
- next = token;
- return true; // Token was accepted
+ boolean chain (REToken token)
+ {
+ next = token;
+ return true; // Token was accepted
}
- abstract void dump(StringBuffer os);
+ abstract void dump (CPStringBuilder os);
- void dumpAll(StringBuffer os) {
- dump(os);
- if (next != null) next.dumpAll(os);
+ void dumpAll (CPStringBuilder os)
+ {
+ dump (os);
+ if (next != null)
+ next.dumpAll (os);
}
- public String toString() {
- StringBuffer os = new StringBuffer();
- dump(os);
- return os.toString();
+ public String toString ()
+ {
+ CPStringBuilder os = new CPStringBuilder ();
+ dump (os);
+ return os.toString ();
}
/**
@@ -181,9 +215,12 @@ abstract class REToken implements Serializable, Cloneable {
* @return the lowercase equivalent of the character, if any;
* otherwise, the character itself.
*/
- public static char toLowerCase(char ch, boolean unicodeAware) {
- if (unicodeAware) return Character.toLowerCase(ch);
- if (ch >= 'A' && ch <= 'Z') return (char)(ch + 'a' - 'A');
+ public static char toLowerCase (char ch, boolean unicodeAware)
+ {
+ if (unicodeAware)
+ return Character.toLowerCase (ch);
+ if (ch >= 'A' && ch <= 'Z')
+ return (char) (ch + 'a' - 'A');
return ch;
}
@@ -195,9 +232,12 @@ abstract class REToken implements Serializable, Cloneable {
* @return the uppercase equivalent of the character, if any;
* otherwise, the character itself.
*/
- public static char toUpperCase(char ch, boolean unicodeAware) {
- if (unicodeAware) return Character.toUpperCase(ch);
- if (ch >= 'a' && ch <= 'z') return (char)(ch + 'A' - 'a');
+ public static char toUpperCase (char ch, boolean unicodeAware)
+ {
+ if (unicodeAware)
+ return Character.toUpperCase (ch);
+ if (ch >= 'a' && ch <= 'z')
+ return (char) (ch + 'A' - 'a');
return ch;
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenAny.java b/libjava/classpath/gnu/java/util/regex/RETokenAny.java
index b99a547..c002d05 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenAny.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenAny.java
@@ -38,62 +38,78 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenAny extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenAny extends REToken
+{
/** True if '.' can match a newline (RE_DOT_NEWLINE) */
- private boolean newline;
+ private boolean newline;
/** True if '.' can't match a null (RE_DOT_NOT_NULL) */
- private boolean matchNull;
-
- RETokenAny(int subIndex, boolean newline, boolean matchNull) {
- super(subIndex);
+ private boolean matchNull;
+
+ RETokenAny (int subIndex, boolean newline, boolean matchNull)
+ {
+ super (subIndex);
this.newline = newline;
this.matchNull = matchNull;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 1;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 1;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
- ++mymatch.index;
- return mymatch;
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
+ ++mymatch.index;
+ return mymatch;
}
- return null;
- }
-
- boolean matchOneChar(char ch) {
- if ((ch == CharIndexed.OUT_OF_BOUNDS)
- || (!newline && (ch == '\n'))
- || (matchNull && (ch == 0))) {
- return false;
+ return null;
+ }
+
+ boolean matchOneChar (char ch)
+ {
+ if ((ch == CharIndexed.OUT_OF_BOUNDS)
+ || (!newline && (ch == '\n')) || (matchNull && (ch == 0)))
+ {
+ return false;
}
- return true;
+ return true;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
int index = mymatch.index;
int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
- numRepeats++;
- }
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
+ numRepeats++;
+ }
return numRepeats;
}
- void dump(StringBuffer os) {
- os.append('.');
+ void dump (CPStringBuilder os)
+ {
+ os.append ('.');
}
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java b/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
index 3a912f9..8f14622 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
@@ -38,49 +38,63 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenBackRef extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenBackRef extends REToken
+{
private int num;
private boolean insens;
-
- RETokenBackRef(int subIndex, int num, boolean insens) {
- super(subIndex);
+
+ RETokenBackRef (int subIndex, int num, boolean insens)
+ {
+ super (subIndex);
this.num = num;
this.insens = insens;
}
// should implement getMinimumLength() -- any ideas?
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- if (num >= mymatch.start.length) return null;
- if (num >= mymatch.end.length) return null;
- int b,e;
- b = mymatch.start[num];
- e = mymatch.end[num];
- if ((b==-1)||(e==-1)) return null; // this shouldn't happen, but...
- if (b < 0) b += 1;
- if (e < 0) e += 1;
- for (int i=b; i<e; i++) {
- char c1 = input.charAt(mymatch.index+i-b);
- char c2 = input.charAt(i);
- if (c1 != c2) {
- if (insens) {
- if (c1 != toLowerCase(c2, unicodeAware) &&
- c1 != toUpperCase(c2, unicodeAware)) {
- return null;
- }
- }
- else {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ if (num >= mymatch.start.length)
+ return null;
+ if (num >= mymatch.end.length)
+ return null;
+ int b, e;
+ b = mymatch.start[num];
+ e = mymatch.end[num];
+ if ((b == -1) || (e == -1))
+ return null; // this shouldn't happen, but...
+ if (b < 0)
+ b += 1;
+ if (e < 0)
+ e += 1;
+ for (int i = b; i < e; i++)
+ {
+ char c1 = input.charAt (mymatch.index + i - b);
+ char c2 = input.charAt (i);
+ if (c1 != c2)
+ {
+ if (insens)
+ {
+ if (c1 != toLowerCase (c2, unicodeAware) &&
+ c1 != toUpperCase (c2, unicodeAware))
+ {
return null;
- }
- }
- }
- mymatch.index += e-b;
- return mymatch;
- }
-
- void dump(StringBuffer os) {
- os.append('\\').append(num);
- }
-}
-
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+ mymatch.index += e - b;
+ return mymatch;
+ }
+ void dump (CPStringBuilder os)
+ {
+ os.append ('\\').append (num);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenChar.java b/libjava/classpath/gnu/java/util/regex/RETokenChar.java
index 42dcd93..babcf3e 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenChar.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenChar.java
@@ -38,98 +38,125 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenChar extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenChar extends REToken
+{
private char[] ch;
private boolean insens;
- RETokenChar(int subIndex, char c, boolean ins) {
- super(subIndex);
+ RETokenChar (int subIndex, char c, boolean ins)
+ {
+ super (subIndex);
insens = ins;
- ch = new char [1];
- ch[0] = c;
+ ch = new char[1];
+ ch[0] = c;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return ch.length;
}
-
- int getMaximumLength() {
+
+ int getMaximumLength ()
+ {
return ch.length;
}
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- if (matchOneString(input, mymatch.index)) {
- mymatch.index += matchedLength;
- return mymatch;
- }
- // java.util.regex.Matcher#hitEnd() requires that the length of
- // partial match be counted.
+
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ if (matchOneString (input, mymatch.index))
+ {
mymatch.index += matchedLength;
- input.setHitEnd(mymatch);
- return null;
- }
-
- private int matchedLength;
- private boolean matchOneString(CharIndexed input, int index) {
- matchedLength = 0;
- int z = ch.length;
- char c;
- for (int i=0; i<z; i++) {
- c = input.charAt(index+i);
- if (! charEquals(c, ch[i])) {
- return false;
- }
- ++matchedLength;
- }
- return true;
- }
-
- private boolean charEquals(char c1, char c2) {
- if (c1 == c2) return true;
- if (! insens) return false;
- if (toLowerCase(c1, unicodeAware) == c2) return true;
- if (toUpperCase(c1, unicodeAware) == c2) return true;
- return false;
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- int z = ch.length;
- while (true) {
- if (numRepeats >= max) break;
- if (matchOneString(input, index)) {
- index += z;
- numRepeats++;
- }
- else break;
- }
- return numRepeats;
- }
+ return mymatch;
+ }
+ // java.util.regex.Matcher#hitEnd() requires that the length of
+ // partial match be counted.
+ mymatch.index += matchedLength;
+ input.setHitEnd (mymatch);
+ return null;
+ }
- // Overrides REToken.chain() to optimize for strings
- boolean chain(REToken next) {
- if (next instanceof RETokenChar && ((RETokenChar)next).insens == insens) {
- RETokenChar cnext = (RETokenChar) next;
- int newsize = ch.length + cnext.ch.length;
-
- char[] chTemp = new char [newsize];
-
- System.arraycopy(ch,0,chTemp,0,ch.length);
- System.arraycopy(cnext.ch,0,chTemp,ch.length,cnext.ch.length);
-
- ch = chTemp;
- if (cnext.next == null)
- return false;
- return chain(cnext.next);
- } else return super.chain(next);
+ private int matchedLength;
+ private boolean matchOneString (CharIndexed input, int index)
+ {
+ matchedLength = 0;
+ int z = ch.length;
+ char c;
+ for (int i = 0; i < z; i++)
+ {
+ c = input.charAt (index + i);
+ if (!charEquals (c, ch[i]))
+ {
+ return false;
+ }
+ ++matchedLength;
+ }
+ return true;
}
- void dump(StringBuffer os) {
- os.append(ch);
+ private boolean charEquals (char c1, char c2)
+ {
+ if (c1 == c2)
+ return true;
+ if (!insens)
+ return false;
+ if (toLowerCase (c1, unicodeAware) == c2)
+ return true;
+ if (toUpperCase (c1, unicodeAware) == c2)
+ return true;
+ return false;
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
}
-}
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ int z = ch.length;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ if (matchOneString (input, index))
+ {
+ index += z;
+ numRepeats++;
+ }
+ else
+ break;
+ }
+ return numRepeats;
+ }
+ // Overrides REToken.chain() to optimize for strings
+ boolean chain (REToken next)
+ {
+ if (next instanceof RETokenChar && ((RETokenChar) next).insens == insens)
+ {
+ RETokenChar cnext = (RETokenChar) next;
+ int newsize = ch.length + cnext.ch.length;
+
+ char[] chTemp = new char[newsize];
+
+ System.arraycopy (ch, 0, chTemp, 0, ch.length);
+ System.arraycopy (cnext.ch, 0, chTemp, ch.length, cnext.ch.length);
+
+ ch = chTemp;
+ if (cnext.next == null)
+ return false;
+ return chain (cnext.next);
+ }
+ else
+ return super.chain (next);
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append (ch);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEnd.java b/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
index 294e320..33e0feb 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
@@ -38,7 +38,10 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenEnd extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenEnd extends REToken
+{
/**
* Indicates whether this token should match on a line break.
*/
@@ -51,74 +54,98 @@ final class RETokenEnd extends REToken {
*/
private boolean fake = false;
- RETokenEnd(int subIndex,String newline) {
- super(subIndex);
+ RETokenEnd (int subIndex, String newline)
+ {
+ super (subIndex);
this.newline = newline;
this.check_java_line_terminators = false;
}
- RETokenEnd(int subIndex, String newline, boolean b) {
- super(subIndex);
+ RETokenEnd (int subIndex, String newline, boolean b)
+ {
+ super (subIndex);
this.newline = newline;
this.check_java_line_terminators = b;
}
- void setFake(boolean fake) {
+ void setFake (boolean fake)
+ {
this.fake = fake;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- boolean match(CharIndexed input, REMatch mymatch) {
- if (!fake) return super.match(input, mymatch);
- return super.matchFake(input, mymatch);
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ if (!fake)
+ return super.match (input, mymatch);
+ return super.matchFake (input, mymatch);
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- if (ch == CharIndexed.OUT_OF_BOUNDS)
- return ((mymatch.eflags & RE.REG_NOTEOL)>0) ?
- null : mymatch;
- if (check_java_line_terminators) {
- if (ch == '\n') {
- char ch1 = input.charAt(mymatch.index - 1);
- if (ch1 == '\r') return null;
- return mymatch;
- }
- if (ch == '\r') return mymatch;
- if (ch == '\u0085') return mymatch; // A next-line character
- if (ch == '\u2028') return mymatch; // A line-separator character
- if (ch == '\u2029') return mymatch; // A paragraph-separator character
- return null;
- }
- if (newline != null) {
- char z;
- int i = 0; // position in newline
- do {
- z = newline.charAt(i);
- if (ch != z) return null;
- ++i;
- ch = input.charAt(mymatch.index + i);
- } while (i < newline.length());
-
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ if (ch == CharIndexed.OUT_OF_BOUNDS)
+ return ((mymatch.eflags & RE.REG_NOTEOL) > 0) ? null : mymatch;
+ if (check_java_line_terminators)
+ {
+ if (ch == '\n')
+ {
+ char ch1 = input.charAt (mymatch.index - 1);
+ if (ch1 == '\r')
+ return null;
return mymatch;
- }
+ }
+ if (ch == '\r')
+ return mymatch;
+ if (ch == '\u0085')
+ return mymatch; // A next-line character
+ if (ch == '\u2028')
+ return mymatch; // A line-separator character
+ if (ch == '\u2029')
+ return mymatch; // A paragraph-separator character
return null;
- }
+ }
+ if (newline != null)
+ {
+ char z;
+ int i = 0; // position in newline
+ do
+ {
+ z = newline.charAt (i);
+ if (ch != z)
+ return null;
+ ++i;
+ ch = input.charAt (mymatch.index + i);
+ }
+ while (i < newline.length ());
+
+ return mymatch;
+ }
+ return null;
+ }
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- REMatch m = (REMatch) mymatch.clone();
- REToken tk = (REToken) this.clone();
- tk.chain(null);
- if (tk.match(input, m)) return max;
- else return 0;
- }
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ REMatch m = (REMatch) mymatch.clone ();
+ REToken tk = (REToken) this.clone ();
+ tk.chain (null);
+ if (tk.match (input, m))
+ return max;
+ else
+ return 0;
+ }
- void dump(StringBuffer os) {
- os.append('$');
+ void dump (CPStringBuilder os)
+ {
+ os.append ('$');
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java b/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
index ea5580e..e4ad619 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
@@ -37,36 +37,52 @@ exception statement from your version. */
package gnu.java.util.regex;
-class RETokenEndOfPreviousMatch extends RETokenStart {
+import gnu.java.lang.CPStringBuilder;
- RETokenEndOfPreviousMatch(int subIndex) {
- super(subIndex, null);
- }
+class RETokenEndOfPreviousMatch extends RETokenStart
+{
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- REMatch lastMatch = input.getLastMatch();
- if (lastMatch == null) return super.matchThis(input, mymatch);
- if (input.getAnchor()+mymatch.index ==
- lastMatch.anchor+lastMatch.index) {
- return mymatch;
- }
- else {
- return null;
- }
- }
+ RETokenEndOfPreviousMatch (int subIndex)
+ {
+ super (subIndex, null);
+ }
- boolean returnsFixedLengthmatches() { return true; }
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- os.append("\\G");
- }
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ REMatch lastMatch = input.getLastMatch ();
+ if (lastMatch == null)
+ return super.matchThis (input, mymatch);
+ if (input.getAnchor () + mymatch.index ==
+ lastMatch.anchor + lastMatch.index)
+ {
+ return mymatch;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ boolean returnsFixedLengthmatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("\\G");
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java b/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
index b3a28a3..0848207 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
@@ -37,34 +37,43 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenEndSub extends REToken {
- RETokenEndSub(int subIndex) {
- super(subIndex);
- }
+import gnu.java.lang.CPStringBuilder;
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- mymatch.start[subIndex] = mymatch.start1[subIndex];
- mymatch.end[subIndex] = mymatch.index;
- return mymatch;
- }
+final class RETokenEndSub extends REToken
+{
+ RETokenEndSub (int subIndex)
+ {
+ super (subIndex);
+ }
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- mymatch.start[subIndex] = mymatch.start1[subIndex];
- mymatch.end[subIndex] = mymatch.index;
- return super.findMatch(input, mymatch);
- }
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- void setHitEnd(CharIndexed input, REMatch mymatch) {
- // Do nothing
- }
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
+ mymatch.end[subIndex] = mymatch.index;
+ return mymatch;
+ }
- void dump(StringBuffer os) {
- // handled by RE
- // But add something for debugging.
- os.append("(?#RETokenEndSub subIndex=" + subIndex + ")");
- }
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
+ mymatch.end[subIndex] = mymatch.index;
+ return super.findMatch (input, mymatch);
+ }
+
+ void setHitEnd (CharIndexed input, REMatch mymatch)
+ {
+ // Do nothing
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ // handled by RE
+ // But add something for debugging.
+ os.append ("(?#RETokenEndSub subIndex=" + subIndex + ")");
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java b/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
index 48f8656..8ad728d 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @author Ito Kazumitsu
*/
@@ -44,35 +46,40 @@ final class RETokenIndependent extends REToken
{
REToken re;
- RETokenIndependent(REToken re) throws REException {
- super(0);
+ RETokenIndependent (REToken re) throws REException
+ {
+ super (0);
this.re = re;
}
- int getMinimumLength() {
- return re.getMinimumLength();
+ int getMinimumLength ()
+ {
+ return re.getMinimumLength ();
}
- int getMaximumLength() {
- return re.getMaximumLength();
+ int getMaximumLength ()
+ {
+ return re.getMaximumLength ();
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- boolean b = re.match(input, mymatch);
- if (b) {
- // Once we have found a match, we do not see other possible matches.
- if (mymatch.backtrackStack != null) mymatch.backtrackStack.clear();
- return mymatch;
+ boolean b = re.match (input, mymatch);
+ if (b)
+ {
+ // Once we have found a match, we do not see other possible matches.
+ if (mymatch.backtrackStack != null)
+ mymatch.backtrackStack.clear ();
+ return mymatch;
- }
+ }
return null;
}
- void dump(StringBuffer os) {
- os.append("(?>");
- re.dumpAll(os);
- os.append(')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?>");
+ re.dumpAll (os);
+ os.append (')');
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java b/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
index 134f17c..1dc6019 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @since gnu.regexp 1.1.3
* @author Shashank Bapat
@@ -46,35 +48,41 @@ final class RETokenLookAhead extends REToken
REToken re;
boolean negative;
- RETokenLookAhead(REToken re, boolean negative) throws REException {
- super(0);
+ RETokenLookAhead (REToken re, boolean negative) throws REException
+ {
+ super (0);
this.re = re;
this.negative = negative;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- REMatch trymatch = (REMatch)mymatch.clone();
- if (re.match(input, trymatch)) {
- if (negative) return null;
- trymatch.index = mymatch.index;
- return trymatch;
- }
- else {
- if (negative) return mymatch;
- return null;
- }
+ REMatch trymatch = (REMatch) mymatch.clone ();
+ if (re.match (input, trymatch))
+ {
+ if (negative)
+ return null;
+ trymatch.index = mymatch.index;
+ return trymatch;
+ }
+ else
+ {
+ if (negative)
+ return mymatch;
+ return null;
+ }
}
- void dump(StringBuffer os) {
- os.append("(?");
- os.append(negative ? '!' : '=');
- re.dumpAll(os);
- os.append(')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?");
+ os.append (negative ? '!' : '=');
+ re.dumpAll (os);
+ os.append (')');
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java b/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
index a01a15b..f61c93c 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @author Ito Kazumitsu
*/
@@ -45,74 +47,90 @@ final class RETokenLookBehind extends REToken
REToken re;
boolean negative;
- RETokenLookBehind(REToken re, boolean negative) throws REException {
- super(0);
+ RETokenLookBehind (REToken re, boolean negative) throws REException
+ {
+ super (0);
this.re = re;
this.negative = negative;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- int max = re.getMaximumLength();
- CharIndexed behind = input.lookBehind(mymatch.index, max);
- REMatch trymatch = (REMatch)mymatch.clone();
- REMatch trymatch1 = (REMatch)mymatch.clone();
- REMatch newMatch = null;
- int diff = behind.length() - input.length();
+ int max = re.getMaximumLength ();
+ CharIndexed behind = input.lookBehind (mymatch.index, max);
+ REMatch trymatch = (REMatch) mymatch.clone ();
+ int diff = behind.length () - input.length ();
int curIndex = trymatch.index + diff;
trymatch.index = 0;
trymatch.offset = 0;
- RETokenMatchHereOnly stopper = new RETokenMatchHereOnly(curIndex);
- REToken re1 = (REToken) re.clone();
- re1.chain(stopper);
- if (re1.match(behind, trymatch)) {
- if (negative) return null;
- for (int i = 0; i < trymatch.start.length; i++) {
- if (trymatch.start[i] != -1 && trymatch.end[i] != -1) {
- trymatch.start[i] -= diff;
- if (trymatch.start[i] < 0) trymatch.start[i] -= 1;
- trymatch.end[i] -= diff;
- if (trymatch.end[i] < 0) trymatch.end[i] -= 1;
+ RETokenMatchHereOnly stopper = new RETokenMatchHereOnly (curIndex);
+ REToken re1 = (REToken) re.clone ();
+ re1.chain (stopper);
+ if (re1.match (behind, trymatch))
+ {
+ if (negative)
+ return null;
+ for (int i = 0; i < trymatch.start.length; i++)
+ {
+ if (trymatch.start[i] != -1 && trymatch.end[i] != -1)
+ {
+ trymatch.start[i] -= diff;
+ if (trymatch.start[i] < 0)
+ trymatch.start[i] -= 1;
+ trymatch.end[i] -= diff;
+ if (trymatch.end[i] < 0)
+ trymatch.end[i] -= 1;
+ }
}
+ trymatch.index = mymatch.index;
+ trymatch.offset = mymatch.offset;
+ return trymatch;
+ }
+ else
+ {
+ if (negative)
+ return mymatch;
+ return null;
}
- trymatch.index = mymatch.index;
- trymatch.offset = mymatch.offset;
- return trymatch;
- }
- else {
- if (negative) return mymatch;
- return null;
- }
}
- void dump(StringBuffer os) {
- os.append("(?<");
- os.append(negative ? '!' : '=');
- re.dumpAll(os);
- os.append(')');
- }
-
- private static class RETokenMatchHereOnly extends REToken {
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?<");
+ os.append (negative ? '!' : '=');
+ re.dumpAll (os);
+ os.append (')');
+ }
- int getMaximumLength() { return 0; }
+ private static class RETokenMatchHereOnly extends REToken
+ {
- private int index;
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- RETokenMatchHereOnly(int index) {
- super(0);
- this.index = index;
- }
+ private int index;
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- return (index == mymatch.index ? mymatch : null);
- }
+ RETokenMatchHereOnly (int index)
+ {
+ super (0);
+ this.index = index;
+ }
- void dump(StringBuffer os) {}
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ return (index == mymatch.index ? mymatch : null);
+ }
+ void dump (CPStringBuilder os)
+ {
}
-}
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java b/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
index 0051f16..1683cb1 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
@@ -38,303 +38,341 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-final class RETokenNamedProperty extends REToken {
+final class RETokenNamedProperty extends REToken
+{
String name;
boolean insens;
boolean negate;
Handler handler;
// Grouped properties
- static final byte[] LETTER = new byte[]
- { Character.LOWERCASE_LETTER,
+ static final byte[] LETTER = new byte[]{ Character.LOWERCASE_LETTER,
Character.UPPERCASE_LETTER,
Character.TITLECASE_LETTER,
Character.MODIFIER_LETTER,
- Character.OTHER_LETTER };
-
- static final byte[] MARK = new byte[]
- { Character.NON_SPACING_MARK,
+ Character.OTHER_LETTER
+ };
+
+ static final byte[] MARK = new byte[]{ Character.NON_SPACING_MARK,
Character.COMBINING_SPACING_MARK,
- Character.ENCLOSING_MARK };
-
- static final byte[] SEPARATOR = new byte[]
- { Character.SPACE_SEPARATOR,
+ Character.ENCLOSING_MARK
+ };
+
+ static final byte[] SEPARATOR = new byte[]{ Character.SPACE_SEPARATOR,
Character.LINE_SEPARATOR,
- Character.PARAGRAPH_SEPARATOR };
-
- static final byte[] SYMBOL = new byte[]
- { Character.MATH_SYMBOL,
+ Character.PARAGRAPH_SEPARATOR
+ };
+
+ static final byte[] SYMBOL = new byte[]{ Character.MATH_SYMBOL,
Character.CURRENCY_SYMBOL,
Character.MODIFIER_SYMBOL,
- Character.OTHER_SYMBOL };
-
- static final byte[] NUMBER = new byte[]
- { Character.DECIMAL_DIGIT_NUMBER,
+ Character.OTHER_SYMBOL
+ };
+
+ static final byte[] NUMBER = new byte[]{ Character.DECIMAL_DIGIT_NUMBER,
Character.LETTER_NUMBER,
- Character.OTHER_NUMBER };
-
- static final byte[] PUNCTUATION = new byte[]
- { Character.DASH_PUNCTUATION,
+ Character.OTHER_NUMBER
+ };
+
+ static final byte[] PUNCTUATION = new byte[]{ Character.DASH_PUNCTUATION,
Character.START_PUNCTUATION,
Character.END_PUNCTUATION,
Character.CONNECTOR_PUNCTUATION,
Character.OTHER_PUNCTUATION,
Character.INITIAL_QUOTE_PUNCTUATION,
- Character.FINAL_QUOTE_PUNCTUATION};
-
- static final byte[] OTHER = new byte[]
- { Character.CONTROL,
+ Character.FINAL_QUOTE_PUNCTUATION
+ };
+
+ static final byte[] OTHER = new byte[]{ Character.CONTROL,
Character.FORMAT,
Character.PRIVATE_USE,
Character.SURROGATE,
- Character.UNASSIGNED };
+ Character.UNASSIGNED
+ };
- RETokenNamedProperty(int subIndex, String name, boolean insens, boolean negate) throws REException {
- super(subIndex);
+ RETokenNamedProperty (int subIndex, String name, boolean insens,
+ boolean negate) throws REException
+ {
+ super (subIndex);
this.name = name;
this.insens = insens;
this.negate = negate;
- handler = getHandler(name);
+ handler = getHandler (name);
}
- int getMinimumLength() {
- return 1;
- }
+ int getMinimumLength ()
+ {
+ return 1;
+ }
- int getMaximumLength() {
- return 1;
- }
+ int getMaximumLength ()
+ {
+ return 1;
+ }
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
++mymatch.index;
return mymatch;
}
- return null;
+ return null;
}
- private boolean matchOneChar(char ch) {
+ private boolean matchOneChar (char ch)
+ {
if (ch == CharIndexed.OUT_OF_BOUNDS)
return false;
-
- boolean retval = handler.includes(ch);
- if (insens) {
- retval = retval ||
- handler.includes(toUpperCase(ch, unicodeAware)) ||
- handler.includes(toLowerCase(ch, unicodeAware));
- }
- if (negate) retval = !retval;
+ boolean retval = handler.includes (ch);
+ if (insens)
+ {
+ retval = retval ||
+ handler.includes (toUpperCase (ch, unicodeAware)) ||
+ handler.includes (toLowerCase (ch, unicodeAware));
+ }
+
+ if (negate)
+ retval = !retval;
return retval;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
int index = mymatch.index;
int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
numRepeats++;
- }
+ }
return numRepeats;
}
- void dump(StringBuffer os) {
- os.append("\\")
- .append(negate ? "P" : "p")
- .append("{" + name + "}");
+ void dump (CPStringBuilder os)
+ {
+ os.append ("\\").append (negate ? "P" : "p").append ("{" + name + "}");
}
- private abstract static class Handler {
- public abstract boolean includes(char c);
+ private abstract static class Handler
+ {
+ public abstract boolean includes (char c);
}
- private Handler getHandler(String name) throws REException {
- if (name.equals("Lower") ||
- name.equals("Upper") ||
- // name.equals("ASCII") ||
- name.equals("Alpha") ||
- name.equals("Digit") ||
- name.equals("Alnum") ||
- name.equals("Punct") ||
- name.equals("Graph") ||
- name.equals("Print") ||
- name.equals("Blank") ||
- name.equals("Cntrl") ||
- name.equals("XDigit") ||
- name.equals("Space") ) {
- return new POSIXHandler(name);
+ private Handler getHandler (String name) throws REException
+ {
+ if (name.equals ("Lower") || name.equals ("Upper") ||
+ // name.equals("ASCII") ||
+ name.equals ("Alpha") ||
+ name.equals ("Digit") ||
+ name.equals ("Alnum") ||
+ name.equals ("Punct") ||
+ name.equals ("Graph") ||
+ name.equals ("Print") ||
+ name.equals ("Blank") ||
+ name.equals ("Cntrl") ||
+ name.equals ("XDigit") || name.equals ("Space"))
+ {
+ return new POSIXHandler (name);
}
- if (name.startsWith("In")) {
- try {
- name = name.substring(2);
- Character.UnicodeBlock block = Character.UnicodeBlock.forName(name);
- return new UnicodeBlockHandler(block);
- }
- catch (IllegalArgumentException e) {
- throw new REException("Invalid Unicode block name: " + name, REException.REG_ESCAPE, 0);
- }
+ if (name.startsWith ("In"))
+ {
+ try
+ {
+ name = name.substring (2);
+ Character.UnicodeBlock block =
+ Character.UnicodeBlock.forName (name);
+ return new UnicodeBlockHandler (block);
+ }
+ catch (IllegalArgumentException e)
+ {
+ throw new REException ("Invalid Unicode block name: " + name,
+ REException.REG_ESCAPE, 0);
+ }
}
- if (name.startsWith("Is")) {
- name = name.substring(2);
+ if (name.startsWith ("Is"))
+ {
+ name = name.substring (2);
}
- // "grouped properties"
- if (name.equals("L"))
- return new UnicodeCategoriesHandler(LETTER);
- if (name.equals("M"))
- return new UnicodeCategoriesHandler(MARK);
- if (name.equals("Z"))
- return new UnicodeCategoriesHandler(SEPARATOR);
- if (name.equals("S"))
- return new UnicodeCategoriesHandler(SYMBOL);
- if (name.equals("N"))
- return new UnicodeCategoriesHandler(NUMBER);
- if (name.equals("P"))
- return new UnicodeCategoriesHandler(PUNCTUATION);
- if (name.equals("C"))
- return new UnicodeCategoriesHandler(OTHER);
-
- if (name.equals("Mc"))
- return new UnicodeCategoryHandler(Character.COMBINING_SPACING_MARK);
- if (name.equals("Pc"))
- return new UnicodeCategoryHandler(Character.CONNECTOR_PUNCTUATION);
- if (name.equals("Cc"))
- return new UnicodeCategoryHandler(Character.CONTROL);
- if (name.equals("Sc"))
- return new UnicodeCategoryHandler(Character.CURRENCY_SYMBOL);
- if (name.equals("Pd"))
- return new UnicodeCategoryHandler(Character.DASH_PUNCTUATION);
- if (name.equals("Nd"))
- return new UnicodeCategoryHandler(Character.DECIMAL_DIGIT_NUMBER);
- if (name.equals("Me"))
- return new UnicodeCategoryHandler(Character.ENCLOSING_MARK);
- if (name.equals("Pe"))
- return new UnicodeCategoryHandler(Character.END_PUNCTUATION);
- if (name.equals("Pf"))
- return new UnicodeCategoryHandler(Character.FINAL_QUOTE_PUNCTUATION);
- if (name.equals("Cf"))
- return new UnicodeCategoryHandler(Character.FORMAT);
- if (name.equals("Pi"))
- return new UnicodeCategoryHandler(Character.INITIAL_QUOTE_PUNCTUATION);
- if (name.equals("Nl"))
- return new UnicodeCategoryHandler(Character.LETTER_NUMBER);
- if (name.equals("Zl"))
- return new UnicodeCategoryHandler(Character.LINE_SEPARATOR);
- if (name.equals("Ll"))
- return new UnicodeCategoryHandler(Character.LOWERCASE_LETTER);
- if (name.equals("Sm"))
- return new UnicodeCategoryHandler(Character.MATH_SYMBOL);
- if (name.equals("Lm"))
- return new UnicodeCategoryHandler(Character.MODIFIER_LETTER);
- if (name.equals("Sk"))
- return new UnicodeCategoryHandler(Character.MODIFIER_SYMBOL);
- if (name.equals("Mn"))
- return new UnicodeCategoryHandler(Character.NON_SPACING_MARK);
- if (name.equals("Lo"))
- return new UnicodeCategoryHandler(Character.OTHER_LETTER);
- if (name.equals("No"))
- return new UnicodeCategoryHandler(Character.OTHER_NUMBER);
- if (name.equals("Po"))
- return new UnicodeCategoryHandler(Character.OTHER_PUNCTUATION);
- if (name.equals("So"))
- return new UnicodeCategoryHandler(Character.OTHER_SYMBOL);
- if (name.equals("Zp"))
- return new UnicodeCategoryHandler(Character.PARAGRAPH_SEPARATOR);
- if (name.equals("Co"))
- return new UnicodeCategoryHandler(Character.PRIVATE_USE);
- if (name.equals("Zs"))
- return new UnicodeCategoryHandler(Character.SPACE_SEPARATOR);
- if (name.equals("Ps"))
- return new UnicodeCategoryHandler(Character.START_PUNCTUATION);
- if (name.equals("Cs"))
- return new UnicodeCategoryHandler(Character.SURROGATE);
- if (name.equals("Lt"))
- return new UnicodeCategoryHandler(Character.TITLECASE_LETTER);
- if (name.equals("Cn"))
- return new UnicodeCategoryHandler(Character.UNASSIGNED);
- if (name.equals("Lu"))
- return new UnicodeCategoryHandler(Character.UPPERCASE_LETTER);
- if (name.equals("all"))
- return new Handler()
- {
- public boolean includes(char c)
- {
- return true;
- }
- };
- if (name.startsWith("java"))
+ // "grouped properties"
+ if (name.equals ("L"))
+ return new UnicodeCategoriesHandler (LETTER);
+ if (name.equals ("M"))
+ return new UnicodeCategoriesHandler (MARK);
+ if (name.equals ("Z"))
+ return new UnicodeCategoriesHandler (SEPARATOR);
+ if (name.equals ("S"))
+ return new UnicodeCategoriesHandler (SYMBOL);
+ if (name.equals ("N"))
+ return new UnicodeCategoriesHandler (NUMBER);
+ if (name.equals ("P"))
+ return new UnicodeCategoriesHandler (PUNCTUATION);
+ if (name.equals ("C"))
+ return new UnicodeCategoriesHandler (OTHER);
+
+ if (name.equals ("Mc"))
+ return new UnicodeCategoryHandler (Character.COMBINING_SPACING_MARK);
+ if (name.equals ("Pc"))
+ return new UnicodeCategoryHandler (Character.CONNECTOR_PUNCTUATION);
+ if (name.equals ("Cc"))
+ return new UnicodeCategoryHandler (Character.CONTROL);
+ if (name.equals ("Sc"))
+ return new UnicodeCategoryHandler (Character.CURRENCY_SYMBOL);
+ if (name.equals ("Pd"))
+ return new UnicodeCategoryHandler (Character.DASH_PUNCTUATION);
+ if (name.equals ("Nd"))
+ return new UnicodeCategoryHandler (Character.DECIMAL_DIGIT_NUMBER);
+ if (name.equals ("Me"))
+ return new UnicodeCategoryHandler (Character.ENCLOSING_MARK);
+ if (name.equals ("Pe"))
+ return new UnicodeCategoryHandler (Character.END_PUNCTUATION);
+ if (name.equals ("Pf"))
+ return new UnicodeCategoryHandler (Character.FINAL_QUOTE_PUNCTUATION);
+ if (name.equals ("Cf"))
+ return new UnicodeCategoryHandler (Character.FORMAT);
+ if (name.equals ("Pi"))
+ return new UnicodeCategoryHandler (Character.INITIAL_QUOTE_PUNCTUATION);
+ if (name.equals ("Nl"))
+ return new UnicodeCategoryHandler (Character.LETTER_NUMBER);
+ if (name.equals ("Zl"))
+ return new UnicodeCategoryHandler (Character.LINE_SEPARATOR);
+ if (name.equals ("Ll"))
+ return new UnicodeCategoryHandler (Character.LOWERCASE_LETTER);
+ if (name.equals ("Sm"))
+ return new UnicodeCategoryHandler (Character.MATH_SYMBOL);
+ if (name.equals ("Lm"))
+ return new UnicodeCategoryHandler (Character.MODIFIER_LETTER);
+ if (name.equals ("Sk"))
+ return new UnicodeCategoryHandler (Character.MODIFIER_SYMBOL);
+ if (name.equals ("Mn"))
+ return new UnicodeCategoryHandler (Character.NON_SPACING_MARK);
+ if (name.equals ("Lo"))
+ return new UnicodeCategoryHandler (Character.OTHER_LETTER);
+ if (name.equals ("No"))
+ return new UnicodeCategoryHandler (Character.OTHER_NUMBER);
+ if (name.equals ("Po"))
+ return new UnicodeCategoryHandler (Character.OTHER_PUNCTUATION);
+ if (name.equals ("So"))
+ return new UnicodeCategoryHandler (Character.OTHER_SYMBOL);
+ if (name.equals ("Zp"))
+ return new UnicodeCategoryHandler (Character.PARAGRAPH_SEPARATOR);
+ if (name.equals ("Co"))
+ return new UnicodeCategoryHandler (Character.PRIVATE_USE);
+ if (name.equals ("Zs"))
+ return new UnicodeCategoryHandler (Character.SPACE_SEPARATOR);
+ if (name.equals ("Ps"))
+ return new UnicodeCategoryHandler (Character.START_PUNCTUATION);
+ if (name.equals ("Cs"))
+ return new UnicodeCategoryHandler (Character.SURROGATE);
+ if (name.equals ("Lt"))
+ return new UnicodeCategoryHandler (Character.TITLECASE_LETTER);
+ if (name.equals ("Cn"))
+ return new UnicodeCategoryHandler (Character.UNASSIGNED);
+ if (name.equals ("Lu"))
+ return new UnicodeCategoryHandler (Character.UPPERCASE_LETTER);
+ if (name.equals ("all"))
+ return new Handler ()
+ {
+ public boolean includes (char c)
+ {
+ return true;
+ }
+ };
+ if (name.startsWith ("java"))
+ {
+ try
{
- try
- {
- Method m = Character.class.getMethod("is" + name.substring(4),
- Character.TYPE);
- return new JavaCategoryHandler(m);
- }
- catch (NoSuchMethodException e)
- {
- throw new REException("Unsupported Java handler: " + name, e,
- REException.REG_ESCAPE, 0);
- }
+ Method m = Character.class.getMethod ("is" + name.substring (4),
+ Character.TYPE);
+ return new JavaCategoryHandler (m);
}
- throw new REException("unsupported name " + name, REException.REG_ESCAPE, 0);
+ catch (NoSuchMethodException e)
+ {
+ throw new REException ("Unsupported Java handler: " + name, e,
+ REException.REG_ESCAPE, 0);
+ }
+ }
+ throw new REException ("unsupported name " + name, REException.REG_ESCAPE,
+ 0);
}
- private static class POSIXHandler extends Handler {
- private RETokenPOSIX retoken;
- public POSIXHandler(String name) {
- int posixId = RETokenPOSIX.intValue(name.toLowerCase());
- if (posixId != -1)
- retoken = new RETokenPOSIX(0,posixId,false,false);
- else
- throw new RuntimeException("Unknown posix ID: " + name);
- }
- public boolean includes(char c) {
- return retoken.matchOneChar(c);
- }
+ private static class POSIXHandler extends Handler
+ {
+ private RETokenPOSIX retoken;
+ public POSIXHandler (String name)
+ {
+ int posixId = RETokenPOSIX.intValue (name.toLowerCase ());
+ if (posixId != -1)
+ retoken = new RETokenPOSIX (0, posixId, false, false);
+ else
+ throw new RuntimeException ("Unknown posix ID: " + name);
+ }
+ public boolean includes (char c)
+ {
+ return retoken.matchOneChar (c);
+ }
}
- private static class UnicodeCategoryHandler extends Handler {
- public UnicodeCategoryHandler(byte category) {
- this.category = (int)category;
- }
- private int category;
- public boolean includes(char c) {
- return Character.getType(c) == category;
- }
+ private static class UnicodeCategoryHandler extends Handler
+ {
+ public UnicodeCategoryHandler (byte category)
+ {
+ this.category = (int) category;
+ }
+ private int category;
+ public boolean includes (char c)
+ {
+ return Character.getType (c) == category;
+ }
}
- private static class UnicodeCategoriesHandler extends Handler {
- public UnicodeCategoriesHandler(byte[] categories) {
- this.categories = categories;
- }
- private byte[] categories;
- public boolean includes(char c) {
- int category = Character.getType(c);
- for (int i = 0; i < categories.length; i++)
- if (category == categories[i])
- return true;
- return false;
- }
+ private static class UnicodeCategoriesHandler extends Handler
+ {
+ public UnicodeCategoriesHandler (byte[]categories)
+ {
+ this.categories = categories;
+ }
+ private byte[] categories;
+ public boolean includes (char c)
+ {
+ int category = Character.getType (c);
+ for (int i = 0; i < categories.length; i++)
+ if (category == categories[i])
+ return true;
+ return false;
+ }
}
- private static class UnicodeBlockHandler extends Handler {
- public UnicodeBlockHandler(Character.UnicodeBlock block) {
- this.block = block;
- }
- private Character.UnicodeBlock block;
- public boolean includes(char c) {
- Character.UnicodeBlock cblock = Character.UnicodeBlock.of(c);
- return (cblock != null && cblock.equals(block));
- }
+ private static class UnicodeBlockHandler extends Handler
+ {
+ public UnicodeBlockHandler (Character.UnicodeBlock block)
+ {
+ this.block = block;
+ }
+ private Character.UnicodeBlock block;
+ public boolean includes (char c)
+ {
+ Character.UnicodeBlock cblock = Character.UnicodeBlock.of (c);
+ return (cblock != null && cblock.equals (block));
+ }
}
/**
@@ -343,30 +381,29 @@ final class RETokenNamedProperty extends REToken {
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
- private static class JavaCategoryHandler
- extends Handler
+ private static class JavaCategoryHandler extends Handler
{
private Method method;
- public JavaCategoryHandler(Method m)
+ public JavaCategoryHandler (Method m)
{
this.method = m;
}
- public boolean includes(char c)
+ public boolean includes (char c)
{
try
- {
- return (Boolean) method.invoke(null, c);
- }
+ {
+ return (Boolean) method.invoke (null, c);
+ }
catch (IllegalAccessException e)
- {
- throw new InternalError("Unable to access method " + method);
- }
+ {
+ throw new InternalError ("Unable to access method " + method);
+ }
catch (InvocationTargetException e)
- {
- throw new InternalError("Error invoking " + method);
- }
+ {
+ throw new InternalError ("Error invoking " + method);
+ }
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java b/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
index 239c220..fcae3c2 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
@@ -36,23 +36,29 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
-import java.util.Vector;
-import java.util.Stack;
-final class RETokenOneOf extends REToken {
- private Vector options;
+import gnu.java.lang.CPStringBuilder;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.List;
+
+final class RETokenOneOf extends REToken
+{
+ private final List < REToken > options;
private boolean negative;
// True if this RETokenOneOf is supposed to match only one character,
// which is typically the case of a character class expression.
private boolean matchesOneChar;
- private Vector addition;
- // This Vector addition is used to store nested character classes.
+ private final List < Object > addition;
+ // This ArrayList addition is used to store nested character classes.
// For example, if the original expression is
// [2-7a-c[f-k][m-z]&&[^p-v][st]]
- // the basic part /2-7a-c/ is stored in the Vector options, and
+ // the basic part /2-7a-c/ is stored in the ArrayList options, and
// the additional part /[f-k][m-z]&&[^p-v][st]/ is stored in the
- // Vector addition in the following order (Reverse Polish Notation):
+ // ArrayList addition in the following order (Reverse Polish Notation):
// -- The matching result of the basic part is assumed here.
// [f-k] -- REToken
// "|" -- or
@@ -65,7 +71,7 @@ final class RETokenOneOf extends REToken {
// "|" -- or
// "&" -- and
//
- // As it is clear from the explanation above, the Vector addition is
+ // As it is clear from the explanation above, the ArrayList addition is
// effective only when this REToken originates from a character class
// expression.
@@ -73,209 +79,254 @@ final class RETokenOneOf extends REToken {
// e.g. \d --> new RETokenOneOf("0123456789",false, ..)
// \D --> new RETokenOneOf("0123456789",true, ..)
- RETokenOneOf(int subIndex, String optionsStr, boolean negative, boolean insens) {
- super(subIndex);
- options = new Vector();
+ RETokenOneOf (int subIndex, String optionsStr, boolean negative,
+ boolean insens)
+ {
+ super (subIndex);
+ options = new ArrayList < REToken > ();
this.negative = negative;
- for (int i = 0; i < optionsStr.length(); i++)
- options.addElement(new RETokenChar(subIndex,optionsStr.charAt(i),insens));
+ for (int i = 0; i < optionsStr.length (); i++)
+ options.add (new RETokenChar (subIndex, optionsStr.charAt (i), insens));
matchesOneChar = true;
+ addition = null;
}
- RETokenOneOf(int subIndex, Vector options, boolean negative) {
- super(subIndex);
- this.options = options;
- this.negative = negative;
- matchesOneChar = negative;
+ RETokenOneOf (int subIndex, List < REToken > options, boolean negative)
+ {
+ this (subIndex, options, null, negative);
}
- RETokenOneOf(int subIndex, Vector options, Vector addition, boolean negative) {
- super(subIndex);
+ RETokenOneOf (int subIndex, List < REToken > options,
+ List < Object > addition, boolean negative)
+ {
+ super (subIndex);
this.options = options;
this.addition = addition;
this.negative = negative;
matchesOneChar = (negative || addition != null);
}
- int getMinimumLength() {
- if (matchesOneChar) return 1;
+ int getMinimumLength ()
+ {
+ if (matchesOneChar)
+ return 1;
int min = Integer.MAX_VALUE;
int x;
- for (int i=0; i < options.size(); i++) {
- if ((x = ((REToken) options.elementAt(i)).getMinimumLength()) < min)
- min = x;
- }
+ for (REToken t:options)
+ {
+ if ((x = t.getMinimumLength ()) < min)
+ min = x;
+ }
return min;
}
- int getMaximumLength() {
- if (matchesOneChar) return 1;
+ int getMaximumLength ()
+ {
+ if (matchesOneChar)
+ return 1;
int max = 0;
int x;
- for (int i=0; i < options.size(); i++) {
- if ((x = ((REToken) options.elementAt(i)).getMaximumLength()) > max)
- max = x;
- }
+ for (REToken t:options)
+ {
+ if ((x = t.getMaximumLength ()) > max)
+ max = x;
+ }
return max;
}
- boolean match(CharIndexed input, REMatch mymatch) {
- setHitEnd(input, mymatch);
- if (matchesOneChar) return matchOneChar(input, mymatch);
- else return matchOneRE(input, mymatch);
- }
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ setHitEnd (input, mymatch);
+ if (matchesOneChar)
+ return matchOneChar (input, mymatch);
+ else
+ return matchOneRE (input, mymatch);
+ }
- boolean matchOneChar(CharIndexed input, REMatch mymatch) {
- REMatch tryMatch;
- boolean tryOnly;
- if (addition == null) {
- tryMatch = mymatch;
- tryOnly = false;
+ boolean matchOneChar (CharIndexed input, REMatch mymatch)
+ {
+ REMatch tryMatch;
+ boolean tryOnly;
+ if (addition == null)
+ {
+ tryMatch = mymatch;
+ tryOnly = false;
}
- else {
- tryMatch = (REMatch) mymatch.clone();
- tryOnly = true;
+ else
+ {
+ tryMatch = (REMatch) mymatch.clone ();
+ tryOnly = true;
}
- boolean b = negative ?
- matchN(input, tryMatch, tryOnly) :
- matchP(input, tryMatch, tryOnly);
- if (addition == null) return b;
+ boolean b = negative ?
+ matchN (input, tryMatch, tryOnly) : matchP (input, tryMatch, tryOnly);
+ if (addition == null)
+ return b;
- Stack stack = new Stack();
- stack.push(new Boolean(b));
- for (int i=0; i < addition.size(); i++) {
- Object obj = addition.elementAt(i);
- if (obj instanceof REToken) {
- b = ((REToken)obj).match(input, (REMatch)mymatch.clone());
- stack.push(new Boolean(b));
- }
- else if (obj instanceof Boolean) {
- stack.push(obj);
- }
- else if (obj.equals("|")) {
- b = ((Boolean)stack.pop()).booleanValue();
- b = ((Boolean)stack.pop()).booleanValue() || b;
- stack.push(new Boolean(b));
- }
- else if (obj.equals("&")) {
- b = ((Boolean)stack.pop()).booleanValue();
- b = ((Boolean)stack.pop()).booleanValue() && b;
- stack.push(new Boolean(b));
- }
- else {
- throw new RuntimeException("Invalid object found");
- }
+ final Deque < Boolean > stack = new ArrayDeque < Boolean > ();
+ stack.push (new Boolean (b));
+ for (Object obj:addition)
+ {
+ if (obj instanceof REToken)
+ {
+ b = ((REToken) obj).match (input, (REMatch) mymatch.clone ());
+ stack.push (new Boolean (b));
+ }
+ else if (obj instanceof Boolean)
+ {
+ stack.push ((Boolean) obj);
+ }
+ else if (obj.equals ("|"))
+ {
+ b = stack.pop ();
+ b = stack.pop () || b;
+ stack.push (new Boolean (b));
+ }
+ else if (obj.equals ("&"))
+ {
+ b = stack.pop ();
+ b = stack.pop () && b;
+ stack.push (new Boolean (b));
+ }
+ else
+ {
+ throw new RuntimeException ("Invalid object found");
+ }
}
- b = ((Boolean)stack.pop()).booleanValue();
- if (b) {
- ++mymatch.index;
- return next(input, mymatch);
+ if (stack.pop ())
+ {
+ ++mymatch.index;
+ return next (input, mymatch);
}
- return false;
- }
+ return false;
+ }
- private boolean matchN(CharIndexed input, REMatch mymatch, boolean tryOnly) {
- if (input.charAt(mymatch.index) == CharIndexed.OUT_OF_BOUNDS)
- return false;
+ private boolean matchN (CharIndexed input, REMatch mymatch, boolean tryOnly)
+ {
+ if (input.charAt (mymatch.index) == CharIndexed.OUT_OF_BOUNDS)
+ return false;
- REMatch newMatch = null;
- REMatch last = null;
- REToken tk;
- for (int i=0; i < options.size(); i++) {
- tk = (REToken) options.elementAt(i);
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tk.match(input, tryMatch)) { // match was successful
+ for (REToken tk:options)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tk.match (input, tryMatch))
+ { // match was successful
return false;
- } // is a match
- } // try next option
+ } // is a match
+ } // try next option
- if (tryOnly) return true;
- ++mymatch.index;
- return next(input, mymatch);
- }
+ if (tryOnly)
+ return true;
+ ++mymatch.index;
+ return next (input, mymatch);
+ }
- private boolean matchP(CharIndexed input, REMatch mymatch, boolean tryOnly) {
- REToken tk;
- for (int i=0; i < options.size(); i++) {
- tk = (REToken) options.elementAt(i);
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tk.match(input, tryMatch)) { // match was successful
- if (tryOnly) return true;
- if (next(input, tryMatch)) {
- mymatch.assignFrom(tryMatch);
+ private boolean matchP (CharIndexed input, REMatch mymatch, boolean tryOnly)
+ {
+ for (REToken tk:options)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tk.match (input, tryMatch))
+ { // match was successful
+ if (tryOnly)
return true;
+ if (next (input, tryMatch))
+ {
+ mymatch.assignFrom (tryMatch);
+ return true;
+ }
}
- }
}
- return false;
- }
+ return false;
+ }
- private boolean matchOneRE(CharIndexed input, REMatch mymatch) {
- REMatch newMatch = findMatch(input, mymatch);
- if (newMatch != null) {
- mymatch.assignFrom(newMatch);
- return true;
+ private boolean matchOneRE (CharIndexed input, REMatch mymatch)
+ {
+ REMatch newMatch = findMatch (input, mymatch);
+ if (newMatch != null)
+ {
+ mymatch.assignFrom (newMatch);
+ return true;
}
- return false;
+ return false;
}
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (matchesOneChar) return super.findMatch(input, mymatch);
- return findMatch(input, mymatch, 0);
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (matchesOneChar)
+ return super.findMatch (input, mymatch);
+ return findMatch (input, mymatch, 0);
}
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- return findMatch(input, mymatch, ((Integer)param).intValue());
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ return findMatch (input, mymatch, ((Integer) param).intValue ());
}
- private REMatch findMatch(CharIndexed input, REMatch mymatch, int optionIndex) {
- for (int i = optionIndex; i < options.size(); i++) {
- REToken tk = (REToken) options.elementAt(i);
- tk = (REToken) tk.clone();
- tk.chain(getNext());
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tryMatch.backtrackStack == null) {
- tryMatch.backtrackStack = new BacktrackStack();
+ private REMatch findMatch (CharIndexed input, REMatch mymatch,
+ int optionIndex)
+ {
+ for (int i = optionIndex; i < options.size (); i++)
+ {
+ REToken tk = options.get (i);
+ tk = (REToken) tk.clone ();
+ tk.chain (getNext ());
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tryMatch.backtrackStack == null)
+ {
+ tryMatch.backtrackStack = new BacktrackStack ();
}
- boolean stackPushed = false;
- if (i + 1 < options.size()) {
- tryMatch.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, new Integer(i + 1)));
+ boolean stackPushed = false;
+ if (i + 1 < options.size ())
+ {
+ tryMatch.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ i + 1));
stackPushed = true;
- }
- boolean b = tk.match(input, tryMatch);
- if (b) {
- return tryMatch;
}
- if (stackPushed) tryMatch.backtrackStack.pop();
+ if (tk.match (input, tryMatch))
+ {
+ return tryMatch;
+ }
+ if (stackPushed)
+ tryMatch.backtrackStack.pop ();
}
- return null;
+ return null;
}
- boolean returnsFixedLengthMatches() { return matchesOneChar; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return matchesOneChar;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (!matchesOneChar)
- return super.findFixedLengthMatches(input, mymatch, max);
- int numRepeats = 0;
- REMatch m = (REMatch) mymatch.clone();
- REToken tk = (REToken) this.clone();
- tk.chain(null);
- while (true) {
- if (numRepeats >= max) break;
- m = tk.findMatch(input, m);
- if (m == null) break;
- numRepeats++;
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (!matchesOneChar)
+ return super.findFixedLengthMatches (input, mymatch, max);
+ int numRepeats = 0;
+ REMatch m = (REMatch) mymatch.clone ();
+ REToken tk = (REToken) this.clone ();
+ tk.chain (null);
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ m = tk.findMatch (input, m);
+ if (m == null)
+ break;
+ numRepeats++;
}
- return numRepeats;
+ return numRepeats;
}
- void dump(StringBuffer os) {
- os.append(negative ? "[^" : "(?:");
- for (int i = 0; i < options.size(); i++) {
- if (!negative && (i > 0)) os.append('|');
- ((REToken) options.elementAt(i)).dumpAll(os);
- }
- os.append(negative ? ']' : ')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append (negative ? "[^" : "(?:");
+ for (int i = 0; i < options.size (); i++)
+ {
+ if (!negative && (i > 0))
+ os.append ('|');
+ options.get (i).dumpAll (os);
+ }
+ os.append (negative ? ']' : ')');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java b/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
index 0729895..2c80957 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
@@ -38,130 +38,158 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenPOSIX extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenPOSIX extends REToken
+{
int type;
boolean insens;
boolean negated;
- static final int ALNUM = 0;
- static final int ALPHA = 1;
- static final int BLANK = 2;
- static final int CNTRL = 3;
- static final int DIGIT = 4;
- static final int GRAPH = 5;
- static final int LOWER = 6;
- static final int PRINT = 7;
- static final int PUNCT = 8;
- static final int SPACE = 9;
- static final int UPPER = 10;
+ static final int ALNUM = 0;
+ static final int ALPHA = 1;
+ static final int BLANK = 2;
+ static final int CNTRL = 3;
+ static final int DIGIT = 4;
+ static final int GRAPH = 5;
+ static final int LOWER = 6;
+ static final int PRINT = 7;
+ static final int PUNCT = 8;
+ static final int SPACE = 9;
+ static final int UPPER = 10;
static final int XDIGIT = 11;
// Array indices correspond to constants defined above.
- static final String[] s_nameTable = {
+ static final String[] s_nameTable = {
"alnum", "alpha", "blank", "cntrl", "digit", "graph", "lower",
- "print", "punct", "space", "upper", "xdigit"
+ "print", "punct", "space", "upper", "xdigit"
};
// The RE constructor uses this to look up the constant for a string
- static int intValue(String key) {
- for (int i = 0; i < s_nameTable.length; i++) {
- if (s_nameTable[i].equals(key)) return i;
- }
+ static int intValue (String key)
+ {
+ for (int i = 0; i < s_nameTable.length; i++)
+ {
+ if (s_nameTable[i].equals (key))
+ return i;
+ }
return -1;
}
- RETokenPOSIX(int subIndex, int type, boolean insens, boolean negated) {
- super(subIndex);
+ RETokenPOSIX (int subIndex, int type, boolean insens, boolean negated)
+ {
+ super (subIndex);
this.type = type;
this.insens = insens;
this.negated = negated;
}
- int getMinimumLength() {
- return 1;
- }
+ int getMinimumLength ()
+ {
+ return 1;
+ }
- int getMaximumLength() {
- return 1;
- }
+ int getMaximumLength ()
+ {
+ return 1;
+ }
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
++mymatch.index;
return mymatch;
}
- return null;
- }
+ return null;
+ }
- boolean matchOneChar(char ch) {
+ boolean matchOneChar (char ch)
+ {
if (ch == CharIndexed.OUT_OF_BOUNDS)
return false;
-
+
boolean retval = false;
- switch (type) {
- case ALNUM:
+ switch (type)
+ {
+ case ALNUM:
// Note that there is some debate over whether '_' should be included
- retval = Character.isLetterOrDigit(ch) || (ch == '_');
+ retval = Character.isLetterOrDigit (ch) || (ch == '_');
break;
- case ALPHA:
- retval = Character.isLetter(ch);
+ case ALPHA:
+ retval = Character.isLetter (ch);
break;
- case BLANK:
+ case BLANK:
retval = ((ch == ' ') || (ch == '\t'));
break;
- case CNTRL:
- retval = Character.isISOControl(ch);
+ case CNTRL:
+ retval = Character.isISOControl (ch);
break;
- case DIGIT:
- retval = Character.isDigit(ch);
+ case DIGIT:
+ retval = Character.isDigit (ch);
break;
- case GRAPH:
- retval = (!(Character.isWhitespace(ch) || Character.isISOControl(ch)));
+ case GRAPH:
+ retval =
+ (!(Character.isWhitespace (ch) || Character.isISOControl (ch)));
break;
- case LOWER:
- retval = ((insens && Character.isLetter(ch)) || Character.isLowerCase(ch));
+ case LOWER:
+ retval = ((insens && Character.isLetter (ch))
+ || Character.isLowerCase (ch));
break;
- case PRINT:
- retval = (!(Character.isWhitespace(ch) || Character.isISOControl(ch)))
- || (ch == ' ');
+ case PRINT:
+ retval =
+ (!(Character.isWhitespace (ch) || Character.isISOControl (ch)))
+ || (ch == ' ');
break;
- case PUNCT:
+ case PUNCT:
// This feels sloppy, especially for non-U.S. locales.
- retval = ("`~!@#$%^&*()-_=+[]{}\\|;:'\"/?,.<>".indexOf(ch)!=-1);
+ retval = ("`~!@#$%^&*()-_=+[]{}\\|;:'\"/?,.<>".indexOf (ch) != -1);
break;
- case SPACE:
- retval = Character.isWhitespace(ch);
+ case SPACE:
+ retval = Character.isWhitespace (ch);
break;
- case UPPER:
- retval = ((insens && Character.isLetter(ch)) || Character.isUpperCase(ch));
+ case UPPER:
+ retval = ((insens && Character.isLetter (ch))
+ || Character.isUpperCase (ch));
break;
- case XDIGIT:
- retval = (Character.isDigit(ch) || ("abcdefABCDEF".indexOf(ch)!=-1));
+ case XDIGIT:
+ retval = (Character.isDigit (ch)
+ || ("abcdefABCDEF".indexOf (ch) != -1));
break;
- }
+ }
- if (negated) retval = !retval;
+ if (negated)
+ retval = !retval;
return retval;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
numRepeats++;
}
- return numRepeats;
+ return numRepeats;
}
- void dump(StringBuffer os) {
- if (negated) os.append('^');
- os.append("[:" + s_nameTable[type] + ":]");
+ void dump (CPStringBuilder os)
+ {
+ if (negated)
+ os.append ('^');
+ os.append ("[:" + s_nameTable[type] + ":]");
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenRange.java b/libjava/classpath/gnu/java/util/regex/RETokenRange.java
index 8a65f77..2597d4d 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenRange.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenRange.java
@@ -37,64 +37,83 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenRange extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenRange extends REToken
+{
private char lo, hi;
private boolean insens;
- RETokenRange(int subIndex, char lo, char hi, boolean ins) {
- super(subIndex);
+ RETokenRange (int subIndex, char lo, char hi, boolean ins)
+ {
+ super (subIndex);
insens = ins;
this.lo = lo;
this.hi = hi;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 1;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 1;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char c = input.charAt(mymatch.index);
- if (matchOneChar(c)) {
- ++mymatch.index;
- return mymatch;
- }
- return null;
- }
-
- boolean matchOneChar(char c) {
- if (c == CharIndexed.OUT_OF_BOUNDS) return false;
- boolean matches = (c >= lo) && (c <= hi);
- if (! matches && insens) {
- char c1 = toLowerCase(c, unicodeAware);
- matches = (c1 >= lo) && (c1 <= hi);
- if (!matches) {
- c1 = toUpperCase(c, unicodeAware);
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char c = input.charAt (mymatch.index);
+ if (matchOneChar (c))
+ {
+ ++mymatch.index;
+ return mymatch;
+ }
+ return null;
+ }
+
+ boolean matchOneChar (char c)
+ {
+ if (c == CharIndexed.OUT_OF_BOUNDS)
+ return false;
+ boolean matches = (c >= lo) && (c <= hi);
+ if (!matches && insens)
+ {
+ char c1 = toLowerCase (c, unicodeAware);
+ matches = (c1 >= lo) && (c1 <= hi);
+ if (!matches)
+ {
+ c1 = toUpperCase (c, unicodeAware);
matches = (c1 >= lo) && (c1 <= hi);
}
- }
- return matches;
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
- numRepeats++;
- }
- return numRepeats;
- }
-
- void dump(StringBuffer os) {
- os.append(lo).append('-').append(hi);
+ }
+ return matches;
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
+ numRepeats++;
+ }
+ return numRepeats;
}
-}
+ void dump (CPStringBuilder os)
+ {
+ os.append (lo).append ('-').append (hi);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java b/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
index 7f5e562..0ba880d 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
@@ -38,493 +38,602 @@ exception statement from your version. */
package gnu.java.util.regex;
-import java.util.ArrayList;
-
-final class RETokenRepeated extends REToken {
- private REToken token;
- private int min,max;
- private boolean stingy;
- private boolean possessive;
- private int tokenFixedLength;
-
- RETokenRepeated(int subIndex, REToken token, int min, int max) {
- super(subIndex);
- this.token = token;
- this.min = min;
- this.max = max;
- if (token.returnsFixedLengthMatches()) {
- tokenFixedLength = token.getMaximumLength();
- }
- else {
- tokenFixedLength = -1;
- }
- }
+import gnu.java.lang.CPStringBuilder;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+final class RETokenRepeated extends REToken
+{
+ private REToken token;
+ private int min, max;
+ private boolean stingy;
+ private boolean possessive;
+ private int tokenFixedLength;
+
+ RETokenRepeated (int subIndex, REToken token, int min, int max)
+ {
+ super (subIndex);
+ this.token = token;
+ this.min = min;
+ this.max = max;
+ if (token.returnsFixedLengthMatches ())
+ {
+ tokenFixedLength = token.getMaximumLength ();
+ }
+ else
+ {
+ tokenFixedLength = -1;
+ }
+ }
/** Sets the minimal matching mode to true. */
- void makeStingy() {
- stingy = true;
- }
-
+ void makeStingy ()
+ {
+ stingy = true;
+ }
+
/** Queries if this token has minimal matching enabled. */
- boolean isStingy() {
- return stingy;
- }
+ boolean isStingy ()
+ {
+ return stingy;
+ }
/** Sets possessive matching mode to true. */
- void makePossessive() {
- possessive = true;
- }
+ void makePossessive ()
+ {
+ possessive = true;
+ }
/** Queries if this token has possessive matching enabled. */
- boolean isPossessive() {
- return possessive;
- }
-
+ boolean isPossessive ()
+ {
+ return possessive;
+ }
+
/**
* The minimum length of a repeated token is the minimum length
* of the token multiplied by the minimum number of times it must
* match.
*/
- int getMinimumLength() {
- return (min * token.getMinimumLength());
+ int getMinimumLength ()
+ {
+ return (min * token.getMinimumLength ());
+ }
+
+ int getMaximumLength ()
+ {
+ if (max == Integer.MAX_VALUE)
+ return Integer.MAX_VALUE;
+ int tmax = token.getMaximumLength ();
+ if (tmax == Integer.MAX_VALUE)
+ return tmax;
+ return (max * tmax);
+ }
+
+ // The comment "MUST make a clone" below means that some tests
+ // failed without doing clone(),
+
+ private static class DoablesFinder
+ {
+ private REToken tk;
+ private CharIndexed input;
+ private REMatch rematch;
+ private boolean findFirst;
+
+ private DoablesFinder (REToken tk, CharIndexed input, REMatch mymatch)
+ {
+ this.tk = tk;
+ this.input = input;
+ this.rematch = (REMatch) mymatch.clone (); // MUST make a clone
+ this.rematch.backtrackStack = new BacktrackStack ();
+ findFirst = true;
}
- int getMaximumLength() {
- if (max == Integer.MAX_VALUE) return Integer.MAX_VALUE;
- int tmax = token.getMaximumLength();
- if (tmax == Integer.MAX_VALUE) return tmax;
- return (max * tmax);
- }
-
- // The comment "MUST make a clone" below means that some tests
- // failed without doing clone(),
-
- private static class DoablesFinder {
- private REToken tk;
- private CharIndexed input;
- private REMatch rematch;
- private boolean findFirst;
-
- private DoablesFinder(REToken tk, CharIndexed input, REMatch mymatch) {
- this.tk = tk;
- this.input = input;
- this.rematch = (REMatch) mymatch.clone(); // MUST make a clone
- this.rematch.backtrackStack = new BacktrackStack();
- findFirst = true;
+ private REMatch find ()
+ {
+ int origin = rematch.index;
+ REMatch rem;
+ if (findFirst)
+ {
+ rem = tk.findMatch (input, rematch);
+ findFirst = false;
}
-
- private REMatch find() {
- int origin = rematch.index;
- REMatch rem;
- if (findFirst) {
- rem = tk.findMatch(input, rematch);
- findFirst = false;
- }
- else {
- while (true) {
- if (rematch.backtrackStack.empty()) {
- rem = null;
- break;
- }
- BacktrackStack.Backtrack bt = rematch.backtrackStack.pop();
- rem = bt.token.backtrack(bt.input, bt.match, bt.param);
- if (rem != null) break;
+ else
+ {
+ while (true)
+ {
+ if (rematch.backtrackStack.empty ())
+ {
+ rem = null;
+ break;
}
+ BacktrackStack.Backtrack bt = rematch.backtrackStack.pop ();
+ rem = bt.token.backtrack (bt.input, bt.match, bt.param);
+ if (rem != null)
+ break;
}
- if (rem == null) return null;
- if (rem.index == origin) rem.empty = true;
- rematch = rem;
- return (REMatch) rem.clone(); // MUST make a clone.
- }
-
- boolean noMore() {
- return rematch.backtrackStack.empty();
- }
- }
-
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (tokenFixedLength >= 0) return findMatchFixedLength(input, mymatch);
- BacktrackStack stack = new BacktrackStack();
- stack.push(new StackedInfo(input, 0, mymatch, null, null));
- return findMatch(stack);
- }
-
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- if (tokenFixedLength >= 0) return backtrackFixedLength(input, mymatch, param);
- return findMatch((BacktrackStack)param);
- }
-
- private static class StackedInfo extends BacktrackStack.Backtrack {
- int numRepeats;
- int[] visited;
- DoablesFinder finder;
- StackedInfo(CharIndexed input, int numRepeats, REMatch match,
- int[] visited, DoablesFinder finder) {
- super(null, input, match, null);
- this.numRepeats = numRepeats;
- this.visited = visited;
- this.finder = finder;
}
+ if (rem == null)
+ return null;
+ if (rem.index == origin)
+ rem.empty = true;
+ rematch = rem;
+ return (REMatch) rem.clone (); // MUST make a clone.
}
- private static class FindMatchControlStack extends ArrayList {
- private void push(FindMatchControl control) {
- add(control);
- }
- private FindMatchControl pop() {
- return (FindMatchControl)remove(size()-1);
- }
- private boolean empty() {
- return isEmpty();
- }
+ boolean noMore ()
+ {
+ return rematch.backtrackStack.empty ();
}
-
- private static class FindMatchControl {
- DoablesFinder finder;
- FindMatchControl(DoablesFinder finder) {
- this.finder = finder;
- }
+ }
+
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (tokenFixedLength >= 0)
+ return findMatchFixedLength (input, mymatch);
+ BacktrackStack stack = new BacktrackStack ();
+ stack.push (new StackedInfo (input, 0, mymatch, null, null));
+ return findMatch (stack);
+ }
+
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ if (tokenFixedLength >= 0)
+ return backtrackFixedLength (input, mymatch, param);
+ return findMatch ((BacktrackStack) param);
+ }
+
+ private static class StackedInfo extends BacktrackStack.Backtrack
+ {
+ int numRepeats;
+ int[] visited;
+ DoablesFinder finder;
+ StackedInfo (CharIndexed input, int numRepeats, REMatch match,
+ int[]visited, DoablesFinder finder)
+ {
+ super (null, input, match, null);
+ this.numRepeats = numRepeats;
+ this.visited = visited;
+ this.finder = finder;
}
-
- private REMatch findMatch(BacktrackStack stack) {
- return findMatch(stack, new FindMatchControlStack());
+ }
+
+ private static class FindMatchControl
+ {
+ DoablesFinder finder;
+ FindMatchControl (DoablesFinder finder)
+ {
+ this.finder = finder;
}
-
- private REMatch findMatch(BacktrackStack stack,
- FindMatchControlStack controlStack) {
- REMatch result = null;
- StackedInfo si = null;
- CharIndexed input = null;
- int numRepeats = 0;
- REMatch mymatch = null;
- int[] visited = null;
- DoablesFinder finder = null;
-
- // Avoid using recursive calls because a match can be very long.
-
- // This is the first entry point of this method.
- // If you want to call this method recursively and you need the
- // result returned, save necessary information in a FindMatchControl
- // object and push it to controlStack, then continue from this point.
- // You can check the result after exiting MAIN_LOOP.
- MAIN_LOOP0:
- while (true) {
+ }
+
+ private REMatch findMatch (BacktrackStack stack)
+ {
+ return findMatch (stack, new ArrayDeque < FindMatchControl > ());
+ }
+
+ private REMatch findMatch (BacktrackStack stack,
+ Deque < FindMatchControl > controlStack)
+ {
+ REMatch result = null;
+ StackedInfo si = null;
+ CharIndexed input = null;
+ int numRepeats = 0;
+ REMatch mymatch = null;
+ int[] visited = null;
+ DoablesFinder finder = null;
+
+ // Avoid using recursive calls because a match can be very long.
+
+ // This is the first entry point of this method.
+ // If you want to call this method recursively and you need the
+ // result returned, save necessary information in a FindMatchControl
+ // object and push it to controlStack, then continue from this point.
+ // You can check the result after exiting MAIN_LOOP.
+ MAIN_LOOP0:
+ while (true)
+ {
// This is the second entry point of this method.
// If you want to call this method recursively but you do not need the
// result returned, just continue from this point.
- MAIN_LOOP:
- while (true) {
-
- if (stack.empty()) break MAIN_LOOP;
- si = (StackedInfo)(stack.peek());
- input = si.input;
- numRepeats = si.numRepeats;
- mymatch = si.match;
- visited = si.visited;
- finder = si.finder;
-
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
-
- if (numRepeats >= max) {
- stack.pop();
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
- result = m1;
+ MAIN_LOOP:
+ while (true)
+ {
+
+ if (stack.empty ())
+ break MAIN_LOOP;
+ si = (StackedInfo) (stack.peek ());
+ input = si.input;
+ numRepeats = si.numRepeats;
+ mymatch = si.match;
+ visited = si.visited;
+ finder = si.finder;
+
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+
+ if (numRepeats >= max)
+ {
+ stack.pop ();
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input,
+ mymatch, stack));
+ }
+ result = m1;
+ break MAIN_LOOP;
+ }
+ if (stingy)
+ {
+ continue MAIN_LOOP;
+ }
break MAIN_LOOP;
- }
- if (stingy) {
- continue MAIN_LOOP;
- }
- break MAIN_LOOP;
- }
-
- if (finder == null) {
- finder = new DoablesFinder(token, input, mymatch);
- si.finder = finder;
- }
-
- if (numRepeats < min) {
- while (true) {
- REMatch doable = finder.find();
- if (doable == null) {
- if (stack.empty()) return null;
- stack.pop();
+ }
+
+ if (finder == null)
+ {
+ finder = new DoablesFinder (token, input, mymatch);
+ si.finder = finder;
+ }
+
+ if (numRepeats < min)
+ {
+ while (true)
+ {
+ REMatch doable = finder.find ();
+ if (doable == null)
+ {
+ if (stack.empty ())
+ return null;
+ stack.pop ();
+ continue MAIN_LOOP;
+ }
+ if (finder.noMore ())
+ stack.pop ();
+ int newNumRepeats = (doable.empty ? min : numRepeats + 1);
+ stack.
+ push (new
+ StackedInfo (input, newNumRepeats, doable,
+ visited, null));
continue MAIN_LOOP;
- }
- if (finder.noMore()) stack.pop();
- int newNumRepeats = (doable.empty ? min : numRepeats + 1);
- stack.push(new StackedInfo(
- input, newNumRepeats, doable, visited, null));
- continue MAIN_LOOP;
- }
- }
-
- if (visited == null) visited = initVisited();
-
- if (stingy) {
- REMatch nextMatch = finder.find();
- if (nextMatch != null && !nextMatch.empty) {
- stack.push(new StackedInfo(
- input, numRepeats + 1, nextMatch, visited, null));
- }
- else {
- stack.pop();
- }
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (!stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
+ }
+ }
+
+ if (visited == null)
+ visited = initVisited ();
+
+ if (stingy)
+ {
+ REMatch nextMatch = finder.find ();
+ if (nextMatch != null && !nextMatch.empty)
+ {
+ stack.
+ push (new
+ StackedInfo (input, numRepeats + 1, nextMatch,
+ visited, null));
+ }
+ else
+ {
+ stack.pop ();
+ }
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input,
+ mymatch, stack));
+ }
+ result = m1;
+ break MAIN_LOOP;
+ }
+ else
+ {
+ continue MAIN_LOOP;
+ }
+ }
+
+ visited = addVisited (mymatch.index, visited);
+
+ TryAnotherResult taresult =
+ tryAnother (stack, input, mymatch, numRepeats, finder, visited);
+ visited = taresult.visited;
+ switch (taresult.status)
+ {
+ case TryAnotherResult.TRY_FURTHER:
+ controlStack.push (new FindMatchControl (finder));
+ continue MAIN_LOOP0;
+ case TryAnotherResult.RESULT_FOUND:
+ result = taresult.result;
+ break MAIN_LOOP;
+ }
+
+ if (!stack.empty ())
+ {
+ stack.pop ();
+ }
+ if (possessive)
+ {
+ stack.clear ();
+ }
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
+ }
result = m1;
break MAIN_LOOP;
- }
- else {
- continue MAIN_LOOP;
- }
- }
-
- visited = addVisited(mymatch.index, visited);
-
- TryAnotherResult taresult = tryAnother(stack, input, mymatch, numRepeats, finder, visited);
- visited = taresult.visited;
- switch (taresult.status) {
- case TryAnotherResult.TRY_FURTHER:
- controlStack.push(new FindMatchControl(
- finder));
- continue MAIN_LOOP0;
- case TryAnotherResult.RESULT_FOUND:
- result = taresult.result;
- break MAIN_LOOP;
- }
-
- if (!stack.empty()) {
- stack.pop();
- }
- if (possessive) {
- stack.clear();
- }
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
- result = m1;
- break MAIN_LOOP;
- }
+ }
- } // MAIN_LOOP
+ } // MAIN_LOOP
- if (controlStack.empty()) return result;
- FindMatchControl control = controlStack.pop();
- if (possessive) {
+ if (controlStack.isEmpty ())
+ return result;
+ FindMatchControl control = controlStack.pop ();
+ if (possessive)
+ {
return result;
- }
- if (result != null) {
- result.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
+ }
+ if (result != null)
+ {
+ result.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
return result;
- }
+ }
finder = control.finder;
- TryAnotherResult taresult = tryAnother(stack, input, mymatch, numRepeats, finder, visited);
+ TryAnotherResult taresult =
+ tryAnother (stack, input, mymatch, numRepeats, finder, visited);
visited = taresult.visited;
- switch (taresult.status) {
- case TryAnotherResult.TRY_FURTHER:
- controlStack.push(new FindMatchControl(
- finder));
- continue MAIN_LOOP0;
- case TryAnotherResult.RESULT_FOUND:
- return taresult.result;
- }
+ switch (taresult.status)
+ {
+ case TryAnotherResult.TRY_FURTHER:
+ controlStack.push (new FindMatchControl (finder));
+ continue MAIN_LOOP0;
+ case TryAnotherResult.RESULT_FOUND:
+ return taresult.result;
+ }
continue MAIN_LOOP0;
- } // MAIN_LOOP0
- }
+ } // MAIN_LOOP0
+ }
- private static class TryAnotherResult {
- REMatch result;
- int status;
- static final int RESULT_FOUND = 1;
- static final int TRY_FURTHER = 2;
- static final int NOTHING_FOUND = 3;
- int[] visited;
- }
+ private static class TryAnotherResult
+ {
+ REMatch result;
+ int status;
+ static final int RESULT_FOUND = 1;
+ static final int TRY_FURTHER = 2;
+ static final int NOTHING_FOUND = 3;
+ int[] visited;
+ }
- private TryAnotherResult tryAnother(BacktrackStack stack,
- CharIndexed input, REMatch mymatch, int numRepeats,
- DoablesFinder finder, int[] visited) {
+ private TryAnotherResult tryAnother (BacktrackStack stack,
+ CharIndexed input, REMatch mymatch,
+ int numRepeats, DoablesFinder finder,
+ int[]visited)
+ {
- TryAnotherResult taresult = new TryAnotherResult();
- taresult.visited = visited;
+ TryAnotherResult taresult = new TryAnotherResult ();
+ taresult.visited = visited;
- DO_THIS:
- {
+ DO_THIS:
+ {
- boolean emptyMatchFound = false;
+ boolean emptyMatchFound = false;
- DO_ONE_DOABLE:
- while (true) {
+ DO_ONE_DOABLE:
+ while (true)
+ {
- REMatch doable = finder.find();
- if (doable == null) {
- break DO_THIS;
+ REMatch doable = finder.find ();
+ if (doable == null)
+ {
+ break DO_THIS;
}
- if (doable.empty) emptyMatchFound = true;
-
- if (!emptyMatchFound) {
- int n = doable.index;
- if (visitedContains(n, visited)) {
- continue DO_ONE_DOABLE;
+ if (doable.empty)
+ emptyMatchFound = true;
+
+ if (!emptyMatchFound)
+ {
+ int n = doable.index;
+ if (visitedContains (n, visited))
+ {
+ continue DO_ONE_DOABLE;
}
- visited = addVisited(n, visited);
- stack.push(new StackedInfo(
- input, numRepeats + 1, doable, visited, null));
- taresult.visited = visited;
- taresult.status = TryAnotherResult.TRY_FURTHER;
- return taresult;
+ visited = addVisited (n, visited);
+ stack.
+ push (new
+ StackedInfo (input, numRepeats + 1, doable, visited,
+ null));
+ taresult.visited = visited;
+ taresult.status = TryAnotherResult.TRY_FURTHER;
+ return taresult;
}
- else {
- REMatch m1 = matchRest(input, doable);
- if (possessive) {
- taresult.result = m1;
- taresult.status = TryAnotherResult.RESULT_FOUND;
- return taresult;
+ else
+ {
+ REMatch m1 = matchRest (input, doable);
+ if (possessive)
+ {
+ taresult.result = m1;
+ taresult.status = TryAnotherResult.RESULT_FOUND;
+ return taresult;
}
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
}
- taresult.result = m1;
- taresult.status = TryAnotherResult.RESULT_FOUND;
- return taresult;
+ taresult.result = m1;
+ taresult.status = TryAnotherResult.RESULT_FOUND;
+ return taresult;
}
}
- } // DO_ONE_DOABLE
-
- } // DO_THIS
-
- taresult.status = TryAnotherResult.NOTHING_FOUND;
- return taresult;
-
- }
-
- boolean match(CharIndexed input, REMatch mymatch) {
- setHitEnd(input, mymatch);
- REMatch m1 = findMatch(input, mymatch);
- if (m1 != null) {
- mymatch.assignFrom(m1);
- return true;
- }
- return false;
- }
-
- // Array visited is an array of character positions we have already
- // visited. visited[0] is used to store the effective length of the
- // array.
- private static int[] initVisited() {
- int[] visited = new int[32];
- visited[0] = 0;
- return visited;
- }
-
- private static boolean visitedContains(int n, int[] visited) {
- // Experience tells that for a small array like this,
- // simple linear search is faster than binary search.
- for (int i = 1; i < visited[0]; i++) {
- if (n == visited[i]) return true;
- }
- return false;
- }
-
- private static int[] addVisited(int n, int[] visited) {
- if (visitedContains(n, visited)) return visited;
- if (visited[0] >= visited.length - 1) {
- int[] newvisited = new int[visited.length + 32];
- System.arraycopy(visited, 0, newvisited, 0, visited.length);
- visited = newvisited;
- }
- visited[0]++;
- visited[visited[0]] = n;
- return visited;
- }
-
- private REMatch matchRest(CharIndexed input, final REMatch newMatch) {
- if (next(input, newMatch)) {
- return newMatch;
- }
- return null;
- }
-
- private REMatch findMatchFixedLength(CharIndexed input, REMatch mymatch) {
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
- int numRepeats = token.findFixedLengthMatches(input, (REMatch)mymatch.clone(), max);
- if (numRepeats == Integer.MAX_VALUE) numRepeats = min;
- int count = numRepeats - min + 1;
- if (count <= 0) return null;
- int index = 0;
- if (!stingy) index = mymatch.index + (tokenFixedLength * numRepeats);
- else index = mymatch.index + (tokenFixedLength * min);
- return findMatchFixedLength(input, mymatch, index, count);
- }
-
- private REMatch backtrackFixedLength(CharIndexed input, REMatch mymatch,
- Object param) {
- int[] params = (int[])param;
- int index = params[0];
- int count = params[1];
- return findMatchFixedLength(input, mymatch, index, count);
- }
-
- private REMatch findMatchFixedLength(CharIndexed input, REMatch mymatch,
- int index, int count) {
- REMatch tryMatch = (REMatch) mymatch.clone();
- while (true) {
- tryMatch.index = index;
- REMatch m = matchRest(input, tryMatch);
- count--;
- if (stingy) index += tokenFixedLength;
- else index -= tokenFixedLength;
- if (possessive) return m;
- if (m != null) {
- if (count > 0) {
- m.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch,
- new int[] {index, count}));
- }
- return m;
- }
- if (count <= 0) return null;
- }
- }
-
- void dump(StringBuffer os) {
- os.append("(?:");
- token.dumpAll(os);
- os.append(')');
- if ((max == Integer.MAX_VALUE) && (min <= 1))
- os.append( (min == 0) ? '*' : '+' );
- else if ((min == 0) && (max == 1))
- os.append('?');
- else {
- os.append('{').append(min);
- if (max > min) {
- os.append(',');
- if (max != Integer.MAX_VALUE) os.append(max);
- }
- os.append('}');
- }
- if (stingy) os.append('?');
- }
+ } // DO_ONE_DOABLE
+
+ } // DO_THIS
+
+ taresult.status = TryAnotherResult.NOTHING_FOUND;
+ return taresult;
+
+ }
+
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ setHitEnd (input, mymatch);
+ REMatch m1 = findMatch (input, mymatch);
+ if (m1 != null)
+ {
+ mymatch.assignFrom (m1);
+ return true;
+ }
+ return false;
+ }
+
+ // Array visited is an array of character positions we have already
+ // visited. visited[0] is used to store the effective length of the
+ // array.
+ private static int[] initVisited ()
+ {
+ int[] visited = new int[32];
+ visited[0] = 0;
+ return visited;
+ }
+
+ private static boolean visitedContains (int n, int[]visited)
+ {
+ // Experience tells that for a small array like this,
+ // simple linear search is faster than binary search.
+ for (int i = 1; i < visited[0]; i++)
+ {
+ if (n == visited[i])
+ return true;
+ }
+ return false;
+ }
+
+ private static int[] addVisited (int n, int[]visited)
+ {
+ if (visitedContains (n, visited))
+ return visited;
+ if (visited[0] >= visited.length - 1)
+ {
+ int[] newvisited = new int[visited.length + 32];
+ System.arraycopy (visited, 0, newvisited, 0, visited.length);
+ visited = newvisited;
+ }
+ visited[0]++;
+ visited[visited[0]] = n;
+ return visited;
+ }
+
+ private REMatch matchRest (CharIndexed input, final REMatch newMatch)
+ {
+ if (next (input, newMatch))
+ {
+ return newMatch;
+ }
+ return null;
+ }
+
+ private REMatch findMatchFixedLength (CharIndexed input, REMatch mymatch)
+ {
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+ int numRepeats =
+ token.findFixedLengthMatches (input, (REMatch) mymatch.clone (), max);
+ if (numRepeats == Integer.MAX_VALUE)
+ numRepeats = min;
+ int count = numRepeats - min + 1;
+ if (count <= 0)
+ return null;
+ int index = 0;
+ if (!stingy)
+ index = mymatch.index + (tokenFixedLength * numRepeats);
+ else
+ index = mymatch.index + (tokenFixedLength * min);
+ return findMatchFixedLength (input, mymatch, index, count);
+ }
+
+ private REMatch backtrackFixedLength (CharIndexed input, REMatch mymatch,
+ Object param)
+ {
+ int[] params = (int[]) param;
+ int index = params[0];
+ int count = params[1];
+ return findMatchFixedLength (input, mymatch, index, count);
+ }
+
+ private REMatch findMatchFixedLength (CharIndexed input, REMatch mymatch,
+ int index, int count)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ while (true)
+ {
+ tryMatch.index = index;
+ REMatch m = matchRest (input, tryMatch);
+ count--;
+ if (stingy)
+ index += tokenFixedLength;
+ else
+ index -= tokenFixedLength;
+ if (possessive)
+ return m;
+ if (m != null)
+ {
+ if (count > 0)
+ {
+ m.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ new int[]
+ {
+ index, count}));
+ }
+ return m;
+ }
+ if (count <= 0)
+ return null;
+ }
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?:");
+ token.dumpAll (os);
+ os.append (')');
+ if ((max == Integer.MAX_VALUE) && (min <= 1))
+ os.append ((min == 0) ? '*' : '+');
+ else if ((min == 0) && (max == 1))
+ os.append ('?');
+ else
+ {
+ os.append ('{').append (min);
+ if (max > min)
+ {
+ os.append (',');
+ if (max != Integer.MAX_VALUE)
+ os.append (max);
+ }
+ os.append ('}');
+ }
+ if (stingy)
+ os.append ('?');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenStart.java b/libjava/classpath/gnu/java/util/regex/RETokenStart.java
index aa5f0c9..6a8d247 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenStart.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenStart.java
@@ -37,85 +37,117 @@ exception statement from your version. */
package gnu.java.util.regex;
-class RETokenStart extends REToken {
- private String newline; // matches after a newline
- private boolean check_java_line_terminators;
-
- RETokenStart(int subIndex, String newline) {
- super(subIndex);
- this.newline = newline;
- this.check_java_line_terminators = false;
- }
-
- RETokenStart(int subIndex, String newline, boolean b) {
- super(subIndex);
- this.newline = newline;
- this.check_java_line_terminators = b;
- }
-
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- // charAt(index-n) may be unknown on a Reader/InputStream. FIXME
- // Match after a newline if in multiline mode
-
- if (check_java_line_terminators) {
- char ch = input.charAt(mymatch.index - 1);
- if (ch != CharIndexed.OUT_OF_BOUNDS) {
- if (ch == '\n') return mymatch;
- if (ch == '\r') {
- char ch1 = input.charAt(mymatch.index);
- if (ch1 != '\n') return mymatch;
- return null;
- }
- if (ch == '\u0085') return mymatch; // A next-line character
- if (ch == '\u2028') return mymatch; // A line-separator character
- if (ch == '\u2029') return mymatch; // A paragraph-separator character
- }
- }
-
- if (newline != null) {
- int len = newline.length();
- if (mymatch.offset >= len) {
- boolean found = true;
- char z;
- int i = 0; // position in REToken.newline
- char ch = input.charAt(mymatch.index - len);
- do {
- z = newline.charAt(i);
- if (ch != z) {
- found = false;
- break;
- }
- ++i;
- ch = input.charAt(mymatch.index - len + i);
- } while (i < len);
-
- if (found) return mymatch;
- }
- }
-
- // Don't match at all if REG_NOTBOL is set.
- if ((mymatch.eflags & RE.REG_NOTBOL) > 0) return null;
-
- if ((mymatch.eflags & RE.REG_ANCHORINDEX) > 0)
- return (mymatch.anchor == mymatch.offset) ?
- mymatch : null;
- else
- return ((mymatch.index == 0) && (mymatch.offset == 0)) ?
- mymatch : null;
- }
-
- boolean returnsFixedLengthmatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- os.append('^');
- }
+import gnu.java.lang.CPStringBuilder;
+
+class RETokenStart extends REToken
+{
+ private String newline; // matches after a newline
+ private boolean check_java_line_terminators;
+
+ RETokenStart (int subIndex, String newline)
+ {
+ super (subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = false;
+ }
+
+ RETokenStart (int subIndex, String newline, boolean b)
+ {
+ super (subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = b;
+ }
+
+ @Override
+ int getMaximumLength ()
+ {
+ return 0;
+ }
+
+ @Override
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ // charAt(index-n) may be unknown on a Reader/InputStream. FIXME
+ // Match after a newline if in multiline mode
+
+ if (check_java_line_terminators)
+ {
+ char ch = input.charAt (mymatch.index - 1);
+ if (ch != CharIndexed.OUT_OF_BOUNDS)
+ {
+ if (ch == '\n')
+ return mymatch;
+ if (ch == '\r')
+ {
+ char ch1 = input.charAt (mymatch.index);
+ if (ch1 != '\n')
+ return mymatch;
+ return null;
+ }
+ if (ch == '\u0085')
+ return mymatch; // A next-line character
+ if (ch == '\u2028')
+ return mymatch; // A line-separator character
+ if (ch == '\u2029')
+ return mymatch; // A paragraph-separator character
+ }
+ }
+
+ if (newline != null)
+ {
+ int len = newline.length ();
+ if (mymatch.offset >= len)
+ {
+ boolean found = true;
+ char z;
+ int i = 0; // position in REToken.newline
+ char ch = input.charAt (mymatch.index - len);
+ do
+ {
+ z = newline.charAt (i);
+ if (ch != z)
+ {
+ found = false;
+ break;
+ }
+ ++i;
+ ch = input.charAt (mymatch.index - len + i);
+ }
+ while (i < len);
+
+ if (found)
+ return mymatch;
+ }
+ }
+
+ // Don't match at all if REG_NOTBOL is set.
+ if ((mymatch.eflags & RE.REG_NOTBOL) > 0)
+ return null;
+
+ if ((mymatch.eflags & RE.REG_ANCHORINDEX) > 0)
+ return (mymatch.anchor == mymatch.offset) ? mymatch : null;
+ else
+ return ((mymatch.index == 0) && (mymatch.offset == 0)) ? mymatch : null;
+ }
+
+ @Override
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ @Override
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ @Override
+ void dump (CPStringBuilder os)
+ {
+ os.append ('^');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java b/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
index 538c6be..9f758b6 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
@@ -38,79 +38,104 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* Represents a combination lookahead/lookbehind for POSIX [:alnum:].
*/
-final class RETokenWordBoundary extends REToken {
- private boolean negated;
- private int where;
- static final int BEGIN = 1;
- static final int END = 2;
-
- RETokenWordBoundary(int subIndex, int where, boolean negated) {
- super(subIndex);
- this.where = where;
- this.negated = negated;
- }
-
- int getMaximumLength() {
- return 0;
- }
-
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- // Word boundary means input[index-1] was a word character
- // and input[index] is not, or input[index] is a word character
- // and input[index-1] was not
- // In the string "one two three", these positions match:
- // |o|n|e| |t|w|o| |t|h|r|e|e|
- // ^ ^ ^ ^ ^ ^
- boolean after = false; // is current character a letter or digit?
- boolean before = false; // is previous character a letter or digit?
- char ch;
-
- // TODO: Also check REG_ANCHORINDEX vs. anchor
- if (((mymatch.eflags & RE.REG_ANCHORINDEX) != RE.REG_ANCHORINDEX)
- || (mymatch.offset + mymatch.index > mymatch.anchor)) {
- if ((ch = input.charAt(mymatch.index - 1)) != CharIndexed.OUT_OF_BOUNDS) {
- before = Character.isLetterOrDigit(ch) || (ch == '_');
- }
- }
-
- if ((ch = input.charAt(mymatch.index)) != CharIndexed.OUT_OF_BOUNDS) {
- after = Character.isLetterOrDigit(ch) || (ch == '_');
- }
-
- // if (before) and (!after), we're at end (\>)
- // if (after) and (!before), we're at beginning (\<)
- boolean doNext = false;
-
- if ((where & BEGIN) == BEGIN) {
- doNext = after && !before;
- }
- if ((where & END) == END) {
- doNext ^= before && !after;
- }
-
- if (negated) doNext = !doNext;
-
- return (doNext ? mymatch : null);
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if(matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- if (where == (BEGIN | END)) {
- os.append( negated ? "\\B" : "\\b" );
- } else if (where == BEGIN) {
- os.append("\\<");
- } else {
- os.append("\\>");
- }
- }
+final class RETokenWordBoundary extends REToken
+{
+ private boolean negated;
+ private int where;
+ static final int BEGIN = 1;
+ static final int END = 2;
+
+ RETokenWordBoundary (int subIndex, int where, boolean negated)
+ {
+ super (subIndex);
+ this.where = where;
+ this.negated = negated;
+ }
+
+ int getMaximumLength ()
+ {
+ return 0;
+ }
+
+
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ // Word boundary means input[index-1] was a word character
+ // and input[index] is not, or input[index] is a word character
+ // and input[index-1] was not
+ // In the string "one two three", these positions match:
+ // |o|n|e| |t|w|o| |t|h|r|e|e|
+ // ^ ^ ^ ^ ^ ^
+ boolean after = false; // is current character a letter or digit?
+ boolean before = false; // is previous character a letter or digit?
+ char ch;
+
+ // TODO: Also check REG_ANCHORINDEX vs. anchor
+ if (((mymatch.eflags & RE.REG_ANCHORINDEX) != RE.REG_ANCHORINDEX)
+ || (mymatch.offset + mymatch.index > mymatch.anchor))
+ {
+ if ((ch =
+ input.charAt (mymatch.index - 1)) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ before = Character.isLetterOrDigit (ch) || (ch == '_');
+ }
+ }
+
+ if ((ch = input.charAt (mymatch.index)) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ after = Character.isLetterOrDigit (ch) || (ch == '_');
+ }
+
+ // if (before) and (!after), we're at end (\>)
+ // if (after) and (!before), we're at beginning (\<)
+ boolean doNext = false;
+
+ if ((where & BEGIN) == BEGIN)
+ {
+ doNext = after && !before;
+ }
+ if ((where & END) == END)
+ {
+ doNext ^= before && !after;
+ }
+
+ if (negated)
+ doNext = !doNext;
+
+ return (doNext ? mymatch : null);
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ if (where == (BEGIN | END))
+ {
+ os.append (negated ? "\\B" : "\\b");
+ }
+ else if (where == BEGIN)
+ {
+ os.append ("\\<");
+ }
+ else
+ {
+ os.append ("\\>");
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/UncheckedRE.java b/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
index 73a67c6..5f8c749 100644
--- a/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
+++ b/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
@@ -55,7 +55,8 @@ package gnu.java.util.regex;
* @since gnu.regexp 1.1.4
*/
-public final class UncheckedRE extends RE {
+public final class UncheckedRE extends RE
+{
/**
* Constructs a regular expression pattern buffer without any compilation
* flags set, and using the default syntax (RESyntax.RE_SYNTAX_PERL5).
@@ -66,8 +67,9 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern) {
- this(pattern,0,RESyntax.RE_SYNTAX_PERL5);
+ public UncheckedRE (Object pattern)
+ {
+ this (pattern, 0, RESyntax.RE_SYNTAX_PERL5);
}
/**
@@ -81,8 +83,9 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern, int cflags) {
- this(pattern,cflags,RESyntax.RE_SYNTAX_PERL5);
+ public UncheckedRE (Object pattern, int cflags)
+ {
+ this (pattern, cflags, RESyntax.RE_SYNTAX_PERL5);
}
/**
@@ -97,13 +100,15 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern, int cflags, RESyntax syntax) {
- try {
- initialize(pattern,cflags,syntax,0,0);
- } catch (REException e) {
- throw new RuntimeException(e.getMessage());
- }
+ public UncheckedRE (Object pattern, int cflags, RESyntax syntax)
+ {
+ try
+ {
+ initialize (pattern, cflags, syntax, 0, 0);
+ }
+ catch (REException e)
+ {
+ throw new RuntimeException (e.getMessage ());
+ }
}
}
-
-