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
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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: ");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:");
|
||||
|
||||
@@ -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: ");
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(", ");
|
||||
|
||||
@@ -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: ");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,13 +222,19 @@ 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.
|
||||
*/
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -38,10 +38,25 @@ exception statement from your version. */
|
||||
|
||||
package gnu.java.awt.peer.gtk;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.datatransfer.*;
|
||||
import gnu.java.lang.CPStringBuilder;
|
||||
|
||||
import java.io.*;
|
||||
import java.awt.Image;
|
||||
|
||||
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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 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);
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
Integer key = null;
|
||||
Window awtWindow = null;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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("[]");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(", ");
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(")")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("(");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -48,20 +48,12 @@ 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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
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;
|
||||
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;
|
||||
}
|
||||
BacktrackStack ()
|
||||
{
|
||||
stack = new Backtrack[INITIAL_CAPACITY];
|
||||
size = 0;
|
||||
capacity = INITIAL_CAPACITY;
|
||||
}
|
||||
|
||||
boolean empty() {
|
||||
return size == 0;
|
||||
}
|
||||
boolean empty ()
|
||||
{
|
||||
return size == 0;
|
||||
}
|
||||
|
||||
Backtrack peek() {
|
||||
return stack[size - 1];
|
||||
}
|
||||
Backtrack peek ()
|
||||
{
|
||||
return stack[size - 1];
|
||||
}
|
||||
|
||||
Backtrack pop() {
|
||||
Backtrack bt = stack[--size];
|
||||
stack[size] = null;
|
||||
return bt;
|
||||
}
|
||||
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 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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
class CharIndexedCharSequence implements CharIndexed, Serializable
|
||||
{
|
||||
private CharSequence s;
|
||||
private int anchor;
|
||||
private int len;
|
||||
|
||||
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);
|
||||
}
|
||||
CharIndexedCharSequence (CharSequence s, int index)
|
||||
{
|
||||
this.s = s;
|
||||
len = s.length ();
|
||||
anchor = index;
|
||||
}
|
||||
|
||||
public boolean move1(int index) {
|
||||
return ((anchor += index) <= len);
|
||||
}
|
||||
public char charAt (int index)
|
||||
{
|
||||
int pos = anchor + index;
|
||||
return ((pos < len) && (pos >= 0)) ? s.charAt (pos) : OUT_OF_BOUNDS;
|
||||
}
|
||||
|
||||
public CharIndexed lookBehind(int index, int length) {
|
||||
if (length > (anchor + index)) length = anchor + index;
|
||||
return new CharIndexedCharSequence(s, anchor + index - length);
|
||||
}
|
||||
public boolean isValid ()
|
||||
{
|
||||
return (anchor < len);
|
||||
}
|
||||
|
||||
public int length() {
|
||||
return len - anchor;
|
||||
}
|
||||
public boolean move (int index)
|
||||
{
|
||||
return ((anchor += index) < len);
|
||||
}
|
||||
|
||||
private REMatch lastMatch;
|
||||
public void setLastMatch(REMatch match) {
|
||||
lastMatch = (REMatch)match.clone();
|
||||
lastMatch.anchor = anchor;
|
||||
}
|
||||
public REMatch getLastMatch() { return lastMatch; }
|
||||
public boolean move1 (int index)
|
||||
{
|
||||
return ((anchor += index) <= len);
|
||||
}
|
||||
|
||||
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 CharIndexed lookBehind (int index, int length)
|
||||
{
|
||||
if (length > (anchor + index))
|
||||
length = anchor + index;
|
||||
return new CharIndexedCharSequence (s, anchor + index - length);
|
||||
}
|
||||
|
||||
public int getAnchor() { return anchor; }
|
||||
public void setAnchor(int anchor) { this.anchor = anchor; }
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
class CharIndexedInputStream implements CharIndexed
|
||||
{
|
||||
private static final int BUFFER_INCREMENT = 1024;
|
||||
private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
|
||||
|
||||
// so that we don't try to reset() right away
|
||||
private int index = -1;
|
||||
private BufferedInputStream br;
|
||||
|
||||
private int bufsize = BUFFER_INCREMENT;
|
||||
// so that we don't try to reset() right away
|
||||
private int index = -1;
|
||||
|
||||
private int end = UNKNOWN;
|
||||
private int bufsize = BUFFER_INCREMENT;
|
||||
|
||||
private char cached = OUT_OF_BOUNDS;
|
||||
private int end = UNKNOWN;
|
||||
|
||||
// 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
|
||||
private char cached = OUT_OF_BOUNDS;
|
||||
|
||||
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;
|
||||
// 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;
|
||||
cached = (char) i;
|
||||
index = 1;
|
||||
} catch (IOException e)
|
||||
{
|
||||
e.printStackTrace ();
|
||||
cached = OUT_OF_BOUNDS;
|
||||
return false;
|
||||
}
|
||||
|
||||
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);
|
||||
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 CharIndexed lookBehind(int index, int length) {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to look behind for an input stream");
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
public int length() {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to tell the length for an input stream");
|
||||
}
|
||||
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 void setLastMatch(REMatch match) {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support setLastMatch for an input stream");
|
||||
}
|
||||
public boolean isValid ()
|
||||
{
|
||||
return (cached != OUT_OF_BOUNDS);
|
||||
}
|
||||
|
||||
public REMatch getLastMatch() {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support getLastMatch for an input stream");
|
||||
}
|
||||
public CharIndexed lookBehind (int index, int length)
|
||||
{
|
||||
throw new
|
||||
UnsupportedOperationException
|
||||
("difficult to look behind for an input stream");
|
||||
}
|
||||
|
||||
public void setHitEnd(REMatch match) {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support setHitEnd for an input stream");
|
||||
}
|
||||
public int length ()
|
||||
{
|
||||
throw new
|
||||
UnsupportedOperationException
|
||||
("difficult to tell the length for an input stream");
|
||||
}
|
||||
|
||||
public boolean hitEnd() {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support hitEnd for an input stream");
|
||||
}
|
||||
public void setLastMatch (REMatch match)
|
||||
{
|
||||
throw new
|
||||
UnsupportedOperationException
|
||||
("difficult to support setLastMatch for an input stream");
|
||||
}
|
||||
|
||||
public int getAnchor() {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support getAnchor for an input stream");
|
||||
}
|
||||
public REMatch getLastMatch ()
|
||||
{
|
||||
throw new
|
||||
UnsupportedOperationException
|
||||
("difficult to support getLastMatch for an input stream");
|
||||
}
|
||||
|
||||
public void setAnchor(int anchor) {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support setAnchor for an input stream");
|
||||
}
|
||||
public void setHitEnd (REMatch match)
|
||||
{
|
||||
throw new
|
||||
UnsupportedOperationException
|
||||
("difficult to support setHitEnd for an input stream");
|
||||
}
|
||||
|
||||
public boolean move1(int index) {
|
||||
throw new UnsupportedOperationException(
|
||||
"difficult to support move1 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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 ();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
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;
|
||||
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);
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
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
|
||||
// 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;
|
||||
// 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;
|
||||
// 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.
|
||||
// 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;
|
||||
BacktrackStack backtrackStack;
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
REMatch copy = (REMatch) super.clone();
|
||||
public Object clone ()
|
||||
{
|
||||
try
|
||||
{
|
||||
REMatch copy = (REMatch) super.clone ();
|
||||
|
||||
copy.start = (int[]) start.clone();
|
||||
copy.start1 = (int[]) start1.clone();
|
||||
copy.end = (int[]) end.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
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
void assignFrom(REMatch other) {
|
||||
start = other.start;
|
||||
start1 = other.start1;
|
||||
end = other.end;
|
||||
index = other.index;
|
||||
backtrackStack = other.backtrackStack;
|
||||
catch (CloneNotSupportedException e)
|
||||
{
|
||||
throw new Error (); // doesn't happen
|
||||
}
|
||||
}
|
||||
|
||||
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 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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/** 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;
|
||||
}
|
||||
|
||||
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;
|
||||
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();
|
||||
}
|
||||
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) {
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
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();
|
||||
static
|
||||
{
|
||||
// Define syntaxes
|
||||
|
||||
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_EMACS = new RESyntax ().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();
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
boolean chain(REToken token) {
|
||||
next = token;
|
||||
return true; // Token was accepted
|
||||
REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
|
||||
{
|
||||
throw new IllegalStateException ("This token cannot be backtracked to");
|
||||
}
|
||||
|
||||
abstract void dump(StringBuffer os);
|
||||
|
||||
void dumpAll(StringBuffer os) {
|
||||
dump(os);
|
||||
if (next != null) next.dumpAll(os);
|
||||
boolean chain (REToken token)
|
||||
{
|
||||
next = token;
|
||||
return true; // Token was accepted
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer os = new StringBuffer();
|
||||
dump(os);
|
||||
return os.toString();
|
||||
abstract void dump (CPStringBuilder os);
|
||||
|
||||
void dumpAll (CPStringBuilder os)
|
||||
{
|
||||
dump (os);
|
||||
if (next != null)
|
||||
next.dumpAll (os);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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 true;
|
||||
return null;
|
||||
}
|
||||
|
||||
boolean returnsFixedLengthMatches() { return true; }
|
||||
boolean matchOneChar (char ch)
|
||||
{
|
||||
if ((ch == CharIndexed.OUT_OF_BOUNDS)
|
||||
|| (!newline && (ch == '\n')) || (matchNull && (ch == 0)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
|
||||
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++;
|
||||
}
|
||||
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 ('.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
return mymatch;
|
||||
}
|
||||
// java.util.regex.Matcher#hitEnd() requires that the length of
|
||||
// partial match be counted.
|
||||
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 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;
|
||||
}
|
||||
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; }
|
||||
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;
|
||||
}
|
||||
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);
|
||||
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(StringBuffer os) {
|
||||
os.append(ch);
|
||||
void dump (CPStringBuilder os)
|
||||
{
|
||||
os.append (ch);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 ());
|
||||
|
||||
boolean returnsFixedLengthMatches() { return true; }
|
||||
return mymatch;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
boolean returnsFixedLengthMatches ()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void dump(StringBuffer os) {
|
||||
os.append('$');
|
||||
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 (CPStringBuilder os)
|
||||
{
|
||||
os.append ('$');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 + ")");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 getMaximumLength() {
|
||||
return re.getMaximumLength();
|
||||
}
|
||||
|
||||
REMatch matchThis(CharIndexed input, REMatch mymatch)
|
||||
int getMinimumLength ()
|
||||
{
|
||||
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 re.getMinimumLength ();
|
||||
}
|
||||
|
||||
}
|
||||
int getMaximumLength ()
|
||||
{
|
||||
return re.getMaximumLength ();
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void dump(StringBuffer os) {
|
||||
os.append("(?>");
|
||||
re.dumpAll(os);
|
||||
os.append(')');
|
||||
}
|
||||
void dump (CPStringBuilder os)
|
||||
{
|
||||
os.append ("(?>");
|
||||
re.dumpAll (os);
|
||||
os.append (')');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 (')');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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(')');
|
||||
void dump (CPStringBuilder os)
|
||||
{
|
||||
os.append ("(?<");
|
||||
os.append (negative ? '!' : '=');
|
||||
re.dumpAll (os);
|
||||
os.append (')');
|
||||
}
|
||||
|
||||
private static class RETokenMatchHereOnly extends REToken
|
||||
{
|
||||
|
||||
int getMaximumLength ()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static class RETokenMatchHereOnly extends REToken {
|
||||
|
||||
int getMaximumLength() { return 0; }
|
||||
|
||||
private int index;
|
||||
|
||||
RETokenMatchHereOnly(int index) {
|
||||
super(0);
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
REMatch matchThis(CharIndexed input, REMatch mymatch) {
|
||||
return (index == mymatch.index ? mymatch : null);
|
||||
}
|
||||
|
||||
void dump(StringBuffer os) {}
|
||||
private int index;
|
||||
|
||||
RETokenMatchHereOnly (int index)
|
||||
{
|
||||
super (0);
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
REMatch matchThis (CharIndexed input, REMatch mymatch)
|
||||
{
|
||||
return (index == mymatch.index ? mymatch : null);
|
||||
}
|
||||
|
||||
void dump (CPStringBuilder os)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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("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"))
|
||||
if (name.startsWith ("In"))
|
||||
{
|
||||
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);
|
||||
}
|
||||
name = name.substring (2);
|
||||
Character.UnicodeBlock block =
|
||||
Character.UnicodeBlock.forName (name);
|
||||
return new UnicodeBlockHandler (block);
|
||||
}
|
||||
throw new REException("unsupported name " + name, REException.REG_ESCAPE, 0);
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
throw new REException ("Invalid Unicode block name: " + name,
|
||||
REException.REG_ESCAPE, 0);
|
||||
}
|
||||
}
|
||||
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"))
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
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; }
|
||||
|
||||
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;
|
||||
boolean returnsFixedLengthMatches ()
|
||||
{
|
||||
return matchesOneChar;
|
||||
}
|
||||
|
||||
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 ? ']' : ')');
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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 ? ']' : ')');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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] + ":]");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
return matches;
|
||||
}
|
||||
|
||||
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;
|
||||
numRepeats++;
|
||||
}
|
||||
return numRepeats;
|
||||
}
|
||||
|
||||
void dump(StringBuffer os) {
|
||||
os.append(lo).append('-').append(hi);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
import gnu.java.lang.CPStringBuilder;
|
||||
|
||||
RETokenStart(int subIndex, String newline, boolean b) {
|
||||
super(subIndex);
|
||||
this.newline = newline;
|
||||
this.check_java_line_terminators = b;
|
||||
}
|
||||
class RETokenStart extends REToken
|
||||
{
|
||||
private String newline; // matches after a newline
|
||||
private boolean check_java_line_terminators;
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
RETokenStart (int subIndex, String newline)
|
||||
{
|
||||
super (subIndex);
|
||||
this.newline = newline;
|
||||
this.check_java_line_terminators = false;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
RETokenStart (int subIndex, String newline, boolean b)
|
||||
{
|
||||
super (subIndex);
|
||||
this.newline = newline;
|
||||
this.check_java_line_terminators = b;
|
||||
}
|
||||
|
||||
boolean returnsFixedLengthmatches() { return true; }
|
||||
@Override
|
||||
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('^');
|
||||
}
|
||||
@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 ('^');
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user