summaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu')
-rw-r--r--libjava/classpath/gnu/CORBA/BigDecimalHelper.java6
-rw-r--r--libjava/classpath/gnu/CORBA/CDR/LittleEndianInputStream.java6
-rw-r--r--libjava/classpath/gnu/CORBA/CDR/Vio.java6
-rw-r--r--libjava/classpath/gnu/CORBA/CDR/gnuRuntime.java4
-rw-r--r--libjava/classpath/gnu/CORBA/GIOP/MessageHeader.java6
-rw-r--r--libjava/classpath/gnu/CORBA/GIOP/RequestHeader.java4
-rw-r--r--libjava/classpath/gnu/CORBA/GIOP/v1_0/ReplyHeader.java4
-rw-r--r--libjava/classpath/gnu/CORBA/GIOP/v1_0/RequestHeader.java6
-rw-r--r--libjava/classpath/gnu/CORBA/IOR.java16
-rw-r--r--libjava/classpath/gnu/CORBA/NamingService/NameParser.java8
-rw-r--r--libjava/classpath/gnu/CORBA/NamingService/NameTransformer.java8
-rw-r--r--libjava/classpath/gnu/CORBA/OrbFunctional.java2
-rw-r--r--libjava/classpath/gnu/CORBA/Poa/gnuPOA.java4
-rw-r--r--libjava/classpath/gnu/CORBA/Poa/gnuServantObject.java6
-rw-r--r--libjava/classpath/gnu/classpath/Configuration.java.in10
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java2
-rw-r--r--libjava/classpath/gnu/classpath/jdwp/util/Signature.java8
-rw-r--r--libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java8
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Edge.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Segment.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Width.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java3
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java169
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java15
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java1
-rw-r--r--libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java6
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java21
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java13
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XEventPump.java346
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java3
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java28
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java9
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java27
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XImage.java71
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XToolkit.java50
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java37
-rw-r--r--libjava/classpath/gnu/java/lang/CPStringBuilder.java1161
-rw-r--r--libjava/classpath/gnu/java/lang/ClassHelper.java2
-rw-r--r--libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java16
-rw-r--r--libjava/classpath/gnu/java/lang/reflect/TypeSignature.java6
-rw-r--r--libjava/classpath/gnu/java/math/GMP.java474
-rw-r--r--libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java12
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Cookie.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java6
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Headers.java4
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java34
-rw-r--r--libjava/classpath/gnu/java/net/protocol/http/Request.java7
-rw-r--r--libjava/classpath/gnu/java/net/protocol/jar/Handler.java6
-rw-r--r--libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java6
-rw-r--r--libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java6
-rw-r--r--libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java6
-rw-r--r--libjava/classpath/gnu/java/rmi/server/RMIHashes.java4
-rw-r--r--libjava/classpath/gnu/java/security/Engine.java4
-rw-r--r--libjava/classpath/gnu/java/security/OID.java4
-rw-r--r--libjava/classpath/gnu/java/security/PolicyFile.java8
-rw-r--r--libjava/classpath/gnu/java/security/der/BitString.java4
-rw-r--r--libjava/classpath/gnu/java/security/der/DERReader.java8
-rw-r--r--libjava/classpath/gnu/java/security/hash/Whirlpool.java20
-rw-r--r--libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java4
-rw-r--r--libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java5
-rw-r--r--libjava/classpath/gnu/java/security/util/ByteArray.java6
-rw-r--r--libjava/classpath/gnu/java/security/util/Util.java10
-rw-r--r--libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java4
-rw-r--r--libjava/classpath/gnu/java/security/x509/Util.java10
-rw-r--r--libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java10
-rw-r--r--libjava/classpath/gnu/java/text/AttributedFormatBuffer.java24
-rw-r--r--libjava/classpath/gnu/java/text/StringFormatBuffer.java2
-rw-r--r--libjava/classpath/gnu/java/util/Base64.java4
-rw-r--r--libjava/classpath/gnu/java/util/EmptyEnumeration.java18
-rw-r--r--libjava/classpath/gnu/java/util/prefs/EventDispatcher.java113
-rw-r--r--libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java6
-rw-r--r--libjava/classpath/gnu/java/util/prefs/NodeWriter.java4
-rw-r--r--libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java99
-rw-r--r--libjava/classpath/gnu/java/util/regex/BacktrackStack.java128
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexed.java29
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java12
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java130
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java346
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedString.java10
-rw-r--r--libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java10
-rw-r--r--libjava/classpath/gnu/java/util/regex/RE.java3166
-rw-r--r--libjava/classpath/gnu/java/util/regex/REException.java66
-rw-r--r--libjava/classpath/gnu/java/util/regex/REFilterInputStream.java97
-rw-r--r--libjava/classpath/gnu/java/util/regex/REMatch.java382
-rw-r--r--libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java76
-rw-r--r--libjava/classpath/gnu/java/util/regex/RESyntax.java369
-rw-r--r--libjava/classpath/gnu/java/util/regex/REToken.java196
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenAny.java84
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenBackRef.java86
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenChar.java183
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEnd.java125
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java72
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenEndSub.java61
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenIndependent.java45
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java50
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java114
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java519
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenOneOf.java371
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java174
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenRange.java105
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenRepeated.java975
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenStart.java194
-rw-r--r--libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java169
-rw-r--r--libjava/classpath/gnu/java/util/regex/UncheckedRE.java31
-rw-r--r--libjava/classpath/gnu/javax/activation/viewers/ImageViewer.java138
-rw-r--r--libjava/classpath/gnu/javax/activation/viewers/TextEditor.java119
-rw-r--r--libjava/classpath/gnu/javax/activation/viewers/TextViewer.java81
-rw-r--r--libjava/classpath/gnu/javax/crypto/assembly/TransformerException.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/cipher/BaseCipher.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/jce/sig/DHParameters.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/key/KeyAgreementException.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/mode/BaseMode.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/pad/BasePad.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/crammd5/CramMD5Util.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/crammd5/PasswordFile.java6
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/plain/PasswordFile.java6
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/plain/PlainClient.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/srp/PasswordFile.java12
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/srp/SRPClient.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/srp/SRPServer.java4
-rw-r--r--libjava/classpath/gnu/javax/crypto/sasl/srp/ServerStore.java4
-rw-r--r--libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriter.java1
-rw-r--r--libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriterSpi.java2
-rw-r--r--libjava/classpath/gnu/javax/management/Server.java123
-rw-r--r--libjava/classpath/gnu/javax/management/Translator.java42
-rw-r--r--libjava/classpath/gnu/javax/naming/giop/CorbalocParser.java8
-rw-r--r--libjava/classpath/gnu/javax/naming/giop/GiopNamingServiceFactory.java4
-rw-r--r--libjava/classpath/gnu/javax/naming/giop/ListBindingsEnumeration.java4
-rw-r--r--libjava/classpath/gnu/javax/naming/giop/ListEnumeration.java6
-rw-r--r--libjava/classpath/gnu/javax/naming/ictxImpl/trans/GnuName.java4
-rw-r--r--libjava/classpath/gnu/javax/net/ssl/PrivateCredentials.java6
-rw-r--r--libjava/classpath/gnu/javax/net/ssl/Session.java6
-rw-r--r--libjava/classpath/gnu/javax/net/ssl/provider/HelloRequest.java4
-rw-r--r--libjava/classpath/gnu/javax/net/ssl/provider/Util.java10
-rw-r--r--libjava/classpath/gnu/javax/print/ipp/IppRequest.java2
-rw-r--r--libjava/classpath/gnu/javax/print/ipp/attribute/RequestedAttributes.java4
-rw-r--r--libjava/classpath/gnu/javax/rmi/CORBA/RmiUtilities.java11
-rw-r--r--libjava/classpath/gnu/javax/security/auth/callback/AWTCallbackHandler.java6
-rw-r--r--libjava/classpath/gnu/javax/security/auth/login/ConfigFileTokenizer.java6
-rw-r--r--libjava/classpath/gnu/javax/sound/sampled/gstreamer/io/GstAudioFileReader.java4
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java36
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java4
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java4
-rw-r--r--libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java10
-rw-r--r--libjava/classpath/gnu/xml/dom/DomAttr.java36
-rw-r--r--libjava/classpath/gnu/xml/dom/DomDocument.java8
-rw-r--r--libjava/classpath/gnu/xml/dom/DomElement.java26
-rw-r--r--libjava/classpath/gnu/xml/dom/DomEvent.java13
-rw-r--r--libjava/classpath/gnu/xml/dom/DomNode.java12
-rw-r--r--libjava/classpath/gnu/xml/dom/DomNsNode.java29
-rw-r--r--libjava/classpath/gnu/xml/dom/DomText.java4
-rw-r--r--libjava/classpath/gnu/xml/dom/ls/DomLSInput.java4
-rw-r--r--libjava/classpath/gnu/xml/dom/ls/DomLSParser.java2
-rw-r--r--libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java7
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeAttr.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeCharacterData.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocument.java7
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocumentType.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeElement.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeEntity.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeNode.java6
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeNotation.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeProcessingInstruction.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeText.java4
-rw-r--r--libjava/classpath/gnu/xml/libxmlj/dom/GnomeXPathResult.java4
-rw-r--r--libjava/classpath/gnu/xml/stream/XMLEventImpl.java14
-rw-r--r--libjava/classpath/gnu/xml/stream/XMLParser.java28
-rw-r--r--libjava/classpath/gnu/xml/transform/AbstractNumberNode.java12
-rw-r--r--libjava/classpath/gnu/xml/transform/ApplyTemplatesNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/AttributeNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/Bindings.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/CallTemplateNode.java17
-rw-r--r--libjava/classpath/gnu/xml/transform/ChooseNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/CopyNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/CopyOfNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/ElementNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/ForEachNode.java58
-rw-r--r--libjava/classpath/gnu/xml/transform/IfNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/MessageNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/ParameterNode.java44
-rw-r--r--libjava/classpath/gnu/xml/transform/ProcessingInstructionNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/SortKey.java62
-rw-r--r--libjava/classpath/gnu/xml/transform/StreamSerializer.java18
-rw-r--r--libjava/classpath/gnu/xml/transform/Stylesheet.java129
-rw-r--r--libjava/classpath/gnu/xml/transform/Template.java6
-rw-r--r--libjava/classpath/gnu/xml/transform/TemplateNode.java2
-rw-r--r--libjava/classpath/gnu/xml/transform/TemplatesImpl.java17
-rw-r--r--libjava/classpath/gnu/xml/transform/TextNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/TransformerImpl.java6
-rw-r--r--libjava/classpath/gnu/xml/transform/TransformerOutputProperties.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/UnparsedEntityUriFunction.java19
-rw-r--r--libjava/classpath/gnu/xml/transform/ValueOfNode.java12
-rw-r--r--libjava/classpath/gnu/xml/transform/WhenNode.java4
-rw-r--r--libjava/classpath/gnu/xml/transform/XSLComparator.java108
-rw-r--r--libjava/classpath/gnu/xml/transform/XSLURIResolver.java9
-rw-r--r--libjava/classpath/gnu/xml/util/DoParse.java4
-rw-r--r--libjava/classpath/gnu/xml/util/XCat.java6
-rw-r--r--libjava/classpath/gnu/xml/util/XMLWriter.java6
-rw-r--r--libjava/classpath/gnu/xml/validation/datatype/EntitiesType.java4
-rw-r--r--libjava/classpath/gnu/xml/validation/datatype/NMTokensType.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/ArithmeticExpr.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/BooleanFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/CeilingFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/ConcatFunction.java22
-rw-r--r--libjava/classpath/gnu/xml/xpath/ContainsFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/CountFunction.java7
-rw-r--r--libjava/classpath/gnu/xml/xpath/DocumentOrderComparator.java12
-rw-r--r--libjava/classpath/gnu/xml/xpath/EqualityExpr.java36
-rw-r--r--libjava/classpath/gnu/xml/xpath/Expr.java75
-rw-r--r--libjava/classpath/gnu/xml/xpath/FloorFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/Function.java2
-rw-r--r--libjava/classpath/gnu/xml/xpath/FunctionCall.java26
-rw-r--r--libjava/classpath/gnu/xml/xpath/IdFunction.java7
-rw-r--r--libjava/classpath/gnu/xml/xpath/LangFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/LocalNameFunction.java13
-rw-r--r--libjava/classpath/gnu/xml/xpath/NameFunction.java18
-rw-r--r--libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java13
-rw-r--r--libjava/classpath/gnu/xml/xpath/NormalizeSpaceFunction.java9
-rw-r--r--libjava/classpath/gnu/xml/xpath/NotFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/NumberFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/ParenthesizedExpr.java7
-rw-r--r--libjava/classpath/gnu/xml/xpath/Path.java2
-rw-r--r--libjava/classpath/gnu/xml/xpath/Root.java10
-rw-r--r--libjava/classpath/gnu/xml/xpath/RoundFunction.java5
-rw-r--r--libjava/classpath/gnu/xml/xpath/Selector.java48
-rw-r--r--libjava/classpath/gnu/xml/xpath/StartsWithFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/Steps.java61
-rw-r--r--libjava/classpath/gnu/xml/xpath/StringFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/StringLengthFunction.java3
-rw-r--r--libjava/classpath/gnu/xml/xpath/SubstringAfterFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/SubstringBeforeFunction.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/SubstringFunction.java7
-rw-r--r--libjava/classpath/gnu/xml/xpath/SumFunction.java12
-rw-r--r--libjava/classpath/gnu/xml/xpath/TranslateFunction.java10
-rw-r--r--libjava/classpath/gnu/xml/xpath/UnionExpr.java21
-rw-r--r--libjava/classpath/gnu/xml/xpath/VariableReference.java4
-rw-r--r--libjava/classpath/gnu/xml/xpath/XPathParser.java88
-rw-r--r--libjava/classpath/gnu/xml/xpath/XPathParser.y62
-rw-r--r--libjava/classpath/gnu/xml/xpath/XPathTokenizer.java10
254 files changed, 8798 insertions, 4866 deletions
diff --git a/libjava/classpath/gnu/CORBA/BigDecimalHelper.java b/libjava/classpath/gnu/CORBA/BigDecimalHelper.java
index 119db045f0f..33b74bb7780 100644
--- a/libjava/classpath/gnu/CORBA/BigDecimalHelper.java
+++ b/libjava/classpath/gnu/CORBA/BigDecimalHelper.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.CORBA;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -135,7 +137,7 @@ public class BigDecimalHelper
public static void write(java.io.OutputStream out, BigDecimal x)
throws IOException, BadKind
{
- StringBuffer v = new StringBuffer(x.unscaledValue().toString());
+ CPStringBuilder v = new CPStringBuilder(x.unscaledValue().toString());
boolean negative = v.charAt(0) == '-';
@@ -165,7 +167,7 @@ public class BigDecimalHelper
*/
private static BigDecimal createFixed(int scale, byte[] d)
{
- StringBuffer s = new StringBuffer(2 * d.length);
+ CPStringBuilder s = new CPStringBuilder(2 * d.length);
int last = d.length - 1;
diff --git a/libjava/classpath/gnu/CORBA/CDR/LittleEndianInputStream.java b/libjava/classpath/gnu/CORBA/CDR/LittleEndianInputStream.java
index a439b658b44..93d18fb1140 100644
--- a/libjava/classpath/gnu/CORBA/CDR/LittleEndianInputStream.java
+++ b/libjava/classpath/gnu/CORBA/CDR/LittleEndianInputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.CORBA.CDR;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.EOFException;
import java.io.FilterInputStream;
import java.io.IOException;
@@ -360,7 +362,7 @@ public class LittleEndianInputStream
public String readLine()
throws IOException
{
- StringBuffer strb = new StringBuffer();
+ CPStringBuilder strb = new CPStringBuilder();
while (true)
{
@@ -629,4 +631,4 @@ public class LittleEndianInputStream
{
throw new InternalError();
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/CORBA/CDR/Vio.java b/libjava/classpath/gnu/CORBA/CDR/Vio.java
index 67a69b87458..86f842c34bb 100644
--- a/libjava/classpath/gnu/CORBA/CDR/Vio.java
+++ b/libjava/classpath/gnu/CORBA/CDR/Vio.java
@@ -41,6 +41,8 @@ package gnu.CORBA.CDR;
import gnu.CORBA.Minor;
import gnu.CORBA.ObjectCreator;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.CustomMarshal;
import org.omg.CORBA.DataInputStream;
import org.omg.CORBA.DataOutputStream;
@@ -754,7 +756,7 @@ public abstract class Vio
return "null";
else
{
- StringBuffer b = new StringBuffer("{");
+ CPStringBuilder b = new CPStringBuilder("{");
for (int i = 0; i < s.length; i++)
{
b.append(s[i]);
@@ -1469,4 +1471,4 @@ public abstract class Vio
return VMVio.allocateObject(clazz, constructor.getDeclaringClass(),
constructor);
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/CORBA/CDR/gnuRuntime.java b/libjava/classpath/gnu/CORBA/CDR/gnuRuntime.java
index 929dc72ec8a..4af8c68515a 100644
--- a/libjava/classpath/gnu/CORBA/CDR/gnuRuntime.java
+++ b/libjava/classpath/gnu/CORBA/CDR/gnuRuntime.java
@@ -40,6 +40,8 @@ package gnu.CORBA.CDR;
import gnu.CORBA.Minor;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.MARSHAL;
@@ -318,7 +320,7 @@ public class gnuRuntime
*/
public String dump()
{
- StringBuffer b = new StringBuffer(" Stream content: \n");
+ CPStringBuilder b = new CPStringBuilder(" Stream content: \n");
// Sort by position.
TreeSet t = new TreeSet(positions.keySet());
diff --git a/libjava/classpath/gnu/CORBA/GIOP/MessageHeader.java b/libjava/classpath/gnu/CORBA/GIOP/MessageHeader.java
index cac2405fc77..f63cbea1708 100644
--- a/libjava/classpath/gnu/CORBA/GIOP/MessageHeader.java
+++ b/libjava/classpath/gnu/CORBA/GIOP/MessageHeader.java
@@ -47,6 +47,8 @@ import gnu.CORBA.CDR.LittleEndianOutputStream;
import gnu.CORBA.CDR.AbstractDataInput;
import gnu.CORBA.CDR.AbstractDataOutput;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.portable.IDLEntity;
@@ -286,7 +288,7 @@ public class MessageHeader
int minor;
if (! Arrays.equals(xMagic, MAGIC))
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
if (r == - 1)
{
b.append("Immediate EOF");
@@ -460,4 +462,4 @@ public class MessageHeader
throw m;
}
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/CORBA/GIOP/RequestHeader.java b/libjava/classpath/gnu/CORBA/GIOP/RequestHeader.java
index 3cfadfd7867..45997ab3deb 100644
--- a/libjava/classpath/gnu/CORBA/GIOP/RequestHeader.java
+++ b/libjava/classpath/gnu/CORBA/GIOP/RequestHeader.java
@@ -41,6 +41,8 @@ package gnu.CORBA.GIOP;
import gnu.CORBA.CDR.AbstractCdrInput;
import gnu.CORBA.CDR.AbstractCdrOutput;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.portable.IDLEntity;
/**
@@ -123,7 +125,7 @@ public abstract class RequestHeader
*/
public String bytes(byte[] array)
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int i = 0; i < array.length; i++)
{
b.append(Integer.toHexString(array[i] & 0xFF));
diff --git a/libjava/classpath/gnu/CORBA/GIOP/v1_0/ReplyHeader.java b/libjava/classpath/gnu/CORBA/GIOP/v1_0/ReplyHeader.java
index c085c17fb9b..dcb00c0ebc4 100644
--- a/libjava/classpath/gnu/CORBA/GIOP/v1_0/ReplyHeader.java
+++ b/libjava/classpath/gnu/CORBA/GIOP/v1_0/ReplyHeader.java
@@ -43,6 +43,8 @@ import gnu.CORBA.CDR.AbstractCdrOutput;
import gnu.CORBA.GIOP.ServiceContext;
import gnu.CORBA.GIOP.CodeSetServiceContext;
+import gnu.java.lang.CPStringBuilder;
+
/**
* The header of the standard reply.
*
@@ -80,7 +82,7 @@ public class ReplyHeader
*/
public String contexts()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int i = 0; i < service_context.length; i++)
{
b.append(service_context [ i ].toString());
diff --git a/libjava/classpath/gnu/CORBA/GIOP/v1_0/RequestHeader.java b/libjava/classpath/gnu/CORBA/GIOP/v1_0/RequestHeader.java
index 5cf723cbc42..d2bea9d8804 100644
--- a/libjava/classpath/gnu/CORBA/GIOP/v1_0/RequestHeader.java
+++ b/libjava/classpath/gnu/CORBA/GIOP/v1_0/RequestHeader.java
@@ -43,6 +43,8 @@ import gnu.CORBA.CDR.AbstractCdrOutput;
import gnu.CORBA.GIOP.ServiceContext;
import gnu.CORBA.GIOP.CodeSetServiceContext;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.portable.IDLEntity;
/**
@@ -81,7 +83,7 @@ public class RequestHeader
public String bytes(byte[] array)
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int i = 0; i < array.length; i++)
{
b.append(Integer.toHexString(array [ i ] & 0xFF));
@@ -95,7 +97,7 @@ public class RequestHeader
*/
public String contexts()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int i = 0; i < service_context.length; i++)
{
b.append(service_context [ i ].toString());
diff --git a/libjava/classpath/gnu/CORBA/IOR.java b/libjava/classpath/gnu/CORBA/IOR.java
index 5e13aecabd3..7f63471eef0 100644
--- a/libjava/classpath/gnu/CORBA/IOR.java
+++ b/libjava/classpath/gnu/CORBA/IOR.java
@@ -45,6 +45,8 @@ import gnu.CORBA.CDR.AbstractCdrOutput;
import gnu.CORBA.GIOP.CharSets_OSF;
import gnu.CORBA.GIOP.CodeSetServiceContext;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.MARSHAL;
@@ -126,7 +128,7 @@ public class IOR
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append("native " + name(native_set));
if (conversion != null && conversion.length > 0)
{
@@ -146,7 +148,7 @@ public class IOR
*/
public String toStringFormatted()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append("\n Native set " + name(native_set));
if (conversion != null && conversion.length > 0)
{
@@ -282,7 +284,7 @@ public class IOR
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append(host);
b.append(":");
b.append(port);
@@ -591,7 +593,7 @@ public class IOR
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append(Id);
b.append(" at ");
b.append(Internet);
@@ -618,7 +620,7 @@ public class IOR
*/
public String toStringFormatted()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append("\nObject Id:\n ");
b.append(Id);
b.append("\nObject is accessible at:\n ");
@@ -656,7 +658,7 @@ public class IOR
_write(out);
- StringBuffer b = new StringBuffer("IOR:");
+ CPStringBuilder b = new CPStringBuilder("IOR:");
byte[] binary = out.buffer.toByteArray();
String s;
@@ -819,4 +821,4 @@ public class IOR
}
return (int) adler.getValue();
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/CORBA/NamingService/NameParser.java b/libjava/classpath/gnu/CORBA/NamingService/NameParser.java
index 205ad8bec84..5d4b729a569 100644
--- a/libjava/classpath/gnu/CORBA/NamingService/NameParser.java
+++ b/libjava/classpath/gnu/CORBA/NamingService/NameParser.java
@@ -44,6 +44,8 @@ import gnu.CORBA.IOR;
import gnu.CORBA.Unexpected;
import gnu.CORBA.Version;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.DATA_CONVERSION;
import org.omg.CORBA.ORB;
@@ -301,7 +303,7 @@ public class NameParser
ior.Internet.version = new Version(major, minor);
// Then host data goes till '/' or ':'.
- StringBuffer bhost = new StringBuffer(corbaloc.length());
+ CPStringBuilder bhost = new CPStringBuilder(corbaloc.length());
while (!t[p].equals(":") && !t[p].equals("/") && !t[p].equals(","))
bhost.append(t[p++]);
@@ -394,7 +396,7 @@ public class NameParser
{
InputStreamReader r = new InputStreamReader(u.openStream());
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
int c;
while ((c = r.read()) > 0)
@@ -465,7 +467,7 @@ public class NameParser
+ "' found");
}
- StringBuffer bKey = new StringBuffer();
+ CPStringBuilder bKey = new CPStringBuilder();
p++;
while (p < t.length && !t[p].equals("#"))
diff --git a/libjava/classpath/gnu/CORBA/NamingService/NameTransformer.java b/libjava/classpath/gnu/CORBA/NamingService/NameTransformer.java
index 7109fdb93e1..132c5dd8f04 100644
--- a/libjava/classpath/gnu/CORBA/NamingService/NameTransformer.java
+++ b/libjava/classpath/gnu/CORBA/NamingService/NameTransformer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.CORBA.NamingService;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.IntHolder;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextPackage.InvalidName;
@@ -125,7 +127,7 @@ public class NameTransformer
{
NameValidator.check(a_name);
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
NameComponent n;
@@ -152,7 +154,7 @@ public class NameTransformer
* @param b a buffer to append the contents to.
* @param s a string to append.
*/
- private void appEscaping(StringBuffer b, String s)
+ private void appEscaping(CPStringBuilder b, String s)
{
char c;
for (int i = 0; i < s.length(); i++)
@@ -271,7 +273,7 @@ public class NameTransformer
*/
private String readPart(IntHolder p, String[] t)
{
- StringBuffer part = new StringBuffer();
+ CPStringBuilder part = new CPStringBuilder();
while (t [ p.value ] != null && !t [ p.value ].equals(".") &&
!t [ p.value ].equals("/")
diff --git a/libjava/classpath/gnu/CORBA/OrbFunctional.java b/libjava/classpath/gnu/CORBA/OrbFunctional.java
index 8fddc66270c..25344cb2ec0 100644
--- a/libjava/classpath/gnu/CORBA/OrbFunctional.java
+++ b/libjava/classpath/gnu/CORBA/OrbFunctional.java
@@ -1194,7 +1194,7 @@ public class OrbFunctional extends OrbRestricted
*/
protected void set_parameters(String[] para, Properties props)
{
- if (para.length > 1)
+ if ((para != null) && para.length > 1)
{
for (int i = 0; i < para.length - 1; i++)
{
diff --git a/libjava/classpath/gnu/CORBA/Poa/gnuPOA.java b/libjava/classpath/gnu/CORBA/Poa/gnuPOA.java
index 82e520904f1..32fc5bfd221 100644
--- a/libjava/classpath/gnu/CORBA/Poa/gnuPOA.java
+++ b/libjava/classpath/gnu/CORBA/Poa/gnuPOA.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.CORBA.Poa;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -1604,7 +1606,7 @@ public class gnuPOA
*/
public String toString()
{
- StringBuffer b = new StringBuffer(name);
+ CPStringBuilder b = new CPStringBuilder(name);
if (children.size() != 0)
{
diff --git a/libjava/classpath/gnu/CORBA/Poa/gnuServantObject.java b/libjava/classpath/gnu/CORBA/Poa/gnuServantObject.java
index 115f4f850fb..7e9b4f2f599 100644
--- a/libjava/classpath/gnu/CORBA/Poa/gnuServantObject.java
+++ b/libjava/classpath/gnu/CORBA/Poa/gnuServantObject.java
@@ -51,6 +51,8 @@ import gnu.CORBA.Unexpected;
import gnu.CORBA.ResponseHandlerImpl;
import gnu.CORBA.StreamHolder;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_OPERATION;
import org.omg.CORBA.BAD_PARAM;
@@ -357,7 +359,7 @@ public class gnuServantObject extends ObjectImpl
*/
public String toString()
{
- StringBuffer b = new StringBuffer("Servant object (");
+ CPStringBuilder b = new CPStringBuilder("Servant object (");
for (int i = 0; i < Id.length; i++)
{
b.append(Integer.toHexString(Id [ i ] & 0xFF));
@@ -820,4 +822,4 @@ public class gnuServantObject extends ObjectImpl
}
return super._is_equivalent(other);
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/classpath/Configuration.java.in b/libjava/classpath/gnu/classpath/Configuration.java.in
index 7fb86409330..4a9b65f5666 100644
--- a/libjava/classpath/gnu/classpath/Configuration.java.in
+++ b/libjava/classpath/gnu/classpath/Configuration.java.in
@@ -101,4 +101,14 @@ public interface Configuration
* com.sun.tools.javac implementation in tools.zip.
*/
String ECJ_JAR = "@ECJ_JAR@";
+
+ /**
+ * Set to <code>true</code> if the config script found that (a) an
+ * implementation of java.math.BigInteger, based on the GNU MP library, is
+ * desired in preference to a pure Java one, and (b) the GNU MP library was
+ * found on the platform where the JVM is to run. Otherwise, this field is
+ * set to <code>false</code>.
+ */
+ boolean WANT_NATIVE_BIG_INTEGER = @WANT_NATIVE_BIG_INTEGER@;
+
}
diff --git a/libjava/classpath/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java b/libjava/classpath/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
index e2703908ba2..b6e0cfeb8b3 100644
--- a/libjava/classpath/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
+++ b/libjava/classpath/gnu/classpath/jdwp/processor/VirtualMachineCommandSet.java
@@ -264,7 +264,7 @@ public class VirtualMachineCommandSet
ThreadGroup root = getRootThreadGroup(jdwpGroup);
os.writeInt(1); // Just one top level group allowed?
- idMan.getObjectId(root);
+ idMan.getObjectId(root).write(os);
}
private void executeDispose(ByteBuffer bb, DataOutputStream os)
diff --git a/libjava/classpath/gnu/classpath/jdwp/util/Signature.java b/libjava/classpath/gnu/classpath/jdwp/util/Signature.java
index 36445c31841..e7453bf0174 100644
--- a/libjava/classpath/gnu/classpath/jdwp/util/Signature.java
+++ b/libjava/classpath/gnu/classpath/jdwp/util/Signature.java
@@ -39,6 +39,8 @@ exception statement from your version. */
package gnu.classpath.jdwp.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@@ -59,7 +61,7 @@ public class Signature
*/
public static String computeClassSignature (Class theClass)
{
- StringBuffer sb = new StringBuffer ();
+ CPStringBuilder sb = new CPStringBuilder ();
_addToSignature (sb, theClass);
return sb.toString ();
}
@@ -93,7 +95,7 @@ public class Signature
private static String _computeSignature (Class returnType,
Class[] paramTypes)
{
- StringBuffer sb = new StringBuffer ("(");
+ CPStringBuilder sb = new CPStringBuilder ("(");
if (paramTypes != null)
{
for (int i = 0; i < paramTypes.length; ++i)
@@ -104,7 +106,7 @@ public class Signature
return sb.toString();
}
- private static void _addToSignature (StringBuffer sb, Class k)
+ private static void _addToSignature (CPStringBuilder sb, Class k)
{
// For some reason there's no easy way to get the signature of a
// class.
diff --git a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
index 2d898a44801..e8124528e6a 100644
--- a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
@@ -37,6 +37,10 @@ exception statement from your version. */
package gnu.java.awt.font;
+
+import gnu.java.awt.peer.ClasspathFontPeer;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.font.FontRenderContext;
@@ -61,8 +65,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import gnu.java.awt.peer.ClasspathFontPeer;
-
public class OpenTypeFontPeer
extends ClasspathFontPeer
{
@@ -422,7 +424,7 @@ public class OpenTypeFontPeer
*/
static String encodeFont(String name, int style)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('/');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
index d9736650b5f..6420fa1cb14 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
class Edge
{
int fpos;
@@ -54,7 +56,7 @@ class Edge
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Edge] id");
s.append(hashCode());
s.append(", fpos: ");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
index 694fb24fe07..2cf68b75c5a 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class LatinBlue
{
static final int FLAG_BLUE_ACTIVE = 1 << 0;
@@ -48,7 +50,7 @@ public class LatinBlue
int flags;
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[BlueZone]");
s.append(" ref: ");
s.append(ref.org);
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
index 640e82ce2e9..9f9da679255 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
@@ -40,6 +40,8 @@ package gnu.java.awt.font.autofit;
import gnu.java.awt.font.opentype.truetype.Point;
+import gnu.java.lang.CPStringBuilder;
+
class Segment
{
@@ -65,7 +67,7 @@ class Segment
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Segment] id: ");
s.append(hashCode());
s.append(", len:");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Width.java b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
index c890cf3de3d..079f7b396c8 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Width.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class Width
{
int org;
@@ -50,7 +52,7 @@ public class Width
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Width] org: ");
s.append(org);
s.append(", cur: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
index ea4b8e2a1fb..c2b009de3e6 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype;
+import gnu.java.lang.CPStringBuilder;
+
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.CharBuffer;
@@ -1077,7 +1079,7 @@ final class GlyphNamer
return name;
}
- StringBuffer buf = new StringBuffer(numChars * 8);
+ CPStringBuilder buf = new CPStringBuilder(numChars * 8);
for (int i = 0; i < numChars; i++)
{
if (i > 0)
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
index 287593e439c..87dfebd412b 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
/**
* A utility class for fixed-point arithmetics, where numbers are
@@ -164,7 +165,7 @@ public final class Fixed
public static String toString(int x, int y)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
sbuf.append('(');
sbuf.append(((float) x) / 64);
sbuf.append(", ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
index c9664d2dc07..31c12037c27 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
/**
* Encapsulates information regarding one point on a glyph outline.
*/
@@ -234,7 +236,7 @@ public class Point
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Point] origX: ");
s.append(origX);
s.append(", origY: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
index 7e50b6678bf..c88d4c6491c 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.FontFormatException;
import java.awt.geom.AffineTransform;
import java.nio.ByteBuffer;
@@ -514,7 +516,7 @@ class VirtualMachine
*/
private void dumpInstruction(ByteBuffer inst)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
int pc = inst.position();
int bcode = inst.get(pc) & 0xff;
int count;
diff --git a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
index 36ba0f4304c..8504659388c 100644
--- a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
@@ -46,6 +46,7 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
+import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
@@ -75,9 +76,12 @@ import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
+import java.awt.image.FilteredImageSource;
import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
+import java.awt.image.ReplicateScaleFilter;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.awt.image.renderable.RenderableImage;
@@ -86,6 +90,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
+import java.util.WeakHashMap;
/**
* This is a 100% Java implementation of the Java2D rendering pipeline. It is
@@ -154,7 +159,14 @@ public abstract class AbstractGraphics2D
extends Graphics2D
implements Cloneable, Pixelizer
{
-
+ /**
+ * Caches scaled versions of an image.
+ *
+ * @see #drawImage(Image, int, int, int, int, ImageObserver)
+ */
+ protected static final WeakHashMap<Image, HashMap<Dimension,Image>> imageCache =
+ new WeakHashMap<Image, HashMap<Dimension, Image>>();
+
/**
* Wether we use anti aliasing for rendering text by default or not.
*/
@@ -210,14 +222,20 @@ public abstract class AbstractGraphics2D
/**
* The paint context during rendering.
*/
- private PaintContext paintContext;
+ private PaintContext paintContext = null;
/**
* The background.
*/
- private Color background;
+ private Color background = Color.WHITE;
/**
+ * Foreground color, as set by setColor.
+ */
+ private Color foreground = Color.BLACK;
+ private boolean isForegroundColorNull = true;
+
+ /**
* The current font.
*/
private Font font;
@@ -266,15 +284,19 @@ public abstract class AbstractGraphics2D
private static final BasicStroke STANDARD_STROKE = new BasicStroke();
- private static final HashMap STANDARD_HINTS;
- static {
- HashMap hints = new HashMap();
- hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
- hints.put(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_DEFAULT);
- STANDARD_HINTS = hints;
- }
+ private static final HashMap<Key, Object> STANDARD_HINTS;
+ static
+ {
+
+ HashMap<Key, Object> hints = new HashMap<Key, Object>();
+ hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ hints.put(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+
+ STANDARD_HINTS = hints;
+ }
+
/**
* Creates a new AbstractGraphics2D instance.
*/
@@ -626,14 +648,29 @@ public abstract class AbstractGraphics2D
if (p != null)
{
paint = p;
-
+
if (! (paint instanceof Color))
- isOptimized = false;
+ {
+ isOptimized = false;
+ }
else
{
+ this.foreground = (Color) paint;
+ isForegroundColorNull = false;
updateOptimization();
}
}
+ else
+ {
+ this.foreground = Color.BLACK;
+ isForegroundColorNull = true;
+ }
+
+ // free resources if needed, then put the paint context to null
+ if (this.paintContext != null)
+ this.paintContext.dispose();
+
+ this.paintContext = null;
}
/**
@@ -1058,10 +1095,10 @@ public abstract class AbstractGraphics2D
*/
public Color getColor()
{
- Color c = null;
- if (paint instanceof Color)
- c = (Color) paint;
- return c;
+ if (isForegroundColorNull)
+ return null;
+
+ return this.foreground;
}
/**
@@ -1070,8 +1107,8 @@ public abstract class AbstractGraphics2D
* @param color the foreground to set
*/
public void setColor(Color color)
- {
- setPaint(color);
+ {
+ this.setPaint(color);
}
public void setPaintMode()
@@ -1468,11 +1505,19 @@ public abstract class AbstractGraphics2D
ImageObserver observer)
{
AffineTransform t = new AffineTransform();
- t.translate(x, y);
- double scaleX = (double) width / (double) image.getWidth(observer);
- double scaleY = (double) height / (double) image.getHeight(observer);
- t.scale(scaleX, scaleY);
- return drawImage(image, t, observer);
+ int imWidth = image.getWidth(observer);
+ int imHeight = image.getHeight(observer);
+ if (imWidth == width && imHeight == height)
+ {
+ // No need to scale, fall back to non-scaling loops.
+ return drawImage(image, x, y, observer);
+ }
+ else
+ {
+ Image scaled = prepareImage(image, width, height);
+ // Ideally, this should notify the observer about the scaling progress.
+ return drawImage(scaled, x, y, observer);
+ }
}
/**
@@ -1639,10 +1684,7 @@ public abstract class AbstractGraphics2D
*
* @return the bounds of the target
*/
- protected Rectangle getDeviceBounds()
- {
- return destinationRaster.getBounds();
- }
+ protected abstract Rectangle getDeviceBounds();
/**
* Draws a line in optimization mode. The implementation should respect the
@@ -1763,7 +1805,8 @@ public abstract class AbstractGraphics2D
*/
public void renderScanline(int y, ScanlineCoverage c)
{
- PaintContext pCtx = paintContext;
+ PaintContext pCtx = getPaintContext();
+
int x0 = c.getMinX();
int x1 = c.getMaxX();
Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
@@ -1797,9 +1840,11 @@ public abstract class AbstractGraphics2D
CompositeContext cCtx = composite.createContext(paintColorModel,
getColorModel(),
renderingHints);
- WritableRaster targetChild = destinationRaster.createWritableTranslatedChild(-x0,- y);
+ WritableRaster raster = getDestinationRaster();
+ WritableRaster targetChild = raster.createWritableTranslatedChild(-x0, -y);
+
cCtx.compose(paintRaster, targetChild, targetChild);
- updateRaster(destinationRaster, x0, y, x1 - x0, 1);
+ updateRaster(raster, x0, y, x1 - x0, 1);
cCtx.dispose();
}
@@ -1986,4 +2031,64 @@ public abstract class AbstractGraphics2D
}
}
+ private PaintContext getPaintContext()
+ {
+ if (this.paintContext == null)
+ {
+ this.paintContext =
+ this.foreground.createContext(getColorModel(),
+ getDeviceBounds(),
+ getClipBounds(),
+ getTransform(),
+ getRenderingHints());
+ }
+
+ return this.paintContext;
+ }
+
+ /**
+ * Scales an image to the specified width and height. This should also
+ * be used to implement
+ * {@link Toolkit#prepareImage(Image, int, int, ImageObserver)}.
+ * This uses {@link Toolkit#createImage(ImageProducer)} to create the actual
+ * image.
+ *
+ * @param image the image to prepare
+ * @param w the width
+ * @param h the height
+ *
+ * @return the scaled image
+ */
+ public static Image prepareImage(Image image, int w, int h)
+ {
+ // Try to find cached scaled image.
+ HashMap<Dimension,Image> scaledTable = imageCache.get(image);
+ Dimension size = new Dimension(w, h);
+ Image scaled = null;
+ if (scaledTable != null)
+ {
+ scaled = scaledTable.get(size);
+ }
+ if (scaled == null)
+ {
+ // No cached scaled image. Start scaling image now.
+ ImageProducer source = image.getSource();
+ ReplicateScaleFilter scaler = new ReplicateScaleFilter(w, h);
+ FilteredImageSource filteredSource =
+ new FilteredImageSource(source, scaler);
+ // Ideally, this should asynchronously scale the image.
+ Image scaledImage =
+ Toolkit.getDefaultToolkit().createImage(filteredSource);
+ scaled = scaledImage;
+ // Put scaled image in cache.
+ if (scaledTable == null)
+ {
+ scaledTable = new HashMap<Dimension,Image>();
+ imageCache.put(image, scaledTable);
+ }
+ scaledTable.put(size, scaledImage);
+ }
+ return scaled;
+ }
+
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
index 4d1e777ccf5..efe1966e378 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.java2d;
+import gnu.java.lang.CPStringBuilder;
+
/**
* A collection of active edges for scanline conversion.
*/
@@ -183,7 +185,7 @@ final class ActiveEdges
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[ActiveEdges] ");
for (int i = 0; i < numActiveEdges; i++)
{
diff --git a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
index 98d47b406aa..04eb55eb8d8 100644
--- a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
+++ b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.awt.java2d;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
@@ -71,6 +72,15 @@ public class RasterGraphics
init();
}
+ @Override
+ public void renderScanline(int y, ScanlineCoverage c)
+ {
+ if (y >= getDeviceBounds().width)
+ return;
+
+ super.renderScanline(y, c);
+ }
+
/**
* Returns the color model of this Graphics object.
*
@@ -100,4 +110,9 @@ public class RasterGraphics
return null;
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ return this.raster.getBounds();
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
index cc4bbef28c0..b00a15c16ac 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
@@ -206,6 +206,7 @@ public final class ScanlineConverter
// Ok, now we can perform the actual scanlining.
int realY = Fixed.intValue(FIXED_DIGITS, y + resolution);
boolean push = lastRealY != realY;
+
doScanline(p, y, push, haveClip);
// Remove obsolete active edges.
diff --git a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
index be216318140..cc41f749dc0 100644
--- a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -124,7 +126,7 @@ public class GnomeDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
index 30dd89ba7b2..8bc3e65b24e 100644
--- a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
@@ -104,7 +106,7 @@ public class KDEDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
index 28fb84119e4..826cfbecead 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
@@ -45,6 +45,8 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.font.opentype.NameDecoder;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Toolkit;
@@ -211,7 +213,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next())
sb.append(c);
return sb.toString();
@@ -219,7 +221,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter, int begin, int limit)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next(), i++)
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
index e41754641bb..e248b6daf10 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
@@ -38,10 +38,25 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Image;
-import java.awt.datatransfer.*;
-import java.io.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Iterator;
@@ -247,7 +262,7 @@ public class GtkClipboard extends Clipboard
Reader r = plainText.getReaderForText(contents);
if (r != null)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
char[] cs = new char[1024];
int l = r.read(cs);
while (l != -1)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
index c80c85c28f0..dde5b919537 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
@@ -39,7 +39,9 @@ package gnu.java.awt.peer.x;
import java.awt.Color;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
+import java.util.Map;
import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.x11.extension.glx.GL;
@@ -70,7 +72,8 @@ public class GLGraphics extends AbstractGraphics2D
public void setBackground(Color b)
{
super.setBackground(b);
- gl.clear_color(b.getRed() / 255.F, b.getGreen() / 255.F,
+
+ gl.clearColor(b.getRed() / 255.F, b.getGreen() / 255.F,
b.getBlue() / 255.F, b.getAlpha() / 255.F);
}
@@ -120,4 +123,12 @@ public class GLGraphics extends AbstractGraphics2D
throw new UnsupportedOperationException("Not yet implemented");
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ // FIXME: not sure it's correct
+ return new Rectangle(0, 0,
+ gl.display.default_screen.width,
+ gl.display.default_screen.height);
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
index 7f984353316..379839196b2 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Container;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
@@ -47,18 +50,26 @@ import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
+import java.awt.event.WindowEvent;
import java.util.HashMap;
+import gnu.java.awt.ComponentReshapeEvent;
+import gnu.x11.Atom;
import gnu.x11.Display;
import gnu.x11.event.ButtonPress;
import gnu.x11.event.ButtonRelease;
+import gnu.x11.event.ClientMessage;
import gnu.x11.event.ConfigureNotify;
+import gnu.x11.event.DestroyNotify;
import gnu.x11.event.Event;
import gnu.x11.event.Expose;
import gnu.x11.event.Input;
import gnu.x11.event.KeyPress;
import gnu.x11.event.KeyRelease;
import gnu.x11.event.MotionNotify;
+import gnu.x11.event.PropertyNotify;
+import gnu.x11.event.ResizeRequest;
+import gnu.x11.event.UnmapNotify;
/**
* Fetches events from X, translates them to AWT events and pumps them up
@@ -148,122 +159,217 @@ public class XEventPump
windows.remove(new Integer(xWindow.id));
}
- private void handleEvent(Event xEvent)
+ private void handleButtonPress(ButtonPress event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ // Create and post the mouse event.
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = button;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mp = new MouseEvent(target, MouseEvent.MOUSE_PRESSED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ }
+
+ private void handleButtonRelease(ButtonRelease event)
{
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
- Integer key = null;
- Window awtWindow = null;
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = -1;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mr = new MouseEvent(target, MouseEvent.MOUSE_RELEASED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ }
+
+
+ private void handleMotionNotify(MotionNotify event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+
+ MouseEvent mm = null;
+ if (drag == -1)
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ else
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(drag),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
+ }
+
+ // FIME: refactor and make faster, maybe caching the event and handle
+ // and/or check timing (timing is generated for PropertyChange)?
+ private void handleExpose(Expose event)
+ {
+ Integer key = new Integer(event.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ if (XToolkit.DEBUG)
+ System.err.println("expose request for window id: " + key);
+
+ Rectangle r = new Rectangle(event.x(), event.y(), event.width(),
+ event.height());
+ // We need to clear the background of the exposed rectangle.
+ assert awtWindow != null : "awtWindow == null for window ID: " + key;
+
+ Graphics g = awtWindow.getGraphics();
+ g.clearRect(r.x, r.y, r.width, r.height);
+ g.dispose();
+
+ XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
+ Insets i = xwindow.insets();
+ if (event.width() != awtWindow.getWidth() - i.left - i.right
+ || event.height() != awtWindow.getHeight() - i.top - i.bottom)
+ {
+ int w = event.width();
+ int h = event.height();
+ int x = xwindow.xwindow.x;
+ int y = xwindow.xwindow.y;
+
+ if (XToolkit.DEBUG)
+ System.err.println("Setting size on AWT window: " + w
+ + ", " + h + ", " + awtWindow.getWidth()
+ + ", " + awtWindow.getHeight());
+
+ // new width and height
+ xwindow.xwindow.width = w;
+ xwindow.xwindow.height = h;
+
+ // reshape the window
+ ComponentReshapeEvent cre =
+ new ComponentReshapeEvent(awtWindow, x, y, w, h);
+ awtWindow.dispatchEvent(cre);
+ }
+
+ ComponentEvent ce =
+ new ComponentEvent(awtWindow, ComponentEvent.COMPONENT_RESIZED);
+ awtWindow.dispatchEvent(ce);
+
+ PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.UPDATE, r);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ }
+
+ private void handleDestroyNotify(DestroyNotify destroyNotify)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("DestroyNotify event: " + destroyNotify);
+
+ Integer key = new Integer(destroyNotify.event_window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+
+ private void handleClientMessage(ClientMessage clientMessage)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage event: " + clientMessage);
+
+ if (clientMessage.delete_window())
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage is a delete_window event");
+
+ Integer key = new Integer(clientMessage.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSING);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+ }
+
+ private void handleEvent(Event xEvent)
+ {
if (XToolkit.DEBUG)
System.err.println("fetched event: " + xEvent);
- switch (xEvent.code())
+
+ switch (xEvent.code() & 0x7f)
{
case ButtonPress.CODE:
- ButtonPress bp = (ButtonPress) xEvent;
- key= new Integer(bp.event_window_id);
- awtWindow = (Window) windows.get(key);
- // Create and post the mouse event.
- int button = bp.detail();
-
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = button;
-
- MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(bp.state()) | buttonToModifier(button),
- bp.event_x(), bp.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ this.handleButtonPress((ButtonPress) xEvent);
break;
case ButtonRelease.CODE:
- ButtonRelease br = (ButtonRelease) xEvent;
- key= new Integer(br.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- button = br.detail();
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = -1;
- MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(br.state()) | buttonToModifier(button),
- br.event_x(), br.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ this.handleButtonRelease((ButtonRelease) xEvent);
break;
case MotionNotify.CODE:
- MotionNotify mn = (MotionNotify) xEvent;
- key= new Integer(mn.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- MouseEvent mm;
- if (drag == -1)
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- else
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
- break;
- case ConfigureNotify.CODE:
- key= new Integer(((ConfigureNotify) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
- ConfigureNotify c = (ConfigureNotify) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("resize request for window id: " + key);
-
- // Detect and report size changes.
- XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
- Insets i = xwindow.insets();
- if (c.width() != awtWindow.getWidth() - i.left - i.right
- || c.height() != awtWindow.getHeight() - i.top - i.bottom)
- {
- if (XToolkit.DEBUG)
- System.err.println("Setting size on AWT window: " + c.width()
- + ", " + c.height() + ", " + awtWindow.getWidth()
- + ", " + awtWindow.getHeight());
- xwindow.callback = true;
- xwindow.xwindow.width = c.width();
- xwindow.xwindow.height = c.height();
- awtWindow.setSize(c.width() + i.left + i.right,
- c.height() + i.top + i.bottom);
- xwindow.callback = false;
- }
+ this.handleMotionNotify((MotionNotify) xEvent);
break;
case Expose.CODE:
- key= new Integer(((Expose) xEvent).window_id);
- awtWindow = (Window) windows.get(key);
- Expose exp = (Expose) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("expose request for window id: " + key);
- Rectangle r = new Rectangle(exp.x(), exp.y(), exp.width(),
- exp.height());
- //System.err.println("expose paint: " + r);
- // We need to clear the background of the exposed rectangle.
- assert awtWindow != null : "awtWindow == null for window ID: " + key;
- Graphics g = awtWindow.getGraphics();
- g.clearRect(r.x, r.y, r.width, r.height);
- g.dispose();
- PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.PAINT, r);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ this.handleExpose((Expose) xEvent);
break;
case KeyPress.CODE:
case KeyRelease.CODE:
- key = new Integer(((Input) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
+ Integer key = new Integer(((Input) xEvent).getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
handleKeyEvent(xEvent, awtWindow);
break;
+ case DestroyNotify.CODE:
+ this.handleDestroyNotify((DestroyNotify) xEvent);
+ break;
+ case ClientMessage.CODE:
+ this.handleClientMessage((ClientMessage) xEvent);
+ break;
+ case PropertyNotify.CODE:
+ key = new Integer (((PropertyNotify) xEvent).getWindowID());
+ awtWindow = (Window) windows.get(key);
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_STATE_CHANGED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ break;
default:
if (XToolkit.DEBUG)
System.err.println("Unhandled X event: " + xEvent);
@@ -280,7 +386,7 @@ public class XEventPump
{
Input keyEvent = (Input) xEvent;
int xKeyCode = keyEvent.detail();
- int xMods = keyEvent.state();
+ int xMods = keyEvent.getState();
int keyCode = KeyboardMapping.mapToKeyCode(xEvent.display.input, xKeyCode,
xMods);
char keyChar = KeyboardMapping.mapToKeyChar(xEvent.display.input, xKeyCode,
@@ -334,5 +440,47 @@ public class XEventPump
return 0;
}
+
+ /**
+ * Finds the heavyweight mouse event target.
+ *
+ * @param src the original source of the event
+ *
+ * @param pt the event coordinates
+ *
+ * @return the real mouse event target
+ */
+ private Component findMouseEventTarget(Component src, int x, int y)
+ {
+ Component found = null;
+ if (src instanceof Container)
+ {
+ Container cont = (Container) src;
+ int numChildren = cont.getComponentCount();
+ for (int i = 0; i < numChildren && found == null; i++)
+ {
+ Component child = cont.getComponent(i);
+ if (child != null && child.isVisible()
+ && child.contains(x - child.getX(), y - child.getY()))
+ {
+ if (child instanceof Container)
+ {
+ Component deeper = findMouseEventTarget(child,
+ x - child.getX(),
+ y - child.getY());
+ if (deeper != null)
+ found = deeper;
+ }
+ else if (! child.isLightweight())
+ found = child;
+ }
+ }
+ }
+
+ // Consider the source itself.
+ if (found == null && src.contains(x, y) && ! src.isLightweight())
+ found = src;
+ return found;
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
index 0a96a613b4e..4372c965ffe 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.AWTError;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -675,7 +677,7 @@ public class XFontPeer
*/
static String encodeFont(String name, int style, int size)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('.');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
index 7424dc671ed..a355c68b383 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
@@ -93,8 +93,7 @@ public class XFramePeer
public int getState()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return 0;
}
public void setState(int state)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
index 95129666a05..0339a424dac 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
@@ -313,7 +313,7 @@ public class XGraphics2D
{
// TODO: Optimize for different standard bit-depths.
Color c = (Color) p;
- XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
+ /* XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
HashMap colorMap = tk.colorMap;
gnu.x11.Color col = (gnu.x11.Color) colorMap.get(c);
if (col == null)
@@ -323,8 +323,10 @@ public class XGraphics2D
c.getGreen() * 256,
c.getBlue() * 256);
colorMap.put(c, col);
- }
- xgc.set_foreground(col);
+ }*/
+ //xgc.set_foreground(col);
+
+ xgc.set_foreground(c.getRGB());
foreground = c;
}
}
@@ -392,9 +394,23 @@ public class XGraphics2D
xdrawable.put_image(xgc, zpixmap, x, y);
imageCache.put(image, zpixmap);
} else {
- ZPixmap zpixmap = (ZPixmap) xdrawable.image(x, y, w, h,
- 0xffffffff,
- gnu.x11.image.Image.Format.ZPIXMAP);
+
+ // TODO optimize reusing the rectangles
+ Rectangle source =
+ new Rectangle(0, 0, xdrawable.width, xdrawable.height);
+ Rectangle target = new Rectangle(x, y, w, h);
+
+ Rectangle destination = source.intersection(target);
+
+ x = destination.x;
+ y = destination.y;
+ w = destination.width;
+ h = destination.height;
+
+ ZPixmap zpixmap =
+ (ZPixmap) xdrawable.image(x, y, w, h,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
for (int yy = 0; yy < h; yy++)
{
for (int xx = 0; xx < w; xx++)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
index 85f72a4eff4..becb92a7d72 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
@@ -146,8 +146,7 @@ public class XGraphicsConfiguration
public AffineTransform getDefaultTransform()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new AffineTransform();
}
public AffineTransform getNormalizingTransform()
@@ -158,8 +157,10 @@ public class XGraphicsConfiguration
public Rectangle getBounds()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ Display d = device.getDisplay();
+ Screen screen = d.default_screen;
+
+ return new Rectangle(0, 0, screen.width, screen.height);
}
/**
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
index eff5902d22e..ca37f3adbbd 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
@@ -39,6 +39,7 @@ package gnu.java.awt.peer.x;
import gnu.classpath.SystemProperties;
import gnu.x11.Display;
+import gnu.x11.EscherServerConnectionException;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
@@ -127,9 +128,16 @@ public class XGraphicsDevice
Socket socket = createLocalSocket();
if (socket != null)
{
- display = new Display(socket, "localhost",
- displayName.display_no,
- displayName.screen_no);
+ try
+ {
+ display = new Display(socket, "localhost",
+ displayName.display_no,
+ displayName.screen_no);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
}
}
@@ -137,8 +145,17 @@ public class XGraphicsDevice
// when the connection is probably remote or when we couldn't load
// the LocalSocket class stuff.
if (display == null)
- display = new Display(displayName);
-
+ {
+ try
+ {
+ display = new Display(displayName);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
+ }
+
eventPump = new XEventPump(display);
}
return display;
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XImage.java b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
index 7d4636b95da..fa94d00c131 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XImage.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
@@ -39,13 +39,19 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
import gnu.x11.Pixmap;
+import gnu.x11.image.ZPixmap;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ImageConsumer;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
+
import java.util.Hashtable;
+import java.util.Vector;
public class XImage
extends Image
@@ -75,8 +81,7 @@ public class XImage
public ImageProducer getSource()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new XImageProducer();
}
/**
@@ -108,4 +113,66 @@ public class XImage
{
pixmap.free();
}
+
+ protected class XImageProducer implements ImageProducer
+ {
+ private Vector<ImageConsumer> consumers = new Vector<ImageConsumer>();
+
+ public void addConsumer(ImageConsumer ic)
+ {
+ if (ic != null && !isConsumer(ic))
+ this.consumers.add(ic);
+ }
+
+ public boolean isConsumer(ImageConsumer ic)
+ {
+ return this.consumers.contains(ic);
+ }
+
+ public void removeConsumer(ImageConsumer ic)
+ {
+ if (ic != null)
+ this.consumers.remove(ic);
+ }
+
+ public void requestTopDownLeftRightResend(ImageConsumer ic)
+ {
+ /* just ignore the call */
+ }
+
+ public void startProduction(ImageConsumer ic)
+ {
+ this.addConsumer(ic);
+
+ for (ImageConsumer consumer : this.consumers)
+ {
+ int width = XImage.this.getWidth(null);
+ int height = XImage.this.getHeight(null);
+
+ XGraphics2D graphics = (XGraphics2D) getGraphics();
+ ColorModel model = graphics.getColorModel();
+ graphics.dispose();
+
+ ZPixmap zpixmap = (ZPixmap)
+ XImage.this.pixmap.image(0, 0, width, height,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
+
+ int size = zpixmap.get_data_length();
+ System.out.println("size: " + size + ", w = " + width + ", h = " + height);
+
+ int [] pixel = new int[size];
+ for (int i = 0; i < size; i++)
+ pixel[i] = zpixmap.get_data_element(i);
+
+ consumer.setHints(ImageConsumer.SINGLEPASS);
+
+ consumer.setDimensions(width, height);
+ consumer.setPixels(0, 0, width, height, model, pixel, 0, width);
+ consumer.imageComplete(ImageConsumer.STATICIMAGEDONE);
+ }
+
+ System.out.println("done!");
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
index c1724aad55d..af12574a150 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
@@ -54,6 +54,7 @@ import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Label;
import java.awt.List;
@@ -120,11 +121,16 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.EmbeddedWindow;
import gnu.java.awt.font.OpenTypeFontPeer;
import gnu.java.awt.image.ImageConverter;
+import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.peer.EmbeddedWindowPeer;
+import gnu.java.awt.peer.swing.SwingButtonPeer;
import gnu.java.awt.peer.swing.SwingCanvasPeer;
+import gnu.java.awt.peer.swing.SwingCheckboxPeer;
import gnu.java.awt.peer.swing.SwingLabelPeer;
import gnu.java.awt.peer.swing.SwingPanelPeer;
+import gnu.java.awt.peer.swing.SwingTextAreaPeer;
+import gnu.java.awt.peer.swing.SwingTextFieldPeer;
public class XToolkit
extends ClasspathToolkit
@@ -232,18 +238,24 @@ public class XToolkit
protected ButtonPeer createButton(Button target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No ButtonPeer can be created in an headless" +
+ "graphics environment.");
+
+ return new SwingButtonPeer(target);
}
protected TextFieldPeer createTextField(TextField target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextFieldPeer can be created in an headless " +
+ "graphics environment.");
+
+ return new SwingTextFieldPeer(target);
}
protected LabelPeer createLabel(Label target)
{
+ checkHeadLess("No LabelPeer can be created in an headless graphics " +
+ "environment.");
return new SwingLabelPeer(target);
}
@@ -255,8 +267,10 @@ public class XToolkit
protected CheckboxPeer createCheckbox(Checkbox target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No CheckboxPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingCheckboxPeer(target);
}
protected ScrollbarPeer createScrollbar(Scrollbar target)
@@ -273,8 +287,10 @@ public class XToolkit
protected TextAreaPeer createTextArea(TextArea target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextAreaPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingTextAreaPeer(target);
}
protected ChoicePeer createChoice(Choice target)
@@ -514,14 +530,14 @@ public class XToolkit
public boolean prepareImage(Image image, int width, int height, ImageObserver observer)
{
- // Images are loaded synchronously, so we don't bother and return true.
- return true;
+ Image scaled = AbstractGraphics2D.prepareImage(image, width, height);
+ return checkImage(image, width, height, observer) == ImageObserver.ALLBITS;
}
public int checkImage(Image image, int width, int height, ImageObserver observer)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ // Images are loaded synchronously, so we don't bother and return true.
+ return ImageObserver.ALLBITS;
}
public Image createImage(ImageProducer producer)
@@ -638,4 +654,14 @@ public class XToolkit
return false;
}
+ private void checkHeadLess(String message) throws HeadlessException
+ {
+ if(GraphicsEnvironment.isHeadless())
+ {
+ if(message == null)
+ message = "This method cannot be called in headless mode.";
+
+ throw new HeadlessException(message);
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
index f9184ed1cde..930247da5c2 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
@@ -71,21 +71,16 @@ public class XWindowPeer
private static int standardSelect = Event.BUTTON_PRESS_MASK
| Event.BUTTON_RELEASE_MASK
| Event.POINTER_MOTION_MASK
- //| Event.RESIZE_REDIRECT_MASK
+ // | Event.RESIZE_REDIRECT_MASK //
| Event.EXPOSURE_MASK
- //| Event.PROPERTY_CHANGE_MASK
- | Event.STRUCTURE_NOTIFY_MASK
+ | Event.PROPERTY_CHANGE_MASK
+ //| Event.STRUCTURE_NOTIFY_MASK
+ //| Event.SUBSTRUCTURE_NOTIFY_MASK
| Event.KEY_PRESS_MASK
| Event.KEY_RELEASE_MASK
+ //| Event.VISIBILITY_CHANGE_MASK //
;
-
- /**
- * Indicates if we are in callback mode, that is when a property (like size)
- * is changed in reponse to a request from the X server and doesn't need
- * to be propagated back to the X server.
- */
- boolean callback = false;
-
+
/**
* The X window.
*/
@@ -110,8 +105,10 @@ public class XWindowPeer
int h = Math.max(window.getHeight(), 1);
xwindow = new Window(dev.getDisplay().default_root, x, y, w, h, 0, atts);
xwindow.select_input(standardSelect);
+
dev.getEventPump().registerWindow(xwindow, window);
-
+ xwindow.set_wm_delete_window();
+
boolean undecorated;
if (awtComponent instanceof Frame)
{
@@ -269,14 +266,9 @@ public class XWindowPeer
*/
public void reshape(int x, int y, int width, int height)
{
- // Need to substract insets because AWT size is including insets,
- // and X size is excluding insets.
- if (! callback)
- {
- Insets i = insets;
- xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
- height - i.top - i.bottom);
- }
+ Insets i = insets;
+ xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
+ height - i.top - i.bottom);
}
public Insets insets()
@@ -303,4 +295,9 @@ public class XWindowPeer
XGraphicsDevice dev = XToolkit.getDefaultDevice();
dev.getEventPump().unregisterWindow(xwindow);
}
+
+ public Window getXwindow()
+ {
+ return xwindow;
+ }
}
diff --git a/libjava/classpath/gnu/java/lang/CPStringBuilder.java b/libjava/classpath/gnu/java/lang/CPStringBuilder.java
new file mode 100644
index 00000000000..27e7d2cc7f9
--- /dev/null
+++ b/libjava/classpath/gnu/java/lang/CPStringBuilder.java
@@ -0,0 +1,1161 @@
+/* ClasspathStringBuffer.java -- Growable strings without locking or copying
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+ Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.lang;
+
+import gnu.classpath.SystemProperties;
+
+import java.io.Serializable;
+
+/**
+ * This class is based on java.lang.AbstractStringBuffer but
+ * without the copying of the string by toString.
+ * If you modify this, please consider also modifying that code.
+ * This code is not thread-safe; limit its use to internal use within
+ * methods.
+ */
+public final class CPStringBuilder
+ implements Serializable, CharSequence, Appendable
+{
+
+ /**
+ * Index of next available character (and thus the size of the current
+ * string contents). Note that this has permissions set this way so that
+ * String can get the value.
+ *
+ * @serial the number of characters in the buffer
+ */
+ private int count;
+
+ /**
+ * The buffer. Note that this has permissions set this way so that String
+ * can get the value.
+ *
+ * @serial the buffer
+ */
+ private char[] value;
+
+ /**
+ * A flag to denote whether the string being created has been
+ * allocated to a {@link String} object. On construction,
+ * the character array, {@link #value} is referenced only
+ * by this class. Once {@link #toString()},
+ * {@link #substring(int)} or {@link #substring(int,int)}
+ * are called, the array is also referenced by a {@link String}
+ * object and this flag is set. Subsequent modifications to
+ * this buffer cause a new array to be allocated and the flag
+ * to be reset.
+ */
+ private boolean allocated = false;
+
+ /**
+ * The default capacity of a buffer.
+ * This can be configured using gnu.classpath.cpstringbuilder.capacity
+ */
+ private static final int DEFAULT_CAPACITY;
+
+ static
+ {
+ String cap =
+ SystemProperties.getProperty("gnu.classpath.cpstringbuilder.capacity");
+ if (cap == null)
+ DEFAULT_CAPACITY = 32;
+ else
+ DEFAULT_CAPACITY = Integer.parseInt(cap);
+ }
+
+ /**
+ * Create a new CPStringBuilder with the default capacity.
+ */
+ public CPStringBuilder()
+ {
+ this(DEFAULT_CAPACITY);
+ }
+
+ /**
+ * Create an empty <code>CPStringBuilder</code> with the specified initial
+ * capacity.
+ *
+ * @param capacity the initial capacity
+ * @throws NegativeArraySizeException if capacity is negative
+ */
+ public CPStringBuilder(int capacity)
+ {
+ value = new char[capacity];
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>String</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(String str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>StringBuffer</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(StringBuffer str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>StringBuilder</code>. Initial capacity will be the size of the
+ * String plus the default capacity.
+ *
+ * @param str the <code>String</code> to convert
+ * @throws NullPointerException if str is null
+ */
+ public CPStringBuilder(StringBuilder str)
+ {
+ count = str.length();
+ value = new char[count + DEFAULT_CAPACITY];
+ str.getChars(0, count, value, 0);
+ }
+
+ /**
+ * Create a new <code>CPStringBuilder</code> with the characters in the
+ * specified <code>CharSequence</code>. Initial capacity will be the
+ * length of the sequence plus the default capacity; if the sequence
+ * reports a length less than or equal to 0, then the initial capacity
+ * will be the default.
+ *
+ * @param seq the initializing <code>CharSequence</code>
+ * @throws NullPointerException if str is null
+ * @since 1.5
+ */
+ public CPStringBuilder(CharSequence seq)
+ {
+ int len = seq.length();
+ count = len <= 0 ? 0 : len;
+ value = new char[count + DEFAULT_CAPACITY];
+ for (int i = 0; i < len; ++i)
+ value[i] = seq.charAt(i);
+ }
+
+ /**
+ * Set the length of this StringBuffer. If the new length is greater than
+ * the current length, all the new characters are set to '\0'. If the new
+ * length is less than the current length, the first <code>newLength</code>
+ * characters of the old array will be preserved, and the remaining
+ * characters are truncated.
+ *
+ * @param newLength the new length
+ * @throws IndexOutOfBoundsException if the new length is negative
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ * @see #length()
+ */
+ public void setLength(int newLength)
+ {
+ if (newLength < 0)
+ throw new StringIndexOutOfBoundsException(newLength);
+
+ int valueLength = value.length;
+
+ /* Always call ensureCapacity in order to preserve
+ copy-on-write semantics, except when the position
+ is simply being reset
+ */
+ if (newLength > 0)
+ ensureCapacity(newLength);
+
+ if (newLength < valueLength)
+ {
+ /* If the StringBuffer's value just grew, then we know that
+ value is newly allocated and the region between count and
+ newLength is filled with '\0'. */
+ count = newLength;
+ }
+ else
+ {
+ /* The StringBuffer's value doesn't need to grow. However,
+ we should clear out any cruft that may exist. */
+ while (count < newLength)
+ value[count++] = '\0';
+ }
+ }
+
+ /**
+ * Get the character at the specified index.
+ *
+ * @param index the index of the character to get, starting at 0
+ * @return the character at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public char charAt(int index)
+ {
+ if (index < 0 || index >= count)
+ throw new StringIndexOutOfBoundsException(index);
+ return value[index];
+ }
+
+ /**
+ * Get the code point at the specified index. This is like #charAt(int),
+ * but if the character is the start of a surrogate pair, and the
+ * following character completes the pair, then the corresponding
+ * supplementary code point is returned.
+ * @param index the index of the codepoint to get, starting at 0
+ * @return the codepoint at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * @since 1.5
+ */
+ public int codePointAt(int index)
+ {
+ return Character.codePointAt(value, index, count);
+ }
+
+ /**
+ * Get the code point before the specified index. This is like
+ * #codePointAt(int), but checks the characters at <code>index-1</code> and
+ * <code>index-2</code> to see if they form a supplementary code point.
+ * @param index the index just past the codepoint to get, starting at 0
+ * @return the codepoint at the specified index
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * @since 1.5
+ */
+ public int codePointBefore(int index)
+ {
+ // Character.codePointBefore() doesn't perform this check. We
+ // could use the CharSequence overload, but this is just as easy.
+ if (index >= count)
+ throw new IndexOutOfBoundsException();
+ return Character.codePointBefore(value, index, 1);
+ }
+
+ /**
+ * Get the specified array of characters. <code>srcOffset - srcEnd</code>
+ * characters will be copied into the array you pass in.
+ *
+ * @param srcOffset the index to start copying from (inclusive)
+ * @param srcEnd the index to stop copying from (exclusive)
+ * @param dst the array to copy into
+ * @param dstOffset the index to start copying into
+ * @throws NullPointerException if dst is null
+ * @throws IndexOutOfBoundsException if any source or target indices are
+ * out of range (while unspecified, source problems cause a
+ * StringIndexOutOfBoundsException, and dest problems cause an
+ * ArrayIndexOutOfBoundsException)
+ * @see System#arraycopy(Object, int, Object, int, int)
+ */
+ public void getChars(int srcOffset, int srcEnd,
+ char[] dst, int dstOffset)
+ {
+ if (srcOffset < 0 || srcEnd > count || srcEnd < srcOffset)
+ throw new StringIndexOutOfBoundsException();
+ System.arraycopy(value, srcOffset, dst, dstOffset, srcEnd - srcOffset);
+ }
+
+ /**
+ * Set the character at the specified index.
+ *
+ * @param index the index of the character to set starting at 0
+ * @param ch the value to set that character to
+ * @throws IndexOutOfBoundsException if index is negative or &gt;= length()
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public void setCharAt(int index, char ch)
+ {
+ if (index < 0 || index >= count)
+ throw new StringIndexOutOfBoundsException(index);
+ // Call ensureCapacity to enforce copy-on-write.
+ ensureCapacity(count);
+ value[index] = ch;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param obj the <code>Object</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(Object)
+ * @see #append(String)
+ */
+ public CPStringBuilder append(Object obj)
+ {
+ return append(String.valueOf(obj));
+ }
+
+ /**
+ * Append the <code>String</code> to this <code>StringBuffer</code>. If
+ * str is null, the String "null" is appended.
+ *
+ * @param str the <code>String</code> to append
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder append(String str)
+ {
+ if (str == null)
+ str = "null";
+ int len = str.length();
+ ensureCapacity(count + len);
+ str.getChars(0, len, value, count);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Append the <code>StringBuilder</code> value of the argument to this
+ * <code>StringBuilder</code>. This behaves the same as
+ * <code>append((Object) stringBuffer)</code>, except it is more efficient.
+ *
+ * @param stringBuffer the <code>StringBuilder</code> to convert and append
+ * @return this <code>StringBuilder</code>
+ * @see #append(Object)
+ */
+ public CPStringBuilder append(StringBuffer stringBuffer)
+ {
+ if (stringBuffer == null)
+ return append("null");
+ synchronized (stringBuffer)
+ {
+ int len = stringBuffer.length();
+ ensureCapacity(count + len);
+ stringBuffer.getChars(0, len, value, count);
+ count += len;
+ }
+ return this;
+ }
+
+ /**
+ * Append the <code>char</code> array to this <code>StringBuffer</code>.
+ * This is similar (but more efficient) than
+ * <code>append(new String(data))</code>, except in the case of null.
+ *
+ * @param data the <code>char[]</code> to append
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @see #append(char[], int, int)
+ */
+ public CPStringBuilder append(char[] data)
+ {
+ return append(data, 0, data.length);
+ }
+
+ /**
+ * Append part of the <code>char</code> array to this
+ * <code>StringBuffer</code>. This is similar (but more efficient) than
+ * <code>append(new String(data, offset, count))</code>, except in the case
+ * of null.
+ *
+ * @param data the <code>char[]</code> to append
+ * @param offset the start location in <code>str</code>
+ * @param count the number of characters to get from <code>str</code>
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @throws IndexOutOfBoundsException if offset or count is out of range
+ * (while unspecified, this is a StringIndexOutOfBoundsException)
+ */
+ public CPStringBuilder append(char[] data, int offset, int count)
+ {
+ if (offset < 0 || count < 0 || offset > data.length - count)
+ throw new StringIndexOutOfBoundsException();
+ ensureCapacity(this.count + count);
+ System.arraycopy(data, offset, value, this.count, count);
+ this.count += count;
+ return this;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param bool the <code>boolean</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(boolean)
+ */
+ public CPStringBuilder append(boolean bool)
+ {
+ return append(bool ? "true" : "false");
+ }
+
+ /**
+ * Append the <code>char</code> to this <code>StringBuffer</code>.
+ *
+ * @param ch the <code>char</code> to append
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder append(char ch)
+ {
+ ensureCapacity(count + 1);
+ value[count++] = ch;
+ return this;
+ }
+
+ /**
+ * Append the characters in the <code>CharSequence</code> to this
+ * buffer.
+ *
+ * @param seq the <code>CharSequence</code> providing the characters
+ * @return this <code>StringBuffer</code>
+ * @since 1.5
+ */
+ public CPStringBuilder append(CharSequence seq)
+ {
+ return append(seq, 0, seq.length());
+ }
+
+ /**
+ * Append some characters from the <code>CharSequence</code> to this
+ * buffer. If the argument is null, the four characters "null" are
+ * appended.
+ *
+ * @param seq the <code>CharSequence</code> providing the characters
+ * @param start the starting index
+ * @param end one past the final index
+ * @return this <code>StringBuffer</code>
+ * @since 1.5
+ */
+ public CPStringBuilder append(CharSequence seq, int start, int end)
+ {
+ if (seq == null)
+ return append("null");
+ if (end - start > 0)
+ {
+ ensureCapacity(count + end - start);
+ for (; start < end; ++start)
+ value[count++] = seq.charAt(start);
+ }
+ return this;
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param inum the <code>int</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(int)
+ */
+ // This is native in libgcj, for efficiency.
+ public CPStringBuilder append(int inum)
+ {
+ return append(String.valueOf(inum));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param lnum the <code>long</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(long)
+ */
+ public CPStringBuilder append(long lnum)
+ {
+ return append(Long.toString(lnum, 10));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param fnum the <code>float</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(float)
+ */
+ public CPStringBuilder append(float fnum)
+ {
+ return append(Float.toString(fnum));
+ }
+
+ /**
+ * Append the <code>String</code> value of the argument to this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param dnum the <code>double</code> to convert and append
+ * @return this <code>StringBuffer</code>
+ * @see String#valueOf(double)
+ */
+ public CPStringBuilder append(double dnum)
+ {
+ return append(Double.toString(dnum));
+ }
+
+ /**
+ * Append the code point to this <code>StringBuffer</code>.
+ * This is like #append(char), but will append two characters
+ * if a supplementary code point is given.
+ *
+ * @param code the code point to append
+ * @return this <code>StringBuffer</code>
+ * @see Character#toChars(int, char[], int)
+ * @since 1.5
+ */
+ public CPStringBuilder appendCodePoint(int code)
+ {
+ int len = Character.charCount(code);
+ ensureCapacity(count + len);
+ Character.toChars(code, value, count);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Delete characters from this <code>StringBuffer</code>.
+ * <code>delete(10, 12)</code> will delete 10 and 11, but not 12. It is
+ * harmless for end to be larger than length().
+ *
+ * @param start the first character to delete
+ * @param end the index after the last character to delete
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if start or end are out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder delete(int start, int end)
+ {
+ if (start < 0 || start > count || start > end)
+ throw new StringIndexOutOfBoundsException(start);
+ if (end > count)
+ end = count;
+ ensureCapacity(count);
+ if (count - end != 0)
+ System.arraycopy(value, end, value, start, count - end);
+ count -= end - start;
+ return this;
+ }
+
+ /**
+ * Delete a character from this <code>StringBuffer</code>.
+ *
+ * @param index the index of the character to delete
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if index is out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder deleteCharAt(int index)
+ {
+ return delete(index, index + 1);
+ }
+
+ /**
+ * Replace characters between index <code>start</code> (inclusive) and
+ * <code>end</code> (exclusive) with <code>str</code>. If <code>end</code>
+ * is larger than the size of this StringBuffer, all characters after
+ * <code>start</code> are replaced.
+ *
+ * @param start the beginning index of characters to delete (inclusive)
+ * @param end the ending index of characters to delete (exclusive)
+ * @param str the new <code>String</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if start or end are out of bounds
+ * @throws NullPointerException if str is null
+ * @since 1.2
+ */
+ public CPStringBuilder replace(int start, int end, String str)
+ {
+ if (start < 0 || start > count || start > end)
+ throw new StringIndexOutOfBoundsException(start);
+
+ int len = str.length();
+ // Calculate the difference in 'count' after the replace.
+ int delta = len - (end > count ? count : end) + start;
+ ensureCapacity(count + delta);
+
+ if (delta != 0 && end < count)
+ System.arraycopy(value, end, value, end + delta, count - end);
+
+ str.getChars(0, len, value, start);
+ count += delta;
+ return this;
+ }
+
+ /**
+ * Insert a subarray of the <code>char[]</code> argument into this
+ * <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param str the <code>char[]</code> to insert
+ * @param str_offset the index in <code>str</code> to start inserting from
+ * @param len the number of characters to insert
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>str</code> is <code>null</code>
+ * @throws StringIndexOutOfBoundsException if any index is out of bounds
+ * @since 1.2
+ */
+ public CPStringBuilder insert(int offset, char[] str, int str_offset, int len)
+ {
+ if (offset < 0 || offset > count || len < 0
+ || str_offset < 0 || str_offset > str.length - len)
+ throw new StringIndexOutOfBoundsException();
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ System.arraycopy(str, str_offset, value, offset, len);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param obj the <code>Object</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @exception StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(Object)
+ */
+ public CPStringBuilder insert(int offset, Object obj)
+ {
+ return insert(offset, obj == null ? "null" : obj.toString());
+ }
+
+ /**
+ * Insert the <code>String</code> argument into this
+ * <code>StringBuffer</code>. If str is null, the String "null" is used
+ * instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param str the <code>String</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ */
+ public CPStringBuilder insert(int offset, String str)
+ {
+ if (offset < 0 || offset > count)
+ throw new StringIndexOutOfBoundsException(offset);
+ if (str == null)
+ str = "null";
+ int len = str.length();
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ str.getChars(0, len, value, offset);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>CharSequence</code> argument into this
+ * <code>StringBuffer</code>. If the sequence is null, the String
+ * "null" is used instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param sequence the <code>CharSequence</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws IndexOutOfBoundsException if offset is out of bounds
+ * @since 1.5
+ */
+ public CPStringBuilder insert(int offset, CharSequence sequence)
+ {
+ if (sequence == null)
+ sequence = "null";
+ return insert(offset, sequence, 0, sequence.length());
+ }
+
+ /**
+ * Insert a subsequence of the <code>CharSequence</code> argument into this
+ * <code>StringBuffer</code>. If the sequence is null, the String
+ * "null" is used instead.
+ *
+ * @param offset the place to insert in this buffer
+ * @param sequence the <code>CharSequence</code> to insert
+ * @param start the starting index of the subsequence
+ * @param end one past the ending index of the subsequence
+ * @return this <code>StringBuffer</code>
+ * @throws IndexOutOfBoundsException if offset, start,
+ * or end are out of bounds
+ * @since 1.5
+ */
+ public CPStringBuilder insert(int offset, CharSequence sequence, int start, int end)
+ {
+ if (sequence == null)
+ sequence = "null";
+ if (start < 0 || end < 0 || start > end || end > sequence.length())
+ throw new IndexOutOfBoundsException();
+ int len = end - start;
+ ensureCapacity(count + len);
+ System.arraycopy(value, offset, value, offset + len, count - offset);
+ for (int i = start; i < end; ++i)
+ value[offset++] = sequence.charAt(i);
+ count += len;
+ return this;
+ }
+
+ /**
+ * Insert the <code>char[]</code> argument into this
+ * <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param data the <code>char[]</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws NullPointerException if <code>data</code> is <code>null</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see #insert(int, char[], int, int)
+ */
+ public CPStringBuilder insert(int offset, char[] data)
+ {
+ return insert(offset, data, 0, data.length);
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param bool the <code>boolean</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(boolean)
+ */
+ public CPStringBuilder insert(int offset, boolean bool)
+ {
+ return insert(offset, bool ? "true" : "false");
+ }
+
+ /**
+ * Insert the <code>char</code> argument into this <code>StringBuffer</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param ch the <code>char</code> to insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ */
+ public CPStringBuilder insert(int offset, char ch)
+ {
+ if (offset < 0 || offset > count)
+ throw new StringIndexOutOfBoundsException(offset);
+ ensureCapacity(count + 1);
+ System.arraycopy(value, offset, value, offset + 1, count - offset);
+ value[offset] = ch;
+ count++;
+ return this;
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param inum the <code>int</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(int)
+ */
+ public CPStringBuilder insert(int offset, int inum)
+ {
+ return insert(offset, String.valueOf(inum));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param lnum the <code>long</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(long)
+ */
+ public CPStringBuilder insert(int offset, long lnum)
+ {
+ return insert(offset, Long.toString(lnum, 10));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param fnum the <code>float</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(float)
+ */
+ public CPStringBuilder insert(int offset, float fnum)
+ {
+ return insert(offset, Float.toString(fnum));
+ }
+
+ /**
+ * Insert the <code>String</code> value of the argument into this
+ * <code>StringBuffer</code>. Uses <code>String.valueOf()</code> to convert
+ * to <code>String</code>.
+ *
+ * @param offset the place to insert in this buffer
+ * @param dnum the <code>double</code> to convert and insert
+ * @return this <code>StringBuffer</code>
+ * @throws StringIndexOutOfBoundsException if offset is out of bounds
+ * @see String#valueOf(double)
+ */
+ public CPStringBuilder insert(int offset, double dnum)
+ {
+ return insert(offset, Double.toString(dnum));
+ }
+
+ /**
+ * Finds the first instance of a substring in this StringBuilder.
+ *
+ * @param str String to find
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @see #indexOf(String, int)
+ */
+ public int indexOf(String str)
+ {
+ return indexOf(str, 0);
+ }
+
+ /**
+ * Finds the first instance of a String in this StringBuffer, starting at
+ * a given index. If starting index is less than 0, the search starts at
+ * the beginning of this String. If the starting index is greater than the
+ * length of this String, or the substring is not found, -1 is returned.
+ *
+ * @param str String to find
+ * @param fromIndex index to start the search
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @since 1.4
+ */
+ public int indexOf(String str, int fromIndex)
+ {
+ if (fromIndex < 0)
+ fromIndex = 0;
+ int olength = str.length();
+ int limit = count - olength;
+ String s = VMCPStringBuilder.toString(value, 0, count);
+ for (; fromIndex <= limit; ++fromIndex)
+ if (s.regionMatches(fromIndex, str, 0, olength))
+ return fromIndex;
+ return -1;
+ }
+
+ /**
+ * Finds the last instance of a substring in this StringBuffer.
+ *
+ * @param str String to find
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @see #lastIndexOf(String, int)
+ * @since 1.4
+ */
+ public int lastIndexOf(String str)
+ {
+ return lastIndexOf(str, count - str.length());
+ }
+
+ /**
+ * Finds the last instance of a String in this StringBuffer, starting at a
+ * given index. If starting index is greater than the maximum valid index,
+ * then the search begins at the end of this String. If the starting index
+ * is less than zero, or the substring is not found, -1 is returned.
+ *
+ * @param str String to find
+ * @param fromIndex index to start the search
+ * @return location (base 0) of the String, or -1 if not found
+ * @throws NullPointerException if str is null
+ * @since 1.4
+ */
+ public int lastIndexOf(String str, int fromIndex)
+ {
+ fromIndex = Math.min(fromIndex, count - str.length());
+ String s = VMCPStringBuilder.toString(value, 0, count);
+ int olength = str.length();
+ for ( ; fromIndex >= 0; fromIndex--)
+ if (s.regionMatches(fromIndex, str, 0, olength))
+ return fromIndex;
+ return -1;
+ }
+
+ /**
+ * Reverse the characters in this StringBuffer. The same sequence of
+ * characters exists, but in the reverse index ordering.
+ *
+ * @return this <code>StringBuffer</code>
+ */
+ public CPStringBuilder reverse()
+ {
+ // Call ensureCapacity to enforce copy-on-write.
+ ensureCapacity(count);
+ for (int i = count >> 1, j = count - i; --i >= 0; ++j)
+ {
+ char c = value[i];
+ value[i] = value[j];
+ value[j] = c;
+ }
+ return this;
+ }
+
+ /**
+ * This may reduce the amount of memory used by the StringBuffer,
+ * by resizing the internal array to remove unused space. However,
+ * this method is not required to resize, so this behavior cannot
+ * be relied upon.
+ * @since 1.5
+ */
+ public void trimToSize()
+ {
+ int wouldSave = value.length - count;
+ // Some random heuristics: if we save less than 20 characters, who
+ // cares.
+ if (wouldSave < 20)
+ return;
+ // If we save more than 200 characters, shrink.
+ // If we save more than 1/4 of the buffer, shrink.
+ if (wouldSave > 200 || wouldSave * 4 > value.length)
+ allocateArray(count);
+ }
+
+ /**
+ * Return the number of code points between two indices in the
+ * <code>StringBuffer</code>. An unpaired surrogate counts as a
+ * code point for this purpose. Characters outside the indicated
+ * range are not examined, even if the range ends in the middle of a
+ * surrogate pair.
+ *
+ * @param start the starting index
+ * @param end one past the ending index
+ * @return the number of code points
+ * @since 1.5
+ */
+ public int codePointCount(int start, int end)
+ {
+ if (start < 0 || end >= count || start > end)
+ throw new StringIndexOutOfBoundsException();
+
+ int count = 0;
+ while (start < end)
+ {
+ char base = value[start];
+ if (base < Character.MIN_HIGH_SURROGATE
+ || base > Character.MAX_HIGH_SURROGATE
+ || start == end
+ || start == count
+ || value[start + 1] < Character.MIN_LOW_SURROGATE
+ || value[start + 1] > Character.MAX_LOW_SURROGATE)
+ {
+ // Nothing.
+ }
+ else
+ {
+ // Surrogate pair.
+ ++start;
+ }
+ ++start;
+ ++count;
+ }
+ return count;
+ }
+
+ /**
+ * Starting at the given index, this counts forward by the indicated
+ * number of code points, and then returns the resulting index. An
+ * unpaired surrogate counts as a single code point for this
+ * purpose.
+ *
+ * @param start the starting index
+ * @param codePoints the number of code points
+ * @return the resulting index
+ * @since 1.5
+ */
+ public int offsetByCodePoints(int start, int codePoints)
+ {
+ while (codePoints > 0)
+ {
+ char base = value[start];
+ if (base < Character.MIN_HIGH_SURROGATE
+ || base > Character.MAX_HIGH_SURROGATE
+ || start == count
+ || value[start + 1] < Character.MIN_LOW_SURROGATE
+ || value[start + 1] > Character.MAX_LOW_SURROGATE)
+ {
+ // Nothing.
+ }
+ else
+ {
+ // Surrogate pair.
+ ++start;
+ }
+ ++start;
+ --codePoints;
+ }
+ return start;
+ }
+
+ /**
+ * Increase the capacity of this <code>StringBuilder</code>. This will
+ * ensure that an expensive growing operation will not occur until either
+ * <code>minimumCapacity</code> is reached or the array has been allocated.
+ * The buffer is grown to either <code>minimumCapacity * 2</code>, if
+ * the array has been allocated or the larger of <code>minimumCapacity</code> and
+ * <code>capacity() * 2 + 2</code>, if it is not already large enough.
+ *
+ * @param minimumCapacity the new capacity
+ * @see #length()
+ */
+ public void ensureCapacity(int minimumCapacity)
+ {
+ if (allocated || minimumCapacity > value.length)
+ {
+ if (minimumCapacity > value.length)
+ {
+ int max = value.length * 2 + 2;
+ minimumCapacity = (minimumCapacity < max ? max : minimumCapacity);
+ }
+ else
+ minimumCapacity *= 2;
+ allocateArray(minimumCapacity);
+ }
+ }
+
+ /**
+ * Allocates a new character array. This method is triggered when
+ * a write is attempted after the array has been passed to a
+ * {@link String} object, so that the builder does not modify
+ * the immutable {@link String}.
+ *
+ * @param capacity the size of the new array.
+ */
+ private void allocateArray(int capacity)
+ {
+ char[] nb = new char[capacity];
+ System.arraycopy(value, 0, nb, 0, count);
+ value = nb;
+ allocated = false;
+ }
+
+ /**
+ * Get the length of the <code>String</code> this <code>StringBuilder</code>
+ * would create. Not to be confused with the <em>capacity</em> of the
+ * <code>StringBuilder</code>.
+ *
+ * @return the length of this <code>StringBuilder</code>
+ * @see #capacity()
+ * @see #setLength(int)
+ */
+ public int length()
+ {
+ return count;
+ }
+
+ /**
+ * Creates a substring of this StringBuilder, starting at a specified index
+ * and ending at one character before a specified index. This is implemented
+ * the same as <code>substring(beginIndex, endIndex)</code>, to satisfy
+ * the CharSequence interface.
+ *
+ * @param beginIndex index to start at (inclusive, base 0)
+ * @param endIndex index to end at (exclusive)
+ * @return new String which is a substring of this StringBuilder
+ * @throws IndexOutOfBoundsException if beginIndex or endIndex is out of
+ * bounds
+ * @see #substring(int, int)
+ */
+ public CharSequence subSequence(int beginIndex, int endIndex)
+ {
+ return substring(beginIndex, endIndex);
+ }
+
+ /**
+ * Creates a substring of this CPStringBuilder, starting at a specified index
+ * and ending at the end of this StringBuilder.
+ *
+ * @param beginIndex index to start substring (base 0)
+ * @return new String which is a substring of this StringBuilder
+ * @throws StringIndexOutOfBoundsException if beginIndex is out of bounds
+ * @see #substring(int, int)
+ */
+ public String substring(int beginIndex)
+ {
+ return substring(beginIndex, count);
+ }
+
+ /**
+ * Creates a substring of this CPStringBuilder, starting at a specified index
+ * and ending at one character before a specified index.
+ *
+ * @param beginIndex index to start at (inclusive, base 0)
+ * @param endIndex index to end at (exclusive)
+ * @return new String which is a substring of this StringBuilder
+ * @throws StringIndexOutOfBoundsException if beginIndex or endIndex is out
+ * of bounds
+ */
+ public String substring(int beginIndex, int endIndex)
+ {
+ if (beginIndex < 0 || endIndex > count || endIndex < beginIndex)
+ throw new StringIndexOutOfBoundsException();
+ int len = endIndex - beginIndex;
+ if (len == 0)
+ return "";
+ allocated = true;
+ return VMCPStringBuilder.toString(value, beginIndex, len);
+ }
+
+ /**
+ * Convert this <code>CPStringBuilder</code> to a <code>String</code>. The
+ * String is composed of the characters currently in this StringBuilder. Note
+ * that the result is not a copy, so we flag this here and make sure to
+ * allocate a new array on the next write attempt (see {@link #ensureCapacity(int)}).
+ *
+ * @return the characters in this StringBuilder
+ */
+ public String toString()
+ {
+ allocated = true;
+ return VMCPStringBuilder.toString(value, 0, count);
+ }
+
+}
diff --git a/libjava/classpath/gnu/java/lang/ClassHelper.java b/libjava/classpath/gnu/java/lang/ClassHelper.java
index 49dce21eaf9..e190889dede 100644
--- a/libjava/classpath/gnu/java/lang/ClassHelper.java
+++ b/libjava/classpath/gnu/java/lang/ClassHelper.java
@@ -102,7 +102,7 @@ public class ClassHelper
String name = klass.getName();
if (arrayCount == 0)
return name;
- StringBuilder b = new StringBuilder(name.length() + 2 * arrayCount);
+ CPStringBuilder b = new CPStringBuilder(name.length() + 2 * arrayCount);
b.append(name);
for (int i = 0; i < arrayCount; ++i)
b.append("[]");
diff --git a/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java b/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
index 06bc9e4ab06..e413c76c78e 100644
--- a/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
+++ b/libjava/classpath/gnu/java/lang/reflect/GenericSignatureParser.java
@@ -38,7 +38,19 @@ exception statement from your version. */
package gnu.java.lang.reflect;
-import java.lang.reflect.*;
+import gnu.java.lang.CPStringBuilder;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.GenericSignatureFormatError;
+import java.lang.reflect.MalformedParameterizedTypeException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+
import java.util.ArrayList;
import java.util.Arrays;
@@ -184,7 +196,7 @@ final class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType
public String toString()
{
- StringBuilder sb = new StringBuilder();
+ CPStringBuilder sb = new CPStringBuilder();
if (owner != null)
{
sb.append(owner);
diff --git a/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java b/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
index 78c17183792..612058dbfe8 100644
--- a/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
+++ b/libjava/classpath/gnu/java/lang/reflect/TypeSignature.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.lang.reflect;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
@@ -239,7 +241,7 @@ public class TypeSignature
public static String getEncodingOfMethod(Method m)
{
Class[] paramTypes = m.getParameterTypes();
- StringBuilder buf = new StringBuilder("(");
+ CPStringBuilder buf = new CPStringBuilder("(");
for (int i = 0; i < paramTypes.length; i++)
buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
buf.append(')').append(getEncodingOfClass(m.getReturnType().getName(),
@@ -261,7 +263,7 @@ public class TypeSignature
public static String getEncodingOfConstructor(Constructor c)
{
Class[] paramTypes = c.getParameterTypes();
- StringBuilder buf = new StringBuilder("(");
+ CPStringBuilder buf = new CPStringBuilder("(");
for (int i = 0; i < paramTypes.length; i++)
buf.append(getEncodingOfClass(paramTypes[i].getName(), true));
buf.append(")V");
diff --git a/libjava/classpath/gnu/java/math/GMP.java b/libjava/classpath/gnu/java/math/GMP.java
new file mode 100644
index 00000000000..6fb49363ddd
--- /dev/null
+++ b/libjava/classpath/gnu/java/math/GMP.java
@@ -0,0 +1,474 @@
+/* gnu.java.math.GMP -- Arbitary precision integers using GMP
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.java.math;
+
+import gnu.classpath.Pointer;
+
+/**
+ * Implement BigInteger using GMP
+ */
+public final class GMP
+{
+ private Pointer native_ptr;
+ private int refCount = 1;
+
+ public GMP()
+ {
+ super();
+
+ natInitialize();
+ }
+
+ private synchronized void acquireRef()
+ {
+ refCount++;
+ }
+
+ private synchronized void releaseRef()
+ {
+ refCount--;
+ if (refCount == 0)
+ {
+ natFinalize();
+ native_ptr = null;
+ }
+ }
+
+ protected void finalize()
+ {
+ releaseRef();
+ }
+
+
+ public void fromByteArray(byte[] v)
+ {
+ acquireRef();
+ natFromByteArray(v);
+ releaseRef();
+ }
+
+ public void fromBI(GMP x)
+ {
+ acquireRef();
+ x.acquireRef();
+ natFromBI(x.native_ptr);
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void fromLong(long n)
+ {
+ acquireRef();
+ natFromLong(n);
+ releaseRef();
+ }
+
+ public int fromString(String s, int rdx)
+ {
+ acquireRef();
+ int result = natFromString(s, rdx);
+ releaseRef();
+ return result;
+ }
+
+ public void fromSignedMagnitude(byte[] m, boolean isNegative)
+ {
+ acquireRef();
+ natFromSignedMagnitude(m, isNegative);
+ releaseRef();
+ }
+
+ public String toString(int b)
+ {
+ acquireRef();
+ String result = natToString(b);
+ releaseRef();
+ return result;
+ }
+
+ public void toByteArray(byte[] r)
+ {
+ acquireRef();
+ natToByteArray(r);
+ releaseRef();
+ }
+
+ public double doubleValue()
+ {
+ acquireRef();
+ double result = natDoubleValue();
+ releaseRef();
+ return result;
+ }
+
+ public int absIntValue()
+ {
+ acquireRef();
+ int result = natAbsIntValue();
+ releaseRef();
+ return result;
+ }
+
+ public int compare(GMP x)
+ {
+ acquireRef();
+ x.acquireRef();
+ int result = natCompare(x.native_ptr);
+ x.releaseRef();
+ releaseRef();
+ return result;
+ }
+
+ public void add(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAdd(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void subtract(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natSubtract(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void multiply(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natMultiply(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void quotient(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natQuotient(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void remainder(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natRemainder(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void quotientAndRemainder(GMP x, GMP q, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ q.acquireRef();
+ r.acquireRef();
+ natQuotientAndRemainder(x.native_ptr, q.native_ptr, r.native_ptr);
+ r.releaseRef();
+ q.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void modulo(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natModulo(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void pow(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natPow(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void modPow(GMP e, GMP m, GMP r)
+ {
+ acquireRef();
+ e.acquireRef();
+ m.acquireRef();
+ r.acquireRef();
+ natModPow(e.native_ptr, m.native_ptr, r.native_ptr);
+ r.releaseRef();
+ m.releaseRef();
+ e.releaseRef();
+ releaseRef();
+ }
+
+ public void modInverse(GMP m, GMP r)
+ {
+ acquireRef();
+ m.acquireRef();
+ r.acquireRef();
+ natModInverse(m.native_ptr, r.native_ptr);
+ r.releaseRef();
+ m.releaseRef();
+ releaseRef();
+ }
+
+ public void gcd(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natGCD(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void shiftLeft(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natShiftLeft(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void shiftRight(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natShiftRight(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void abs(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natAbs(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void negate(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natNegate(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int bitLength()
+ {
+ acquireRef();
+ int result = natBitLength();
+ releaseRef();
+ return result;
+ }
+
+ public int bitCount()
+ {
+ acquireRef();
+ int result = natSetBitCount();
+ releaseRef();
+ return result;
+ }
+
+ public void and(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAnd(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void or(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natOr(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void xor(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natXor(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void andNot(GMP x, GMP r)
+ {
+ acquireRef();
+ x.acquireRef();
+ r.acquireRef();
+ natAndNot(x.native_ptr, r.native_ptr);
+ r.releaseRef();
+ x.releaseRef();
+ releaseRef();
+ }
+
+ public void not(GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natNot(r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public void flipBit(int n, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natFlipBit(n, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int testBit(int n)
+ {
+ acquireRef();
+ int result = natTestBit(n);
+ releaseRef();
+ return result;
+ }
+
+ public void setBit(int n, boolean setIt, GMP r)
+ {
+ acquireRef();
+ r.acquireRef();
+ natSetBit(n, setIt, r.native_ptr);
+ r.releaseRef();
+ releaseRef();
+ }
+
+ public int testPrimality(int certainty)
+ {
+ acquireRef();
+ int result = natTestPrimality(certainty);
+ releaseRef();
+ return result;
+ }
+
+ public int lowestSetBit()
+ {
+ acquireRef();
+ int result = natLowestSetBit();
+ releaseRef();
+ return result;
+ }
+
+ // Native methods .........................................................
+
+ public static native void natInitializeLibrary();
+
+ private native void natInitialize();
+ private native void natFinalize();
+
+ private native void natFromLong(long n);
+ private native void natFromBI(Pointer x);
+ private native void natFromByteArray(byte[] v);
+ private native int natFromString(String s, int rdx);
+ private native void natFromSignedMagnitude(byte[] m, boolean isNegative);
+
+ private native String natToString(int base);
+ private native void natToByteArray(byte[] r);
+ private native int natAbsIntValue();
+ private native double natDoubleValue();
+
+ private native int natCompare(Pointer y);
+ private native void natAdd(Pointer x, Pointer r);
+ private native void natSubtract(Pointer x, Pointer r);
+ private native void natMultiply(Pointer x, Pointer r);
+ private native void natQuotient(Pointer x, Pointer r);
+ private native void natRemainder(Pointer x, Pointer r);
+ private native void natQuotientAndRemainder(Pointer x, Pointer q, Pointer r);
+ private native void natModulo(Pointer m, Pointer r);
+ private native void natPow(int n, Pointer r);
+ private native void natModPow(Pointer e, Pointer m, Pointer r);
+ private native void natModInverse(Pointer x, Pointer r);
+ private native void natGCD(Pointer x, Pointer r);
+ private native int natTestPrimality(int c);
+ private native void natShiftLeft(int n, Pointer r);
+ private native void natShiftRight(int n, Pointer r);
+ private native int natLowestSetBit();
+ private native void natAbs(Pointer r);
+ private native void natNegate(Pointer r);
+ private native int natBitLength();
+ private native int natSetBitCount();
+ private native void natXor(Pointer x, Pointer r);
+ private native void natOr(Pointer x, Pointer r);
+ private native void natAnd(Pointer x, Pointer r);
+ private native void natAndNot(Pointer x, Pointer r);
+ private native void natFlipBit(int n, Pointer r);
+ private native int natTestBit(int n);
+ private native void natSetBit(int n, boolean setIt, Pointer r);
+ private native void natNot(Pointer r);
+}
diff --git a/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java b/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
index fd79019183a..98e8a868d60 100644
--- a/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
+++ b/libjava/classpath/gnu/java/net/protocol/ftp/FTPConnection.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.ftp;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.CRLFInputStream;
import gnu.java.net.CRLFOutputStream;
import gnu.java.net.EmptyX509TrustManager;
@@ -621,7 +623,7 @@ public class FTPConnection
}
// Send PORT command
- StringBuffer buf = new StringBuffer(PORT);
+ CPStringBuilder buf = new CPStringBuilder(PORT);
buf.append(' ');
// Construct the address/port string form
byte[] address = localhost.getAddress();
@@ -686,7 +688,7 @@ public class FTPConnection
public void setRepresentationType(int type)
throws IOException
{
- StringBuffer buf = new StringBuffer(TYPE);
+ CPStringBuilder buf = new CPStringBuilder(TYPE);
buf.append(' ');
switch (type)
{
@@ -732,7 +734,7 @@ public class FTPConnection
public void setFileStructure(int structure)
throws IOException
{
- StringBuffer buf = new StringBuffer(STRU);
+ CPStringBuilder buf = new CPStringBuilder(STRU);
buf.append(' ');
switch (structure)
{
@@ -776,7 +778,7 @@ public class FTPConnection
public void setTransferMode(int mode)
throws IOException
{
- StringBuffer buf = new StringBuffer(MODE);
+ CPStringBuilder buf = new CPStringBuilder(MODE);
buf.append(' ');
switch (mode)
{
@@ -1286,7 +1288,7 @@ public class FTPConnection
}
else if (c == '-')
{
- StringBuffer buf = new StringBuffer(line.substring(4));
+ CPStringBuilder buf = new CPStringBuilder(line.substring(4));
buf.append('\n');
while(true)
{
diff --git a/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java b/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
index 8abef71d521..8a30e51db57 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/ChunkedInputStream.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.ProtocolException;
@@ -113,7 +115,7 @@ public class ChunkedInputStream
// Read chunk header
int c, last = 0;
boolean seenSemi = false;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
do
{
c = in.read();
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Cookie.java b/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
index 0be7a097e5b..4482a121e59 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Cookie.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Date;
/**
@@ -139,7 +141,7 @@ public class Cookie
public String toString(boolean showPath, boolean showDomain)
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(name);
buf.append('=');
buf.append(value);
diff --git a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java b/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
index 9d19bfbdba4..44b1a608ac7 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/HTTPConnection.java
@@ -39,6 +39,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
import gnu.classpath.SystemProperties;
+
+import gnu.java.lang.CPStringBuilder;
import gnu.java.net.EmptyX509TrustManager;
import java.io.BufferedInputStream;
@@ -668,7 +670,7 @@ public class HTTPConnection
Cookie[] cookies = cookieManager.getCookies(hostname, secure, path);
if (cookies != null && cookies.length > 0)
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append("$Version=1");
for (int i = 0; i < cookies.length; i++)
{
@@ -827,7 +829,7 @@ public class HTTPConnection
*/
protected String getURI()
{
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(secure ? "https://" : "http://");
buf.append(hostname);
if (secure)
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Headers.java b/libjava/classpath/gnu/java/net/protocol/http/Headers.java
index c8736bbac8f..690a0c65bd0 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Headers.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Headers.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.LineInputStream;
import java.io.IOException;
@@ -280,7 +282,7 @@ class Headers implements Iterable<Headers.HeaderElement>
(LineInputStream) in : new LineInputStream(in);
String name = null;
- StringBuilder value = new StringBuilder();
+ CPStringBuilder value = new CPStringBuilder();
while (true)
{
String line = lin.readLine();
diff --git a/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java b/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
index 16cf56a2919..568f830fd47 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/LimitedLengthInputStream.java
@@ -1,5 +1,5 @@
/* LimitedLengthInputStream.java --
- Copyright (C) 2005 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2008 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-
+
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
@@ -57,20 +57,17 @@ class LimitedLengthInputStream
private boolean eof;
private InputStream in;
private boolean doClose;
-
-
+
private void handleClose()
throws IOException
{
eof = true;
+
if (doClose)
- {
- in.close();
- }
+ in.close();
else
- {
- connection.release();
- }
+ connection.release();
+
in = null;
connection = null;
}
@@ -85,7 +82,7 @@ class LimitedLengthInputStream
* @param restrictLen if true the number of bytes that can be read
* from this stream will be limited to maxLen, otherwise the number
* of bytes is not restricted.
- *
+ *
* @param con the HTTPConnection associated with this stream
*
* @param doClose if true con will be closed when finished reading,
@@ -98,7 +95,6 @@ class LimitedLengthInputStream
HTTPConnection con,
boolean doClose)
throws IOException
-
{
this.in = in;
this.remainingLen = maxLen;
@@ -122,7 +118,7 @@ class LimitedLengthInputStream
return -1; // EOF
int r;
-
+
if (restrictLen)
{
r = in.read();
@@ -138,7 +134,7 @@ class LimitedLengthInputStream
if (r == -1)
handleClose();
}
-
+
return r;
}
@@ -156,12 +152,12 @@ class LimitedLengthInputStream
if (restrictLen && length > remainingLen)
length = (int) remainingLen;
-
+
int r = in.read(buffer, offset, length);
-
+
if (-1 == r)
handleClose();
-
+
if (restrictLen && r > 0)
{
remainingLen -= r;
@@ -182,7 +178,7 @@ class LimitedLengthInputStream
n = remainingLen;
long r = in.skip(n);
-
+
if (restrictLen)
{
remainingLen -= r;
@@ -214,7 +210,7 @@ class LimitedLengthInputStream
// it away.
doClose = true;
-
+
handleClose();
}
}
diff --git a/libjava/classpath/gnu/java/net/protocol/http/Request.java b/libjava/classpath/gnu/java/net/protocol/http/Request.java
index 90e3b7a0d64..88e2fd077f2 100644
--- a/libjava/classpath/gnu/java/net/protocol/http/Request.java
+++ b/libjava/classpath/gnu/java/net/protocol/http/Request.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.net.protocol.http;
+import gnu.java.lang.CPStringBuilder;
import gnu.java.net.LineInputStream;
import gnu.java.util.Base64;
@@ -628,7 +629,7 @@ public class Request
{
int len = text.length();
String key = null;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
Properties ret = new Properties();
boolean inQuote = false;
for (int i = 0; i < len; i++)
@@ -681,7 +682,7 @@ public class Request
{
int nc = connection.getNonceCount(nonce);
String hex = Integer.toHexString(nc);
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 8 - hex.length(); i > 0; i--)
{
buf.append('0');
@@ -752,7 +753,7 @@ public class Request
int len = text.length();
String attr = null;
- StringBuilder buf = new StringBuilder();
+ CPStringBuilder buf = new CPStringBuilder();
boolean inQuote = false;
for (int i = 0; i <= len; i++)
{
diff --git a/libjava/classpath/gnu/java/net/protocol/jar/Handler.java b/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
index c57d0a36016..66f0fb6d983 100644
--- a/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
+++ b/libjava/classpath/gnu/java/net/protocol/jar/Handler.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.net.protocol.jar;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.net.URLParseError;
import java.io.IOException;
@@ -180,7 +182,7 @@ public class Handler extends URLStreamHandler
tokens.add(token);
}
- StringBuffer path = new StringBuffer(url_string.length());
+ CPStringBuilder path = new CPStringBuilder(url_string.length());
path.append(url_string.substring(0, jar_stop + 1));
Iterator<String> it = tokens.iterator();
@@ -205,7 +207,7 @@ public class Handler extends URLStreamHandler
// Do the concatenation manually to avoid resize StringBuffer's
// internal buffer. The length of ref is not taken into consideration
// as it's a rare path.
- StringBuffer sb = new StringBuffer (file.length() + 5);
+ CPStringBuilder sb = new CPStringBuilder (file.length() + 5);
sb.append ("jar:");
sb.append (file);
if (ref != null)
diff --git a/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java b/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
index 33dfa0263c7..a1eb5e2067b 100644
--- a/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
+++ b/libjava/classpath/gnu/java/nio/charset/ByteDecodeLoopHelper.java
@@ -119,6 +119,8 @@ public abstract class ByteDecodeLoopHelper
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -129,7 +131,7 @@ public abstract class ByteDecodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
@@ -147,7 +149,7 @@ public abstract class ByteDecodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
char c = mapToChar(b);
outArray[outPos] = c;
diff --git a/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java b/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
index 5f703b195f2..b1a4f10da92 100644
--- a/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
+++ b/libjava/classpath/gnu/java/nio/charset/ByteEncodeLoopHelper.java
@@ -120,6 +120,8 @@ public abstract class ByteEncodeLoopHelper
int inRemaining = in.remaining();
int outRemaining = out.remaining();
CoderResult result;
+
+ bailOut:
if (inRemaining <= outRemaining)
{
for (int i = 0; i < inRemaining; i++)
@@ -130,7 +132,7 @@ public abstract class ByteEncodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;
@@ -148,7 +150,7 @@ public abstract class ByteEncodeLoopHelper
{
inPos--;
result = CoderResult.unmappableForLength(1);
- break;
+ break bailOut;
}
byte b = mapToByte(inChar);
outArray[outPos] = b;
diff --git a/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java b/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
index 4d5e1b0269e..9c3edef76d8 100644
--- a/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
+++ b/libjava/classpath/gnu/java/rmi/server/RMIClassLoaderImpl.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.rmi.server;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.net.URL;
@@ -69,7 +71,7 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi
if (urls.length == 0)
return null;
- StringBuffer annotation = new StringBuffer (64 * urls.length);
+ CPStringBuilder annotation = new CPStringBuilder (64 * urls.length);
for (int i = 0; i < urls.length; i++)
{
@@ -337,7 +339,7 @@ public class RMIClassLoaderImpl extends RMIClassLoaderSpi
if (urls.length == 0)
return null;
- StringBuffer annotation = new StringBuffer (64 * urls.length);
+ CPStringBuilder annotation = new CPStringBuilder (64 * urls.length);
for (int i = 0; i < urls.length; i++)
{
diff --git a/libjava/classpath/gnu/java/rmi/server/RMIHashes.java b/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
index 5a414404d4f..c3665a4e73b 100644
--- a/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
+++ b/libjava/classpath/gnu/java/rmi/server/RMIHashes.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.rmi.server;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.lang.reflect.TypeSignature;
import java.io.ByteArrayOutputStream;
@@ -61,7 +63,7 @@ public class RMIHashes
ByteArrayOutputStream digest_out = new ByteArrayOutputStream();
DataOutputStream data_out = new DataOutputStream (digest_out);
- StringBuffer sbuf = new StringBuffer();
+ CPStringBuilder sbuf = new CPStringBuilder();
sbuf.append(meth.getName());
sbuf.append('(');
Class params[] = meth.getParameterTypes();
diff --git a/libjava/classpath/gnu/java/security/Engine.java b/libjava/classpath/gnu/java/security/Engine.java
index 2cb21832152..6c39d46acc6 100644
--- a/libjava/classpath/gnu/java/security/Engine.java
+++ b/libjava/classpath/gnu/java/security/Engine.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.security;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -150,7 +152,7 @@ public final class Engine
String alias;
int count = 0;
boolean algorithmFound = false;
- StringBuilder sb = new StringBuilder();
+ CPStringBuilder sb = new CPStringBuilder();
while (enumer.hasMoreElements())
{
key = (String) enumer.nextElement();
diff --git a/libjava/classpath/gnu/java/security/OID.java b/libjava/classpath/gnu/java/security/OID.java
index f61cf0fc37c..a3d70e22019 100644
--- a/libjava/classpath/gnu/java/security/OID.java
+++ b/libjava/classpath/gnu/java/security/OID.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.der.DEREncodingException;
import java.io.ByteArrayOutputStream;
@@ -359,7 +361,7 @@ public class OID implements Cloneable, Comparable, java.io.Serializable
return strRep;
else
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 0; i < components.length; i++)
{
buf.append((long) components[i] & 0xFFFFFFFFL);
diff --git a/libjava/classpath/gnu/java/security/PolicyFile.java b/libjava/classpath/gnu/java/security/PolicyFile.java
index 8da3a7d72fe..e9c811644df 100644
--- a/libjava/classpath/gnu/java/security/PolicyFile.java
+++ b/libjava/classpath/gnu/java/security/PolicyFile.java
@@ -39,6 +39,8 @@ package gnu.java.security;
import gnu.classpath.debug.Component;
import gnu.classpath.debug.SystemLogger;
+
+import gnu.java.lang.CPStringBuilder;
import gnu.java.security.action.GetPropertyAction;
import java.io.File;
@@ -150,7 +152,7 @@ public final class PolicyFile extends Policy
protected static final Logger logger = SystemLogger.SYSTEM;
// Added to cut redundant AccessController.doPrivileged calls
- private static GetPropertyAction prop = new GetPropertyAction("file.seperator");
+ private static GetPropertyAction prop = new GetPropertyAction("file.separator");
private static final String fs = (String) AccessController.doPrivileged(prop);
private static final String DEFAULT_POLICY =
@@ -629,8 +631,8 @@ public final class PolicyFile extends Policy
*/
private static String expand(final String s)
{
- final StringBuffer result = new StringBuffer();
- final StringBuffer prop = new StringBuffer();
+ final CPStringBuilder result = new CPStringBuilder();
+ final CPStringBuilder prop = new CPStringBuilder();
int state = 0;
for (int i = 0; i < s.length(); i++)
{
diff --git a/libjava/classpath/gnu/java/security/der/BitString.java b/libjava/classpath/gnu/java/security/der/BitString.java
index 02b1c037762..ac10be22e6b 100644
--- a/libjava/classpath/gnu/java/security/der/BitString.java
+++ b/libjava/classpath/gnu/java/security/der/BitString.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.der;
+import gnu.java.lang.CPStringBuilder;
+
import java.math.BigInteger;
import java.util.Arrays;
@@ -314,7 +316,7 @@ public class BitString implements Cloneable, Comparable
public String toString()
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
for (int i = 0, j = 7, k = 0; i < size(); i++)
{
sb.append((bytes[k] & 1 << j) != 0 ? "1" : "0");
diff --git a/libjava/classpath/gnu/java/security/der/DERReader.java b/libjava/classpath/gnu/java/security/der/DERReader.java
index 09ec1e2dff0..cd552c8bedd 100644
--- a/libjava/classpath/gnu/java/security/der/DERReader.java
+++ b/libjava/classpath/gnu/java/security/der/DERReader.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.der;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.OID;
import java.io.BufferedInputStream;
@@ -286,7 +288,7 @@ public class DERReader implements DER
private static String fromIso88591(byte[] bytes)
{
- StringBuffer str = new StringBuffer(bytes.length);
+ CPStringBuilder str = new CPStringBuilder(bytes.length);
for (int i = 0; i < bytes.length; i++)
str.append((char) (bytes[i] & 0xFF));
return str.toString();
@@ -296,7 +298,7 @@ public class DERReader implements DER
{
if ((bytes.length & 0x01) != 0)
throw new IOException("UTF-16 bytes are odd in length");
- StringBuffer str = new StringBuffer(bytes.length / 2);
+ CPStringBuilder str = new CPStringBuilder(bytes.length / 2);
for (int i = 0; i < bytes.length; i += 2)
{
char c = (char) ((bytes[i] << 8) & 0xFF);
@@ -308,7 +310,7 @@ public class DERReader implements DER
private static String fromUtf8(byte[] bytes) throws IOException
{
- StringBuffer str = new StringBuffer((int)(bytes.length / 1.5));
+ CPStringBuilder str = new CPStringBuilder((int)(bytes.length / 1.5));
for (int i = 0; i < bytes.length; )
{
char c = 0;
diff --git a/libjava/classpath/gnu/java/security/hash/Whirlpool.java b/libjava/classpath/gnu/java/security/hash/Whirlpool.java
index 89df5c51bf3..aebe1acb699 100644
--- a/libjava/classpath/gnu/java/security/hash/Whirlpool.java
+++ b/libjava/classpath/gnu/java/security/hash/Whirlpool.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.hash;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
@@ -177,10 +179,10 @@ public final class Whirlpool
{
log.fine("Static data");
log.fine("T0[]:");
- StringBuilder sb;
+ CPStringBuilder sb;
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T0[i * 4 + j])).append(", ");
@@ -189,7 +191,7 @@ public final class Whirlpool
log.fine("T1[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T1[i * 4 + j])).append(", ");
@@ -198,7 +200,7 @@ public final class Whirlpool
log.fine("T2[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T2[i * 4 + j])).append(", ");
@@ -207,7 +209,7 @@ public final class Whirlpool
log.fine("T3[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T3[i * 4 + j])).append(", ");
@@ -216,7 +218,7 @@ public final class Whirlpool
log.fine("\nT4[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T4[i * 4 + j])).append(", ");
@@ -225,7 +227,7 @@ public final class Whirlpool
log.fine("T5[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
@@ -234,7 +236,7 @@ public final class Whirlpool
log.fine("T6[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
@@ -243,7 +245,7 @@ public final class Whirlpool
log.fine("T7[]:");
for (i = 0; i < 64; i++)
{
- sb = new StringBuilder();
+ sb = new CPStringBuilder();
for (j = 0; j < 4; j++)
sb.append("0x").append(Util.toString(T5[i * 4 + j])).append(", ");
diff --git a/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java b/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
index eaccb009551..8a1cb4ca502 100644
--- a/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
+++ b/libjava/classpath/gnu/java/security/jce/sig/DSSParameters.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.jce.sig;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.der.DER;
import gnu.java.security.der.DERReader;
@@ -195,7 +197,7 @@ public class DSSParameters
protected String engineToString()
{
- StringBuffer sb = new StringBuffer("p=");
+ CPStringBuilder sb = new CPStringBuilder("p=");
if (p == null)
sb.append("???");
else
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
index 657de8dd02d..d4cf36513eb 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.util.FormatUtil;
@@ -181,7 +183,7 @@ public abstract class DSSKey
if (str == null)
{
String ls = (String) AccessController.doPrivileged(new GetPropertyAction("line.separator"));
- StringBuilder sb = new StringBuilder(ls)
+ CPStringBuilder sb = new CPStringBuilder(ls)
.append("defaultFormat=").append(defaultFormat).append(",")
.append(ls);
if (hasInheritedParameters())
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
index 6ed8de8460d..633fcf7ce08 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSPrivateKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
@@ -191,7 +193,7 @@ public class DSSPrivateKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("x=0x").append(Configuration.DEBUG ? x.toString(16)
: "**...*").append(ls)
diff --git a/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java b/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
index 9e1c4cf0a04..e5c53467176 100644
--- a/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
+++ b/libjava/classpath/gnu/java/security/key/dss/DSSPublicKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.dss;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.key.IKeyPairCodec;
@@ -190,7 +192,7 @@ public class DSSPublicKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("y=0x").append(y.toString(16)).append(ls)
.append(")")
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
index 4bdce4011a5..0419ac96ee4 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.util.FormatUtil;
@@ -163,7 +165,7 @@ public abstract class GnuRSAKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(ls)
+ str = new CPStringBuilder(ls)
.append("defaultFormat=").append(defaultFormat).append(",").append(ls)
.append("n=0x").append(n.toString(16)).append(",").append(ls)
.append("e=0x").append(e.toString(16))
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
index 00a1b822ad0..e554f2f3f02 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPrivateKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.Registry;
@@ -289,7 +291,7 @@ public class GnuRSAPrivateKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append("d=0x").append(Configuration.DEBUG ? d.toString(16)
: "**...*").append(ls)
diff --git a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
index fe28d0ba3b0..3217130c258 100644
--- a/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
+++ b/libjava/classpath/gnu/java/security/key/rsa/GnuRSAPublicKey.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.key.rsa;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.action.GetPropertyAction;
import gnu.java.security.key.IKeyPairCodec;
@@ -178,7 +180,7 @@ public class GnuRSAPublicKey
{
String ls = (String) AccessController.doPrivileged
(new GetPropertyAction("line.separator"));
- str = new StringBuilder(this.getClass().getName()).append("(")
+ str = new CPStringBuilder(this.getClass().getName()).append("(")
.append(super.toString()).append(",").append(ls)
.append(")")
.toString();
diff --git a/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java b/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
index 7d61779f937..64403315672 100644
--- a/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
+++ b/libjava/classpath/gnu/java/security/provider/X509CertificateFactory.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.security.provider;
import gnu.java.io.Base64InputStream;
+import gnu.java.lang.CPStringBuilder;
import gnu.java.security.x509.X509CRL;
import gnu.java.security.x509.X509CertPath;
import gnu.java.security.x509.X509Certificate;
@@ -193,7 +194,7 @@ public class X509CertificateFactory
if (i != 0x30)
{
inStream.reset();
- StringBuffer line = new StringBuffer(80);
+ CPStringBuilder line = new CPStringBuilder(80);
do
{
line.setLength(0);
@@ -252,7 +253,7 @@ public class X509CertificateFactory
if (i != 0x30)
{
inStream.reset();
- StringBuffer line = new StringBuffer(80);
+ CPStringBuilder line = new CPStringBuilder(80);
do
{
line.setLength(0);
diff --git a/libjava/classpath/gnu/java/security/util/ByteArray.java b/libjava/classpath/gnu/java/security/util/ByteArray.java
index 0d04d9127ae..51449204397 100644
--- a/libjava/classpath/gnu/java/security/util/ByteArray.java
+++ b/libjava/classpath/gnu/java/security/util/ByteArray.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -86,7 +88,7 @@ public final class ByteArray
public static String toHexString (byte[] buf, int off, int len, char sep)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append (Character.forDigit (buf[i+off] >>> 4 & 0x0F, 16));
@@ -100,7 +102,7 @@ public final class ByteArray
public static String formatInt (int value, int radix, int len)
{
String s = Integer.toString (value, radix);
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
for (int j = 0; j < len - s.length(); j++)
buf.append ("0");
buf.append (s);
diff --git a/libjava/classpath/gnu/java/security/util/Util.java b/libjava/classpath/gnu/java/security/util/Util.java
index c7a6810fba3..50d4466d539 100644
--- a/libjava/classpath/gnu/java/security/util/Util.java
+++ b/libjava/classpath/gnu/java/security/util/Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.math.BigInteger;
/**
@@ -296,7 +298,7 @@ public class Util
*/
public static final String toUnicodeString(byte[] ba, int offset, int length)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
int j = 0;
int k;
@@ -328,7 +330,7 @@ public class Util
*/
public static String toUnicodeString(int[] ia)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
int j = 0;
int k;
@@ -385,7 +387,7 @@ public class Util
{
if (data == null)
return m + "null\n";
- StringBuffer sb = new StringBuffer(length * 3);
+ CPStringBuilder sb = new CPStringBuilder(length * 3);
if (length > 32)
sb.append(m).append("Hexadecimal dump of ")
.append(length).append(" bytes...\n");
@@ -466,7 +468,7 @@ public class Util
b2 = buffer[1];
break;
}
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int c;
boolean notleading = false;
do
diff --git a/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java b/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
index 72cb4a9ea91..60d35574d01 100644
--- a/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
+++ b/libjava/classpath/gnu/java/security/x509/PolicyNodeImpl.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
import java.security.cert.PolicyNode;
import java.security.cert.PolicyQualifierInfo;
@@ -186,7 +188,7 @@ public final class PolicyNodeImpl implements PolicyNode
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 0; i < depth; i++)
buf.append(" ");
buf.append("(");
diff --git a/libjava/classpath/gnu/java/security/x509/Util.java b/libjava/classpath/gnu/java/security/x509/Util.java
index 1bd268a51e2..7b6c89f6aac 100644
--- a/libjava/classpath/gnu/java/security/x509/Util.java
+++ b/libjava/classpath/gnu/java/security/x509/Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
/**
* A collection of useful class methods.
*
@@ -65,7 +67,7 @@ public final class Util
*/
public static String toHexString(byte[] buf, int off, int len)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append(HEX.charAt(buf[i+off] >>> 4 & 0x0F));
@@ -94,7 +96,7 @@ public final class Util
*/
public static String toHexString(byte[] buf, int off, int len, char sep)
{
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
str.append(HEX.charAt(buf[i+off] >>> 4 & 0x0F));
@@ -130,7 +132,7 @@ public final class Util
public static String hexDump(byte[] buf, int off, int len, String prefix)
{
String nl = System.getProperty("line.separator");
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
int i = 0;
while (i < len)
{
@@ -174,7 +176,7 @@ public final class Util
public static String formatInt(int i, int radix, int len)
{
String s = Integer.toString(i, radix);
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int j = 0; j < len - s.length(); j++)
buf.append("0");
buf.append(s);
diff --git a/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java b/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
index 02adad7d2fd..e2e05c57e4b 100644
--- a/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
+++ b/libjava/classpath/gnu/java/security/x509/X500DistinguishedName.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.security.x509;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.OID;
import gnu.java.security.der.DER;
import gnu.java.security.der.DERReader;
@@ -285,7 +287,7 @@ public class X500DistinguishedName implements Principal
{
if (fixed && stringRep != null)
return stringRep;
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
for (Iterator it = components.iterator(); it.hasNext(); )
{
Map m = (Map) it.next();
@@ -377,7 +379,7 @@ public class X500DistinguishedName implements Principal
private String readAttributeType(Reader in) throws IOException
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int ch;
while ((ch = in.read()) != '=')
{
@@ -399,7 +401,7 @@ public class X500DistinguishedName implements Principal
private String readAttributeValue(Reader in) throws IOException
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int ch = in.read();
if (ch == '#')
{
@@ -537,7 +539,7 @@ public class X500DistinguishedName implements Principal
private static String compressWS(String str)
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
char lastChar = 0;
for (int i = 0; i < str.length(); i++)
{
diff --git a/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java b/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
index ae3e6ef706c..c2aae96092a 100644
--- a/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
+++ b/libjava/classpath/gnu/java/text/AttributedFormatBuffer.java
@@ -36,21 +36,25 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.text;
+import gnu.java.lang.CPStringBuilder;
+
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.HashMap;
/**
* This class is an implementation of a FormatBuffer with attributes.
- *
+ * Note that this class is not thread-safe; external synchronisation
+ * should be used if an instance is to be accessed from multiple threads.
+ *
* @author Guilhem Lavaux <guilhem@kaffe.org>
* @date April 10, 2004
*/
public class AttributedFormatBuffer implements FormatBuffer
{
- private StringBuffer buffer;
- private ArrayList ranges;
- private ArrayList attributes;
+ private final CPStringBuilder buffer;
+ private final ArrayList ranges;
+ private final ArrayList attributes;
private int[] a_ranges;
private HashMap[] a_attributes;
private int startingRange;
@@ -60,9 +64,9 @@ public class AttributedFormatBuffer implements FormatBuffer
* This constructor accepts a StringBuffer. If the buffer contains
* already some characters they will not be attributed.
*/
- public AttributedFormatBuffer(StringBuffer buffer)
+ public AttributedFormatBuffer(CPStringBuilder buffer)
{
- this.buffer = buffer;
+ this.buffer = new CPStringBuilder(buffer);
this.ranges = new ArrayList();
this.attributes = new ArrayList();
this.defaultAttr = null;
@@ -77,7 +81,7 @@ public class AttributedFormatBuffer implements FormatBuffer
public AttributedFormatBuffer(int prebuffer)
{
- this(new StringBuffer(prebuffer));
+ this(new CPStringBuilder(prebuffer));
}
public AttributedFormatBuffer()
@@ -214,12 +218,12 @@ public class AttributedFormatBuffer implements FormatBuffer
}
/**
- * This method returns the internal StringBuffer describing
+ * This method returns the internal CPStringBuilder describing
* the attributed string.
*
- * @return An instance of StringBuffer which contains the string.
+ * @return An instance of CPStringBuilder which contains the string.
*/
- public StringBuffer getBuffer()
+ public CPStringBuilder getBuffer()
{
return buffer;
}
diff --git a/libjava/classpath/gnu/java/text/StringFormatBuffer.java b/libjava/classpath/gnu/java/text/StringFormatBuffer.java
index 19b621ce4fd..fc8d08ee6f8 100644
--- a/libjava/classpath/gnu/java/text/StringFormatBuffer.java
+++ b/libjava/classpath/gnu/java/text/StringFormatBuffer.java
@@ -47,7 +47,7 @@ import java.util.HashMap;
*/
public class StringFormatBuffer implements FormatBuffer
{
- private StringBuffer buffer;
+ private final StringBuffer buffer;
private AttributedCharacterIterator.Attribute defaultAttr;
public StringFormatBuffer(int prebuffer)
diff --git a/libjava/classpath/gnu/java/util/Base64.java b/libjava/classpath/gnu/java/util/Base64.java
index 592696bcc80..4401a151a36 100644
--- a/libjava/classpath/gnu/java/util/Base64.java
+++ b/libjava/classpath/gnu/java/util/Base64.java
@@ -83,6 +83,8 @@ DAMAGES. */
package gnu.java.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -143,7 +145,7 @@ public final class Base64
int srcLength = buf.length - offset;
byte[] input = new byte[3];
int[] output = new int[4];
- StringBuffer out = new StringBuffer();
+ CPStringBuilder out = new CPStringBuilder();
int i = offset;
int chars = 0;
diff --git a/libjava/classpath/gnu/java/util/EmptyEnumeration.java b/libjava/classpath/gnu/java/util/EmptyEnumeration.java
index 46a82d6cb53..ca2c56d7335 100644
--- a/libjava/classpath/gnu/java/util/EmptyEnumeration.java
+++ b/libjava/classpath/gnu/java/util/EmptyEnumeration.java
@@ -51,25 +51,19 @@ import java.util.NoSuchElementException;
*
* @author Mark Wielaard (mark@klomp.org)
*/
-public final class EmptyEnumeration implements Enumeration, Serializable
+public final class EmptyEnumeration<T> implements Enumeration<T>, Serializable
{
/** The only instance of this class */
- private static final EmptyEnumeration instance = new EmptyEnumeration();
+ private static final EmptyEnumeration<Object> instance =
+ new EmptyEnumeration<Object>();
/**
- * Private constructor that creates a new empty Enumeration.
- */
- private EmptyEnumeration()
- {
- }
-
- /**
- * Returns the only instance of this class.
+ * Returns an instance of this class for Object.
* It can be shared by multiple objects and threads.
*
* @return the common empty enumeration
*/
- public static EmptyEnumeration getInstance()
+ public static EmptyEnumeration<Object> getInstance()
{
return instance;
}
@@ -89,7 +83,7 @@ public final class EmptyEnumeration implements Enumeration, Serializable
*
* @throws NoSuchElementException this is empty
*/
- public Object nextElement()
+ public T nextElement()
{
throw new NoSuchElementException();
}
diff --git a/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java b/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java
deleted file mode 100644
index f73c3e70311..00000000000
--- a/libjava/classpath/gnu/java/util/prefs/EventDispatcher.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/* EventDispatcher.java -- Dispatch events for prefs
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
-
-package gnu.java.util.prefs;
-
-import java.util.ArrayList;
-
-/**
- * This is a helper class used for dispatching events for
- * the prefs package.
- */
-public class EventDispatcher extends Thread
-{
- // This is a singleton class. We dispatch all events via a
- // new Thread which is created on demand.
- private static final Thread dispatchThread = new EventDispatcher();
-
- // This is a queue of events to dispatch. This thread waits on
- // the queue and when notified will remove events until the queue
- // is empty.
- private static final ArrayList<Runnable> queue = new ArrayList<Runnable>();
-
- // FIXME: this thread probably ought to go in some classpath-internal
- // ThreadGroup. But we don't have that yet.
- private EventDispatcher()
- {
- setDaemon(true);
- start();
- }
-
- public void run()
- {
- while (true)
- {
- Runnable r;
- synchronized (queue)
- {
- while (queue.size() == 0)
- {
- try
- {
- queue.wait();
- }
- catch (InterruptedException _)
- {
- // Ignore.
- }
- }
- r = queue.remove(0);
- }
- // Invoke outside the synchronization, so that
- // we aren't blocking other threads from posting events.
- try
- {
- r.run();
- }
- catch (Throwable _)
- {
- // Ignore.
- }
- }
- }
-
- /**
- * Add a new runnable to the event dispatch queue. The
- * runnable will be invoked in the event dispatch queue
- * without any locks held.
- * @param runner the Runnable to dispatch
- */
- public static void dispatch(Runnable runner)
- {
- synchronized (queue)
- {
- queue.add(runner);
- queue.notify();
- }
- }
-}
diff --git a/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java b/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
index 0fd4df36616..c26fe63c9b6 100644
--- a/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
+++ b/libjava/classpath/gnu/java/util/prefs/GConfBasedPreferences.java
@@ -165,11 +165,7 @@ public class GConfBasedPreferences
GConfBasedPreferences preferenceNode
= new GConfBasedPreferences(this, name, this.isUser);
-
- // register the node for to GConf so that it can listen
- // events outside the scope of the application
- backend.startWatchingNode(this.node);
-
+
return preferenceNode;
}
diff --git a/libjava/classpath/gnu/java/util/prefs/NodeWriter.java b/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
index 231c047da06..d3c09535147 100644
--- a/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
+++ b/libjava/classpath/gnu/java/util/prefs/NodeWriter.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.prefs;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
@@ -273,7 +275,7 @@ public class NodeWriter {
throws BackingStoreException, IOException
{
// construct String used for indentation
- StringBuffer indentBuffer = new StringBuffer(2*indent);
+ CPStringBuilder indentBuffer = new CPStringBuilder(2*indent);
for (int i=0; i < indent; i++)
indentBuffer.append(" ");
String indentString = indentBuffer.toString();
diff --git a/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java b/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
index 5e12c718b2c..3c029195989 100644
--- a/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
+++ b/libjava/classpath/gnu/java/util/prefs/gconf/GConfNativePeer.java
@@ -49,19 +49,11 @@ import java.util.prefs.BackingStoreException;
public final class GConfNativePeer
{
/**
- * Object to achieve locks for methods that need to be synchronized.
- */
- private static final Object[] semaphore = new Object[0];
-
- /**
* Creates a new instance of GConfNativePeer
*/
public GConfNativePeer()
{
- synchronized (semaphore)
- {
- init_class();
- }
+ init_class();
}
/**
@@ -72,31 +64,7 @@ public final class GConfNativePeer
*/
public boolean nodeExist(String node)
{
- return gconf_client_dir_exists(node);
- }
-
- /**
- * Add the node <code>node</code> to the list of nodes the GConf will watch.
- * An event is raised everytime this node is changed. You can add a node
- * multiple times.
- *
- * @param node the node to track.
- */
- public void startWatchingNode(String node)
- {
- gconf_client_add_dir(node);
- }
-
- /**
- * Remove the node <code>node</code> to the list of nodes the GConf is
- * watching. Note that if a node has been added multiple times, you must
- * remove it the same number of times before the remove takes effect.
- *
- * @param node the node you don't want to track anymore.
- */
- public void stopWatchingNode(String node)
- {
- gconf_client_remove_dir(node);
+ return gconf_dir_exists(node);
}
/**
@@ -111,7 +79,7 @@ public final class GConfNativePeer
*/
public boolean setString(String key, String value)
{
- return gconf_client_set_string(key, value);
+ return gconf_set_string(key, value);
}
/**
@@ -124,7 +92,7 @@ public final class GConfNativePeer
*/
public boolean unset(String key)
{
- return gconf_client_unset(key);
+ return gconf_unset(key);
}
/**
@@ -135,7 +103,7 @@ public final class GConfNativePeer
*/
public String getKey(String key)
{
- return gconf_client_get_string(key);
+ return gconf_get_string(key);
}
/**
@@ -149,7 +117,7 @@ public final class GConfNativePeer
*/
public List<String> getKeys(String node) throws BackingStoreException
{
- return gconf_client_all_keys(node);
+ return gconf_all_keys(node);
}
/**
@@ -161,7 +129,7 @@ public final class GConfNativePeer
*/
public List<String> getChildrenNodes(String node) throws BackingStoreException
{
- return gconf_client_all_nodes(node);
+ return gconf_all_nodes(node);
}
/**
@@ -185,17 +153,14 @@ public final class GConfNativePeer
*/
public void suggestSync() throws BackingStoreException
{
- gconf_client_suggest_sync();
+ gconf_suggest_sync();
}
protected void finalize() throws Throwable
{
try
{
- synchronized (semaphore)
- {
- finalize_class();
- }
+ finalize_class();
}
finally
{
@@ -215,18 +180,18 @@ public final class GConfNativePeer
* Initialize the GConf native peer and enable the object cache.
* It is meant to be used by the static initializer.
*/
- native static final private void init_id_cache();
+ native synchronized static final private void init_id_cache();
/**
* Initialize the GConf native peer. This is meant to be used by the
* class constructor.
*/
- native static final private void init_class();
+ native synchronized static final private void init_class();
/**
* Class finalizer.
*/
- native static final private void finalize_class();
+ native synchronized static final private void finalize_class();
/**
* Queries the GConf database to see if the given node exists, returning
@@ -235,23 +200,8 @@ public final class GConfNativePeer
* @param node the node to query for existence.
* @return true if the node exist, false otherwise.
*/
- native static final protected boolean gconf_client_dir_exists(String node);
-
- /**
- * Adds the given node to the list of nodes that GConf watches for
- * changes.
- *
- * @param node the node to watch for changes.
- */
- native static final protected void gconf_client_add_dir(String node);
-
- /**
- * Removes the given node from the list of nodes that GConf watches for
- * changes.
- *
- * @param node the node to remove from from the list of watched nodes.
- */
- native static final protected void gconf_client_remove_dir(String node);
+ native synchronized
+ static final protected boolean gconf_dir_exists(String node);
/**
* Sets the given key/value pair into the GConf database.
@@ -261,8 +211,8 @@ public final class GConfNativePeer
* @param value the value to associate to the given key.
* @return true if the change has effect, false otherwise.
*/
- native static final protected boolean gconf_client_set_string(String key,
- String value);
+ native synchronized
+ static final protected boolean gconf_set_string(String key, String value);
/**
* Returns the key associated to the given key. Null is returned if the
@@ -271,7 +221,8 @@ public final class GConfNativePeer
* @param key the key to return the value of.
* @return The value associated to the given key, or null.
*/
- native static final protected String gconf_client_get_string(String key);
+ native synchronized
+ static final protected String gconf_get_string(String key);
/**
* Usets the given key, removing the key from the database.
@@ -279,13 +230,13 @@ public final class GConfNativePeer
* @param key the key to remove.
* @return true if the operation success, false otherwise.
*/
- native static final protected boolean gconf_client_unset(String key);
+ native synchronized static final protected boolean gconf_unset(String key);
/**
* Suggest to the GConf native peer a sync with the database.
*
*/
- native static final protected void gconf_client_suggest_sync()
+ native synchronized static final protected void gconf_suggest_sync()
throws BackingStoreException;
/**
@@ -295,7 +246,7 @@ public final class GConfNativePeer
* @return A list of nodes under the given source node.
*/
native
- static final protected List<String> gconf_client_all_nodes(String node)
+ static synchronized final protected List<String> gconf_all_nodes(String node)
throws BackingStoreException;
/**
@@ -304,8 +255,8 @@ public final class GConfNativePeer
* @param node the source node.
* @return A list of all keys stored in the given node.
*/
- native
- static final protected List<String> gconf_client_all_keys(String node)
+ native synchronized
+ static final protected List<String> gconf_all_keys(String node)
throws BackingStoreException;
/**
@@ -314,7 +265,7 @@ public final class GConfNativePeer
* @param plain the String to escape.
* @return An escaped String for use with GConf.
*/
- native
+ native synchronized
static final protected String gconf_escape_key(String plain);
/**
@@ -324,7 +275,7 @@ public final class GConfNativePeer
* @param escaped key as returned by gconf_escape_key
* @return An unescaped key.
*/
- native
+ native synchronized
static final protected String gconf_unescape_key(String escaped);
static
diff --git a/libjava/classpath/gnu/java/util/regex/BacktrackStack.java b/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
index d711945e43b..68472615e6a 100644
--- a/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
+++ b/libjava/classpath/gnu/java/util/regex/BacktrackStack.java
@@ -44,69 +44,81 @@ package gnu.java.util.regex;
*
* @author Ito Kazumitsu</A>
*/
-final class BacktrackStack {
+final class BacktrackStack
+{
/** A set of data to be used for backtracking. */
- static class Backtrack {
- /** REToken to which to go back */
- REToken token;
+ static class Backtrack
+ {
+ /** REToken to which to go back */
+ REToken token;
/** CharIndexed on which matches are being searched for. */
- CharIndexed input;
+ CharIndexed input;
/** REMatch to be used by the REToken token. */
- REMatch match;
+ REMatch match;
/** Some parameter used by the token's backtrack method. */
- Object param;
- Backtrack(REToken token, CharIndexed input, REMatch match, Object param) {
- this.token = token;
- this.input = input;
- // REMatch may change before backtracking is needed. So we
- // keep a clone of it.
- this.match = (REMatch) match.clone();
- this.param = param;
- }
- }
-
- Backtrack[] stack;
- private int size;
- private int capacity;
- private static final int INITIAL_CAPACITY = 32;
- private static final int CAPACITY_INCREMENT = 16;
-
- BacktrackStack() {
- stack = new Backtrack[INITIAL_CAPACITY];
- size = 0;
- capacity = INITIAL_CAPACITY;
- }
-
- boolean empty() {
- return size == 0;
- }
-
- Backtrack peek() {
- return stack[size - 1];
- }
-
- Backtrack pop() {
- Backtrack bt = stack[--size];
- stack[size] = null;
- return bt;
- }
-
- void clear() {
- for (int i = 0; i < size; i++) {
- stack[i] = null;
- }
- size = 0;
- }
-
- void push(Backtrack bt) {
- if (size >= capacity) {
- capacity += CAPACITY_INCREMENT;
- Backtrack[] newStack = new Backtrack[capacity];
- System.arraycopy(stack, 0, newStack, 0, size);
- stack = newStack;
- }
- stack[size++] = bt;
+ Object param;
+ Backtrack (REToken token, CharIndexed input, REMatch match,
+ Object param)
+ {
+ this.token = token;
+ this.input = input;
+ // REMatch may change before backtracking is needed. So we
+ // keep a clone of it.
+ this.match = (REMatch) match.clone ();
+ this.param = param;
}
+ }
+
+ Backtrack[] stack;
+ private int size;
+ private int capacity;
+ private static final int INITIAL_CAPACITY = 32;
+ private static final int CAPACITY_INCREMENT = 16;
+
+ BacktrackStack ()
+ {
+ stack = new Backtrack[INITIAL_CAPACITY];
+ size = 0;
+ capacity = INITIAL_CAPACITY;
+ }
+
+ boolean empty ()
+ {
+ return size == 0;
+ }
+
+ Backtrack peek ()
+ {
+ return stack[size - 1];
+ }
+
+ Backtrack pop ()
+ {
+ Backtrack bt = stack[--size];
+ stack[size] = null;
+ return bt;
+ }
+
+ void clear ()
+ {
+ for (int i = 0; i < size; i++)
+ {
+ stack[i] = null;
+ }
+ size = 0;
+ }
+
+ void push (Backtrack bt)
+ {
+ if (size >= capacity)
+ {
+ capacity += CAPACITY_INCREMENT;
+ Backtrack[]newStack = new Backtrack[capacity];
+ System.arraycopy (stack, 0, newStack, 0, size);
+ stack = newStack;
+ }
+ stack[size++] = bt;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexed.java b/libjava/classpath/gnu/java/util/regex/CharIndexed.java
index 27e07b2f8ff..070547d7feb 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexed.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexed.java
@@ -48,13 +48,14 @@ package gnu.java.util.regex;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public interface CharIndexed {
+public interface CharIndexed
+{
/**
* Defines a constant (0xFFFF was somewhat arbitrarily chosen)
* that can be returned by the charAt() function indicating that
* the specified index is out of range.
*/
- char OUT_OF_BOUNDS = '\uFFFF';
+ char OUT_OF_BOUNDS = '\uFFFF';
/**
* Returns the character at the given offset past the current cursor
@@ -68,66 +69,66 @@ public interface CharIndexed {
* @return the character at the specified index, or the OUT_OF_BOUNDS
* character defined by this interface.
*/
- char charAt(int index);
+ char charAt (int index);
/**
* Shifts the input buffer by a given number of positions. Returns
* true if the new cursor position is valid.
*/
- boolean move(int index);
+ boolean move (int index);
/**
* Shifts the input buffer by a given number of positions. Returns
* true if the new cursor position is valid or cursor position is at
* the end of input.
*/
- boolean move1(int index); // I cannot think of a better name for this.
+ boolean move1 (int index); // I cannot think of a better name for this.
/**
* Returns true if the most recent move() operation placed the cursor
* position at a valid position in the input.
*/
- boolean isValid();
+ boolean isValid ();
/**
* Returns another CharIndexed containing length characters to the left
* of the given index. The given length is an expected maximum and
* the returned CharIndexed may not necessarily contain so many characters.
*/
- CharIndexed lookBehind(int index, int length);
+ CharIndexed lookBehind (int index, int length);
/**
* Returns the effective length of this CharIndexed
*/
- int length();
+ int length ();
/**
* Sets the REMatch last found on this input.
*/
- void setLastMatch(REMatch match);
+ void setLastMatch (REMatch match);
/**
* Returns the REMatch last found on this input.
*/
- REMatch getLastMatch();
+ REMatch getLastMatch ();
/**
* Sets the information used for hitEnd().
*/
- void setHitEnd(REMatch match);
+ void setHitEnd (REMatch match);
/**
* Returns whether the matcher has hit the end of input.
*/
- boolean hitEnd();
+ boolean hitEnd ();
/**
* Returns the anchor.
*/
- int getAnchor();
+ int getAnchor ();
/**
* Sets the anchor.
*/
- void setAnchor(int anchor);
+ void setAnchor (int anchor);
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java b/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
index 6f74c992f8f..565773837e8 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedCharArray.java
@@ -38,9 +38,11 @@ exception statement from your version. */
package gnu.java.util.regex;
import java.nio.CharBuffer;
-class CharIndexedCharArray extends CharIndexedCharSequence {
-
- CharIndexedCharArray(char[] str, int index) {
- super(CharBuffer.wrap(str), index);
- }
+class CharIndexedCharArray extends CharIndexedCharSequence
+{
+
+ CharIndexedCharArray (char[]str, int index)
+ {
+ super (CharBuffer.wrap (str), index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java b/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
index 8a0578eb80f..bc3cbbd1d72 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedCharSequence.java
@@ -38,58 +38,82 @@ exception statement from your version. */
package gnu.java.util.regex;
import java.io.Serializable;
-class CharIndexedCharSequence implements CharIndexed, Serializable {
- private CharSequence s;
- private int anchor;
- private int len;
-
- CharIndexedCharSequence(CharSequence s, int index) {
- this.s = s;
- len = s.length();
- anchor = index;
- }
-
- public char charAt(int index) {
- int pos = anchor + index;
- return ((pos < len) && (pos >= 0)) ? s.charAt(pos) : OUT_OF_BOUNDS;
- }
-
- public boolean isValid() {
- return (anchor < len);
- }
-
- public boolean move(int index) {
- return ((anchor += index) < len);
- }
-
- public boolean move1(int index) {
- return ((anchor += index) <= len);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- if (length > (anchor + index)) length = anchor + index;
- return new CharIndexedCharSequence(s, anchor + index - length);
- }
-
- public int length() {
- return len - anchor;
- }
-
- private REMatch lastMatch;
- public void setLastMatch(REMatch match) {
- lastMatch = (REMatch)match.clone();
- lastMatch.anchor = anchor;
- }
- public REMatch getLastMatch() { return lastMatch; }
-
- private int rightmostTriedPosition = 0;
- public void setHitEnd(REMatch match) {
- int pos = anchor + match.index;
- if (pos > rightmostTriedPosition) rightmostTriedPosition = pos;
- }
- public boolean hitEnd() { return rightmostTriedPosition >= len; }
-
- public int getAnchor() { return anchor; }
- public void setAnchor(int anchor) { this.anchor = anchor; }
+class CharIndexedCharSequence implements CharIndexed, Serializable
+{
+ private CharSequence s;
+ private int anchor;
+ private int len;
+
+ CharIndexedCharSequence (CharSequence s, int index)
+ {
+ this.s = s;
+ len = s.length ();
+ anchor = index;
+ }
+
+ public char charAt (int index)
+ {
+ int pos = anchor + index;
+ return ((pos < len) && (pos >= 0)) ? s.charAt (pos) : OUT_OF_BOUNDS;
+ }
+
+ public boolean isValid ()
+ {
+ return (anchor < len);
+ }
+
+ public boolean move (int index)
+ {
+ return ((anchor += index) < len);
+ }
+
+ public boolean move1 (int index)
+ {
+ return ((anchor += index) <= len);
+ }
+
+ public CharIndexed lookBehind (int index, int length)
+ {
+ if (length > (anchor + index))
+ length = anchor + index;
+ return new CharIndexedCharSequence (s, anchor + index - length);
+ }
+
+ public int length ()
+ {
+ return len - anchor;
+ }
+
+ private REMatch lastMatch;
+ public void setLastMatch (REMatch match)
+ {
+ lastMatch = (REMatch) match.clone ();
+ lastMatch.anchor = anchor;
+ }
+ public REMatch getLastMatch ()
+ {
+ return lastMatch;
+ }
+
+ private int rightmostTriedPosition = 0;
+ public void setHitEnd (REMatch match)
+ {
+ int pos = anchor + match.index;
+ if (pos > rightmostTriedPosition)
+ rightmostTriedPosition = pos;
+ }
+ public boolean hitEnd ()
+ {
+ return rightmostTriedPosition >= len;
+ }
+
+ public int getAnchor ()
+ {
+ return anchor;
+ }
+ public void setAnchor (int anchor)
+ {
+ this.anchor = anchor;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
index 844fada51fc..e42710b5de1 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedInputStream.java
@@ -42,154 +42,212 @@ import java.io.InputStream;
// TODO: move(x) shouldn't rely on calling next() x times
-class CharIndexedInputStream implements CharIndexed {
- private static final int BUFFER_INCREMENT = 1024;
- private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
-
- private BufferedInputStream br;
-
- // so that we don't try to reset() right away
- private int index = -1;
-
- private int bufsize = BUFFER_INCREMENT;
-
- private int end = UNKNOWN;
-
- private char cached = OUT_OF_BOUNDS;
-
- // Big enough for a \r\n pair
- // lookBehind[0] = most recent
- // lookBehind[1] = second most recent
- private char[] lookBehind = new char[] { OUT_OF_BOUNDS, OUT_OF_BOUNDS };
-
- CharIndexedInputStream(InputStream str, int index) {
- if (str instanceof BufferedInputStream) br = (BufferedInputStream) str;
- else br = new BufferedInputStream(str,BUFFER_INCREMENT);
- next();
- if (index > 0) move(index);
- }
-
- private boolean next() {
- if (end == 1) return false;
- end--; // closer to end
-
- try {
- if (index != -1) {
- br.reset();
- }
- int i = br.read();
- br.mark(bufsize);
- if (i == -1) {
- end = 1;
- cached = OUT_OF_BOUNDS;
- return false;
- }
- cached = (char) i;
- index = 1;
- } catch (IOException e) {
- e.printStackTrace();
- cached = OUT_OF_BOUNDS;
- return false;
+class CharIndexedInputStream implements CharIndexed
+{
+ private static final int BUFFER_INCREMENT = 1024;
+ private static final int UNKNOWN = Integer.MAX_VALUE; // value for end
+
+ private BufferedInputStream br;
+
+ // so that we don't try to reset() right away
+ private int index = -1;
+
+ private int bufsize = BUFFER_INCREMENT;
+
+ private int end = UNKNOWN;
+
+ private char cached = OUT_OF_BOUNDS;
+
+ // Big enough for a \r\n pair
+ // lookBehind[0] = most recent
+ // lookBehind[1] = second most recent
+ private char[] lookBehind = new char[]{ OUT_OF_BOUNDS, OUT_OF_BOUNDS };
+
+ CharIndexedInputStream (InputStream str, int index)
+ {
+ if (str instanceof BufferedInputStream)
+ br = (BufferedInputStream) str;
+ else
+ br = new BufferedInputStream (str, BUFFER_INCREMENT);
+ next ();
+ if (index > 0)
+ move (index);
+ }
+
+ private boolean next ()
+ {
+ if (end == 1)
+ return false;
+ end--; // closer to end
+
+ try
+ {
+ if (index != -1)
+ {
+ br.reset ();
}
- return true;
- }
-
- public char charAt(int index) {
- if (index == 0) {
- return cached;
- } else if (index >= end) {
- return OUT_OF_BOUNDS;
- } else if (index == -1) {
- return lookBehind[0];
- } else if (index == -2) {
- return lookBehind[1];
- } else if (index < -2) {
- return OUT_OF_BOUNDS;
- } else if (index >= bufsize) {
- // Allocate more space in the buffer.
- try {
- while (bufsize <= index) bufsize += BUFFER_INCREMENT;
- br.reset();
- br.mark(bufsize);
- br.skip(index-1);
- } catch (IOException e) { }
- } else if (this.index != index) {
- try {
- br.reset();
- br.skip(index-1);
- } catch (IOException e) { }
+ int i = br.read ();
+ br.mark (bufsize);
+ if (i == -1)
+ {
+ end = 1;
+ cached = OUT_OF_BOUNDS;
+ return false;
}
- char ch = OUT_OF_BOUNDS;
-
- try {
- int i = br.read();
- this.index = index+1; // this.index is index of next pos relative to charAt(0)
- if (i == -1) {
- // set flag that next should fail next time?
- end = index;
- return ch;
- }
- ch = (char) i;
- } catch (IOException ie) { }
-
- return ch;
- }
-
- public boolean move(int index) {
- // move read position [index] clicks from 'charAt(0)'
- boolean retval = true;
- while (retval && (index-- > 0)) retval = next();
- return retval;
- }
-
- public boolean isValid() {
- return (cached != OUT_OF_BOUNDS);
- }
-
- public CharIndexed lookBehind(int index, int length) {
- throw new UnsupportedOperationException(
- "difficult to look behind for an input stream");
- }
-
- public int length() {
- throw new UnsupportedOperationException(
- "difficult to tell the length for an input stream");
- }
-
- public void setLastMatch(REMatch match) {
- throw new UnsupportedOperationException(
- "difficult to support setLastMatch for an input stream");
- }
-
- public REMatch getLastMatch() {
- throw new UnsupportedOperationException(
- "difficult to support getLastMatch for an input stream");
- }
-
- public void setHitEnd(REMatch match) {
- throw new UnsupportedOperationException(
- "difficult to support setHitEnd for an input stream");
- }
-
- public boolean hitEnd() {
- throw new UnsupportedOperationException(
- "difficult to support hitEnd for an input stream");
+ cached = (char) i;
+ index = 1;
+ } catch (IOException e)
+ {
+ e.printStackTrace ();
+ cached = OUT_OF_BOUNDS;
+ return false;
}
-
- public int getAnchor() {
- throw new UnsupportedOperationException(
- "difficult to support getAnchor for an input stream");
- }
-
- public void setAnchor(int anchor) {
- throw new UnsupportedOperationException(
- "difficult to support setAnchor for an input stream");
+ return true;
+ }
+
+ public char charAt (int index)
+ {
+ if (index == 0)
+ {
+ return cached;
+ }
+ else if (index >= end)
+ {
+ return OUT_OF_BOUNDS;
+ }
+ else if (index == -1)
+ {
+ return lookBehind[0];
+ }
+ else if (index == -2)
+ {
+ return lookBehind[1];
+ }
+ else if (index < -2)
+ {
+ return OUT_OF_BOUNDS;
+ }
+ else if (index >= bufsize)
+ {
+ // Allocate more space in the buffer.
+ try
+ {
+ while (bufsize <= index)
+ bufsize += BUFFER_INCREMENT;
+ br.reset ();
+ br.mark (bufsize);
+ br.skip (index - 1);
+ }
+ catch (IOException e)
+ {
+ }
+ }
+ else if (this.index != index)
+ {
+ try
+ {
+ br.reset ();
+ br.skip (index - 1);
+ }
+ catch (IOException e)
+ {
+ }
+ }
+ char ch = OUT_OF_BOUNDS;
+
+ try
+ {
+ int i = br.read ();
+ this.index = index + 1; // this.index is index of next pos relative to charAt(0)
+ if (i == -1)
+ {
+ // set flag that next should fail next time?
+ end = index;
+ return ch;
+ }
+ ch = (char) i;
+ } catch (IOException ie)
+ {
}
- public boolean move1(int index) {
- throw new UnsupportedOperationException(
- "difficult to support move1 for an input stream");
- }
+ return ch;
+ }
+
+ public boolean move (int index)
+ {
+ // move read position [index] clicks from 'charAt(0)'
+ boolean retval = true;
+ while (retval && (index-- > 0))
+ retval = next ();
+ return retval;
+ }
+
+ public boolean isValid ()
+ {
+ return (cached != OUT_OF_BOUNDS);
+ }
+
+ public CharIndexed lookBehind (int index, int length)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to look behind for an input stream");
+ }
+
+ public int length ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to tell the length for an input stream");
+ }
+
+ public void setLastMatch (REMatch match)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setLastMatch for an input stream");
+ }
+
+ public REMatch getLastMatch ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support getLastMatch for an input stream");
+ }
+
+ public void setHitEnd (REMatch match)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setHitEnd for an input stream");
+ }
+
+ public boolean hitEnd ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support hitEnd for an input stream");
+ }
+
+ public int getAnchor ()
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support getAnchor for an input stream");
+ }
+
+ public void setAnchor (int anchor)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support setAnchor for an input stream");
+ }
+
+ public boolean move1 (int index)
+ {
+ throw new
+ UnsupportedOperationException
+ ("difficult to support move1 for an input stream");
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedString.java b/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
index fab6d78360b..7a56f487eba 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedString.java
@@ -37,8 +37,10 @@ exception statement from your version. */
package gnu.java.util.regex;
-class CharIndexedString extends CharIndexedCharSequence {
- CharIndexedString(String str, int index) {
- super(str, index);
- }
+class CharIndexedString extends CharIndexedCharSequence
+{
+ CharIndexedString (String str, int index)
+ {
+ super (str, index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java b/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
index 10005b66831..d6484f89b7c 100644
--- a/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
+++ b/libjava/classpath/gnu/java/util/regex/CharIndexedStringBuffer.java
@@ -37,9 +37,11 @@ exception statement from your version. */
package gnu.java.util.regex;
-class CharIndexedStringBuffer extends CharIndexedCharSequence {
+class CharIndexedStringBuffer extends CharIndexedCharSequence
+{
- CharIndexedStringBuffer(StringBuffer str, int index) {
- super(str, index);
- }
+ CharIndexedStringBuffer (StringBuffer str, int index)
+ {
+ super (str, index);
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RE.java b/libjava/classpath/gnu/java/util/regex/RE.java
index 421640ff293..d064f7a3579 100644
--- a/libjava/classpath/gnu/java/util/regex/RE.java
+++ b/libjava/classpath/gnu/java/util/regex/RE.java
@@ -36,12 +36,17 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.InputStream;
import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
-import java.util.Vector;
/**
* RE provides the user interface for compiling and matching regular
@@ -114,13 +119,16 @@ import java.util.Vector;
* @version 1.1.5-dev, to be released
*/
-public class RE extends REToken {
+public class RE extends REToken
+{
- private static final class IntPair implements Serializable {
+ private static final class IntPair implements Serializable
+ {
public int first, second;
}
- private static final class CharUnit implements Serializable {
+ private static final class CharUnit implements Serializable
+ {
public char ch;
public boolean bk;
}
@@ -144,8 +152,8 @@ public class RE extends REToken {
private int numSubs;
/** Minimum length, in characters, of any possible match. */
- private int minimumLength;
- private int maximumLength;
+ private int minimumLength;
+ private int maximumLength;
/**
* Compilation flag. Do not differentiate case. Subsequent
@@ -263,15 +271,18 @@ public class RE extends REToken {
public static final int REG_FIX_STARTING_POSITION = 0x1000;
/** Returns a string representing the version of the gnu.regexp package. */
- public static final String version() {
+ public static final String version ()
+ {
return VERSION;
}
// Retrieves a message from the ResourceBundle
- static final String getLocalizedMessage(String key) {
+ static final String getLocalizedMessage (String key)
+ {
if (messages == null)
- messages = PropertyResourceBundle.getBundle(bundle, Locale.getDefault());
- return messages.getString(key);
+ messages =
+ PropertyResourceBundle.getBundle (bundle, Locale.getDefault ());
+ return messages.getString (key);
}
/**
@@ -284,8 +295,9 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern) throws REException {
- this(pattern,0,RESyntax.RE_SYNTAX_PERL5,0,0);
+ public RE (Object pattern) throws REException
+ {
+ this (pattern, 0, RESyntax.RE_SYNTAX_PERL5, 0, 0);
}
/**
@@ -299,8 +311,9 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern, int cflags) throws REException {
- this(pattern,cflags,RESyntax.RE_SYNTAX_PERL5,0,0);
+ public RE (Object pattern, int cflags) throws REException
+ {
+ this (pattern, cflags, RESyntax.RE_SYNTAX_PERL5, 0, 0);
}
/**
@@ -315,47 +328,75 @@ public class RE extends REToken {
* @exception REException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public RE(Object pattern, int cflags, RESyntax syntax) throws REException {
- this(pattern,cflags,syntax,0,0);
+ public RE (Object pattern, int cflags, RESyntax syntax) throws REException
+ {
+ this (pattern, cflags, syntax, 0, 0);
}
// internal constructor used for alternation
- private RE(REToken first, REToken last,int subs, int subIndex, int minLength, int maxLength) {
- super(subIndex);
+ private RE (REToken first, REToken last, int subs, int subIndex,
+ int minLength, int maxLength)
+ {
+ super (subIndex);
firstToken = first;
lastToken = last;
numSubs = subs;
minimumLength = minLength;
maximumLength = maxLength;
- addToken(new RETokenEndSub(subIndex));
+ addToken (new RETokenEndSub (subIndex));
}
- private RE(Object patternObj, int cflags, RESyntax syntax, int myIndex, int nextSub) throws REException {
- super(myIndex); // Subexpression index of this token.
- initialize(patternObj, cflags, syntax, myIndex, nextSub);
+ private RE (Object patternObj, int cflags, RESyntax syntax, int myIndex,
+ int nextSub) throws REException
+ {
+ super (myIndex); // Subexpression index of this token.
+ initialize (patternObj, cflags, syntax, myIndex, nextSub);
}
- // For use by subclasses
- protected RE() { super(0); }
-
- // The meat of construction
- protected void initialize(Object patternObj, int cflags, RESyntax syntax, int myIndex, int nextSub) throws REException {
- char[] pattern;
- if (patternObj instanceof String) {
- pattern = ((String) patternObj).toCharArray();
- } else if (patternObj instanceof char[]) {
- pattern = (char[]) patternObj;
- } else if (patternObj instanceof StringBuffer) {
- pattern = new char [((StringBuffer) patternObj).length()];
- ((StringBuffer) patternObj).getChars(0,pattern.length,pattern,0);
- } else {
- pattern = patternObj.toString().toCharArray();
- }
+ // For use by subclasses
+ protected RE ()
+ {
+ super (0);
+ }
+
+ // The meat of construction
+ protected void initialize (Object patternObj, int cflags, RESyntax syntax,
+ int myIndex, int nextSub) throws REException
+ {
+ char[] pattern;
+ if (patternObj instanceof String)
+ {
+ pattern = ((String) patternObj).toCharArray ();
+ }
+ else if (patternObj instanceof char[])
+ {
+ pattern = (char[]) patternObj;
+ }
+ else if (patternObj instanceof StringBuffer)
+ {
+ pattern = new char[((StringBuffer) patternObj).length ()];
+ ((StringBuffer) patternObj).getChars (0, pattern.length, pattern, 0);
+ }
+ else if (patternObj instanceof StringBuilder)
+ {
+ pattern = new char[((StringBuilder) patternObj).length ()];
+ ((StringBuilder) patternObj).getChars (0, pattern.length, pattern, 0);
+ }
+ else if (patternObj instanceof CPStringBuilder)
+ {
+ pattern = new char[((CPStringBuilder) patternObj).length ()];
+ ((CPStringBuilder) patternObj).getChars (0, pattern.length, pattern,
+ 0);
+ }
+ else
+ {
+ pattern = patternObj.toString ().toCharArray ();
+ }
int pLength = pattern.length;
- numSubs = 0; // Number of subexpressions in this token.
- Vector branches = null;
+ numSubs = 0; // Number of subexpressions in this token.
+ ArrayList < REToken > branches = null;
// linked list of tokens (sort of -- some closed loops can exist)
firstToken = lastToken = null;
@@ -372,14 +413,13 @@ public class RE extends REToken {
int index = 0;
// this will be the current parse character (pattern[index])
- CharUnit unit = new CharUnit();
+ CharUnit unit = new CharUnit ();
// This is used for {x,y} calculations
- IntPair minMax = new IntPair();
+ IntPair minMax = new IntPair ();
// Buffer a token so we can create a TokenRepeated, etc.
REToken currentToken = null;
- char ch;
boolean quot = false;
// Saved syntax and flags.
@@ -387,652 +427,862 @@ public class RE extends REToken {
int savedCflags = 0;
boolean flagsSaved = false;
- while (index < pLength) {
- // read the next character unit (including backslash escapes)
- index = getCharUnit(pattern,index,unit,quot);
-
- if (unit.bk)
- if (unit.ch == 'Q') {
- quot = true;
- continue;
- } else if (unit.ch == 'E') {
- quot = false;
- continue;
- }
- if (quot)
- unit.bk = false;
-
- if (((cflags & REG_X_COMMENTS) > 0) && (!unit.bk) && (!quot)) {
- if (Character.isWhitespace(unit.ch)) {
- continue;
- }
- if (unit.ch == '#') {
- for (int i = index; i < pLength; i++) {
- if (pattern[i] == '\n') {
- index = i + 1;
+ while (index < pLength)
+ {
+ // read the next character unit (including backslash escapes)
+ index = getCharUnit (pattern, index, unit, quot);
+
+ if (unit.bk)
+ if (unit.ch == 'Q')
+ {
+ quot = true;
continue;
}
- else if (pattern[i] == '\r') {
- if (i + 1 < pLength && pattern[i + 1] == '\n') {
- index = i + 2;
- }
- else {
- index = i + 1;
- }
+ else if (unit.ch == 'E')
+ {
+ quot = false;
continue;
}
+ if (quot)
+ unit.bk = false;
+
+ if (((cflags & REG_X_COMMENTS) > 0) && (!unit.bk) && (!quot))
+ {
+ if (Character.isWhitespace (unit.ch))
+ {
+ continue;
+ }
+ if (unit.ch == '#')
+ {
+ for (int i = index; i < pLength; i++)
+ {
+ if (pattern[i] == '\n')
+ {
+ index = i + 1;
+ continue;
+ }
+ else if (pattern[i] == '\r')
+ {
+ if (i + 1 < pLength && pattern[i + 1] == '\n')
+ {
+ index = i + 2;
+ }
+ else
+ {
+ index = i + 1;
+ }
+ continue;
+ }
+ }
+ index = pLength;
+ continue;
+ }
}
- index = pLength;
- continue;
- }
- }
- // ALTERNATION OPERATOR
- // \| or | (if RE_NO_BK_VBAR) or newline (if RE_NEWLINE_ALT)
- // not available if RE_LIMITED_OPS is set
-
- // TODO: the '\n' literal here should be a test against REToken.newline,
- // which unfortunately may be more than a single character.
- if ( ( (unit.ch == '|' && (syntax.get(RESyntax.RE_NO_BK_VBAR) ^ (unit.bk || quot)))
- || (syntax.get(RESyntax.RE_NEWLINE_ALT) && (unit.ch == '\n') && !(unit.bk || quot)) )
- && !syntax.get(RESyntax.RE_LIMITED_OPS)) {
- // make everything up to here be a branch. create vector if nec.
- addToken(currentToken);
- RE theBranch = new RE(firstToken, lastToken, numSubs, subIndex, minimumLength, maximumLength);
- minimumLength = 0;
- maximumLength = 0;
- if (branches == null) {
- branches = new Vector();
- }
- branches.addElement(theBranch);
- firstToken = lastToken = currentToken = null;
- }
-
- // INTERVAL OPERATOR:
- // {x} | {x,} | {x,y} (RE_INTERVALS && RE_NO_BK_BRACES)
- // \{x\} | \{x,\} | \{x,y\} (RE_INTERVALS && !RE_NO_BK_BRACES)
- //
- // OPEN QUESTION:
- // what is proper interpretation of '{' at start of string?
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*){2,}", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '{') && syntax.get(RESyntax.RE_INTERVALS) && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ (unit.bk || quot))) {
- int newIndex = getMinMax(pattern,index,minMax,syntax);
- if (newIndex > index) {
- if (minMax.first > minMax.second)
- throw new REException(getLocalizedMessage("interval.order"),REException.REG_BADRPT,newIndex);
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,newIndex);
- if (currentToken instanceof RETokenRepeated)
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,newIndex);
- if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,newIndex);
- index = newIndex;
- currentToken = setRepeated(currentToken,minMax.first,minMax.second,index);
- }
- else {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,unit.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
- }
-
- // LIST OPERATOR:
- // [...] | [^...]
-
- else if ((unit.ch == '[') && !(unit.bk || quot)) {
- // Create a new RETokenOneOf
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index, pLength, cflags, syntax, 0);
- addToken(currentToken);
- currentToken = result.token;
- index = result.index;
- }
+ // ALTERNATION OPERATOR
+ // \| or | (if RE_NO_BK_VBAR) or newline (if RE_NEWLINE_ALT)
+ // not available if RE_LIMITED_OPS is set
+
+ // TODO: the '\n' literal here should be a test against REToken.newline,
+ // which unfortunately may be more than a single character.
+ if (((unit.ch == '|'
+ && (syntax.get (RESyntax.RE_NO_BK_VBAR) ^ (unit.bk || quot)))
+ || (syntax.get (RESyntax.RE_NEWLINE_ALT) && (unit.ch == '\n')
+ && !(unit.bk || quot)))
+ && !syntax.get (RESyntax.RE_LIMITED_OPS))
+ {
+ // make everything up to here be a branch. create vector if nec.
+ addToken (currentToken);
+ RE theBranch =
+ new RE (firstToken, lastToken, numSubs, subIndex, minimumLength,
+ maximumLength);
+ minimumLength = 0;
+ maximumLength = 0;
+ if (branches == null)
+ {
+ branches = new ArrayList < REToken > ();
+ }
+ branches.add (theBranch);
+ firstToken = lastToken = currentToken = null;
+ }
- // SUBEXPRESSIONS
- // (...) | \(...\) depending on RE_NO_BK_PARENS
-
- else if ((unit.ch == '(') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))) {
- boolean pure = false;
- boolean comment = false;
- boolean lookAhead = false;
- boolean lookBehind = false;
- boolean independent = false;
- boolean negativelh = false;
- boolean negativelb = false;
- if ((index+1 < pLength) && (pattern[index] == '?')) {
- switch (pattern[index+1]) {
- case '!':
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- negativelh = true;
- lookAhead = true;
- index += 2;
- }
- break;
- case '=':
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- lookAhead = true;
- index += 2;
- }
- break;
- case '<':
- // We assume that if the syntax supports look-ahead,
- // it also supports look-behind.
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- index++;
- switch (pattern[index +1]) {
- case '!':
- pure = true;
- negativelb = true;
- lookBehind = true;
- index += 2;
- break;
- case '=':
- pure = true;
- lookBehind = true;
- index += 2;
- }
- }
- break;
- case '>':
- // We assume that if the syntax supports look-ahead,
- // it also supports independent group.
- if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
- pure = true;
- independent = true;
- index += 2;
- }
- break;
- case 'i':
- case 'd':
- case 'm':
- case 's':
- case 'u':
- case 'x':
- case '-':
- if (!syntax.get(RESyntax.RE_EMBEDDED_FLAGS)) break;
- // Set or reset syntax flags.
- int flagIndex = index + 1;
- int endFlag = -1;
- RESyntax newSyntax = new RESyntax(syntax);
- int newCflags = cflags;
- boolean negate = false;
- while (flagIndex < pLength && endFlag < 0) {
- switch(pattern[flagIndex]) {
- case 'i':
- if (negate)
- newCflags &= ~REG_ICASE;
- else
- newCflags |= REG_ICASE;
- flagIndex++;
- break;
- case 'd':
- if (negate)
- newSyntax.setLineSeparator(RESyntax.DEFAULT_LINE_SEPARATOR);
- else
- newSyntax.setLineSeparator("\n");
- flagIndex++;
- break;
- case 'm':
- if (negate)
- newCflags &= ~REG_MULTILINE;
- else
- newCflags |= REG_MULTILINE;
- flagIndex++;
- break;
- case 's':
- if (negate)
- newCflags &= ~REG_DOT_NEWLINE;
- else
- newCflags |= REG_DOT_NEWLINE;
- flagIndex++;
- break;
- case 'u':
- if (negate)
- newCflags |= REG_ICASE_USASCII;
- else
- newCflags &= ~REG_ICASE_USASCII;
- flagIndex++;
- break;
- case 'x':
- if (negate)
- newCflags &= ~REG_X_COMMENTS;
- else
- newCflags |= REG_X_COMMENTS;
- flagIndex++;
- break;
- case '-':
- negate = true;
- flagIndex++;
- break;
- case ':':
- case ')':
- endFlag = pattern[flagIndex];
- break;
- default:
- throw new REException(getLocalizedMessage("repeat.no.token"), REException.REG_BADRPT, index);
+ // INTERVAL OPERATOR:
+ // {x} | {x,} | {x,y} (RE_INTERVALS && RE_NO_BK_BRACES)
+ // \{x\} | \{x,\} | \{x,y\} (RE_INTERVALS && !RE_NO_BK_BRACES)
+ //
+ // OPEN QUESTION:
+ // what is proper interpretation of '{' at start of string?
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*){2,}", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '{') && syntax.get (RESyntax.RE_INTERVALS)
+ && (syntax.
+ get (RESyntax.RE_NO_BK_BRACES) ^ (unit.bk || quot)))
+ {
+ int newIndex = getMinMax (pattern, index, minMax, syntax);
+ if (newIndex > index)
+ {
+ if (minMax.first > minMax.second)
+ throw new
+ REException (getLocalizedMessage ("interval.order"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken == null)
+ throw new
+ REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken instanceof RETokenRepeated)
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, newIndex);
+ if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new
+ REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, newIndex);
+ index = newIndex;
+ currentToken =
+ setRepeated (currentToken, minMax.first, minMax.second,
+ index);
+ }
+ else
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, unit.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
+ }
+
+ // LIST OPERATOR:
+ // [...] | [^...]
+
+ else if ((unit.ch == '[') && !(unit.bk || quot))
+ {
+ // Create a new RETokenOneOf
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index, pLength, cflags,
+ syntax, 0);
+ addToken (currentToken);
+ currentToken = result.token;
+ index = result.index;
+ }
+
+ // SUBEXPRESSIONS
+ // (...) | \(...\) depending on RE_NO_BK_PARENS
+
+ else if ((unit.ch == '(')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
+ {
+ boolean pure = false;
+ boolean comment = false;
+ boolean lookAhead = false;
+ boolean lookBehind = false;
+ boolean independent = false;
+ boolean negativelh = false;
+ boolean negativelb = false;
+ if ((index + 1 < pLength) && (pattern[index] == '?'))
+ {
+ switch (pattern[index + 1])
+ {
+ case '!':
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ negativelh = true;
+ lookAhead = true;
+ index += 2;
+ }
+ break;
+ case '=':
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ lookAhead = true;
+ index += 2;
+ }
+ break;
+ case '<':
+ // We assume that if the syntax supports look-ahead,
+ // it also supports look-behind.
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ index++;
+ switch (pattern[index + 1])
+ {
+ case '!':
+ pure = true;
+ negativelb = true;
+ lookBehind = true;
+ index += 2;
+ break;
+ case '=':
+ pure = true;
+ lookBehind = true;
+ index += 2;
+ }
+ }
+ break;
+ case '>':
+ // We assume that if the syntax supports look-ahead,
+ // it also supports independent group.
+ if (syntax.get (RESyntax.RE_LOOKAHEAD))
+ {
+ pure = true;
+ independent = true;
+ index += 2;
+ }
+ break;
+ case 'i':
+ case 'd':
+ case 'm':
+ case 's':
+ case 'u':
+ case 'x':
+ case '-':
+ if (!syntax.get (RESyntax.RE_EMBEDDED_FLAGS))
+ break;
+ // Set or reset syntax flags.
+ int flagIndex = index + 1;
+ int endFlag = -1;
+ RESyntax newSyntax = new RESyntax (syntax);
+ int newCflags = cflags;
+ boolean negate = false;
+ while (flagIndex < pLength && endFlag < 0)
+ {
+ switch (pattern[flagIndex])
+ {
+ case 'i':
+ if (negate)
+ newCflags &= ~REG_ICASE;
+ else
+ newCflags |= REG_ICASE;
+ flagIndex++;
+ break;
+ case 'd':
+ if (negate)
+ newSyntax.setLineSeparator (RESyntax.
+ DEFAULT_LINE_SEPARATOR);
+ else
+ newSyntax.setLineSeparator ("\n");
+ flagIndex++;
+ break;
+ case 'm':
+ if (negate)
+ newCflags &= ~REG_MULTILINE;
+ else
+ newCflags |= REG_MULTILINE;
+ flagIndex++;
+ break;
+ case 's':
+ if (negate)
+ newCflags &= ~REG_DOT_NEWLINE;
+ else
+ newCflags |= REG_DOT_NEWLINE;
+ flagIndex++;
+ break;
+ case 'u':
+ if (negate)
+ newCflags |= REG_ICASE_USASCII;
+ else
+ newCflags &= ~REG_ICASE_USASCII;
+ flagIndex++;
+ break;
+ case 'x':
+ if (negate)
+ newCflags &= ~REG_X_COMMENTS;
+ else
+ newCflags |= REG_X_COMMENTS;
+ flagIndex++;
+ break;
+ case '-':
+ negate = true;
+ flagIndex++;
+ break;
+ case ':':
+ case ')':
+ endFlag = pattern[flagIndex];
+ break;
+ default:
+ throw new
+ REException (getLocalizedMessage
+ ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ }
+ }
+ if (endFlag == ')')
+ {
+ syntax = newSyntax;
+ cflags = newCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ // This can be treated as though it were a comment.
+ comment = true;
+ index = flagIndex - 1;
+ break;
+ }
+ if (endFlag == ':')
+ {
+ savedSyntax = syntax;
+ savedCflags = cflags;
+ flagsSaved = true;
+ syntax = newSyntax;
+ cflags = newCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ index = flagIndex - 1;
+ // Fall through to the next case.
+ }
+ else
+ {
+ throw new
+ REException (getLocalizedMessage
+ ("unmatched.paren"),
+ REException.REG_ESUBREG, index);
+ }
+ case ':':
+ if (syntax.get (RESyntax.RE_PURE_GROUPING))
+ {
+ pure = true;
+ index += 2;
+ }
+ break;
+ case '#':
+ if (syntax.get (RESyntax.RE_COMMENTS))
+ {
+ comment = true;
+ }
+ break;
+ default:
+ throw new
+ REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ }
+ }
+
+ if (index >= pLength)
+ {
+ throw new
+ REException (getLocalizedMessage ("unmatched.paren"),
+ REException.REG_ESUBREG, index);
+ }
+
+ // find end of subexpression
+ int endIndex = index;
+ int nextIndex = index;
+ int nested = 0;
+
+ while (((nextIndex =
+ getCharUnit (pattern, endIndex, unit, false)) > 0)
+ && !(nested == 0 && (unit.ch == ')')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot))))
+ {
+ if ((endIndex = nextIndex) >= pLength)
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
+ else
+ if ((unit.ch == '[') && !(unit.bk || quot))
+ {
+ // I hate to do something similar to the LIST OPERATOR matters
+ // above, but ...
+ int listIndex = nextIndex;
+ if (listIndex < pLength && pattern[listIndex] == '^')
+ listIndex++;
+ if (listIndex < pLength && pattern[listIndex] == ']')
+ listIndex++;
+ int listEndIndex = -1;
+ int listNest = 0;
+ while (listIndex < pLength && listEndIndex < 0)
+ {
+ switch (pattern[listIndex++])
+ {
+ case '\\':
+ listIndex++;
+ break;
+ case '[':
+ // Sun's API document says that regexp like "[a-d[m-p]]"
+ // is legal. Even something like "[[[^]]]]" is accepted.
+ listNest++;
+ if (listIndex < pLength
+ && pattern[listIndex] == '^')
+ listIndex++;
+ if (listIndex < pLength
+ && pattern[listIndex] == ']')
+ listIndex++;
+ break;
+ case ']':
+ if (listNest == 0)
+ listEndIndex = listIndex;
+ listNest--;
+ break;
+ }
+ }
+ if (listEndIndex >= 0)
+ {
+ nextIndex = listEndIndex;
+ if ((endIndex = nextIndex) >= pLength)
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
+ else
+ continue;
+ }
+ throw new
+ REException (getLocalizedMessage ("subexpr.no.end"),
+ REException.REG_ESUBREG, nextIndex);
}
- }
- if (endFlag == ')') {
- syntax = newSyntax;
- cflags = newCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- // This can be treated as though it were a comment.
- comment = true;
- index = flagIndex - 1;
- break;
- }
- if (endFlag == ':') {
- savedSyntax = syntax;
- savedCflags = cflags;
- flagsSaved = true;
- syntax = newSyntax;
- cflags = newCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- index = flagIndex -1;
- // Fall through to the next case.
- }
- else {
- throw new REException(getLocalizedMessage("unmatched.paren"), REException.REG_ESUBREG,index);
- }
- case ':':
- if (syntax.get(RESyntax.RE_PURE_GROUPING)) {
- pure = true;
- index += 2;
- }
- break;
- case '#':
- if (syntax.get(RESyntax.RE_COMMENTS)) {
- comment = true;
- }
- break;
- default:
- throw new REException(getLocalizedMessage("repeat.no.token"), REException.REG_BADRPT, index);
+ else if (unit.ch == '('
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot)))
+ nested++;
+ else if (unit.ch == ')'
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk
+ || quot)))
+ nested--;
+ }
+
+ // endIndex is now position at a ')','\)'
+ // nextIndex is end of string or position after ')' or '\)'
+
+ if (comment)
+ index = nextIndex;
+ else
+ { // not a comment
+ // create RE subexpression as token.
+ addToken (currentToken);
+ if (!pure)
+ {
+ numSubs++;
+ }
+
+ int useIndex = (pure || lookAhead || lookBehind
+ || independent) ? 0 : nextSub + numSubs;
+ currentToken =
+ new RE (String.valueOf (pattern, index, endIndex - index).
+ toCharArray (), cflags, syntax, useIndex,
+ nextSub + numSubs);
+ numSubs += ((RE) currentToken).getNumSubs ();
+
+ if (lookAhead)
+ {
+ currentToken =
+ new RETokenLookAhead (currentToken, negativelh);
+ }
+ else if (lookBehind)
+ {
+ currentToken =
+ new RETokenLookBehind (currentToken, negativelb);
+ }
+ else if (independent)
+ {
+ currentToken = new RETokenIndependent (currentToken);
+ }
+
+ index = nextIndex;
+ if (flagsSaved)
+ {
+ syntax = savedSyntax;
+ cflags = savedCflags;
+ insens = ((cflags & REG_ICASE) > 0);
+ insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ flagsSaved = false;
+ }
+ } // not a comment
+ } // subexpression
+
+ // UNMATCHED RIGHT PAREN
+ // ) or \) throw exception if
+ // !syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
+ else if (!syntax.get (RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
+ && ((unit.ch == ')')
+ && (syntax.
+ get (RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))))
+ {
+ throw new REException (getLocalizedMessage ("unmatched.paren"),
+ REException.REG_EPAREN, index);
}
- }
-
- if (index >= pLength) {
- throw new REException(getLocalizedMessage("unmatched.paren"), REException.REG_ESUBREG,index);
- }
-
- // find end of subexpression
- int endIndex = index;
- int nextIndex = index;
- int nested = 0;
-
- while ( ((nextIndex = getCharUnit(pattern,endIndex,unit,false)) > 0)
- && !(nested == 0 && (unit.ch == ')') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot))) ) {
- if ((endIndex = nextIndex) >= pLength)
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
- else if ((unit.ch == '[') && !(unit.bk || quot)) {
- // I hate to do something similar to the LIST OPERATOR matters
- // above, but ...
- int listIndex = nextIndex;
- if (listIndex < pLength && pattern[listIndex] == '^') listIndex++;
- if (listIndex < pLength && pattern[listIndex] == ']') listIndex++;
- int listEndIndex = -1;
- int listNest = 0;
- while (listIndex < pLength && listEndIndex < 0) {
- switch(pattern[listIndex++]) {
- case '\\':
- listIndex++;
- break;
- case '[':
- // Sun's API document says that regexp like "[a-d[m-p]]"
- // is legal. Even something like "[[[^]]]]" is accepted.
- listNest++;
- if (listIndex < pLength && pattern[listIndex] == '^') listIndex++;
- if (listIndex < pLength && pattern[listIndex] == ']') listIndex++;
- break;
- case ']':
- if (listNest == 0)
- listEndIndex = listIndex;
- listNest--;
- break;
+
+ // START OF LINE OPERATOR
+ // ^
+
+ else if ((unit.ch == '^') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken = null;
+ RETokenStart token = null;
+ if ((cflags & REG_MULTILINE) > 0)
+ {
+ String sep = syntax.getLineSeparator ();
+ if (sep == null)
+ {
+ token = new RETokenStart (subIndex, null, true);
+ }
+ else
+ {
+ token = new RETokenStart (subIndex, sep);
+ }
}
- }
- if (listEndIndex >= 0) {
- nextIndex = listEndIndex;
- if ((endIndex = nextIndex) >= pLength)
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
- else
- continue;
- }
- throw new REException(getLocalizedMessage("subexpr.no.end"),REException.REG_ESUBREG,nextIndex);
+ else
+ {
+ token = new RETokenStart (subIndex, null);
+ }
+ addToken (token);
}
- else if (unit.ch == '(' && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
- nested++;
- else if (unit.ch == ')' && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))
- nested--;
- }
-
- // endIndex is now position at a ')','\)'
- // nextIndex is end of string or position after ')' or '\)'
-
- if (comment) index = nextIndex;
- else { // not a comment
- // create RE subexpression as token.
- addToken(currentToken);
- if (!pure) {
- numSubs++;
+
+ // END OF LINE OPERATOR
+ // $
+
+ else if ((unit.ch == '$') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken = null;
+ RETokenEnd token = null;
+ if ((cflags & REG_MULTILINE) > 0)
+ {
+ String sep = syntax.getLineSeparator ();
+ if (sep == null)
+ {
+ token = new RETokenEnd (subIndex, null, true);
+ }
+ else
+ {
+ token = new RETokenEnd (subIndex, sep);
+ }
+ }
+ else
+ {
+ token = new RETokenEnd (subIndex, null);
+ }
+ addToken (token);
}
- int useIndex = (pure || lookAhead || lookBehind || independent) ?
- 0 : nextSub + numSubs;
- currentToken = new RE(String.valueOf(pattern,index,endIndex-index).toCharArray(),cflags,syntax,useIndex,nextSub + numSubs);
- numSubs += ((RE) currentToken).getNumSubs();
+ // MATCH-ANY-CHARACTER OPERATOR (except possibly newline and null)
+ // .
- if (lookAhead) {
- currentToken = new RETokenLookAhead(currentToken,negativelh);
+ else if ((unit.ch == '.') && !(unit.bk || quot))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenAny (subIndex, syntax.get (RESyntax.RE_DOT_NEWLINE)
+ || ((cflags & REG_DOT_NEWLINE) > 0),
+ syntax.get (RESyntax.RE_DOT_NOT_NULL));
}
- else if (lookBehind) {
- currentToken = new RETokenLookBehind(currentToken,negativelb);
- }
- else if (independent) {
- currentToken = new RETokenIndependent(currentToken);
+
+ // ZERO-OR-MORE REPEAT OPERATOR
+ // *
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*)*", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '*') && !(unit.bk || quot))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ if (currentToken instanceof RETokenRepeated)
+ throw new REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+ if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ currentToken =
+ setRepeated (currentToken, 0, Integer.MAX_VALUE, index);
}
- index = nextIndex;
- if (flagsSaved) {
- syntax = savedSyntax;
- cflags = savedCflags;
- insens = ((cflags & REG_ICASE) > 0);
- insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- flagsSaved = false;
+ // ONE-OR-MORE REPEAT OPERATOR / POSSESSIVE MATCHING OPERATOR
+ // + | \+ depending on RE_BK_PLUS_QM
+ // not available if RE_LIMITED_OPS is set
+ //
+ // This method used to check "repeat.empty.token" to avoid such regexp
+ // as "(a*)+", but now "repeat.empty.token" is allowed.
+
+ else if ((unit.ch == '+') && !syntax.get (RESyntax.RE_LIMITED_OPS)
+ && (!syntax.
+ get (RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot)))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+
+ // Check for possessive matching on RETokenRepeated
+ if (currentToken instanceof RETokenRepeated)
+ {
+ RETokenRepeated tokenRep = (RETokenRepeated) currentToken;
+ if (syntax.get (RESyntax.RE_POSSESSIVE_OPS)
+ && !tokenRep.isPossessive () && !tokenRep.isStingy ())
+ tokenRep.makePossessive ();
+ else
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+
+ }
+ else if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ else
+ currentToken =
+ setRepeated (currentToken, 1, Integer.MAX_VALUE, index);
}
- } // not a comment
- } // subexpression
-
- // UNMATCHED RIGHT PAREN
- // ) or \) throw exception if
- // !syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD)
- else if (!syntax.get(RESyntax.RE_UNMATCHED_RIGHT_PAREN_ORD) && ((unit.ch == ')') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ (unit.bk || quot)))) {
- throw new REException(getLocalizedMessage("unmatched.paren"),REException.REG_EPAREN,index);
- }
- // START OF LINE OPERATOR
- // ^
-
- else if ((unit.ch == '^') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = null;
- RETokenStart token = null;
- if ((cflags & REG_MULTILINE) > 0) {
- String sep = syntax.getLineSeparator();
- if (sep == null) {
- token = new RETokenStart(subIndex, null, true);
- }
- else {
- token = new RETokenStart(subIndex, sep);
- }
- }
- else {
- token = new RETokenStart(subIndex, null);
- }
- addToken(token);
- }
+ // ZERO-OR-ONE REPEAT OPERATOR / STINGY MATCHING OPERATOR
+ // ? | \? depending on RE_BK_PLUS_QM
+ // not available if RE_LIMITED_OPS is set
+ // stingy matching if RE_STINGY_OPS is set and it follows a quantifier
+
+ else if ((unit.ch == '?') && !syntax.get (RESyntax.RE_LIMITED_OPS)
+ && (!syntax.
+ get (RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot)))
+ {
+ if (currentToken == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+
+ // Check for stingy matching on RETokenRepeated
+ if (currentToken instanceof RETokenRepeated)
+ {
+ RETokenRepeated tokenRep = (RETokenRepeated) currentToken;
+ if (syntax.get (RESyntax.RE_STINGY_OPS)
+ && !tokenRep.isStingy () && !tokenRep.isPossessive ())
+ tokenRep.makeStingy ();
+ else
+ throw new
+ REException (getLocalizedMessage ("repeat.chained"),
+ REException.REG_BADRPT, index);
+ }
+ else if (currentToken instanceof RETokenWordBoundary
+ || currentToken instanceof RETokenWordBoundary)
+ throw new REException (getLocalizedMessage ("repeat.assertion"),
+ REException.REG_BADRPT, index);
+ else
+ currentToken = setRepeated (currentToken, 0, 1, index);
+ }
- // END OF LINE OPERATOR
- // $
-
- else if ((unit.ch == '$') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = null;
- RETokenEnd token = null;
- if ((cflags & REG_MULTILINE) > 0) {
- String sep = syntax.getLineSeparator();
- if (sep == null) {
- token = new RETokenEnd(subIndex, null, true);
- }
- else {
- token = new RETokenEnd(subIndex, sep);
- }
- }
- else {
- token = new RETokenEnd(subIndex, null);
- }
- addToken(token);
- }
+ // OCTAL CHARACTER
+ // \0377
+
+ else if (unit.bk && (unit.ch == '0')
+ && syntax.get (RESyntax.RE_OCTAL_CHAR))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 2, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid octal character",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + ce.len;
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, ce.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
- // MATCH-ANY-CHARACTER OPERATOR (except possibly newline and null)
- // .
+ // BACKREFERENCE OPERATOR
+ // \1 \2 ... \9 and \10 \11 \12 ...
+ // not available if RE_NO_BK_REFS is set
+ // Perl recognizes \10, \11, and so on only if enough number of
+ // parentheses have opened before it, otherwise they are treated
+ // as aliases of \010, \011, ... (octal characters). In case of
+ // Sun's JDK, octal character expression must always begin with \0.
+ // We will do as JDK does. But FIXME, take a look at "(a)(b)\29".
+ // JDK treats \2 as a back reference to the 2nd group because
+ // there are only two groups. But in our poor implementation,
+ // we cannot help but treat \29 as a back reference to the 29th group.
+
+ else if (unit.bk && Character.isDigit (unit.ch)
+ && !syntax.get (RESyntax.RE_NO_BK_REFS))
+ {
+ addToken (currentToken);
+ int numBegin = index - 1;
+ int numEnd = pLength;
+ for (int i = index; i < pLength; i++)
+ {
+ if (!Character.isDigit (pattern[i]))
+ {
+ numEnd = i;
+ break;
+ }
+ }
+ int num = parseInt (pattern, numBegin, numEnd - numBegin, 10);
- else if ((unit.ch == '.') && !(unit.bk || quot)) {
- addToken(currentToken);
- currentToken = new RETokenAny(subIndex,syntax.get(RESyntax.RE_DOT_NEWLINE) || ((cflags & REG_DOT_NEWLINE) > 0),syntax.get(RESyntax.RE_DOT_NOT_NULL));
- }
+ currentToken = new RETokenBackRef (subIndex, num, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ index = numEnd;
+ }
- // ZERO-OR-MORE REPEAT OPERATOR
- // *
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*)*", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '*') && !(unit.bk || quot)) {
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenRepeated)
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- currentToken = setRepeated(currentToken,0,Integer.MAX_VALUE,index);
- }
+ // START OF STRING OPERATOR
+ // \A if RE_STRING_ANCHORS is set
- // ONE-OR-MORE REPEAT OPERATOR / POSSESSIVE MATCHING OPERATOR
- // + | \+ depending on RE_BK_PLUS_QM
- // not available if RE_LIMITED_OPS is set
- //
- // This method used to check "repeat.empty.token" to avoid such regexp
- // as "(a*)+", but now "repeat.empty.token" is allowed.
-
- else if ((unit.ch == '+') && !syntax.get(RESyntax.RE_LIMITED_OPS) && (!syntax.get(RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot))) {
- if (currentToken == null)
- throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
-
- // Check for possessive matching on RETokenRepeated
- if (currentToken instanceof RETokenRepeated) {
- RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
- if (syntax.get(RESyntax.RE_POSSESSIVE_OPS) && !tokenRep.isPossessive() && !tokenRep.isStingy())
- tokenRep.makePossessive();
- else
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
-
- }
- else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- else
- currentToken = setRepeated(currentToken,1,Integer.MAX_VALUE,index);
- }
+ else if (unit.bk && (unit.ch == 'A')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenStart (subIndex, null);
+ }
- // ZERO-OR-ONE REPEAT OPERATOR / STINGY MATCHING OPERATOR
- // ? | \? depending on RE_BK_PLUS_QM
- // not available if RE_LIMITED_OPS is set
- // stingy matching if RE_STINGY_OPS is set and it follows a quantifier
-
- else if ((unit.ch == '?') && !syntax.get(RESyntax.RE_LIMITED_OPS) && (!syntax.get(RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot))) {
- if (currentToken == null) throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
-
- // Check for stingy matching on RETokenRepeated
- if (currentToken instanceof RETokenRepeated) {
- RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
- if (syntax.get(RESyntax.RE_STINGY_OPS) && !tokenRep.isStingy() && !tokenRep.isPossessive())
- tokenRep.makeStingy();
- else
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- }
- else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- else
- currentToken = setRepeated(currentToken,0,1,index);
- }
+ // WORD BREAK OPERATOR
+ // \b if ????
+
+ else if (unit.bk && (unit.ch == 'b')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex,
+ RETokenWordBoundary.
+ BEGIN | RETokenWordBoundary.END,
+ false);
+ }
- // OCTAL CHARACTER
- // \0377
-
- else if (unit.bk && (unit.ch == '0') && syntax.get(RESyntax.RE_OCTAL_CHAR)) {
- CharExpression ce = getCharExpression(pattern, index - 2, pLength, syntax);
- if (ce == null)
- throw new REException("invalid octal character", REException.REG_ESCAPE, index);
- index = index - 2 + ce.len;
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,ce.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // WORD BEGIN OPERATOR
+ // \< if ????
+ else if (unit.bk && (unit.ch == '<'))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex, RETokenWordBoundary.BEGIN,
+ false);
+ }
- // BACKREFERENCE OPERATOR
- // \1 \2 ... \9 and \10 \11 \12 ...
- // not available if RE_NO_BK_REFS is set
- // Perl recognizes \10, \11, and so on only if enough number of
- // parentheses have opened before it, otherwise they are treated
- // as aliases of \010, \011, ... (octal characters). In case of
- // Sun's JDK, octal character expression must always begin with \0.
- // We will do as JDK does. But FIXME, take a look at "(a)(b)\29".
- // JDK treats \2 as a back reference to the 2nd group because
- // there are only two groups. But in our poor implementation,
- // we cannot help but treat \29 as a back reference to the 29th group.
-
- else if (unit.bk && Character.isDigit(unit.ch) && !syntax.get(RESyntax.RE_NO_BK_REFS)) {
- addToken(currentToken);
- int numBegin = index - 1;
- int numEnd = pLength;
- for (int i = index; i < pLength; i++) {
- if (! Character.isDigit(pattern[i])) {
- numEnd = i;
- break;
- }
- }
- int num = parseInt(pattern, numBegin, numEnd-numBegin, 10);
+ // WORD END OPERATOR
+ // \> if ????
+ else if (unit.bk && (unit.ch == '>'))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex, RETokenWordBoundary.END,
+ false);
+ }
- currentToken = new RETokenBackRef(subIndex,num,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- index = numEnd;
- }
+ // NON-WORD BREAK OPERATOR
+ // \B if ????
+
+ else if (unit.bk && (unit.ch == 'B')
+ && syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenWordBoundary (subIndex,
+ RETokenWordBoundary.
+ BEGIN | RETokenWordBoundary.END, true);
+ }
- // START OF STRING OPERATOR
- // \A if RE_STRING_ANCHORS is set
-
- else if (unit.bk && (unit.ch == 'A') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenStart(subIndex,null);
- }
- // WORD BREAK OPERATOR
- // \b if ????
-
- else if (unit.bk && (unit.ch == 'b') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN | RETokenWordBoundary.END, false);
- }
-
- // WORD BEGIN OPERATOR
- // \< if ????
- else if (unit.bk && (unit.ch == '<')) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN, false);
- }
-
- // WORD END OPERATOR
- // \> if ????
- else if (unit.bk && (unit.ch == '>')) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.END, false);
- }
-
- // NON-WORD BREAK OPERATOR
- // \B if ????
-
- else if (unit.bk && (unit.ch == 'B') && syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenWordBoundary(subIndex, RETokenWordBoundary.BEGIN | RETokenWordBoundary.END, true);
- }
-
-
- // DIGIT OPERATOR
- // \d if RE_CHAR_CLASS_ESCAPES is set
-
- else if (unit.bk && (unit.ch == 'd') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // DIGIT OPERATOR
+ // \d if RE_CHAR_CLASS_ESCAPES is set
- // NON-DIGIT OPERATOR
- // \D
+ else if (unit.bk && (unit.ch == 'd')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.DIGIT, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
- else if (unit.bk && (unit.ch == 'D') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.DIGIT,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // NON-DIGIT OPERATOR
+ // \D
+
+ else if (unit.bk && (unit.ch == 'D')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.DIGIT, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NEWLINE ESCAPE
- // \n
+ // \n
- else if (unit.bk && (unit.ch == 'n')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\n',false);
- }
+ else if (unit.bk && (unit.ch == 'n'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\n', false);
+ }
// RETURN ESCAPE
- // \r
+ // \r
- else if (unit.bk && (unit.ch == 'r')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\r',false);
- }
+ else if (unit.bk && (unit.ch == 'r'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\r', false);
+ }
// WHITESPACE OPERATOR
- // \s if RE_CHAR_CLASS_ESCAPES is set
-
- else if (unit.bk && (unit.ch == 's') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \s if RE_CHAR_CLASS_ESCAPES is set
+
+ else if (unit.bk && (unit.ch == 's')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.SPACE, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NON-WHITESPACE OPERATOR
- // \S
-
- else if (unit.bk && (unit.ch == 'S') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.SPACE,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \S
+
+ else if (unit.bk && (unit.ch == 'S')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.SPACE, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// TAB ESCAPE
- // \t
+ // \t
- else if (unit.bk && (unit.ch == 't')) {
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,'\t',false);
- }
+ else if (unit.bk && (unit.ch == 't'))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, '\t', false);
+ }
// ALPHANUMERIC OPERATOR
- // \w
-
- else if (unit.bk && (unit.ch == 'w') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,false);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \w
+
+ else if (unit.bk && (unit.ch == 'w')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.ALNUM, insens, false);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NON-ALPHANUMERIC OPERATOR
- // \W
-
- else if (unit.bk && (unit.ch == 'W') && syntax.get(RESyntax.RE_CHAR_CLASS_ESCAPES)) {
- addToken(currentToken);
- currentToken = new RETokenPOSIX(subIndex,RETokenPOSIX.ALNUM,insens,true);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ // \W
+
+ else if (unit.bk && (unit.ch == 'W')
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESCAPES))
+ {
+ addToken (currentToken);
+ currentToken =
+ new RETokenPOSIX (subIndex, RETokenPOSIX.ALNUM, insens, true);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// END OF STRING OPERATOR
- // \Z, \z
+ // \Z, \z
// FIXME: \Z and \z are different in that if the input string
// ends with a line terminator, \Z matches the position before
@@ -1040,77 +1290,106 @@ public class RE extends REToken {
// to be implemented.
else if (unit.bk && (unit.ch == 'Z' || unit.ch == 'z') &&
- syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenEnd(subIndex,null);
- }
-
- // HEX CHARACTER, UNICODE CHARACTER
- // \x1B, \u1234
-
- else if ((unit.bk && (unit.ch == 'x') && syntax.get(RESyntax.RE_HEX_CHAR)) ||
- (unit.bk && (unit.ch == 'u') && syntax.get(RESyntax.RE_UNICODE_CHAR))) {
- CharExpression ce = getCharExpression(pattern, index - 2, pLength, syntax);
- if (ce == null)
- throw new REException("invalid hex character", REException.REG_ESCAPE, index);
- index = index - 2 + ce.len;
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,ce.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenEnd (subIndex, null);
+ }
+
+ // HEX CHARACTER, UNICODE CHARACTER
+ // \x1B, \u1234
+
+ else
+ if ((unit.bk && (unit.ch == 'x')
+ && syntax.get (RESyntax.RE_HEX_CHAR)) || (unit.bk
+ && (unit.ch == 'u')
+ && syntax.
+ get (RESyntax.
+ RE_UNICODE_CHAR)))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 2, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid hex character",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + ce.len;
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, ce.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// NAMED PROPERTY
// \p{prop}, \P{prop}
- else if ((unit.bk && (unit.ch == 'p') && syntax.get(RESyntax.RE_NAMED_PROPERTY)) ||
- (unit.bk && (unit.ch == 'P') && syntax.get(RESyntax.RE_NAMED_PROPERTY))) {
- NamedProperty np = getNamedProperty(pattern, index - 2, pLength);
- if (np == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- index = index - 2 + np.len;
- addToken(currentToken);
- currentToken = getRETokenNamedProperty(subIndex,np,insens,index);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
+ else
+ if ((unit.bk && (unit.ch == 'p')
+ && syntax.get (RESyntax.RE_NAMED_PROPERTY)) || (unit.bk
+ && (unit.ch ==
+ 'P')
+ && syntax.
+ get (RESyntax.
+ RE_NAMED_PROPERTY)))
+ {
+ NamedProperty np = getNamedProperty (pattern, index - 2, pLength);
+ if (np == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ index = index - 2 + np.len;
+ addToken (currentToken);
+ currentToken =
+ getRETokenNamedProperty (subIndex, np, insens, index);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
// END OF PREVIOUS MATCH
- // \G
+ // \G
else if (unit.bk && (unit.ch == 'G') &&
- syntax.get(RESyntax.RE_STRING_ANCHORS)) {
- addToken(currentToken);
- currentToken = new RETokenEndOfPreviousMatch(subIndex);
- }
+ syntax.get (RESyntax.RE_STRING_ANCHORS))
+ {
+ addToken (currentToken);
+ currentToken = new RETokenEndOfPreviousMatch (subIndex);
+ }
// NON-SPECIAL CHARACTER (or escape to make literal)
- // c | \* for example
+ // c | \* for example
- else { // not a special character
- addToken(currentToken);
- currentToken = new RETokenChar(subIndex,unit.ch,insens);
- if (insensUSASCII) currentToken.unicodeAware = false;
- }
- } // end while
+ else
+ { // not a special character
+ addToken (currentToken);
+ currentToken = new RETokenChar (subIndex, unit.ch, insens);
+ if (insensUSASCII)
+ currentToken.unicodeAware = false;
+ }
+ } // end while
// Add final buffered token and an EndSub marker
- addToken(currentToken);
-
- if (branches != null) {
- branches.addElement(new RE(firstToken,lastToken,numSubs,subIndex,minimumLength, maximumLength));
- branches.trimToSize(); // compact the Vector
+ addToken (currentToken);
+
+ if (branches != null)
+ {
+ branches.
+ add (new
+ RE (firstToken, lastToken, numSubs, subIndex, minimumLength,
+ maximumLength));
+ branches.trimToSize (); // compact the Vector
minimumLength = 0;
maximumLength = 0;
firstToken = lastToken = null;
- addToken(new RETokenOneOf(subIndex,branches,false));
- }
- else addToken(new RETokenEndSub(subIndex));
+ addToken (new RETokenOneOf (subIndex, branches, false));
+ }
+ else
+ addToken (new RETokenEndSub (subIndex));
}
- private static class ParseCharClassResult {
- RETokenOneOf token;
- int index;
- boolean returnAtAndOperator = false;
+ private static class ParseCharClassResult
+ {
+ RETokenOneOf token;
+ int index;
+ boolean returnAtAndOperator = false;
}
/**
@@ -1123,223 +1402,315 @@ public class RE extends REToken {
* @param pflags Flags that affect the behavior of this method.
* @param syntax Syntax used to parse the pattern.
*/
- private static ParseCharClassResult parseCharClass(int subIndex,
- char[] pattern, int index,
- int pLength, int cflags, RESyntax syntax, int pflags)
- throws REException {
-
- boolean insens = ((cflags & REG_ICASE) > 0);
- boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
- Vector options = new Vector();
- Vector addition = new Vector();
- boolean additionAndAppeared = false;
- final int RETURN_AT_AND = 0x01;
- boolean returnAtAndOperator = ((pflags & RETURN_AT_AND) != 0);
- boolean negative = false;
- char ch;
-
- char lastChar = 0;
- boolean lastCharIsSet = false;
- if (index == pLength) throw new REException(getLocalizedMessage("unmatched.bracket"),REException.REG_EBRACK,index);
-
- // Check for initial caret, negation
- if ((ch = pattern[index]) == '^') {
- negative = true;
- if (++index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
+ private static ParseCharClassResult parseCharClass (int subIndex,
+ char[]pattern,
+ int index, int pLength,
+ int cflags,
+ RESyntax syntax,
+ int pflags) throws
+ REException
+ {
+
+ boolean insens = ((cflags & REG_ICASE) > 0);
+ boolean insensUSASCII = ((cflags & REG_ICASE_USASCII) > 0);
+ final ArrayList < REToken > options = new ArrayList < REToken > ();
+ ArrayList < Object > addition = new ArrayList < Object > ();
+ boolean additionAndAppeared = false;
+ final int RETURN_AT_AND = 0x01;
+ boolean returnAtAndOperator = ((pflags & RETURN_AT_AND) != 0);
+ boolean negative = false;
+ char ch;
+
+ char lastChar = 0;
+ boolean lastCharIsSet = false;
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("unmatched.bracket"),
+ REException.REG_EBRACK, index);
+
+ // Check for initial caret, negation
+ if ((ch = pattern[index]) == '^')
+ {
+ negative = true;
+ if (++index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
ch = pattern[index];
- }
-
- // Check for leading right bracket literal
- if (ch == ']') {
- lastChar = ch; lastCharIsSet = true;
- if (++index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- }
-
- while ((ch = pattern[index++]) != ']') {
- if ((ch == '-') && (lastCharIsSet)) {
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- if ((ch = pattern[index]) == ']') {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- lastChar = '-';
- } else {
- if ((ch == '\\') && syntax.get(RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS)) {
- CharExpression ce = getCharExpression(pattern, index, pLength, syntax);
- if (ce == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- ch = ce.ch;
- index = index + ce.len - 1;
+ }
+
+ // Check for leading right bracket literal
+ if (ch == ']')
+ {
+ lastChar = ch;
+ lastCharIsSet = true;
+ if (++index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ }
+
+ while ((ch = pattern[index++]) != ']')
+ {
+ if ((ch == '-') && (lastCharIsSet))
+ {
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ if ((ch = pattern[index]) == ']')
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ lastChar = '-';
}
- RETokenRange t = new RETokenRange(subIndex,lastChar,ch,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- lastChar = 0; lastCharIsSet = false;
- index++;
- }
- } else if ((ch == '\\') && syntax.get(RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS)) {
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
+ else
+ {
+ if ((ch == '\\')
+ && syntax.get (RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS))
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ ch = ce.ch;
+ index = index + ce.len - 1;
+ }
+ RETokenRange t =
+ new RETokenRange (subIndex, lastChar, ch, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ lastChar = 0;
+ lastCharIsSet = false;
+ index++;
+ }
+ }
+ else if ((ch == '\\')
+ && syntax.get (RESyntax.RE_BACKSLASH_ESCAPE_IN_LISTS))
+ {
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
int posixID = -1;
boolean negate = false;
- char asciiEsc = 0;
+ char asciiEsc = 0;
boolean asciiEscIsSet = false;
NamedProperty np = null;
- if (("dswDSW".indexOf(pattern[index]) != -1) && syntax.get(RESyntax.RE_CHAR_CLASS_ESC_IN_LISTS)) {
- switch (pattern[index]) {
- case 'D':
- negate = true;
- case 'd':
- posixID = RETokenPOSIX.DIGIT;
- break;
- case 'S':
- negate = true;
- case 's':
- posixID = RETokenPOSIX.SPACE;
- break;
- case 'W':
- negate = true;
- case 'w':
- posixID = RETokenPOSIX.ALNUM;
- break;
+ if (("dswDSW".indexOf (pattern[index]) != -1)
+ && syntax.get (RESyntax.RE_CHAR_CLASS_ESC_IN_LISTS))
+ {
+ switch (pattern[index])
+ {
+ case 'D':
+ negate = true;
+ case 'd':
+ posixID = RETokenPOSIX.DIGIT;
+ break;
+ case 'S':
+ negate = true;
+ case 's':
+ posixID = RETokenPOSIX.SPACE;
+ break;
+ case 'W':
+ negate = true;
+ case 'w':
+ posixID = RETokenPOSIX.ALNUM;
+ break;
+ }
+ }
+ if (("pP".indexOf (pattern[index]) != -1)
+ && syntax.get (RESyntax.RE_NAMED_PROPERTY))
+ {
+ np = getNamedProperty (pattern, index - 1, pLength);
+ if (np == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ index = index - 1 + np.len - 1;
+ }
+ else
+ {
+ CharExpression ce =
+ getCharExpression (pattern, index - 1, pLength, syntax);
+ if (ce == null)
+ throw new REException ("invalid escape sequence",
+ REException.REG_ESCAPE, index);
+ asciiEsc = ce.ch;
+ asciiEscIsSet = true;
+ index = index - 1 + ce.len - 1;
+ }
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+
+ if (posixID != -1)
+ {
+ RETokenPOSIX t =
+ new RETokenPOSIX (subIndex, posixID, insens, negate);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ else if (np != null)
+ {
+ RETokenNamedProperty t =
+ getRETokenNamedProperty (subIndex, np, insens, index);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ else if (asciiEscIsSet)
+ {
+ lastChar = asciiEsc;
+ lastCharIsSet = true;
+ }
+ else
+ {
+ lastChar = pattern[index];
+ lastCharIsSet = true;
}
- }
- if (("pP".indexOf(pattern[index]) != -1) && syntax.get(RESyntax.RE_NAMED_PROPERTY)) {
- np = getNamedProperty(pattern, index - 1, pLength);
- if (np == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- index = index - 1 + np.len - 1;
- }
- else {
- CharExpression ce = getCharExpression(pattern, index - 1, pLength, syntax);
- if (ce == null)
- throw new REException("invalid escape sequence", REException.REG_ESCAPE, index);
- asciiEsc = ce.ch; asciiEscIsSet = true;
- index = index - 1 + ce.len - 1;
- }
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
-
- if (posixID != -1) {
- RETokenPOSIX t = new RETokenPOSIX(subIndex,posixID,insens,negate);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- } else if (np != null) {
- RETokenNamedProperty t = getRETokenNamedProperty(subIndex,np,insens,index);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- } else if (asciiEscIsSet) {
- lastChar = asciiEsc; lastCharIsSet = true;
- } else {
- lastChar = pattern[index]; lastCharIsSet = true;
- }
++index;
- } else if ((ch == '[') && (syntax.get(RESyntax.RE_CHAR_CLASSES)) && (index < pLength) && (pattern[index] == ':')) {
- StringBuffer posixSet = new StringBuffer();
- index = getPosixSet(pattern,index+1,posixSet);
- int posixId = RETokenPOSIX.intValue(posixSet.toString());
- if (posixId != -1) {
- RETokenPOSIX t = new RETokenPOSIX(subIndex,posixId,insens,false);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
- } else if ((ch == '[') && (syntax.get(RESyntax.RE_NESTED_CHARCLASS))) {
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index, pLength, cflags, syntax, 0);
- addition.addElement(result.token);
- addition.addElement("|");
- index = result.index;
- } else if ((ch == '&') &&
- (syntax.get(RESyntax.RE_NESTED_CHARCLASS)) &&
- (index < pLength) && (pattern[index] == '&')) {
- if (returnAtAndOperator) {
- ParseCharClassResult result = new ParseCharClassResult();
- options.trimToSize();
- if (additionAndAppeared) addition.addElement("&");
- if (addition.size() == 0) addition = null;
- result.token = new RETokenOneOf(subIndex,
- options, addition, negative);
- result.index = index - 1;
- result.returnAtAndOperator = true;
- return result;
- }
- // The precedence of the operator "&&" is the lowest.
- // So we postpone adding "&" until other elements
- // are added. And we insert Boolean.FALSE at the
- // beginning of the list of tokens following "&&".
- // So, "&&[a-b][k-m]" will be stored in the Vecter
- // addition in this order:
- // Boolean.FALSE, [a-b], "|", [k-m], "|", "&"
- if (additionAndAppeared) addition.addElement("&");
- addition.addElement(Boolean.FALSE);
- additionAndAppeared = true;
-
- // The part on which "&&" operates may be either
- // (1) explicitly enclosed by []
- // or
- // (2) not enclosed by [] and terminated by the
- // next "&&" or the end of the character list.
- // Let the preceding else if block do the case (1).
- // We must do something in case of (2).
- if ((index + 1 < pLength) && (pattern[index + 1] != '[')) {
- ParseCharClassResult result = parseCharClass(
- subIndex, pattern, index+1, pLength, cflags, syntax,
- RETURN_AT_AND);
- addition.addElement(result.token);
- addition.addElement("|");
- // If the method returned at the next "&&", it is OK.
- // Otherwise we have eaten the mark of the end of this
- // character list "]". In this case we must give back
- // the end mark.
- index = (result.returnAtAndOperator ?
- result.index: result.index - 1);
- }
- } else {
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
- lastChar = ch; lastCharIsSet = true;
}
- if (index == pLength) throw new REException(getLocalizedMessage("class.no.end"),REException.REG_EBRACK,index);
- } // while in list
- // Out of list, index is one past ']'
-
- if (lastCharIsSet) {
- RETokenChar t = new RETokenChar(subIndex,lastChar,insens);
- if (insensUSASCII) t.unicodeAware = false;
- options.addElement(t);
- }
-
- ParseCharClassResult result = new ParseCharClassResult();
- // Create a new RETokenOneOf
- options.trimToSize();
- if (additionAndAppeared) addition.addElement("&");
- if (addition.size() == 0) addition = null;
- result.token = new RETokenOneOf(subIndex,options, addition, negative);
- result.index = index;
- return result;
+ else if ((ch == '[') && (syntax.get (RESyntax.RE_CHAR_CLASSES))
+ && (index < pLength) && (pattern[index] == ':'))
+ {
+ CPStringBuilder posixSet = new CPStringBuilder ();
+ index = getPosixSet (pattern, index + 1, posixSet);
+ int posixId = RETokenPOSIX.intValue (posixSet.toString ());
+ if (posixId != -1)
+ {
+ RETokenPOSIX t =
+ new RETokenPOSIX (subIndex, posixId, insens, false);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ }
+ else if ((ch == '[') && (syntax.get (RESyntax.RE_NESTED_CHARCLASS)))
+ {
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index, pLength, cflags,
+ syntax, 0);
+ addition.add (result.token);
+ addition.add ("|");
+ index = result.index;
+ }
+ else if ((ch == '&') &&
+ (syntax.get (RESyntax.RE_NESTED_CHARCLASS)) &&
+ (index < pLength) && (pattern[index] == '&'))
+ {
+ if (returnAtAndOperator)
+ {
+ ParseCharClassResult result = new ParseCharClassResult ();
+ options.trimToSize ();
+ if (additionAndAppeared)
+ addition.add ("&");
+ if (addition.size () == 0)
+ addition = null;
+ result.token = new RETokenOneOf (subIndex,
+ options, addition, negative);
+ result.index = index - 1;
+ result.returnAtAndOperator = true;
+ return result;
+ }
+ // The precedence of the operator "&&" is the lowest.
+ // So we postpone adding "&" until other elements
+ // are added. And we insert Boolean.FALSE at the
+ // beginning of the list of tokens following "&&".
+ // So, "&&[a-b][k-m]" will be stored in the Vecter
+ // addition in this order:
+ // Boolean.FALSE, [a-b], "|", [k-m], "|", "&"
+ if (additionAndAppeared)
+ addition.add ("&");
+ addition.add (Boolean.FALSE);
+ additionAndAppeared = true;
+
+ // The part on which "&&" operates may be either
+ // (1) explicitly enclosed by []
+ // or
+ // (2) not enclosed by [] and terminated by the
+ // next "&&" or the end of the character list.
+ // Let the preceding else if block do the case (1).
+ // We must do something in case of (2).
+ if ((index + 1 < pLength) && (pattern[index + 1] != '['))
+ {
+ ParseCharClassResult result =
+ parseCharClass (subIndex, pattern, index + 1, pLength,
+ cflags, syntax,
+ RETURN_AT_AND);
+ addition.add (result.token);
+ addition.add ("|");
+ // If the method returned at the next "&&", it is OK.
+ // Otherwise we have eaten the mark of the end of this
+ // character list "]". In this case we must give back
+ // the end mark.
+ index = (result.returnAtAndOperator ?
+ result.index : result.index - 1);
+ }
+ }
+ else
+ {
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+ lastChar = ch;
+ lastCharIsSet = true;
+ }
+ if (index == pLength)
+ throw new REException (getLocalizedMessage ("class.no.end"),
+ REException.REG_EBRACK, index);
+ } // while in list
+ // Out of list, index is one past ']'
+
+ if (lastCharIsSet)
+ {
+ RETokenChar t = new RETokenChar (subIndex, lastChar, insens);
+ if (insensUSASCII)
+ t.unicodeAware = false;
+ options.add (t);
+ }
+
+ ParseCharClassResult result = new ParseCharClassResult ();
+ // Create a new RETokenOneOf
+ options.trimToSize ();
+ if (additionAndAppeared)
+ addition.add ("&");
+ if (addition.size () == 0)
+ addition = null;
+ result.token = new RETokenOneOf (subIndex, options, addition, negative);
+ result.index = index;
+ return result;
}
- private static int getCharUnit(char[] input, int index, CharUnit unit, boolean quot) throws REException {
+ private static int getCharUnit (char[]input, int index, CharUnit unit,
+ boolean quot) throws REException
+ {
unit.ch = input[index++];
unit.bk = (unit.ch == '\\'
&& (!quot || index >= input.length || input[index] == 'E'));
if (unit.bk)
if (index < input.length)
unit.ch = input[index++];
- else throw new REException(getLocalizedMessage("ends.with.backslash"),REException.REG_ESCAPE,index);
+ else
+ throw new REException (getLocalizedMessage ("ends.with.backslash"),
+ REException.REG_ESCAPE, index);
return index;
}
- private static int parseInt(char[] input, int pos, int len, int radix) {
+ private static int parseInt (char[]input, int pos, int len, int radix)
+ {
int ret = 0;
- for (int i = pos; i < pos + len; i++) {
- ret = ret * radix + Character.digit(input[i], radix);
- }
+ for (int i = pos; i < pos + len; i++)
+ {
+ ret = ret * radix + Character.digit (input[i], radix);
+ }
return ret;
}
@@ -1350,88 +1721,109 @@ public class RE extends REToken {
* "\x1b" : Hex char 0x1b
* "\u1234" : Unicode char \u1234
*/
- private static class CharExpression {
+ private static class CharExpression
+ {
/** character represented by this expression */
char ch;
/** String expression */
String expr;
/** length of this expression */
int len;
- public String toString() { return expr; }
+ public String toString ()
+ {
+ return expr;
+ }
}
- private static CharExpression getCharExpression(char[] input, int pos, int lim,
- RESyntax syntax) {
- CharExpression ce = new CharExpression();
+ private static CharExpression getCharExpression (char[]input, int pos,
+ int lim, RESyntax syntax)
+ {
+ CharExpression ce = new CharExpression ();
char c = input[pos];
- if (c == '\\') {
- if (pos + 1 >= lim) return null;
- c = input[pos + 1];
- switch(c) {
- case 't':
- ce.ch = '\t';
- ce.len = 2;
- break;
- case 'n':
- ce.ch = '\n';
- ce.len = 2;
- break;
- case 'r':
- ce.ch = '\r';
- ce.len = 2;
- break;
- case 'x':
- case 'u':
- if ((c == 'x' && syntax.get(RESyntax.RE_HEX_CHAR)) ||
- (c == 'u' && syntax.get(RESyntax.RE_UNICODE_CHAR))) {
- int l = 0;
- int expectedLength = (c == 'x' ? 2 : 4);
- for (int i = pos + 2; i < pos + 2 + expectedLength; i++) {
- if (i >= lim) break;
- if (!((input[i] >= '0' && input[i] <= '9') ||
- (input[i] >= 'A' && input[i] <= 'F') ||
- (input[i] >= 'a' && input[i] <= 'f')))
- break;
- l++;
- }
- if (l != expectedLength) return null;
- ce.ch = (char)(parseInt(input, pos + 2, l, 16));
- ce.len = l + 2;
- }
- else {
- ce.ch = c;
- ce.len = 2;
- }
- break;
- case '0':
- if (syntax.get(RESyntax.RE_OCTAL_CHAR)) {
- int l = 0;
- for (int i = pos + 2; i < pos + 2 + 3; i++) {
- if (i >= lim) break;
- if (input[i] < '0' || input[i] > '7') break;
- l++;
- }
- if (l == 3 && input[pos + 2] > '3') l--;
- if (l <= 0) return null;
- ce.ch = (char)(parseInt(input, pos + 2, l, 8));
- ce.len = l + 2;
- }
- else {
- ce.ch = c;
- ce.len = 2;
- }
- break;
- default:
- ce.ch = c;
- ce.len = 2;
- break;
+ if (c == '\\')
+ {
+ if (pos + 1 >= lim)
+ return null;
+ c = input[pos + 1];
+ switch (c)
+ {
+ case 't':
+ ce.ch = '\t';
+ ce.len = 2;
+ break;
+ case 'n':
+ ce.ch = '\n';
+ ce.len = 2;
+ break;
+ case 'r':
+ ce.ch = '\r';
+ ce.len = 2;
+ break;
+ case 'x':
+ case 'u':
+ if ((c == 'x' && syntax.get (RESyntax.RE_HEX_CHAR)) ||
+ (c == 'u' && syntax.get (RESyntax.RE_UNICODE_CHAR)))
+ {
+ int l = 0;
+ int expectedLength = (c == 'x' ? 2 : 4);
+ for (int i = pos + 2; i < pos + 2 + expectedLength; i++)
+ {
+ if (i >= lim)
+ break;
+ if (!((input[i] >= '0' && input[i] <= '9') ||
+ (input[i] >= 'A' && input[i] <= 'F') ||
+ (input[i] >= 'a' && input[i] <= 'f')))
+ break;
+ l++;
+ }
+ if (l != expectedLength)
+ return null;
+ ce.ch = (char) (parseInt (input, pos + 2, l, 16));
+ ce.len = l + 2;
+ }
+ else
+ {
+ ce.ch = c;
+ ce.len = 2;
+ }
+ break;
+ case '0':
+ if (syntax.get (RESyntax.RE_OCTAL_CHAR))
+ {
+ int l = 0;
+ for (int i = pos + 2; i < pos + 2 + 3; i++)
+ {
+ if (i >= lim)
+ break;
+ if (input[i] < '0' || input[i] > '7')
+ break;
+ l++;
+ }
+ if (l == 3 && input[pos + 2] > '3')
+ l--;
+ if (l <= 0)
+ return null;
+ ce.ch = (char) (parseInt (input, pos + 2, l, 8));
+ ce.len = l + 2;
+ }
+ else
+ {
+ ce.ch = c;
+ ce.len = 2;
+ }
+ break;
+ default:
+ ce.ch = c;
+ ce.len = 2;
+ break;
+ }
}
- }
- else {
- ce.ch = input[pos];
- ce.len = 1;
- }
- ce.expr = new String(input, pos, ce.len);
+ else
+ {
+ ce.ch = input[pos];
+ ce.len = 1;
+ }
+ ce.expr = new String (input, pos, ce.len);
return ce;
}
@@ -1443,7 +1835,8 @@ public class RE extends REToken {
* "\PA" : Property named "A" (Negated)
* "\P{prop}" : Property named "prop" (Negated)
*/
- private static class NamedProperty {
+ private static class NamedProperty
+ {
/** Property name */
String name;
/** Negated or not */
@@ -1452,56 +1845,73 @@ public class RE extends REToken {
int len;
}
- private static NamedProperty getNamedProperty(char[] input, int pos, int lim) {
- NamedProperty np = new NamedProperty();
+ private static NamedProperty getNamedProperty (char[]input, int pos,
+ int lim)
+ {
+ NamedProperty np = new NamedProperty ();
char c = input[pos];
- if (c == '\\') {
- if (++pos >= lim) return null;
- c = input[pos++];
- switch(c) {
- case 'p':
- np.negate = false;
- break;
- case 'P':
- np.negate = true;
- break;
- default:
- return null;
- }
- c = input[pos++];
- if (c == '{') {
- int p = -1;
- for (int i = pos; i < lim; i++) {
- if (input[i] == '}') {
- p = i;
- break;
+ if (c == '\\')
+ {
+ if (++pos >= lim)
+ return null;
+ c = input[pos++];
+ switch (c)
+ {
+ case 'p':
+ np.negate = false;
+ break;
+ case 'P':
+ np.negate = true;
+ break;
+ default:
+ return null;
+ }
+ c = input[pos++];
+ if (c == '{')
+ {
+ int p = -1;
+ for (int i = pos; i < lim; i++)
+ {
+ if (input[i] == '}')
+ {
+ p = i;
+ break;
+ }
}
+ if (p < 0)
+ return null;
+ int len = p - pos;
+ np.name = new String (input, pos, len);
+ np.len = len + 4;
}
- if (p < 0) return null;
- int len = p - pos;
- np.name = new String(input, pos, len);
- np.len = len + 4;
- }
- else {
- np.name = new String(input, pos - 1, 1);
- np.len = 3;
+ else
+ {
+ np.name = new String (input, pos - 1, 1);
+ np.len = 3;
+ }
+ return np;
}
- return np;
- }
- else return null;
+ else
+ return null;
}
- private static RETokenNamedProperty getRETokenNamedProperty(
- int subIndex, NamedProperty np, boolean insens, int index)
- throws REException {
- try {
- return new RETokenNamedProperty(subIndex, np.name, insens, np.negate);
+ private static RETokenNamedProperty getRETokenNamedProperty (int subIndex,
+ NamedProperty
+ np,
+ boolean insens,
+ int index)
+ throws REException
+ {
+ try
+ {
+ return new RETokenNamedProperty (subIndex, np.name, insens, np.negate);
}
- catch (REException e) {
- REException ree;
- ree = new REException(e.getMessage(), REException.REG_ESCAPE, index);
- ree.initCause(e);
- throw ree;
+ catch (REException e)
+ {
+ REException ree;
+ ree = new REException (e.getMessage (), REException.REG_ESCAPE, index);
+ ree.initCause (e);
+ throw ree;
}
}
@@ -1510,10 +1920,11 @@ public class RE extends REToken {
*
* @param input The input text.
*/
- public boolean isMatch(Object input) {
- return isMatch(input,0,0);
+ public boolean isMatch (Object input)
+ {
+ return isMatch (input, 0, 0);
}
-
+
/**
* Checks if the input string, starting from index, is an exact match of
* this regular expression.
@@ -1521,10 +1932,11 @@ public class RE extends REToken {
* @param input The input text.
* @param index The offset index at which the search should be begin.
*/
- public boolean isMatch(Object input,int index) {
- return isMatch(input,index,0);
+ public boolean isMatch (Object input, int index)
+ {
+ return isMatch (input, index, 0);
}
-
+
/**
* Checks if the input, starting from index and using the specified
@@ -1534,45 +1946,56 @@ public class RE extends REToken {
* @param index The offset index at which the search should be begin.
* @param eflags The logical OR of any execution flags above.
*/
- public boolean isMatch(Object input,int index,int eflags) {
- return isMatchImpl(makeCharIndexed(input,index),index,eflags);
+ public boolean isMatch (Object input, int index, int eflags)
+ {
+ return isMatchImpl (makeCharIndexed (input, index), index, eflags);
}
- private boolean isMatchImpl(CharIndexed input, int index, int eflags) {
- if (firstToken == null) // Trivial case
- return (input.charAt(0) == CharIndexed.OUT_OF_BOUNDS);
- REMatch m = new REMatch(numSubs, index, eflags);
- if (firstToken.match(input, m)) {
- if (m != null) {
- if (input.charAt(m.index) == CharIndexed.OUT_OF_BOUNDS) {
+ private boolean isMatchImpl (CharIndexed input, int index, int eflags)
+ {
+ if (firstToken == null) // Trivial case
+ return (input.charAt (0) == CharIndexed.OUT_OF_BOUNDS);
+ REMatch m = new REMatch (numSubs, index, eflags);
+ if (firstToken.match (input, m))
+ {
+ if (m != null)
+ {
+ if (input.charAt (m.index) == CharIndexed.OUT_OF_BOUNDS)
+ {
return true;
- }
- }
- }
+ }
+ }
+ }
return false;
}
-
+
/**
* Returns the maximum number of subexpressions in this regular expression.
* If the expression contains branches, the value returned will be the
* maximum subexpressions in any of the branches.
*/
- public int getNumSubs() {
+ public int getNumSubs ()
+ {
return numSubs;
}
// Overrides REToken.setUncle
- void setUncle(REToken uncle) {
- if (lastToken != null) {
- lastToken.setUncle(uncle);
- } else super.setUncle(uncle); // to deal with empty subexpressions
+ void setUncle (REToken uncle)
+ {
+ if (lastToken != null)
+ {
+ lastToken.setUncle (uncle);
+ }
+ else
+ super.setUncle (uncle); // to deal with empty subexpressions
}
// Overrides REToken.chain
- boolean chain(REToken next) {
- super.chain(next);
- setUncle(next);
+ boolean chain (REToken next)
+ {
+ super.chain (next);
+ setUncle (next);
return true;
}
@@ -1580,12 +2003,14 @@ public class RE extends REToken {
* Returns the minimum number of characters that could possibly
* constitute a match of this regular expression.
*/
- public int getMinimumLength() {
- return minimumLength;
+ public int getMinimumLength ()
+ {
+ return minimumLength;
}
- public int getMaximumLength() {
- return maximumLength;
+ public int getMaximumLength ()
+ {
+ return maximumLength;
}
/**
@@ -1597,8 +2022,9 @@ public class RE extends REToken {
* @param input The input text.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input) {
- return getAllMatches(input,0,0);
+ public REMatch[] getAllMatches (Object input)
+ {
+ return getAllMatches (input, 0, 0);
}
/**
@@ -1612,8 +2038,9 @@ public class RE extends REToken {
* @param index The offset index at which the search should be begin.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input, int index) {
- return getAllMatches(input,index,0);
+ public REMatch[] getAllMatches (Object input, int index)
+ {
+ return getAllMatches (input, index, 0);
}
/**
@@ -1629,52 +2056,62 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @return a non-null (but possibly zero-length) array of matches
*/
- public REMatch[] getAllMatches(Object input, int index, int eflags) {
- return getAllMatchesImpl(makeCharIndexed(input,index),index,eflags);
+ public REMatch[] getAllMatches (Object input, int index, int eflags)
+ {
+ return getAllMatchesImpl (makeCharIndexed (input, index), index, eflags);
}
// this has been changed since 1.03 to be non-overlapping matches
- private REMatch[] getAllMatchesImpl(CharIndexed input, int index, int eflags) {
- Vector all = new Vector();
+ private REMatch[] getAllMatchesImpl (CharIndexed input, int index,
+ int eflags)
+ {
+ List < REMatch > all = new ArrayList < REMatch > ();
REMatch m = null;
- while ((m = getMatchImpl(input,index,eflags,null)) != null) {
- all.addElement(m);
- index = m.getEndIndex();
- if (m.end[0] == 0) { // handle pathological case of zero-length match
- index++;
- input.move(1);
- } else {
- input.move(m.end[0]);
+ while ((m = getMatchImpl (input, index, eflags, null)) != null)
+ {
+ all.add (m);
+ index = m.getEndIndex ();
+ if (m.end[0] == 0)
+ { // handle pathological case of zero-length match
+ index++;
+ input.move (1);
+ }
+ else
+ {
+ input.move (m.end[0]);
+ }
+ if (!input.isValid ())
+ break;
}
- if (!input.isValid()) break;
- }
- REMatch[] mset = new REMatch[all.size()];
- all.copyInto(mset);
- return mset;
+ return all.toArray (new REMatch[all.size ()]);
}
-
- /* Implements abstract method REToken.match() */
- boolean match(CharIndexed input, REMatch mymatch) {
- input.setHitEnd(mymatch);
- if (firstToken == null) {
- return next(input, mymatch);
- }
-
- // Note the start of this subexpression
- mymatch.start1[subIndex] = mymatch.index;
-
- return firstToken.match(input, mymatch);
- }
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
- boolean b = match(input, mymatch);
- if (b) {
- return mymatch;
- }
- return null;
- }
+ /* Implements abstract method REToken.match() */
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ input.setHitEnd (mymatch);
+ if (firstToken == null)
+ {
+ return next (input, mymatch);
+ }
+
+ // Note the start of this subexpression
+ mymatch.start1[subIndex] = mymatch.index;
+
+ return firstToken.match (input, mymatch);
+ }
+
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+ boolean b = match (input, mymatch);
+ if (b)
+ {
+ return mymatch;
+ }
+ return null;
+ }
/**
* Returns the first match found in the input. If no match is found,
@@ -1683,10 +2120,11 @@ public class RE extends REToken {
* @param input The input text.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input) {
- return getMatch(input,0,0);
+ public REMatch getMatch (Object input)
+ {
+ return getMatch (input, 0, 0);
}
-
+
/**
* Returns the first match found in the input, beginning
* the search at the specified index. If no match is found,
@@ -1696,10 +2134,11 @@ public class RE extends REToken {
* @param index The offset within the text to begin looking for a match.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input, int index) {
- return getMatch(input,index,0);
+ public REMatch getMatch (Object input, int index)
+ {
+ return getMatch (input, index, 0);
}
-
+
/**
* Returns the first match found in the input, beginning
* the search at the specified index, and using the specified
@@ -1710,8 +2149,9 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @return An REMatch instance referencing the match, or null if none.
*/
- public REMatch getMatch(Object input, int index, int eflags) {
- return getMatch(input,index,eflags,null);
+ public REMatch getMatch (Object input, int index, int eflags)
+ {
+ return getMatch (input, index, eflags, null);
}
/**
@@ -1727,70 +2167,82 @@ public class RE extends REToken {
* @param eflags The logical OR of any execution flags above.
* @param buffer The StringBuffer to save pre-match text in.
* @return An REMatch instance referencing the match, or null if none. */
- public REMatch getMatch(Object input, int index, int eflags, StringBuffer buffer) {
- return getMatchImpl(makeCharIndexed(input,index),index,eflags,buffer);
+ public REMatch getMatch (Object input, int index, int eflags,
+ CPStringBuilder buffer)
+ {
+ return getMatchImpl (makeCharIndexed (input, index), index, eflags,
+ buffer);
}
- REMatch getMatchImpl(CharIndexed input, int anchor, int eflags, StringBuffer buffer) {
- boolean tryEntireMatch = ((eflags & REG_TRY_ENTIRE_MATCH) != 0);
- boolean doMove = ((eflags & REG_FIX_STARTING_POSITION) == 0);
- RE re = (tryEntireMatch ? (RE) this.clone() : this);
- if (tryEntireMatch) {
- RETokenEnd reEnd = new RETokenEnd(0, null);
- reEnd.setFake(true);
- re.chain(reEnd);
+ REMatch getMatchImpl (CharIndexed input, int anchor, int eflags,
+ CPStringBuilder buffer)
+ {
+ boolean tryEntireMatch = ((eflags & REG_TRY_ENTIRE_MATCH) != 0);
+ boolean doMove = ((eflags & REG_FIX_STARTING_POSITION) == 0);
+ RE re = (tryEntireMatch ? (RE) this.clone () : this);
+ if (tryEntireMatch)
+ {
+ RETokenEnd reEnd = new RETokenEnd (0, null);
+ reEnd.setFake (true);
+ re.chain (reEnd);
}
- // Create a new REMatch to hold results
- REMatch mymatch = new REMatch(numSubs, anchor, eflags);
- do {
- /* The following potimization is commented out because
- the matching should be tried even if the length of
- input is obviously too short in order that
- java.util.regex.Matcher#hitEnd() may work correctly.
- // Optimization: check if anchor + minimumLength > length
- if (minimumLength == 0 || input.charAt(minimumLength-1) != CharIndexed.OUT_OF_BOUNDS) {
- */
- if (re.match(input, mymatch)) {
- REMatch best = mymatch;
- // We assume that the match that coms first is the best.
- // And the following "The longer, the better" rule has
- // been commented out. The longest is not neccesarily
- // the best. For example, "a" out of "aaa" is the best
- // match for /a+?/.
- /*
- // Find best match of them all to observe leftmost longest
- while ((mymatch = mymatch.next) != null) {
- if (mymatch.index > best.index) {
- best = mymatch;
- }
- }
- */
- best.end[0] = best.index;
- best.finish(input);
- input.setLastMatch(best);
- return best;
- }
- /* End of the optimization commented out
- }
- */
- mymatch.clear(++anchor);
- // Append character to buffer if needed
- if (buffer != null && input.charAt(0) != CharIndexed.OUT_OF_BOUNDS) {
- buffer.append(input.charAt(0));
+ // Create a new REMatch to hold results
+ REMatch mymatch = new REMatch (numSubs, anchor, eflags);
+ do
+ {
+ /* The following potimization is commented out because
+ the matching should be tried even if the length of
+ input is obviously too short in order that
+ java.util.regex.Matcher#hitEnd() may work correctly.
+ // Optimization: check if anchor + minimumLength > length
+ if (minimumLength == 0 || input.charAt(minimumLength-1) != CharIndexed.OUT_OF_BOUNDS) {
+ */
+ if (re.match (input, mymatch))
+ {
+ REMatch best = mymatch;
+ // We assume that the match that coms first is the best.
+ // And the following "The longer, the better" rule has
+ // been commented out. The longest is not neccesarily
+ // the best. For example, "a" out of "aaa" is the best
+ // match for /a+?/.
+ /*
+ // Find best match of them all to observe leftmost longest
+ while ((mymatch = mymatch.next) != null) {
+ if (mymatch.index > best.index) {
+ best = mymatch;
+ }
+ }
+ */
+ best.end[0] = best.index;
+ best.finish (input);
+ input.setLastMatch (best);
+ return best;
}
- // java.util.regex.Matcher#hitEnd() requires that the search should
- // be tried at the end of input, so we use move1(1) instead of move(1)
- } while (doMove && input.move1(1));
-
- // Special handling at end of input for e.g. "$"
- if (minimumLength == 0) {
- if (match(input, mymatch)) {
- mymatch.finish(input);
- return mymatch;
+ /* End of the optimization commented out
+ }
+ */
+ mymatch.clear (++anchor);
+ // Append character to buffer if needed
+ if (buffer != null && input.charAt (0) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ buffer.append (input.charAt (0));
+ }
+ // java.util.regex.Matcher#hitEnd() requires that the search should
+ // be tried at the end of input, so we use move1(1) instead of move(1)
+ }
+ while (doMove && input.move1 (1));
+
+ // Special handling at end of input for e.g. "$"
+ if (minimumLength == 0)
+ {
+ if (match (input, mymatch))
+ {
+ mymatch.finish (input);
+ return mymatch;
}
}
- return null;
+ return null;
}
/**
@@ -1800,8 +2252,9 @@ public class RE extends REToken {
* @param input The input text.
* @return A non-null REMatchEnumeration instance.
*/
- public REMatchEnumeration getMatchEnumeration(Object input) {
- return getMatchEnumeration(input,0,0);
+ public REMatchEnumeration getMatchEnumeration (Object input)
+ {
+ return getMatchEnumeration (input, 0, 0);
}
@@ -1814,8 +2267,9 @@ public class RE extends REToken {
* @return A non-null REMatchEnumeration instance, with its input cursor
* set to the index position specified.
*/
- public REMatchEnumeration getMatchEnumeration(Object input, int index) {
- return getMatchEnumeration(input,index,0);
+ public REMatchEnumeration getMatchEnumeration (Object input, int index)
+ {
+ return getMatchEnumeration (input, index, 0);
}
/**
@@ -1828,8 +2282,11 @@ public class RE extends REToken {
* @return A non-null REMatchEnumeration instance, with its input cursor
* set to the index position specified.
*/
- public REMatchEnumeration getMatchEnumeration(Object input, int index, int eflags) {
- return new REMatchEnumeration(this,makeCharIndexed(input,index),index,eflags);
+ public REMatchEnumeration getMatchEnumeration (Object input, int index,
+ int eflags)
+ {
+ return new REMatchEnumeration (this, makeCharIndexed (input, index),
+ index, eflags);
}
@@ -1841,8 +2298,9 @@ public class RE extends REToken {
* @return A String interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace) {
- return substitute(input,replace,0,0);
+ public String substitute (Object input, String replace)
+ {
+ return substitute (input, replace, 0, 0);
}
/**
@@ -1858,8 +2316,9 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace,int index) {
- return substitute(input,replace,index,0);
+ public String substitute (Object input, String replace, int index)
+ {
+ return substitute (input, replace, index, 0);
}
/**
@@ -1875,23 +2334,32 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substitute(Object input,String replace,int index,int eflags) {
- return substituteImpl(makeCharIndexed(input,index),replace,index,eflags);
+ public String substitute (Object input, String replace, int index,
+ int eflags)
+ {
+ return substituteImpl (makeCharIndexed (input, index), replace, index,
+ eflags);
}
- private String substituteImpl(CharIndexed input,String replace,int index,int eflags) {
- StringBuffer buffer = new StringBuffer();
- REMatch m = getMatchImpl(input,index,eflags,buffer);
- if (m==null) return buffer.toString();
- buffer.append(getReplacement(replace, m, eflags));
- if (input.move(m.end[0])) {
- do {
- buffer.append(input.charAt(0));
- } while (input.move(1));
- }
- return buffer.toString();
+ private String substituteImpl (CharIndexed input, String replace, int index,
+ int eflags)
+ {
+ CPStringBuilder buffer = new CPStringBuilder ();
+ REMatch m = getMatchImpl (input, index, eflags, buffer);
+ if (m == null)
+ return buffer.toString ();
+ buffer.append (getReplacement (replace, m, eflags));
+ if (input.move (m.end[0]))
+ {
+ do
+ {
+ buffer.append (input.charAt (0));
+ }
+ while (input.move (1));
+ }
+ return buffer.toString ();
}
-
+
/**
* Substitutes the replacement text for each non-overlapping match found
* in the input text.
@@ -1901,8 +2369,9 @@ public class RE extends REToken {
* @return A String interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace) {
- return substituteAll(input,replace,0,0);
+ public String substituteAll (Object input, String replace)
+ {
+ return substituteAll (input, replace, 0, 0);
}
/**
@@ -1919,10 +2388,11 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace,int index) {
- return substituteAll(input,replace,index,0);
+ public String substituteAll (Object input, String replace, int index)
+ {
+ return substituteAll (input, replace, index, 0);
}
-
+
/**
* Substitutes the replacement text for each non-overlapping match found
* in the input text, starting at the specified index and using the
@@ -1936,218 +2406,270 @@ public class RE extends REToken {
* at the index position, and interpolating the substituted text.
* @see REMatch#substituteInto
*/
- public String substituteAll(Object input,String replace,int index,int eflags) {
- return substituteAllImpl(makeCharIndexed(input,index),replace,index,eflags);
+ public String substituteAll (Object input, String replace, int index,
+ int eflags)
+ {
+ return substituteAllImpl (makeCharIndexed (input, index), replace, index,
+ eflags);
}
- private String substituteAllImpl(CharIndexed input,String replace,int index,int eflags) {
- StringBuffer buffer = new StringBuffer();
+ private String substituteAllImpl (CharIndexed input, String replace,
+ int index, int eflags)
+ {
+ CPStringBuilder buffer = new CPStringBuilder ();
REMatch m;
- while ((m = getMatchImpl(input,index,eflags,buffer)) != null) {
- buffer.append(getReplacement(replace, m, eflags));
- index = m.getEndIndex();
- if (m.end[0] == 0) {
- char ch = input.charAt(0);
- if (ch != CharIndexed.OUT_OF_BOUNDS)
- buffer.append(ch);
- input.move(1);
- } else {
- input.move(m.end[0]);
- }
+ while ((m = getMatchImpl (input, index, eflags, buffer)) != null)
+ {
+ buffer.append (getReplacement (replace, m, eflags));
+ index = m.getEndIndex ();
+ if (m.end[0] == 0)
+ {
+ char ch = input.charAt (0);
+ if (ch != CharIndexed.OUT_OF_BOUNDS)
+ buffer.append (ch);
+ input.move (1);
+ }
+ else
+ {
+ input.move (m.end[0]);
+ }
- if (!input.isValid()) break;
- }
- return buffer.toString();
+ if (!input.isValid ())
+ break;
+ }
+ return buffer.toString ();
}
- public static String getReplacement(String replace, REMatch m, int eflags) {
+ public static String getReplacement (String replace, REMatch m, int eflags)
+ {
if ((eflags & REG_NO_INTERPOLATE) > 0)
return replace;
- else {
- if ((eflags & REG_REPLACE_USE_BACKSLASHESCAPE) > 0) {
- StringBuffer sb = new StringBuffer();
- int l = replace.length();
- for (int i = 0; i < l; i++) {
- char c = replace.charAt(i);
- switch(c) {
- case '\\':
- i++;
- // Let StringIndexOutOfBoundsException be thrown.
- sb.append(replace.charAt(i));
- break;
- case '$':
- int i1 = i + 1;
- while (i1 < replace.length() &&
- Character.isDigit(replace.charAt(i1))) i1++;
- sb.append(m.substituteInto(replace.substring(i, i1)));
- i = i1 - 1;
- break;
- default:
- sb.append(c);
- }
- }
- return sb.toString();
+ else
+ {
+ if ((eflags & REG_REPLACE_USE_BACKSLASHESCAPE) > 0)
+ {
+ CPStringBuilder sb = new CPStringBuilder ();
+ int l = replace.length ();
+ for (int i = 0; i < l; i++)
+ {
+ char c = replace.charAt (i);
+ switch (c)
+ {
+ case '\\':
+ i++;
+ // Let StringIndexOutOfBoundsException be thrown.
+ sb.append (replace.charAt (i));
+ break;
+ case '$':
+ int i1 = i + 1;
+ while (i1 < replace.length () &&
+ Character.isDigit (replace.charAt (i1)))
+ i1++;
+ sb.append (m.substituteInto (replace.substring (i, i1)));
+ i = i1 - 1;
+ break;
+ default:
+ sb.append (c);
+ }
+ }
+ return sb.toString ();
+ }
+ else
+ return m.substituteInto (replace);
}
- else
- return m.substituteInto(replace);
- }
- }
-
+ }
+
/* Helper function for constructor */
- private void addToken(REToken next) {
- if (next == null) return;
- minimumLength += next.getMinimumLength();
- int nmax = next.getMaximumLength();
+ private void addToken (REToken next)
+ {
+ if (next == null)
+ return;
+ minimumLength += next.getMinimumLength ();
+ int nmax = next.getMaximumLength ();
if (nmax < Integer.MAX_VALUE && maximumLength < Integer.MAX_VALUE)
- maximumLength += nmax;
- else
- maximumLength = Integer.MAX_VALUE;
+ maximumLength += nmax;
+ else
+ maximumLength = Integer.MAX_VALUE;
- if (firstToken == null) {
+ if (firstToken == null)
+ {
lastToken = firstToken = next;
- } else {
- // if chain returns false, it "rejected" the token due to
- // an optimization, and next was combined with lastToken
- if (lastToken.chain(next)) {
- lastToken = next;
}
- }
+ else
+ {
+ // if chain returns false, it "rejected" the token due to
+ // an optimization, and next was combined with lastToken
+ if (lastToken.chain (next))
+ {
+ lastToken = next;
+ }
+ }
}
- private static REToken setRepeated(REToken current, int min, int max, int index) throws REException {
- if (current == null) throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
- return new RETokenRepeated(current.subIndex,current,min,max);
+ private static REToken setRepeated (REToken current, int min, int max,
+ int index) throws REException
+ {
+ if (current == null)
+ throw new REException (getLocalizedMessage ("repeat.no.token"),
+ REException.REG_BADRPT, index);
+ return new RETokenRepeated (current.subIndex, current, min, max);
}
- private static int getPosixSet(char[] pattern,int index,StringBuffer buf) {
+ private static int getPosixSet (char[]pattern, int index,
+ CPStringBuilder buf)
+ {
// Precondition: pattern[index-1] == ':'
// we will return pos of closing ']'.
int i;
- for (i=index; i<(pattern.length-1); i++) {
- if ((pattern[i] == ':') && (pattern[i+1] == ']'))
- return i+2;
- buf.append(pattern[i]);
- }
- return index; // didn't match up
+ for (i = index; i < (pattern.length - 1); i++)
+ {
+ if ((pattern[i] == ':') && (pattern[i + 1] == ']'))
+ return i + 2;
+ buf.append (pattern[i]);
+ }
+ return index; // didn't match up
}
- private int getMinMax(char[] input,int index,IntPair minMax,RESyntax syntax) throws REException {
+ private int getMinMax (char[]input, int index, IntPair minMax,
+ RESyntax syntax) throws REException
+ {
// Precondition: input[index-1] == '{', minMax != null
- boolean mustMatch = !syntax.get(RESyntax.RE_NO_BK_BRACES);
+ boolean mustMatch = !syntax.get (RESyntax.RE_NO_BK_BRACES);
int startIndex = index;
- if (index == input.length) {
- if (mustMatch)
- throw new REException(getLocalizedMessage("unmatched.brace"),REException.REG_EBRACE,index);
- else
- return startIndex;
- }
-
- int min,max=0;
- CharUnit unit = new CharUnit();
- StringBuffer buf = new StringBuffer();
-
+ if (index == input.length)
+ {
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("unmatched.brace"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ }
+
+ int min, max = 0;
+ CharUnit unit = new CharUnit ();
+ CPStringBuilder buf = new CPStringBuilder ();
+
// Read string of digits
- do {
- index = getCharUnit(input,index,unit,false);
- if (Character.isDigit(unit.ch))
- buf.append(unit.ch);
- } while ((index != input.length) && Character.isDigit(unit.ch));
+ do
+ {
+ index = getCharUnit (input, index, unit, false);
+ if (Character.isDigit (unit.ch))
+ buf.append (unit.ch);
+ }
+ while ((index != input.length) && Character.isDigit (unit.ch));
// Check for {} tomfoolery
- if (buf.length() == 0) {
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
- else
- return startIndex;
- }
+ if (buf.length () == 0)
+ {
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ }
- min = Integer.parseInt(buf.toString());
-
- if ((unit.ch == '}') && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ unit.bk))
+ min = Integer.parseInt (buf.toString ());
+
+ if ((unit.ch == '}') && (syntax.get (RESyntax.RE_NO_BK_BRACES) ^ unit.bk))
max = min;
else if (index == input.length)
if (mustMatch)
- throw new REException(getLocalizedMessage("interval.no.end"),REException.REG_EBRACE,index);
- else
- return startIndex;
- else if ((unit.ch == ',') && !unit.bk) {
- buf = new StringBuffer();
+ throw new REException (getLocalizedMessage ("interval.no.end"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
+ else
+ if ((unit.ch == ',') && !unit.bk)
+ {
+ buf = new CPStringBuilder ();
// Read string of digits
- while (((index = getCharUnit(input,index,unit,false)) != input.length) && Character.isDigit(unit.ch))
- buf.append(unit.ch);
-
- if (!((unit.ch == '}') && (syntax.get(RESyntax.RE_NO_BK_BRACES) ^ unit.bk)))
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
- else
- return startIndex;
+ while (((index =
+ getCharUnit (input, index, unit, false)) != input.length)
+ && Character.isDigit (unit.ch))
+ buf.append (unit.ch);
+
+ if (!
+ ((unit.ch == '}')
+ && (syntax.get (RESyntax.RE_NO_BK_BRACES) ^ unit.bk)))
+ if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
// This is the case of {x,}
- if (buf.length() == 0) max = Integer.MAX_VALUE;
- else max = Integer.parseInt(buf.toString());
- } else
- if (mustMatch)
- throw new REException(getLocalizedMessage("interval.error"),REException.REG_EBRACE,index);
+ if (buf.length () == 0)
+ max = Integer.MAX_VALUE;
else
- return startIndex;
+ max = Integer.parseInt (buf.toString ());
+ }
+ else if (mustMatch)
+ throw new REException (getLocalizedMessage ("interval.error"),
+ REException.REG_EBRACE, index);
+ else
+ return startIndex;
- // We know min and max now, and they are valid.
+ // We know min and max now, and they are valid.
- minMax.first = min;
- minMax.second = max;
+ minMax.first = min;
+ minMax.second = max;
- // return the index following the '}'
- return index;
+ // return the index following the '}'
+ return index;
}
/**
* Return a human readable form of the compiled regular expression,
* useful for debugging.
*/
- public String toString() {
- StringBuffer sb = new StringBuffer();
- dump(sb);
- return sb.toString();
- }
-
- void dump(StringBuffer os) {
- os.append("(?#startRE subIndex=" + subIndex + ")");
+ public String toString ()
+ {
+ CPStringBuilder sb = new CPStringBuilder ();
+ dump (sb);
+ return sb.toString ();
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?#startRE subIndex=" + subIndex + ")");
if (subIndex == 0)
- os.append("?:");
+ os.append ("?:");
if (firstToken != null)
- firstToken.dumpAll(os);
+ firstToken.dumpAll (os);
if (subIndex == 0)
- os.append(")");
- os.append("(?#endRE subIndex=" + subIndex + ")");
+ os.append (")");
+ os.append ("(?#endRE subIndex=" + subIndex + ")");
}
// Cast input appropriately or throw exception
// This method was originally a private method, but has been made
// public because java.util.regex.Matcher uses this.
- public static CharIndexed makeCharIndexed(Object input, int index) {
- // The case where input is already a CharIndexed is supposed
- // be the most likely because this is the case with
- // java.util.regex.Matcher.
- // We could let a String or a CharSequence fall through
- // to final input, but since it'a very likely input type,
- // we check it first.
- if (input instanceof CharIndexed) {
+ public static CharIndexed makeCharIndexed (Object input, int index)
+ {
+ // The case where input is already a CharIndexed is supposed
+ // be the most likely because this is the case with
+ // java.util.regex.Matcher.
+ // We could let a String or a CharSequence fall through
+ // to final input, but since it'a very likely input type,
+ // we check it first.
+ if (input instanceof CharIndexed)
+ {
CharIndexed ci = (CharIndexed) input;
- ci.setAnchor(index);
+ ci.setAnchor (index);
return ci;
- }
+ }
else if (input instanceof CharSequence)
- return new CharIndexedCharSequence((CharSequence) input,index);
+ return new CharIndexedCharSequence ((CharSequence) input, index);
else if (input instanceof String)
- return new CharIndexedString((String) input,index);
+ return new CharIndexedString ((String) input, index);
else if (input instanceof char[])
- return new CharIndexedCharArray((char[]) input,index);
+ return new CharIndexedCharArray ((char[]) input, index);
else if (input instanceof StringBuffer)
- return new CharIndexedStringBuffer((StringBuffer) input,index);
+ return new CharIndexedStringBuffer ((StringBuffer) input, index);
else if (input instanceof InputStream)
- return new CharIndexedInputStream((InputStream) input,index);
- else
- return new CharIndexedString(input.toString(), index);
+ return new CharIndexedInputStream ((InputStream) input, index);
+ else
+ return new CharIndexedString (input.toString (), index);
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REException.java b/libjava/classpath/gnu/java/util/regex/REException.java
index 7a277ca3ae3..5681ceeea6a 100644
--- a/libjava/classpath/gnu/java/util/regex/REException.java
+++ b/libjava/classpath/gnu/java/util/regex/REException.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
import java.text.MessageFormat;
/**
@@ -53,7 +55,8 @@ import java.text.MessageFormat;
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public class REException extends Exception {
+public class REException extends Exception
+{
private int type;
private int pos;
@@ -64,25 +67,25 @@ public class REException extends Exception {
* Invalid use of repetition operators such as using
* `*' as the first character.
*/
- public static final int REG_BADRPT = 1;
+ public static final int REG_BADRPT = 1;
/**
* Error flag.
* Invalid use of back reference operator.
*/
- public static final int REG_BADBR = 2;
+ public static final int REG_BADBR = 2;
/**
* Error flag.
* Un-matched brace interval operators.
*/
- public static final int REG_EBRACE = 3;
+ public static final int REG_EBRACE = 3;
/**
* Error flag.
* Un-matched bracket list operators.
*/
- public static final int REG_EBRACK = 4;
+ public static final int REG_EBRACK = 4;
/**
* Error flag.
@@ -90,65 +93,67 @@ public class REException extends Exception {
* point of the range occurs prior to the starting
* point.
*/
- public static final int REG_ERANGE = 5;
+ public static final int REG_ERANGE = 5;
/**
* Error flag.
* Unknown character class name. <B>Not implemented</B>.
*/
- public static final int REG_ECTYPE = 6;
+ public static final int REG_ECTYPE = 6;
/**
* Error flag.
* Un-matched parenthesis group operators.
*/
- public static final int REG_EPAREN = 7;
+ public static final int REG_EPAREN = 7;
/**
* Error flag.
* Invalid back reference to a subexpression.
*/
- public static final int REG_ESUBREG = 8;
+ public static final int REG_ESUBREG = 8;
/**
* Error flag.
* Non specific error. <B>Not implemented</B>.
*/
- public static final int REG_EEND = 9;
+ public static final int REG_EEND = 9;
/**
* Error flag.
* Invalid escape sequence. <B>Not implemented</B>.
*/
- public static final int REG_ESCAPE = 10;
+ public static final int REG_ESCAPE = 10;
/**
* Error flag.
* Invalid use of pattern operators such as group or list.
*/
- public static final int REG_BADPAT = 11;
+ public static final int REG_BADPAT = 11;
/**
* Error flag.
* Compiled regular expression requires a pattern
* buffer larger than 64Kb. <B>Not implemented</B>.
*/
- public static final int REG_ESIZE = 12;
+ public static final int REG_ESIZE = 12;
/**
* Error flag.
* The regex routines ran out of memory. <B>Not implemented</B>.
*/
- public static final int REG_ESPACE = 13;
+ public static final int REG_ESPACE = 13;
- REException(String msg, int type, int position) {
- super(msg);
+ REException (String msg, int type, int position)
+ {
+ super (msg);
this.type = type;
this.pos = position;
}
- REException(String msg, Throwable cause, int type, int position) {
- super(msg, cause);
+ REException (String msg, Throwable cause, int type, int position)
+ {
+ super (msg, cause);
this.type = type;
this.pos = position;
}
@@ -157,7 +162,8 @@ public class REException extends Exception {
* Returns the type of the exception, one of the constants listed above.
*/
- public int getType() {
+ public int getType ()
+ {
return type;
}
@@ -167,7 +173,8 @@ public class REException extends Exception {
* where the error was detected, not necessarily the starting index of
* a bad subexpression.
*/
- public int getPosition() {
+ public int getPosition ()
+ {
return pos;
}
@@ -176,13 +183,16 @@ public class REException extends Exception {
* as well as its index position in the string or character array
* being compiled.
*/
- public String getMessage() {
- Object[] args = {new Integer(pos)};
- StringBuffer sb = new StringBuffer();
- String prefix = RE.getLocalizedMessage("error.prefix");
- sb.append(MessageFormat.format(prefix, args));
- sb.append('\n');
- sb.append(super.getMessage());
- return sb.toString();
+ public String getMessage ()
+ {
+ Object[]args =
+ {
+ new Integer (pos)};
+ CPStringBuilder sb = new CPStringBuilder ();
+ String prefix = RE.getLocalizedMessage ("error.prefix");
+ sb.append (MessageFormat.format (prefix, args));
+ sb.append ('\n');
+ sb.append (super.getMessage ());
+ return sb.toString ();
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java b/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
index abe86308bbc..c7acb714a27 100644
--- a/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
+++ b/libjava/classpath/gnu/java/util/regex/REFilterInputStream.java
@@ -51,14 +51,15 @@ import java.io.InputStream;
* class instead.
*/
-public class REFilterInputStream extends FilterInputStream {
+public class REFilterInputStream extends FilterInputStream
+{
- private RE expr;
- private String replace;
- private String buffer;
- private int bufpos;
- private int offset;
- private CharIndexedInputStream stream;
+ private RE expr;
+ private String replace;
+ private String buffer;
+ private int bufpos;
+ private int offset;
+ private CharIndexedInputStream stream;
/**
* Creates an REFilterInputStream. When reading from this stream,
@@ -71,9 +72,10 @@ public class REFilterInputStream extends FilterInputStream {
* @param expr The regular expression to search for.
* @param replace The text pattern to replace matches with.
*/
- public REFilterInputStream(InputStream stream, RE expr, String replace) {
- super(stream);
- this.stream = new CharIndexedInputStream(stream,0);
+ public REFilterInputStream (InputStream stream, RE expr, String replace)
+ {
+ super (stream);
+ this.stream = new CharIndexedInputStream (stream, 0);
this.expr = expr;
this.replace = replace;
}
@@ -82,32 +84,38 @@ public class REFilterInputStream extends FilterInputStream {
* Reads the next byte from the stream per the general contract of
* InputStream.read(). Returns -1 on error or end of stream.
*/
- public int read() {
+ public int read ()
+ {
// If we have buffered replace data, use it.
- if ((buffer != null) && (bufpos < buffer.length())) {
- return (int) buffer.charAt(bufpos++);
- }
+ if ((buffer != null) && (bufpos < buffer.length ()))
+ {
+ return (int) buffer.charAt (bufpos++);
+ }
// check if input is at a valid position
- if (!stream.isValid()) return -1;
-
- REMatch mymatch = new REMatch(expr.getNumSubs(),offset,0);
- if (expr.match(stream, mymatch)) {
- mymatch.end[0] = mymatch.index;
- mymatch.finish(stream);
- stream.move(mymatch.toString().length());
- offset += mymatch.toString().length();
- buffer = mymatch.substituteInto(replace);
- bufpos = 1;
-
- // This is prone to infinite loops if replace string turns out empty.
- if (buffer.length() > 0) {
- return buffer.charAt(0);
+ if (!stream.isValid ())
+ return -1;
+
+ REMatch mymatch = new REMatch (expr.getNumSubs (), offset, 0);
+ if (expr.match (stream, mymatch))
+ {
+ mymatch.end[0] = mymatch.index;
+ mymatch.finish (stream);
+ stream.move (mymatch.toString ().length ());
+ offset += mymatch.toString ().length ();
+ buffer = mymatch.substituteInto (replace);
+ bufpos = 1;
+
+ // This is prone to infinite loops if replace string turns out empty.
+ if (buffer.length () > 0)
+ {
+ return buffer.charAt (0);
+ }
}
- }
- char ch = stream.charAt(0);
- if (ch == CharIndexed.OUT_OF_BOUNDS) return -1;
- stream.move(1);
+ char ch = stream.charAt (0);
+ if (ch == CharIndexed.OUT_OF_BOUNDS)
+ return -1;
+ stream.move (1);
offset++;
return ch;
}
@@ -116,25 +124,30 @@ public class REFilterInputStream extends FilterInputStream {
* Returns false. REFilterInputStream does not support mark() and
* reset() methods.
*/
- public boolean markSupported() {
+ public boolean markSupported ()
+ {
return false;
}
/** Reads from the stream into the provided array. */
- public int read(byte[] b, int off, int len) {
+ public int read (byte[]b, int off, int len)
+ {
int i;
int ok = 0;
- while (len-- > 0) {
- i = read();
- if (i == -1) return (ok == 0) ? -1 : ok;
- b[off++] = (byte) i;
- ok++;
- }
+ while (len-- > 0)
+ {
+ i = read ();
+ if (i == -1)
+ return (ok == 0) ? -1 : ok;
+ b[off++] = (byte) i;
+ ok++;
+ }
return ok;
}
/** Reads from the stream into the provided array. */
- public int read(byte[] b) {
- return read(b,0,b.length);
+ public int read (byte[]b)
+ {
+ return read (b, 0, b.length);
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/REMatch.java b/libjava/classpath/gnu/java/util/regex/REMatch.java
index d8994829323..d29972e1dd8 100644
--- a/libjava/classpath/gnu/java/util/regex/REMatch.java
+++ b/libjava/classpath/gnu/java/util/regex/REMatch.java
@@ -37,6 +37,9 @@ exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
/**
@@ -47,100 +50,112 @@ import java.io.Serializable;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public final class REMatch implements Serializable, Cloneable {
- private String matchedText;
- private CharIndexed matchedCharIndexed;
-
- // These variables are package scope for fast access within the engine
- int eflags; // execution flags this match was made using
-
- // Offset in source text where match was tried. This is zero-based;
- // the actual position in the source text is given by (offset + anchor).
- int offset;
-
- // Anchor position refers to the index into the source input
- // at which the matching operation began.
- // This is also useful for the ANCHORINDEX option.
- int anchor;
-
- // Package scope; used by RE.
- int index; // used while matching to mark current match position in input
- // start1[i] is set when the i-th subexp starts. And start1[i] is copied
- // to start[i] when the i-th subexp ends. So start[i] keeps the previously
- // assigned value while the i-th subexp is being processed. This makes
- // backreference to the i-th subexp within the i-th subexp possible.
- int[] start; // start positions (relative to offset) for each (sub)exp.
- int[] start1; // start positions (relative to offset) for each (sub)exp.
- int[] end; // end positions for the same
- // start[i] == -1 or end[i] == -1 means that the start/end position is void.
- // start[i] == p or end[i] == p where p < 0 and p != -1 means that
- // the actual start/end position is (p+1). Start/end positions may
- // become negative when the subexpression is in a RETokenLookBehind.
- boolean empty; // empty string matched. This flag is used only within
- // RETokenRepeated.
-
- BacktrackStack backtrackStack;
-
- public Object clone() {
- try {
- REMatch copy = (REMatch) super.clone();
-
- copy.start = (int[]) start.clone();
- copy.start1 = (int[]) start1.clone();
- copy.end = (int[]) end.clone();
-
- return copy;
- } catch (CloneNotSupportedException e) {
- throw new Error(); // doesn't happen
- }
- }
+public final class REMatch implements Serializable, Cloneable
+{
+ private String matchedText;
+ private CharIndexed matchedCharIndexed;
- void assignFrom(REMatch other) {
- start = other.start;
- start1 = other.start1;
- end = other.end;
- index = other.index;
- backtrackStack = other.backtrackStack;
- }
+ // These variables are package scope for fast access within the engine
+ int eflags; // execution flags this match was made using
- REMatch(int subs, int anchor, int eflags) {
- start = new int[subs+1];
- start1 = new int[subs+1];
- end = new int[subs+1];
- this.anchor = anchor;
- this.eflags = eflags;
- clear(anchor);
- }
+ // Offset in source text where match was tried. This is zero-based;
+ // the actual position in the source text is given by (offset + anchor).
+ int offset;
- void finish(CharIndexed text) {
- start[0] = 0;
- StringBuffer sb = new StringBuffer();
- int i;
- for (i = 0; i < end[0]; i++)
- sb.append(text.charAt(i));
- matchedText = sb.toString();
- matchedCharIndexed = text;
- for (i = 0; i < start.length; i++) {
- // If any subexpressions didn't terminate, they don't count
- // TODO check if this code ever gets hit
- if ((start[i] == -1) ^ (end[i] == -1)) {
- start[i] = -1;
- end[i] = -1;
- }
- }
- backtrackStack = null;
+ // Anchor position refers to the index into the source input
+ // at which the matching operation began.
+ // This is also useful for the ANCHORINDEX option.
+ int anchor;
+
+ // Package scope; used by RE.
+ int index; // used while matching to mark current match position in input
+ // start1[i] is set when the i-th subexp starts. And start1[i] is copied
+ // to start[i] when the i-th subexp ends. So start[i] keeps the previously
+ // assigned value while the i-th subexp is being processed. This makes
+ // backreference to the i-th subexp within the i-th subexp possible.
+ int[] start; // start positions (relative to offset) for each (sub)exp.
+ int[] start1; // start positions (relative to offset) for each (sub)exp.
+ int[] end; // end positions for the same
+ // start[i] == -1 or end[i] == -1 means that the start/end position is void.
+ // start[i] == p or end[i] == p where p < 0 and p != -1 means that
+ // the actual start/end position is (p+1). Start/end positions may
+ // become negative when the subexpression is in a RETokenLookBehind.
+ boolean empty; // empty string matched. This flag is used only within
+ // RETokenRepeated.
+
+ BacktrackStack backtrackStack;
+
+ public Object clone ()
+ {
+ try
+ {
+ REMatch copy = (REMatch) super.clone ();
+
+ copy.start = (int[]) start.clone ();
+ copy.start1 = (int[]) start1.clone ();
+ copy.end = (int[]) end.clone ();
+
+ return copy;
}
-
- /** Clears the current match and moves the offset to the new index. */
- void clear(int index) {
- offset = index;
- this.index = 0;
- for (int i = 0; i < start.length; i++) {
- start[i] = start1[i] = end[i] = -1;
- }
- backtrackStack = null;
+ catch (CloneNotSupportedException e)
+ {
+ throw new Error (); // doesn't happen
}
-
+ }
+
+ void assignFrom (REMatch other)
+ {
+ start = other.start;
+ start1 = other.start1;
+ end = other.end;
+ index = other.index;
+ backtrackStack = other.backtrackStack;
+ }
+
+ REMatch (int subs, int anchor, int eflags)
+ {
+ start = new int[subs + 1];
+ start1 = new int[subs + 1];
+ end = new int[subs + 1];
+ this.anchor = anchor;
+ this.eflags = eflags;
+ clear (anchor);
+ }
+
+ void finish (CharIndexed text)
+ {
+ start[0] = 0;
+ CPStringBuilder sb = new CPStringBuilder ();
+ int i;
+ for (i = 0; i < end[0]; i++)
+ sb.append (text.charAt (i));
+ matchedText = sb.toString ();
+ matchedCharIndexed = text;
+ for (i = 0; i < start.length; i++)
+ {
+ // If any subexpressions didn't terminate, they don't count
+ // TODO check if this code ever gets hit
+ if ((start[i] == -1) ^ (end[i] == -1))
+ {
+ start[i] = -1;
+ end[i] = -1;
+ }
+ }
+ backtrackStack = null;
+ }
+
+ /** Clears the current match and moves the offset to the new index. */
+ void clear (int index)
+ {
+ offset = index;
+ this.index = 0;
+ for (int i = 0; i < start.length; i++)
+ {
+ start[i] = start1[i] = end[i] = -1;
+ }
+ backtrackStack = null;
+ }
+
/**
* Returns the string matching the pattern. This makes it convenient
* to write code like the following:
@@ -150,18 +165,20 @@ public final class REMatch implements Serializable, Cloneable {
* if (myMatch != null) System.out.println("Regexp found: "+myMatch);
* </code>
*/
- public String toString() {
- return matchedText;
- }
-
+ public String toString ()
+ {
+ return matchedText;
+ }
+
/**
* Returns the index within the input text where the match in its entirety
* began.
*/
- public int getStartIndex() {
- return offset + start[0];
- }
-
+ public int getStartIndex ()
+ {
+ return offset + start[0];
+ }
+
/**
* Returns the index within the input string where the match in
* its entirety ends. The return value is the next position after
@@ -179,10 +196,11 @@ public final class REMatch implements Serializable, Cloneable {
* But you can save yourself that work, since the <code>toString()</code>
* method (above) does exactly that for you.
*/
- public int getEndIndex() {
- return offset + end[0];
- }
-
+ public int getEndIndex ()
+ {
+ return offset + end[0];
+ }
+
/**
* Returns the string matching the given subexpression. The subexpressions
* are indexed starting with one, not zero. That is, the subexpression
@@ -191,25 +209,30 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param sub Index of the subexpression.
*/
- public String toString(int sub) {
- if ((sub >= start.length) || sub < 0)
- throw new IndexOutOfBoundsException("No group " + sub);
- if (start[sub] == -1) return null;
- if (start[sub] >= 0 && end[sub] <= matchedText.length())
- return (matchedText.substring(start[sub],end[sub]));
- else {
+ public String toString (int sub)
+ {
+ if ((sub >= start.length) || sub < 0)
+ throw new IndexOutOfBoundsException ("No group " + sub);
+ if (start[sub] == -1)
+ return null;
+ if (start[sub] >= 0 && end[sub] <= matchedText.length ())
+ return (matchedText.substring (start[sub], end[sub]));
+ else
+ {
// This case occurs with RETokenLookAhead or RETokenLookBehind.
- StringBuffer sb = new StringBuffer();
- int s = start[sub];
- int e = end[sub];
- if (s < 0) s += 1;
- if (e < 0) e += 1;
- for (int i = start[0] + s; i < start[0] + e; i++)
- sb.append(matchedCharIndexed.charAt(i));
- return sb.toString();
- }
- }
-
+ CPStringBuilder sb = new CPStringBuilder ();
+ int s = start[sub];
+ int e = end[sub];
+ if (s < 0)
+ s += 1;
+ if (e < 0)
+ e += 1;
+ for (int i = start[0] + s; i < start[0] + e; i++)
+ sb.append (matchedCharIndexed.charAt (i));
+ return sb.toString ();
+ }
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> begins, or <code>-1</code> if
@@ -218,13 +241,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @deprecated Use getStartIndex(int) instead.
*/
- public int getSubStartIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = start[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getSubStartIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = start[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> begins, or <code>-1</code> if
@@ -233,13 +257,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @since gnu.regexp 1.1.0
*/
- public int getStartIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = start[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getStartIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = start[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> ends, or <code>-1</code> if
@@ -248,13 +273,14 @@ public final class REMatch implements Serializable, Cloneable {
* @param sub Subexpression index
* @deprecated Use getEndIndex(int) instead
*/
- public int getSubEndIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = end[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getSubEndIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = end[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Returns the index within the input string used to generate this match
* where subexpression number <i>sub</i> ends, or <code>-1</code> if
@@ -262,13 +288,14 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param sub Subexpression index
*/
- public int getEndIndex(int sub) {
- if (sub >= start.length) return -1;
- int x = end[sub];
- return (x == -1) ? x :
- (x >= 0) ? offset + x : offset + x + 1;
- }
-
+ public int getEndIndex (int sub)
+ {
+ if (sub >= start.length)
+ return -1;
+ int x = end[sub];
+ return (x == -1) ? x : (x >= 0) ? offset + x : offset + x + 1;
+ }
+
/**
* Substitute the results of this match to create a new string.
* This is patterned after PERL, so the tokens to watch out for are
@@ -280,31 +307,42 @@ public final class REMatch implements Serializable, Cloneable {
*
* @param input A string consisting of literals and <code>$<i>n</i></code> tokens.
*/
- public String substituteInto(String input) {
- // a la Perl, $0 is whole thing, $1 - $9 are subexpressions
- StringBuffer output = new StringBuffer();
- int pos;
- for (pos = 0; pos < input.length()-1; pos++) {
- if ((input.charAt(pos) == '$') && (Character.isDigit(input.charAt(pos+1)))) {
- int val = Character.digit(input.charAt(++pos),10);
- int pos1 = pos + 1;
- while (pos1 < input.length() &&
- Character.isDigit(input.charAt(pos1))) {
- int val1 = val*10 + Character.digit(input.charAt(pos1),10);
- if (val1 >= start.length) break;
- pos1++;
- val = val1;
- }
- pos = pos1 - 1;
-
- if (val < start.length) {
- output.append(toString(val));
- }
- } else output.append(input.charAt(pos));
- }
- if (pos < input.length()) output.append(input.charAt(pos));
- return output.toString();
- }
+ public String substituteInto (String input)
+ {
+ // a la Perl, $0 is whole thing, $1 - $9 are subexpressions
+ CPStringBuilder output = new CPStringBuilder ();
+ int pos;
+ for (pos = 0; pos < input.length () - 1; pos++)
+ {
+ if ((input.charAt (pos) == '$')
+ && (Character.isDigit (input.charAt (pos + 1))))
+ {
+ int val = Character.digit (input.charAt (++pos), 10);
+ int pos1 = pos + 1;
+ while (pos1 < input.length () &&
+ Character.isDigit (input.charAt (pos1)))
+ {
+ int val1 =
+ val * 10 + Character.digit (input.charAt (pos1), 10);
+ if (val1 >= start.length)
+ break;
+ pos1++;
+ val = val1;
+ }
+ pos = pos1 - 1;
+
+ if (val < start.length)
+ {
+ output.append (toString (val));
+ }
+ }
+ else
+ output.append (input.charAt (pos));
+ }
+ if (pos < input.length ())
+ output.append (input.charAt (pos));
+ return output.toString ();
+ }
/* The following are used for debugging purpose
public static String d(REMatch m) {
diff --git a/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java b/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
index bc700beac5a..f0c78be925c 100644
--- a/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
+++ b/libjava/classpath/gnu/java/util/regex/REMatchEnumeration.java
@@ -36,6 +36,9 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
import java.util.Enumeration;
import java.util.NoSuchElementException;
@@ -66,20 +69,23 @@ import java.util.NoSuchElementException;
*
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public class REMatchEnumeration implements Enumeration, Serializable {
+public class REMatchEnumeration
+ implements Enumeration < REMatch >, Serializable
+{
private static final int YES = 1;
private static final int MAYBE = 0;
private static final int NO = -1;
-
+
private int more;
private REMatch match;
- private RE expr;
- private CharIndexed input;
- private int eflags;
- private int index;
+ private final RE expr;
+ private final CharIndexed input;
+ private final int eflags;
+ private int index;
// Package scope constructor is used by RE.getMatchEnumeration()
- REMatchEnumeration(RE expr, CharIndexed input, int index, int eflags) {
+ REMatchEnumeration (RE expr, CharIndexed input, int index, int eflags)
+ {
more = MAYBE;
this.expr = expr;
this.input = input;
@@ -88,48 +94,48 @@ public class REMatchEnumeration implements Enumeration, Serializable {
}
/** Returns true if there are more matches in the input text. */
- public boolean hasMoreElements() {
- return hasMoreMatches(null);
+ public boolean hasMoreElements ()
+ {
+ return hasMoreMatches (null);
}
/** Returns true if there are more matches in the input text. */
- public boolean hasMoreMatches() {
- return hasMoreMatches(null);
+ public boolean hasMoreMatches ()
+ {
+ return hasMoreMatches (null);
}
/** Returns true if there are more matches in the input text.
* Saves the text leading up to the match (or to the end of the input)
* in the specified buffer.
*/
- public boolean hasMoreMatches(StringBuffer buffer) {
- if (more == MAYBE) {
- match = expr.getMatchImpl(input,index,eflags,buffer);
- if (match != null) {
- input.move((match.end[0] > 0) ? match.end[0] : 1);
-
- index = (match.end[0] > 0) ? match.end[0] + match.offset : index + 1;
+ public boolean hasMoreMatches (CPStringBuilder buffer)
+ {
+ if (more == MAYBE)
+ {
+ match = expr.getMatchImpl (input, index, eflags, buffer);
+ if (match != null)
+ {
+ input.move ((match.end[0] > 0) ? match.end[0] : 1);
+
+ index =
+ (match.end[0] > 0) ? match.end[0] + match.offset : index + 1;
more = YES;
- } else more = NO;
- }
+ }
+ else
+ more = NO;
+ }
return (more == YES);
}
/** Returns the next match in the input text. */
- public Object nextElement() throws NoSuchElementException {
- return nextMatch();
- }
-
- /**
- * Returns the next match in the input text. This method is provided
- * for convenience to avoid having to explicitly cast the return value
- * to class REMatch.
- */
- public REMatch nextMatch() throws NoSuchElementException {
- if (hasMoreElements()) {
- more = (input.isValid()) ? MAYBE : NO;
+ public REMatch nextElement () throws NoSuchElementException
+ {
+ if (hasMoreElements ())
+ {
+ more = (input.isValid ())? MAYBE : NO;
return match;
- }
- throw new NoSuchElementException();
+ }
+ throw new NoSuchElementException ();
}
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RESyntax.java b/libjava/classpath/gnu/java/util/regex/RESyntax.java
index db11e2db450..38d70564d4a 100644
--- a/libjava/classpath/gnu/java/util/regex/RESyntax.java
+++ b/libjava/classpath/gnu/java/util/regex/RESyntax.java
@@ -51,102 +51,104 @@ import java.util.BitSet;
* @author <A HREF="mailto:wes@cacas.org">Wes Biggs</A>
*/
-public final class RESyntax implements Serializable {
- static final String DEFAULT_LINE_SEPARATOR = System.getProperty("line.separator");
+public final class RESyntax implements Serializable
+{
+ static final String DEFAULT_LINE_SEPARATOR =
+ System.getProperty ("line.separator");
- private BitSet bits;
+ private BitSet bits;
- // true for the constant defined syntaxes
- private boolean isFinal = false;
+ // true for the constant defined syntaxes
+ private boolean isFinal = false;
- private String lineSeparator = DEFAULT_LINE_SEPARATOR;
+ private String lineSeparator = DEFAULT_LINE_SEPARATOR;
// Values for constants are bit indexes
/**
* Syntax bit. Backslash is an escape character in lists.
*/
- public static final int RE_BACKSLASH_ESCAPE_IN_LISTS = 0;
+ public static final int RE_BACKSLASH_ESCAPE_IN_LISTS = 0;
/**
* Syntax bit. Use \? instead of ? and \+ instead of +.
*/
- public static final int RE_BK_PLUS_QM = 1;
+ public static final int RE_BK_PLUS_QM = 1;
/**
* Syntax bit. POSIX character classes ([:...:]) in lists are allowed.
*/
- public static final int RE_CHAR_CLASSES = 2;
+ public static final int RE_CHAR_CLASSES = 2;
/**
* Syntax bit. ^ and $ are special everywhere.
* <B>Not implemented.</B>
*/
- public static final int RE_CONTEXT_INDEP_ANCHORS = 3;
+ public static final int RE_CONTEXT_INDEP_ANCHORS = 3;
/**
* Syntax bit. Repetition operators are only special in valid positions.
* <B>Not implemented.</B>
*/
- public static final int RE_CONTEXT_INDEP_OPS = 4;
+ public static final int RE_CONTEXT_INDEP_OPS = 4;
/**
* Syntax bit. Repetition and alternation operators are invalid
* at start and end of pattern and other places.
* <B>Not implemented</B>.
*/
- public static final int RE_CONTEXT_INVALID_OPS = 5;
+ public static final int RE_CONTEXT_INVALID_OPS = 5;
/**
* Syntax bit. Match-any-character operator (.) matches a newline.
*/
- public static final int RE_DOT_NEWLINE = 6;
+ public static final int RE_DOT_NEWLINE = 6;
/**
* Syntax bit. Match-any-character operator (.) does not match a null.
*/
- public static final int RE_DOT_NOT_NULL = 7;
+ public static final int RE_DOT_NOT_NULL = 7;
/**
* Syntax bit. Intervals ({x}, {x,}, {x,y}) are allowed.
*/
- public static final int RE_INTERVALS = 8;
+ public static final int RE_INTERVALS = 8;
/**
* Syntax bit. No alternation (|), match one-or-more (+), or
* match zero-or-one (?) operators.
*/
- public static final int RE_LIMITED_OPS = 9;
+ public static final int RE_LIMITED_OPS = 9;
/**
* Syntax bit. Newline is an alternation operator.
*/
- public static final int RE_NEWLINE_ALT = 10; // impl.
+ public static final int RE_NEWLINE_ALT = 10; // impl.
/**
* Syntax bit. Intervals use { } instead of \{ \}
*/
- public static final int RE_NO_BK_BRACES = 11;
+ public static final int RE_NO_BK_BRACES = 11;
/**
* Syntax bit. Grouping uses ( ) instead of \( \).
*/
- public static final int RE_NO_BK_PARENS = 12;
+ public static final int RE_NO_BK_PARENS = 12;
/**
* Syntax bit. Backreferences not allowed.
*/
- public static final int RE_NO_BK_REFS = 13;
+ public static final int RE_NO_BK_REFS = 13;
/**
* Syntax bit. Alternation uses | instead of \|
*/
- public static final int RE_NO_BK_VBAR = 14;
+ public static final int RE_NO_BK_VBAR = 14;
/**
* Syntax bit. <B>Not implemented</B>.
*/
- public static final int RE_NO_EMPTY_RANGES = 15;
+ public static final int RE_NO_EMPTY_RANGES = 15;
/**
* Syntax bit. An unmatched right parenthesis (')' or '\)', depending
@@ -157,80 +159,80 @@ public final class RESyntax implements Serializable {
/**
* Syntax bit. <B>Not implemented.</B>
*/
- public static final int RE_HAT_LISTS_NOT_NEWLINE = 17;
+ public static final int RE_HAT_LISTS_NOT_NEWLINE = 17;
/**
* Syntax bit. Stingy matching is allowed (+?, *?, ??, {x,y}?).
*/
- public static final int RE_STINGY_OPS = 18;
+ public static final int RE_STINGY_OPS = 18;
/**
* Syntax bit. Allow character class escapes (\d, \D, \s, \S, \w, \W).
*/
- public static final int RE_CHAR_CLASS_ESCAPES = 19;
+ public static final int RE_CHAR_CLASS_ESCAPES = 19;
/**
* Syntax bit. Allow use of (?:xxx) grouping (subexpression is not saved).
*/
- public static final int RE_PURE_GROUPING = 20;
+ public static final int RE_PURE_GROUPING = 20;
/**
* Syntax bit. Allow use of (?=xxx) and (?!xxx) apply the subexpression
* to the text following the current position without consuming that text.
*/
- public static final int RE_LOOKAHEAD = 21;
+ public static final int RE_LOOKAHEAD = 21;
/**
* Syntax bit. Allow beginning- and end-of-string anchors (\A, \Z).
*/
- public static final int RE_STRING_ANCHORS = 22;
+ public static final int RE_STRING_ANCHORS = 22;
/**
* Syntax bit. Allow embedded comments, (?#comment), as in Perl5.
*/
- public static final int RE_COMMENTS = 23;
+ public static final int RE_COMMENTS = 23;
/**
* Syntax bit. Allow character class escapes within lists, as in Perl5.
*/
- public static final int RE_CHAR_CLASS_ESC_IN_LISTS = 24;
+ public static final int RE_CHAR_CLASS_ESC_IN_LISTS = 24;
/**
* Syntax bit. Possessive matching is allowed (++, *+, ?+, {x,y}+).
*/
- public static final int RE_POSSESSIVE_OPS = 25;
+ public static final int RE_POSSESSIVE_OPS = 25;
/**
* Syntax bit. Allow embedded flags, (?is-x), as in Perl5.
*/
- public static final int RE_EMBEDDED_FLAGS = 26;
+ public static final int RE_EMBEDDED_FLAGS = 26;
/**
* Syntax bit. Allow octal char (\0377), as in Perl5.
*/
- public static final int RE_OCTAL_CHAR = 27;
+ public static final int RE_OCTAL_CHAR = 27;
/**
* Syntax bit. Allow hex char (\x1b), as in Perl5.
*/
- public static final int RE_HEX_CHAR = 28;
+ public static final int RE_HEX_CHAR = 28;
/**
* Syntax bit. Allow Unicode char (\u1234), as in Java 1.4.
*/
- public static final int RE_UNICODE_CHAR = 29;
+ public static final int RE_UNICODE_CHAR = 29;
/**
* Syntax bit. Allow named property (\p{P}, \P{p}), as in Perl5.
*/
- public static final int RE_NAMED_PROPERTY = 30;
+ public static final int RE_NAMED_PROPERTY = 30;
/**
* Syntax bit. Allow nested characterclass ([a-z&&[^p-r]]), as in Java 1.4.
*/
- public static final int RE_NESTED_CHARCLASS = 31;
+ public static final int RE_NESTED_CHARCLASS = 31;
- private static final int BIT_TOTAL = 32;
+ private static final int BIT_TOTAL = 32;
/**
* Predefined syntax.
@@ -315,13 +317,13 @@ public final class RESyntax implements Serializable {
* Emulates regular expression support in Larry Wall's perl, version 4,
* using single line mode (/s modifier).
*/
- public static final RESyntax RE_SYNTAX_PERL4_S; // single line mode (/s)
+ public static final RESyntax RE_SYNTAX_PERL4_S; // single line mode (/s)
/**
* Predefined syntax.
* Emulates regular expression support in Larry Wall's perl, version 5.
*/
- public static final RESyntax RE_SYNTAX_PERL5;
+ public static final RESyntax RE_SYNTAX_PERL5;
/**
* Predefined syntax.
@@ -335,145 +337,109 @@ public final class RESyntax implements Serializable {
* Emulates regular expression support in Java 1.4's java.util.regex
* package.
*/
- public static final RESyntax RE_SYNTAX_JAVA_1_4;
-
- static {
- // Define syntaxes
-
- RE_SYNTAX_EMACS = new RESyntax().makeFinal();
-
- RESyntax RE_SYNTAX_POSIX_COMMON = new RESyntax()
- .set(RE_CHAR_CLASSES)
- .set(RE_DOT_NEWLINE)
- .set(RE_DOT_NOT_NULL)
- .set(RE_INTERVALS)
- .set(RE_NO_EMPTY_RANGES)
- .makeFinal();
-
- RE_SYNTAX_POSIX_BASIC = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_BK_PLUS_QM)
- .makeFinal();
-
- RE_SYNTAX_POSIX_EXTENDED = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- RE_SYNTAX_AWK = new RESyntax()
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .set(RE_DOT_NOT_NULL)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_REFS)
- .set(RE_NO_BK_VBAR)
- .set(RE_NO_EMPTY_RANGES)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- RE_SYNTAX_POSIX_AWK = new RESyntax(RE_SYNTAX_POSIX_EXTENDED)
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .makeFinal();
-
- RE_SYNTAX_GREP = new RESyntax()
- .set(RE_BK_PLUS_QM)
- .set(RE_CHAR_CLASSES)
- .set(RE_HAT_LISTS_NOT_NEWLINE)
- .set(RE_INTERVALS)
- .set(RE_NEWLINE_ALT)
- .makeFinal();
-
- RE_SYNTAX_EGREP = new RESyntax()
- .set(RE_CHAR_CLASSES)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS)
- .set(RE_HAT_LISTS_NOT_NEWLINE)
- .set(RE_NEWLINE_ALT)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .makeFinal();
-
- RE_SYNTAX_POSIX_EGREP = new RESyntax(RE_SYNTAX_EGREP)
- .set(RE_INTERVALS)
- .set(RE_NO_BK_BRACES)
- .makeFinal();
-
- /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
-
- RE_SYNTAX_ED = new RESyntax(RE_SYNTAX_POSIX_BASIC)
- .makeFinal();
-
- RE_SYNTAX_SED = new RESyntax(RE_SYNTAX_POSIX_BASIC)
- .makeFinal();
-
- RE_SYNTAX_POSIX_MINIMAL_BASIC = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_LIMITED_OPS)
- .makeFinal();
-
- /* Differs from RE_SYNTAX_POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
- replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
-
- RE_SYNTAX_POSIX_MINIMAL_EXTENDED = new RESyntax(RE_SYNTAX_POSIX_COMMON)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INVALID_OPS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_REFS)
- .set(RE_NO_BK_VBAR)
- .set(RE_UNMATCHED_RIGHT_PAREN_ORD)
- .makeFinal();
-
- /* There is no official Perl spec, but here's a "best guess" */
-
- RE_SYNTAX_PERL4 = new RESyntax()
- .set(RE_BACKSLASH_ESCAPE_IN_LISTS)
- .set(RE_CONTEXT_INDEP_ANCHORS)
- .set(RE_CONTEXT_INDEP_OPS) // except for '{', apparently
- .set(RE_INTERVALS)
- .set(RE_NO_BK_BRACES)
- .set(RE_NO_BK_PARENS)
- .set(RE_NO_BK_VBAR)
- .set(RE_NO_EMPTY_RANGES)
- .set(RE_CHAR_CLASS_ESCAPES) // \d,\D,\w,\W,\s,\S
- .makeFinal();
-
- RE_SYNTAX_PERL4_S = new RESyntax(RE_SYNTAX_PERL4)
- .set(RE_DOT_NEWLINE)
- .makeFinal();
-
- RE_SYNTAX_PERL5 = new RESyntax(RE_SYNTAX_PERL4)
- .set(RE_PURE_GROUPING) // (?:)
- .set(RE_STINGY_OPS) // *?,??,+?,{}?
- .set(RE_LOOKAHEAD) // (?=)(?!)
- .set(RE_STRING_ANCHORS) // \A,\Z
- .set(RE_CHAR_CLASS_ESC_IN_LISTS)// \d,\D,\w,\W,\s,\S within []
- .set(RE_COMMENTS) // (?#)
- .set(RE_EMBEDDED_FLAGS) // (?imsx-imsx)
- .set(RE_OCTAL_CHAR) // \0377
- .set(RE_HEX_CHAR) // \x1b
- .set(RE_NAMED_PROPERTY) // \p{prop}, \P{prop}
- .makeFinal();
-
- RE_SYNTAX_PERL5_S = new RESyntax(RE_SYNTAX_PERL5)
- .set(RE_DOT_NEWLINE)
- .makeFinal();
-
- RE_SYNTAX_JAVA_1_4 = new RESyntax(RE_SYNTAX_PERL5)
- // XXX
- .set(RE_POSSESSIVE_OPS) // *+,?+,++,{}+
- .set(RE_UNICODE_CHAR) // \u1234
- .set(RE_NESTED_CHARCLASS) // [a-z&&[^p-r]]
- .makeFinal();
+ public static final RESyntax RE_SYNTAX_JAVA_1_4;
+
+ static
+ {
+ // Define syntaxes
+
+ RE_SYNTAX_EMACS = new RESyntax ().makeFinal ();
+
+ RESyntax RE_SYNTAX_POSIX_COMMON =
+ new RESyntax ().set (RE_CHAR_CLASSES).set (RE_DOT_NEWLINE).
+ set (RE_DOT_NOT_NULL).set (RE_INTERVALS).set (RE_NO_EMPTY_RANGES).
+ makeFinal ();
+
+ RE_SYNTAX_POSIX_BASIC =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_BK_PLUS_QM).makeFinal ();
+
+ RE_SYNTAX_POSIX_EXTENDED =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INDEP_OPS).set (RE_NO_BK_BRACES).set (RE_NO_BK_PARENS).
+ set (RE_NO_BK_VBAR).set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ RE_SYNTAX_AWK =
+ new RESyntax ().set (RE_BACKSLASH_ESCAPE_IN_LISTS).
+ set (RE_DOT_NOT_NULL).set (RE_NO_BK_PARENS).set (RE_NO_BK_REFS).
+ set (RE_NO_BK_VBAR).set (RE_NO_EMPTY_RANGES).
+ set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ RE_SYNTAX_POSIX_AWK =
+ new RESyntax (RE_SYNTAX_POSIX_EXTENDED).
+ set (RE_BACKSLASH_ESCAPE_IN_LISTS).makeFinal ();
+
+ RE_SYNTAX_GREP =
+ new RESyntax ().set (RE_BK_PLUS_QM).set (RE_CHAR_CLASSES).
+ set (RE_HAT_LISTS_NOT_NEWLINE).set (RE_INTERVALS).set (RE_NEWLINE_ALT).
+ makeFinal ();
+
+ RE_SYNTAX_EGREP =
+ new RESyntax ().set (RE_CHAR_CLASSES).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INDEP_OPS).set (RE_HAT_LISTS_NOT_NEWLINE).
+ set (RE_NEWLINE_ALT).set (RE_NO_BK_PARENS).set (RE_NO_BK_VBAR).
+ makeFinal ();
+
+ RE_SYNTAX_POSIX_EGREP =
+ new RESyntax (RE_SYNTAX_EGREP).set (RE_INTERVALS).set (RE_NO_BK_BRACES).
+ makeFinal ();
+
+ /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+
+ RE_SYNTAX_ED = new RESyntax (RE_SYNTAX_POSIX_BASIC).makeFinal ();
+
+ RE_SYNTAX_SED = new RESyntax (RE_SYNTAX_POSIX_BASIC).makeFinal ();
+
+ RE_SYNTAX_POSIX_MINIMAL_BASIC =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_LIMITED_OPS).makeFinal ();
+
+ /* Differs from RE_SYNTAX_POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+ replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
+
+ RE_SYNTAX_POSIX_MINIMAL_EXTENDED =
+ new RESyntax (RE_SYNTAX_POSIX_COMMON).set (RE_CONTEXT_INDEP_ANCHORS).
+ set (RE_CONTEXT_INVALID_OPS).set (RE_NO_BK_BRACES).
+ set (RE_NO_BK_PARENS).set (RE_NO_BK_REFS).set (RE_NO_BK_VBAR).
+ set (RE_UNMATCHED_RIGHT_PAREN_ORD).makeFinal ();
+
+ /* There is no official Perl spec, but here's a "best guess" */
+
+ RE_SYNTAX_PERL4 = new RESyntax ().set (RE_BACKSLASH_ESCAPE_IN_LISTS).set (RE_CONTEXT_INDEP_ANCHORS).set (RE_CONTEXT_INDEP_OPS) // except for '{', apparently
+ .set (RE_INTERVALS).set (RE_NO_BK_BRACES).set (RE_NO_BK_PARENS).set (RE_NO_BK_VBAR).set (RE_NO_EMPTY_RANGES).set (RE_CHAR_CLASS_ESCAPES) // \d,\D,\w,\W,\s,\S
+ .makeFinal ();
+
+ RE_SYNTAX_PERL4_S =
+ new RESyntax (RE_SYNTAX_PERL4).set (RE_DOT_NEWLINE).makeFinal ();
+
+ RE_SYNTAX_PERL5 = new RESyntax (RE_SYNTAX_PERL4).set (RE_PURE_GROUPING) // (?:)
+ .set (RE_STINGY_OPS) // *?,??,+?,{}?
+ .set (RE_LOOKAHEAD) // (?=)(?!)
+ .set (RE_STRING_ANCHORS) // \A,\Z
+ .set (RE_CHAR_CLASS_ESC_IN_LISTS) // \d,\D,\w,\W,\s,\S within []
+ .set (RE_COMMENTS) // (?#)
+ .set (RE_EMBEDDED_FLAGS) // (?imsx-imsx)
+ .set (RE_OCTAL_CHAR) // \0377
+ .set (RE_HEX_CHAR) // \x1b
+ .set (RE_NAMED_PROPERTY) // \p{prop}, \P{prop}
+ .makeFinal ();
+
+ RE_SYNTAX_PERL5_S =
+ new RESyntax (RE_SYNTAX_PERL5).set (RE_DOT_NEWLINE).makeFinal ();
+
+ RE_SYNTAX_JAVA_1_4 = new RESyntax (RE_SYNTAX_PERL5)
+ // XXX
+ .set (RE_POSSESSIVE_OPS) // *+,?+,++,{}+
+ .set (RE_UNICODE_CHAR) // \u1234
+ .set (RE_NESTED_CHARCLASS) // [a-z&&[^p-r]]
+ .makeFinal ();
}
/**
* Construct a new syntax object with all bits turned off.
* This is equivalent to RE_SYNTAX_EMACS.
*/
- public RESyntax() {
- bits = new BitSet(BIT_TOTAL);
+ public RESyntax ()
+ {
+ bits = new BitSet (BIT_TOTAL);
}
/**
@@ -484,24 +450,27 @@ public final class RESyntax implements Serializable {
*
* @return this object for convenient chaining
*/
- public RESyntax makeFinal() {
- isFinal = true;
- return this;
- }
+ public RESyntax makeFinal ()
+ {
+ isFinal = true;
+ return this;
+ }
/**
* Construct a new syntax object with all bits set the same
* as the other syntax.
*/
- public RESyntax(RESyntax other) {
- bits = (BitSet) other.bits.clone();
+ public RESyntax (RESyntax other)
+ {
+ bits = (BitSet) other.bits.clone ();
}
/**
* Check if a given bit is set in this syntax.
*/
- public boolean get(int index) {
- return bits.get(index);
+ public boolean get (int index)
+ {
+ return bits.get (index);
}
/**
@@ -510,10 +479,11 @@ public final class RESyntax implements Serializable {
* @param index the constant (RESyntax.RE_xxx) bit to set.
* @return a reference to this object for easy chaining.
*/
- public RESyntax set(int index) {
+ public RESyntax set (int index)
+ {
if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- bits.set(index);
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ bits.set (index);
return this;
}
@@ -523,11 +493,12 @@ public final class RESyntax implements Serializable {
* @param index the constant (RESyntax.RE_xxx) bit to clear.
* @return a reference to this object for easy chaining.
*/
- public RESyntax clear(int index) {
- if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- bits.clear(index);
- return this;
+ public RESyntax clear (int index)
+ {
+ if (isFinal)
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ bits.clear (index);
+ return this;
}
/**
@@ -547,18 +518,20 @@ public final class RESyntax implements Serializable {
*
* @return this object for convenient chaining
*/
- public RESyntax setLineSeparator(String aSeparator) {
- if (isFinal)
- throw new IllegalAccessError(RE.getLocalizedMessage("syntax.final"));
- lineSeparator = aSeparator;
- return this;
- }
+ public RESyntax setLineSeparator (String aSeparator)
+ {
+ if (isFinal)
+ throw new IllegalAccessError (RE.getLocalizedMessage ("syntax.final"));
+ lineSeparator = aSeparator;
+ return this;
+ }
/**
* Returns the currently active line separator string. The default
* is the platform-dependent system property "line.separator".
*/
- public String getLineSeparator() {
- return lineSeparator;
- }
+ public String getLineSeparator ()
+ {
+ return lineSeparator;
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/REToken.java b/libjava/classpath/gnu/java/util/regex/REToken.java
index addc62225eb..681ac517f04 100644
--- a/libjava/classpath/gnu/java/util/regex/REToken.java
+++ b/libjava/classpath/gnu/java/util/regex/REToken.java
@@ -36,65 +36,84 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
+
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
-abstract class REToken implements Serializable, Cloneable {
+abstract class REToken implements Serializable, Cloneable
+{
protected REToken next = null;
protected REToken uncle = null;
protected int subIndex;
protected boolean unicodeAware = true;
- public Object clone() {
- try {
- REToken copy = (REToken) super.clone();
- return copy;
- } catch (CloneNotSupportedException e) {
- throw new Error(); // doesn't happen
+ public Object clone ()
+ {
+ try
+ {
+ REToken copy = (REToken) super.clone ();
+ return copy;
+ }
+ catch (CloneNotSupportedException e)
+ {
+ throw new Error (); // doesn't happen
}
}
- protected REToken(int subIndex) {
- this.subIndex = subIndex;
+ protected REToken (int subIndex)
+ {
+ this.subIndex = subIndex;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 0;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return Integer.MAX_VALUE;
}
- void setUncle(REToken anUncle) {
+ void setUncle (REToken anUncle)
+ {
uncle = anUncle;
}
/** Returns true if the match succeeded, false if it failed. */
- boolean match(CharIndexed input, REMatch mymatch) {
- return match(input, mymatch, false);
- }
- boolean matchFake(CharIndexed input, REMatch mymatch) {
- return match(input, mymatch, true);
- }
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ return match (input, mymatch, false);
+ }
+ boolean matchFake (CharIndexed input, REMatch mymatch)
+ {
+ return match (input, mymatch, true);
+ }
- private boolean match(CharIndexed input, REMatch mymatch, boolean fake) {
- if (!fake) {
- setHitEnd(input, mymatch);
- }
- REMatch m = matchThis(input, mymatch);
- if (m == null) return false;
- if (next(input, m)) {
- mymatch.assignFrom(m);
- return true;
- }
- return false;
- }
+ private boolean match (CharIndexed input, REMatch mymatch, boolean fake)
+ {
+ if (!fake)
+ {
+ setHitEnd (input, mymatch);
+ }
+ REMatch m = matchThis (input, mymatch);
+ if (m == null)
+ return false;
+ if (next (input, m))
+ {
+ mymatch.assignFrom (m);
+ return true;
+ }
+ return false;
+ }
/** Sets whether the matching occurs at the end of input */
- void setHitEnd(CharIndexed input, REMatch mymatch) {
- input.setHitEnd(mymatch);
- }
+ void setHitEnd (CharIndexed input, REMatch mymatch)
+ {
+ input.setHitEnd (mymatch);
+ }
/** Returns true if the match succeeded, false if it failed.
* The matching is done against this REToken only. Chained
@@ -106,22 +125,27 @@ abstract class REToken implements Serializable, Cloneable {
* subclasses of REToken, which needs a special match method,
* do not have to implement this method.
*/
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- throw new UnsupportedOperationException(
- "This REToken does not have a matchThis method");
- }
-
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ throw new
+ UnsupportedOperationException
+ ("This REToken does not have a matchThis method");
+ }
+
/** Returns true if the rest of the tokens match, false if they fail. */
- protected boolean next(CharIndexed input, REMatch mymatch) {
- REToken nextToken = getNext();
- if (nextToken == null) return true;
- return nextToken.match(input, mymatch);
- }
+ protected boolean next (CharIndexed input, REMatch mymatch)
+ {
+ REToken nextToken = getNext ();
+ if (nextToken == null)
+ return true;
+ return nextToken.match (input, mymatch);
+ }
/** Returns the next REToken chained to this REToken. */
- REToken getNext() {
- return (next != null ? next : uncle);
- }
+ REToken getNext ()
+ {
+ return (next != null ? next : uncle);
+ }
/** Finds a match at the position specified by the given REMatch.
* If necessary, adds a BacktrackStack.Backtrack object to backtrackStack
@@ -132,45 +156,55 @@ abstract class REToken implements Serializable, Cloneable {
* @param mymatch Position at which a match should be found
* @return REMatch object if a match was found, null otherwise.
*/
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- boolean b = match(input, mymatch);
- if (b) return mymatch;
- return null;
- }
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ boolean b = match (input, mymatch);
+ if (b)
+ return mymatch;
+ return null;
+ }
- boolean returnsFixedLengthMatches() {
- return false;
- }
+ boolean returnsFixedLengthMatches ()
+ {
+ return false;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- throw new UnsupportedOperationException(
- "This token does not support findFixedLengthMatches");
- }
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ throw new
+ UnsupportedOperationException
+ ("This token does not support findFixedLengthMatches");
+ }
/**
* Backtrack to another possibility.
* Ordinary REToken cannot do anything if this method is called.
*/
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- throw new IllegalStateException("This token cannot be backtracked to");
- }
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ throw new IllegalStateException ("This token cannot be backtracked to");
+ }
- boolean chain(REToken token) {
- next = token;
- return true; // Token was accepted
+ boolean chain (REToken token)
+ {
+ next = token;
+ return true; // Token was accepted
}
- abstract void dump(StringBuffer os);
+ abstract void dump (CPStringBuilder os);
- void dumpAll(StringBuffer os) {
- dump(os);
- if (next != null) next.dumpAll(os);
+ void dumpAll (CPStringBuilder os)
+ {
+ dump (os);
+ if (next != null)
+ next.dumpAll (os);
}
- public String toString() {
- StringBuffer os = new StringBuffer();
- dump(os);
- return os.toString();
+ public String toString ()
+ {
+ CPStringBuilder os = new CPStringBuilder ();
+ dump (os);
+ return os.toString ();
}
/**
@@ -181,9 +215,12 @@ abstract class REToken implements Serializable, Cloneable {
* @return the lowercase equivalent of the character, if any;
* otherwise, the character itself.
*/
- public static char toLowerCase(char ch, boolean unicodeAware) {
- if (unicodeAware) return Character.toLowerCase(ch);
- if (ch >= 'A' && ch <= 'Z') return (char)(ch + 'a' - 'A');
+ public static char toLowerCase (char ch, boolean unicodeAware)
+ {
+ if (unicodeAware)
+ return Character.toLowerCase (ch);
+ if (ch >= 'A' && ch <= 'Z')
+ return (char) (ch + 'a' - 'A');
return ch;
}
@@ -195,9 +232,12 @@ abstract class REToken implements Serializable, Cloneable {
* @return the uppercase equivalent of the character, if any;
* otherwise, the character itself.
*/
- public static char toUpperCase(char ch, boolean unicodeAware) {
- if (unicodeAware) return Character.toUpperCase(ch);
- if (ch >= 'a' && ch <= 'z') return (char)(ch + 'A' - 'a');
+ public static char toUpperCase (char ch, boolean unicodeAware)
+ {
+ if (unicodeAware)
+ return Character.toUpperCase (ch);
+ if (ch >= 'a' && ch <= 'z')
+ return (char) (ch + 'A' - 'a');
return ch;
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenAny.java b/libjava/classpath/gnu/java/util/regex/RETokenAny.java
index b99a54717c9..c002d050423 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenAny.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenAny.java
@@ -38,62 +38,78 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenAny extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenAny extends REToken
+{
/** True if '.' can match a newline (RE_DOT_NEWLINE) */
- private boolean newline;
+ private boolean newline;
/** True if '.' can't match a null (RE_DOT_NOT_NULL) */
- private boolean matchNull;
-
- RETokenAny(int subIndex, boolean newline, boolean matchNull) {
- super(subIndex);
+ private boolean matchNull;
+
+ RETokenAny (int subIndex, boolean newline, boolean matchNull)
+ {
+ super (subIndex);
this.newline = newline;
this.matchNull = matchNull;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 1;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 1;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
- ++mymatch.index;
- return mymatch;
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
+ ++mymatch.index;
+ return mymatch;
}
- return null;
- }
-
- boolean matchOneChar(char ch) {
- if ((ch == CharIndexed.OUT_OF_BOUNDS)
- || (!newline && (ch == '\n'))
- || (matchNull && (ch == 0))) {
- return false;
+ return null;
+ }
+
+ boolean matchOneChar (char ch)
+ {
+ if ((ch == CharIndexed.OUT_OF_BOUNDS)
+ || (!newline && (ch == '\n')) || (matchNull && (ch == 0)))
+ {
+ return false;
}
- return true;
+ return true;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
int index = mymatch.index;
int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
- numRepeats++;
- }
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
+ numRepeats++;
+ }
return numRepeats;
}
- void dump(StringBuffer os) {
- os.append('.');
+ void dump (CPStringBuilder os)
+ {
+ os.append ('.');
}
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java b/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
index 3a912f9bba7..8f146222d95 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenBackRef.java
@@ -38,49 +38,63 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenBackRef extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenBackRef extends REToken
+{
private int num;
private boolean insens;
-
- RETokenBackRef(int subIndex, int num, boolean insens) {
- super(subIndex);
+
+ RETokenBackRef (int subIndex, int num, boolean insens)
+ {
+ super (subIndex);
this.num = num;
this.insens = insens;
}
// should implement getMinimumLength() -- any ideas?
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- if (num >= mymatch.start.length) return null;
- if (num >= mymatch.end.length) return null;
- int b,e;
- b = mymatch.start[num];
- e = mymatch.end[num];
- if ((b==-1)||(e==-1)) return null; // this shouldn't happen, but...
- if (b < 0) b += 1;
- if (e < 0) e += 1;
- for (int i=b; i<e; i++) {
- char c1 = input.charAt(mymatch.index+i-b);
- char c2 = input.charAt(i);
- if (c1 != c2) {
- if (insens) {
- if (c1 != toLowerCase(c2, unicodeAware) &&
- c1 != toUpperCase(c2, unicodeAware)) {
- return null;
- }
- }
- else {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ if (num >= mymatch.start.length)
+ return null;
+ if (num >= mymatch.end.length)
+ return null;
+ int b, e;
+ b = mymatch.start[num];
+ e = mymatch.end[num];
+ if ((b == -1) || (e == -1))
+ return null; // this shouldn't happen, but...
+ if (b < 0)
+ b += 1;
+ if (e < 0)
+ e += 1;
+ for (int i = b; i < e; i++)
+ {
+ char c1 = input.charAt (mymatch.index + i - b);
+ char c2 = input.charAt (i);
+ if (c1 != c2)
+ {
+ if (insens)
+ {
+ if (c1 != toLowerCase (c2, unicodeAware) &&
+ c1 != toUpperCase (c2, unicodeAware))
+ {
return null;
- }
- }
- }
- mymatch.index += e-b;
- return mymatch;
- }
-
- void dump(StringBuffer os) {
- os.append('\\').append(num);
- }
-}
-
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+ mymatch.index += e - b;
+ return mymatch;
+ }
+ void dump (CPStringBuilder os)
+ {
+ os.append ('\\').append (num);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenChar.java b/libjava/classpath/gnu/java/util/regex/RETokenChar.java
index 42dcd93268a..babcf3e4e93 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenChar.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenChar.java
@@ -38,98 +38,125 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenChar extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenChar extends REToken
+{
private char[] ch;
private boolean insens;
- RETokenChar(int subIndex, char c, boolean ins) {
- super(subIndex);
+ RETokenChar (int subIndex, char c, boolean ins)
+ {
+ super (subIndex);
insens = ins;
- ch = new char [1];
- ch[0] = c;
+ ch = new char[1];
+ ch[0] = c;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return ch.length;
}
-
- int getMaximumLength() {
+
+ int getMaximumLength ()
+ {
return ch.length;
}
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- if (matchOneString(input, mymatch.index)) {
- mymatch.index += matchedLength;
- return mymatch;
- }
- // java.util.regex.Matcher#hitEnd() requires that the length of
- // partial match be counted.
+
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ if (matchOneString (input, mymatch.index))
+ {
mymatch.index += matchedLength;
- input.setHitEnd(mymatch);
- return null;
- }
-
- private int matchedLength;
- private boolean matchOneString(CharIndexed input, int index) {
- matchedLength = 0;
- int z = ch.length;
- char c;
- for (int i=0; i<z; i++) {
- c = input.charAt(index+i);
- if (! charEquals(c, ch[i])) {
- return false;
- }
- ++matchedLength;
- }
- return true;
- }
-
- private boolean charEquals(char c1, char c2) {
- if (c1 == c2) return true;
- if (! insens) return false;
- if (toLowerCase(c1, unicodeAware) == c2) return true;
- if (toUpperCase(c1, unicodeAware) == c2) return true;
- return false;
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- int z = ch.length;
- while (true) {
- if (numRepeats >= max) break;
- if (matchOneString(input, index)) {
- index += z;
- numRepeats++;
- }
- else break;
- }
- return numRepeats;
- }
+ return mymatch;
+ }
+ // java.util.regex.Matcher#hitEnd() requires that the length of
+ // partial match be counted.
+ mymatch.index += matchedLength;
+ input.setHitEnd (mymatch);
+ return null;
+ }
- // Overrides REToken.chain() to optimize for strings
- boolean chain(REToken next) {
- if (next instanceof RETokenChar && ((RETokenChar)next).insens == insens) {
- RETokenChar cnext = (RETokenChar) next;
- int newsize = ch.length + cnext.ch.length;
-
- char[] chTemp = new char [newsize];
-
- System.arraycopy(ch,0,chTemp,0,ch.length);
- System.arraycopy(cnext.ch,0,chTemp,ch.length,cnext.ch.length);
-
- ch = chTemp;
- if (cnext.next == null)
- return false;
- return chain(cnext.next);
- } else return super.chain(next);
+ private int matchedLength;
+ private boolean matchOneString (CharIndexed input, int index)
+ {
+ matchedLength = 0;
+ int z = ch.length;
+ char c;
+ for (int i = 0; i < z; i++)
+ {
+ c = input.charAt (index + i);
+ if (!charEquals (c, ch[i]))
+ {
+ return false;
+ }
+ ++matchedLength;
+ }
+ return true;
}
- void dump(StringBuffer os) {
- os.append(ch);
+ private boolean charEquals (char c1, char c2)
+ {
+ if (c1 == c2)
+ return true;
+ if (!insens)
+ return false;
+ if (toLowerCase (c1, unicodeAware) == c2)
+ return true;
+ if (toUpperCase (c1, unicodeAware) == c2)
+ return true;
+ return false;
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
}
-}
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ int z = ch.length;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ if (matchOneString (input, index))
+ {
+ index += z;
+ numRepeats++;
+ }
+ else
+ break;
+ }
+ return numRepeats;
+ }
+ // Overrides REToken.chain() to optimize for strings
+ boolean chain (REToken next)
+ {
+ if (next instanceof RETokenChar && ((RETokenChar) next).insens == insens)
+ {
+ RETokenChar cnext = (RETokenChar) next;
+ int newsize = ch.length + cnext.ch.length;
+
+ char[] chTemp = new char[newsize];
+
+ System.arraycopy (ch, 0, chTemp, 0, ch.length);
+ System.arraycopy (cnext.ch, 0, chTemp, ch.length, cnext.ch.length);
+
+ ch = chTemp;
+ if (cnext.next == null)
+ return false;
+ return chain (cnext.next);
+ }
+ else
+ return super.chain (next);
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append (ch);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEnd.java b/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
index 294e32085b5..33e0febb7b2 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEnd.java
@@ -38,7 +38,10 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenEnd extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenEnd extends REToken
+{
/**
* Indicates whether this token should match on a line break.
*/
@@ -51,74 +54,98 @@ final class RETokenEnd extends REToken {
*/
private boolean fake = false;
- RETokenEnd(int subIndex,String newline) {
- super(subIndex);
+ RETokenEnd (int subIndex, String newline)
+ {
+ super (subIndex);
this.newline = newline;
this.check_java_line_terminators = false;
}
- RETokenEnd(int subIndex, String newline, boolean b) {
- super(subIndex);
+ RETokenEnd (int subIndex, String newline, boolean b)
+ {
+ super (subIndex);
this.newline = newline;
this.check_java_line_terminators = b;
}
- void setFake(boolean fake) {
+ void setFake (boolean fake)
+ {
this.fake = fake;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- boolean match(CharIndexed input, REMatch mymatch) {
- if (!fake) return super.match(input, mymatch);
- return super.matchFake(input, mymatch);
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ if (!fake)
+ return super.match (input, mymatch);
+ return super.matchFake (input, mymatch);
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- if (ch == CharIndexed.OUT_OF_BOUNDS)
- return ((mymatch.eflags & RE.REG_NOTEOL)>0) ?
- null : mymatch;
- if (check_java_line_terminators) {
- if (ch == '\n') {
- char ch1 = input.charAt(mymatch.index - 1);
- if (ch1 == '\r') return null;
- return mymatch;
- }
- if (ch == '\r') return mymatch;
- if (ch == '\u0085') return mymatch; // A next-line character
- if (ch == '\u2028') return mymatch; // A line-separator character
- if (ch == '\u2029') return mymatch; // A paragraph-separator character
- return null;
- }
- if (newline != null) {
- char z;
- int i = 0; // position in newline
- do {
- z = newline.charAt(i);
- if (ch != z) return null;
- ++i;
- ch = input.charAt(mymatch.index + i);
- } while (i < newline.length());
-
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ if (ch == CharIndexed.OUT_OF_BOUNDS)
+ return ((mymatch.eflags & RE.REG_NOTEOL) > 0) ? null : mymatch;
+ if (check_java_line_terminators)
+ {
+ if (ch == '\n')
+ {
+ char ch1 = input.charAt (mymatch.index - 1);
+ if (ch1 == '\r')
+ return null;
return mymatch;
- }
+ }
+ if (ch == '\r')
+ return mymatch;
+ if (ch == '\u0085')
+ return mymatch; // A next-line character
+ if (ch == '\u2028')
+ return mymatch; // A line-separator character
+ if (ch == '\u2029')
+ return mymatch; // A paragraph-separator character
return null;
- }
+ }
+ if (newline != null)
+ {
+ char z;
+ int i = 0; // position in newline
+ do
+ {
+ z = newline.charAt (i);
+ if (ch != z)
+ return null;
+ ++i;
+ ch = input.charAt (mymatch.index + i);
+ }
+ while (i < newline.length ());
+
+ return mymatch;
+ }
+ return null;
+ }
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- REMatch m = (REMatch) mymatch.clone();
- REToken tk = (REToken) this.clone();
- tk.chain(null);
- if (tk.match(input, m)) return max;
- else return 0;
- }
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ REMatch m = (REMatch) mymatch.clone ();
+ REToken tk = (REToken) this.clone ();
+ tk.chain (null);
+ if (tk.match (input, m))
+ return max;
+ else
+ return 0;
+ }
- void dump(StringBuffer os) {
- os.append('$');
+ void dump (CPStringBuilder os)
+ {
+ os.append ('$');
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java b/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
index ea5580e1666..e4ad6194168 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEndOfPreviousMatch.java
@@ -37,36 +37,52 @@ exception statement from your version. */
package gnu.java.util.regex;
-class RETokenEndOfPreviousMatch extends RETokenStart {
+import gnu.java.lang.CPStringBuilder;
- RETokenEndOfPreviousMatch(int subIndex) {
- super(subIndex, null);
- }
+class RETokenEndOfPreviousMatch extends RETokenStart
+{
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- REMatch lastMatch = input.getLastMatch();
- if (lastMatch == null) return super.matchThis(input, mymatch);
- if (input.getAnchor()+mymatch.index ==
- lastMatch.anchor+lastMatch.index) {
- return mymatch;
- }
- else {
- return null;
- }
- }
+ RETokenEndOfPreviousMatch (int subIndex)
+ {
+ super (subIndex, null);
+ }
- boolean returnsFixedLengthmatches() { return true; }
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- os.append("\\G");
- }
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ REMatch lastMatch = input.getLastMatch ();
+ if (lastMatch == null)
+ return super.matchThis (input, mymatch);
+ if (input.getAnchor () + mymatch.index ==
+ lastMatch.anchor + lastMatch.index)
+ {
+ return mymatch;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ boolean returnsFixedLengthmatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("\\G");
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java b/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
index b3a28a3e82e..0848207f491 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenEndSub.java
@@ -37,34 +37,43 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenEndSub extends REToken {
- RETokenEndSub(int subIndex) {
- super(subIndex);
- }
+import gnu.java.lang.CPStringBuilder;
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- mymatch.start[subIndex] = mymatch.start1[subIndex];
- mymatch.end[subIndex] = mymatch.index;
- return mymatch;
- }
+final class RETokenEndSub extends REToken
+{
+ RETokenEndSub (int subIndex)
+ {
+ super (subIndex);
+ }
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- mymatch.start[subIndex] = mymatch.start1[subIndex];
- mymatch.end[subIndex] = mymatch.index;
- return super.findMatch(input, mymatch);
- }
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- void setHitEnd(CharIndexed input, REMatch mymatch) {
- // Do nothing
- }
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
+ mymatch.end[subIndex] = mymatch.index;
+ return mymatch;
+ }
- void dump(StringBuffer os) {
- // handled by RE
- // But add something for debugging.
- os.append("(?#RETokenEndSub subIndex=" + subIndex + ")");
- }
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ mymatch.start[subIndex] = mymatch.start1[subIndex];
+ mymatch.end[subIndex] = mymatch.index;
+ return super.findMatch (input, mymatch);
+ }
+
+ void setHitEnd (CharIndexed input, REMatch mymatch)
+ {
+ // Do nothing
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ // handled by RE
+ // But add something for debugging.
+ os.append ("(?#RETokenEndSub subIndex=" + subIndex + ")");
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java b/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
index 48f8656123d..8ad728df837 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenIndependent.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @author Ito Kazumitsu
*/
@@ -44,35 +46,40 @@ final class RETokenIndependent extends REToken
{
REToken re;
- RETokenIndependent(REToken re) throws REException {
- super(0);
+ RETokenIndependent (REToken re) throws REException
+ {
+ super (0);
this.re = re;
}
- int getMinimumLength() {
- return re.getMinimumLength();
+ int getMinimumLength ()
+ {
+ return re.getMinimumLength ();
}
- int getMaximumLength() {
- return re.getMaximumLength();
+ int getMaximumLength ()
+ {
+ return re.getMaximumLength ();
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- boolean b = re.match(input, mymatch);
- if (b) {
- // Once we have found a match, we do not see other possible matches.
- if (mymatch.backtrackStack != null) mymatch.backtrackStack.clear();
- return mymatch;
+ boolean b = re.match (input, mymatch);
+ if (b)
+ {
+ // Once we have found a match, we do not see other possible matches.
+ if (mymatch.backtrackStack != null)
+ mymatch.backtrackStack.clear ();
+ return mymatch;
- }
+ }
return null;
}
- void dump(StringBuffer os) {
- os.append("(?>");
- re.dumpAll(os);
- os.append(')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?>");
+ re.dumpAll (os);
+ os.append (')');
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java b/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
index 134f17c609c..1dc6019380f 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenLookAhead.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @since gnu.regexp 1.1.3
* @author Shashank Bapat
@@ -46,35 +48,41 @@ final class RETokenLookAhead extends REToken
REToken re;
boolean negative;
- RETokenLookAhead(REToken re, boolean negative) throws REException {
- super(0);
+ RETokenLookAhead (REToken re, boolean negative) throws REException
+ {
+ super (0);
this.re = re;
this.negative = negative;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- REMatch trymatch = (REMatch)mymatch.clone();
- if (re.match(input, trymatch)) {
- if (negative) return null;
- trymatch.index = mymatch.index;
- return trymatch;
- }
- else {
- if (negative) return mymatch;
- return null;
- }
+ REMatch trymatch = (REMatch) mymatch.clone ();
+ if (re.match (input, trymatch))
+ {
+ if (negative)
+ return null;
+ trymatch.index = mymatch.index;
+ return trymatch;
+ }
+ else
+ {
+ if (negative)
+ return mymatch;
+ return null;
+ }
}
- void dump(StringBuffer os) {
- os.append("(?");
- os.append(negative ? '!' : '=');
- re.dumpAll(os);
- os.append(')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?");
+ os.append (negative ? '!' : '=');
+ re.dumpAll (os);
+ os.append (')');
+ }
}
-
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java b/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
index a01a15bc90f..f61c93c0abb 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenLookBehind.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* @author Ito Kazumitsu
*/
@@ -45,74 +47,90 @@ final class RETokenLookBehind extends REToken
REToken re;
boolean negative;
- RETokenLookBehind(REToken re, boolean negative) throws REException {
- super(0);
+ RETokenLookBehind (REToken re, boolean negative) throws REException
+ {
+ super (0);
this.re = re;
this.negative = negative;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 0;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch)
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
{
- int max = re.getMaximumLength();
- CharIndexed behind = input.lookBehind(mymatch.index, max);
- REMatch trymatch = (REMatch)mymatch.clone();
- REMatch trymatch1 = (REMatch)mymatch.clone();
- REMatch newMatch = null;
- int diff = behind.length() - input.length();
+ int max = re.getMaximumLength ();
+ CharIndexed behind = input.lookBehind (mymatch.index, max);
+ REMatch trymatch = (REMatch) mymatch.clone ();
+ int diff = behind.length () - input.length ();
int curIndex = trymatch.index + diff;
trymatch.index = 0;
trymatch.offset = 0;
- RETokenMatchHereOnly stopper = new RETokenMatchHereOnly(curIndex);
- REToken re1 = (REToken) re.clone();
- re1.chain(stopper);
- if (re1.match(behind, trymatch)) {
- if (negative) return null;
- for (int i = 0; i < trymatch.start.length; i++) {
- if (trymatch.start[i] != -1 && trymatch.end[i] != -1) {
- trymatch.start[i] -= diff;
- if (trymatch.start[i] < 0) trymatch.start[i] -= 1;
- trymatch.end[i] -= diff;
- if (trymatch.end[i] < 0) trymatch.end[i] -= 1;
+ RETokenMatchHereOnly stopper = new RETokenMatchHereOnly (curIndex);
+ REToken re1 = (REToken) re.clone ();
+ re1.chain (stopper);
+ if (re1.match (behind, trymatch))
+ {
+ if (negative)
+ return null;
+ for (int i = 0; i < trymatch.start.length; i++)
+ {
+ if (trymatch.start[i] != -1 && trymatch.end[i] != -1)
+ {
+ trymatch.start[i] -= diff;
+ if (trymatch.start[i] < 0)
+ trymatch.start[i] -= 1;
+ trymatch.end[i] -= diff;
+ if (trymatch.end[i] < 0)
+ trymatch.end[i] -= 1;
+ }
}
+ trymatch.index = mymatch.index;
+ trymatch.offset = mymatch.offset;
+ return trymatch;
+ }
+ else
+ {
+ if (negative)
+ return mymatch;
+ return null;
}
- trymatch.index = mymatch.index;
- trymatch.offset = mymatch.offset;
- return trymatch;
- }
- else {
- if (negative) return mymatch;
- return null;
- }
}
- void dump(StringBuffer os) {
- os.append("(?<");
- os.append(negative ? '!' : '=');
- re.dumpAll(os);
- os.append(')');
- }
-
- private static class RETokenMatchHereOnly extends REToken {
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?<");
+ os.append (negative ? '!' : '=');
+ re.dumpAll (os);
+ os.append (')');
+ }
- int getMaximumLength() { return 0; }
+ private static class RETokenMatchHereOnly extends REToken
+ {
- private int index;
+ int getMaximumLength ()
+ {
+ return 0;
+ }
- RETokenMatchHereOnly(int index) {
- super(0);
- this.index = index;
- }
+ private int index;
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- return (index == mymatch.index ? mymatch : null);
- }
+ RETokenMatchHereOnly (int index)
+ {
+ super (0);
+ this.index = index;
+ }
- void dump(StringBuffer os) {}
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ return (index == mymatch.index ? mymatch : null);
+ }
+ void dump (CPStringBuilder os)
+ {
}
-}
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java b/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
index 0051f164364..1683cb1bf67 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenNamedProperty.java
@@ -38,303 +38,341 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-final class RETokenNamedProperty extends REToken {
+final class RETokenNamedProperty extends REToken
+{
String name;
boolean insens;
boolean negate;
Handler handler;
// Grouped properties
- static final byte[] LETTER = new byte[]
- { Character.LOWERCASE_LETTER,
+ static final byte[] LETTER = new byte[]{ Character.LOWERCASE_LETTER,
Character.UPPERCASE_LETTER,
Character.TITLECASE_LETTER,
Character.MODIFIER_LETTER,
- Character.OTHER_LETTER };
-
- static final byte[] MARK = new byte[]
- { Character.NON_SPACING_MARK,
+ Character.OTHER_LETTER
+ };
+
+ static final byte[] MARK = new byte[]{ Character.NON_SPACING_MARK,
Character.COMBINING_SPACING_MARK,
- Character.ENCLOSING_MARK };
-
- static final byte[] SEPARATOR = new byte[]
- { Character.SPACE_SEPARATOR,
+ Character.ENCLOSING_MARK
+ };
+
+ static final byte[] SEPARATOR = new byte[]{ Character.SPACE_SEPARATOR,
Character.LINE_SEPARATOR,
- Character.PARAGRAPH_SEPARATOR };
-
- static final byte[] SYMBOL = new byte[]
- { Character.MATH_SYMBOL,
+ Character.PARAGRAPH_SEPARATOR
+ };
+
+ static final byte[] SYMBOL = new byte[]{ Character.MATH_SYMBOL,
Character.CURRENCY_SYMBOL,
Character.MODIFIER_SYMBOL,
- Character.OTHER_SYMBOL };
-
- static final byte[] NUMBER = new byte[]
- { Character.DECIMAL_DIGIT_NUMBER,
+ Character.OTHER_SYMBOL
+ };
+
+ static final byte[] NUMBER = new byte[]{ Character.DECIMAL_DIGIT_NUMBER,
Character.LETTER_NUMBER,
- Character.OTHER_NUMBER };
-
- static final byte[] PUNCTUATION = new byte[]
- { Character.DASH_PUNCTUATION,
+ Character.OTHER_NUMBER
+ };
+
+ static final byte[] PUNCTUATION = new byte[]{ Character.DASH_PUNCTUATION,
Character.START_PUNCTUATION,
Character.END_PUNCTUATION,
Character.CONNECTOR_PUNCTUATION,
Character.OTHER_PUNCTUATION,
Character.INITIAL_QUOTE_PUNCTUATION,
- Character.FINAL_QUOTE_PUNCTUATION};
-
- static final byte[] OTHER = new byte[]
- { Character.CONTROL,
+ Character.FINAL_QUOTE_PUNCTUATION
+ };
+
+ static final byte[] OTHER = new byte[]{ Character.CONTROL,
Character.FORMAT,
Character.PRIVATE_USE,
Character.SURROGATE,
- Character.UNASSIGNED };
+ Character.UNASSIGNED
+ };
- RETokenNamedProperty(int subIndex, String name, boolean insens, boolean negate) throws REException {
- super(subIndex);
+ RETokenNamedProperty (int subIndex, String name, boolean insens,
+ boolean negate) throws REException
+ {
+ super (subIndex);
this.name = name;
this.insens = insens;
this.negate = negate;
- handler = getHandler(name);
+ handler = getHandler (name);
}
- int getMinimumLength() {
- return 1;
- }
+ int getMinimumLength ()
+ {
+ return 1;
+ }
- int getMaximumLength() {
- return 1;
- }
+ int getMaximumLength ()
+ {
+ return 1;
+ }
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
++mymatch.index;
return mymatch;
}
- return null;
+ return null;
}
- private boolean matchOneChar(char ch) {
+ private boolean matchOneChar (char ch)
+ {
if (ch == CharIndexed.OUT_OF_BOUNDS)
return false;
-
- boolean retval = handler.includes(ch);
- if (insens) {
- retval = retval ||
- handler.includes(toUpperCase(ch, unicodeAware)) ||
- handler.includes(toLowerCase(ch, unicodeAware));
- }
- if (negate) retval = !retval;
+ boolean retval = handler.includes (ch);
+ if (insens)
+ {
+ retval = retval ||
+ handler.includes (toUpperCase (ch, unicodeAware)) ||
+ handler.includes (toLowerCase (ch, unicodeAware));
+ }
+
+ if (negate)
+ retval = !retval;
return retval;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
int index = mymatch.index;
int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
numRepeats++;
- }
+ }
return numRepeats;
}
- void dump(StringBuffer os) {
- os.append("\\")
- .append(negate ? "P" : "p")
- .append("{" + name + "}");
+ void dump (CPStringBuilder os)
+ {
+ os.append ("\\").append (negate ? "P" : "p").append ("{" + name + "}");
}
- private abstract static class Handler {
- public abstract boolean includes(char c);
+ private abstract static class Handler
+ {
+ public abstract boolean includes (char c);
}
- private Handler getHandler(String name) throws REException {
- if (name.equals("Lower") ||
- name.equals("Upper") ||
- // name.equals("ASCII") ||
- name.equals("Alpha") ||
- name.equals("Digit") ||
- name.equals("Alnum") ||
- name.equals("Punct") ||
- name.equals("Graph") ||
- name.equals("Print") ||
- name.equals("Blank") ||
- name.equals("Cntrl") ||
- name.equals("XDigit") ||
- name.equals("Space") ) {
- return new POSIXHandler(name);
+ private Handler getHandler (String name) throws REException
+ {
+ if (name.equals ("Lower") || name.equals ("Upper") ||
+ // name.equals("ASCII") ||
+ name.equals ("Alpha") ||
+ name.equals ("Digit") ||
+ name.equals ("Alnum") ||
+ name.equals ("Punct") ||
+ name.equals ("Graph") ||
+ name.equals ("Print") ||
+ name.equals ("Blank") ||
+ name.equals ("Cntrl") ||
+ name.equals ("XDigit") || name.equals ("Space"))
+ {
+ return new POSIXHandler (name);
}
- if (name.startsWith("In")) {
- try {
- name = name.substring(2);
- Character.UnicodeBlock block = Character.UnicodeBlock.forName(name);
- return new UnicodeBlockHandler(block);
- }
- catch (IllegalArgumentException e) {
- throw new REException("Invalid Unicode block name: " + name, REException.REG_ESCAPE, 0);
- }
+ if (name.startsWith ("In"))
+ {
+ try
+ {
+ name = name.substring (2);
+ Character.UnicodeBlock block =
+ Character.UnicodeBlock.forName (name);
+ return new UnicodeBlockHandler (block);
+ }
+ catch (IllegalArgumentException e)
+ {
+ throw new REException ("Invalid Unicode block name: " + name,
+ REException.REG_ESCAPE, 0);
+ }
}
- if (name.startsWith("Is")) {
- name = name.substring(2);
+ if (name.startsWith ("Is"))
+ {
+ name = name.substring (2);
}
- // "grouped properties"
- if (name.equals("L"))
- return new UnicodeCategoriesHandler(LETTER);
- if (name.equals("M"))
- return new UnicodeCategoriesHandler(MARK);
- if (name.equals("Z"))
- return new UnicodeCategoriesHandler(SEPARATOR);
- if (name.equals("S"))
- return new UnicodeCategoriesHandler(SYMBOL);
- if (name.equals("N"))
- return new UnicodeCategoriesHandler(NUMBER);
- if (name.equals("P"))
- return new UnicodeCategoriesHandler(PUNCTUATION);
- if (name.equals("C"))
- return new UnicodeCategoriesHandler(OTHER);
-
- if (name.equals("Mc"))
- return new UnicodeCategoryHandler(Character.COMBINING_SPACING_MARK);
- if (name.equals("Pc"))
- return new UnicodeCategoryHandler(Character.CONNECTOR_PUNCTUATION);
- if (name.equals("Cc"))
- return new UnicodeCategoryHandler(Character.CONTROL);
- if (name.equals("Sc"))
- return new UnicodeCategoryHandler(Character.CURRENCY_SYMBOL);
- if (name.equals("Pd"))
- return new UnicodeCategoryHandler(Character.DASH_PUNCTUATION);
- if (name.equals("Nd"))
- return new UnicodeCategoryHandler(Character.DECIMAL_DIGIT_NUMBER);
- if (name.equals("Me"))
- return new UnicodeCategoryHandler(Character.ENCLOSING_MARK);
- if (name.equals("Pe"))
- return new UnicodeCategoryHandler(Character.END_PUNCTUATION);
- if (name.equals("Pf"))
- return new UnicodeCategoryHandler(Character.FINAL_QUOTE_PUNCTUATION);
- if (name.equals("Cf"))
- return new UnicodeCategoryHandler(Character.FORMAT);
- if (name.equals("Pi"))
- return new UnicodeCategoryHandler(Character.INITIAL_QUOTE_PUNCTUATION);
- if (name.equals("Nl"))
- return new UnicodeCategoryHandler(Character.LETTER_NUMBER);
- if (name.equals("Zl"))
- return new UnicodeCategoryHandler(Character.LINE_SEPARATOR);
- if (name.equals("Ll"))
- return new UnicodeCategoryHandler(Character.LOWERCASE_LETTER);
- if (name.equals("Sm"))
- return new UnicodeCategoryHandler(Character.MATH_SYMBOL);
- if (name.equals("Lm"))
- return new UnicodeCategoryHandler(Character.MODIFIER_LETTER);
- if (name.equals("Sk"))
- return new UnicodeCategoryHandler(Character.MODIFIER_SYMBOL);
- if (name.equals("Mn"))
- return new UnicodeCategoryHandler(Character.NON_SPACING_MARK);
- if (name.equals("Lo"))
- return new UnicodeCategoryHandler(Character.OTHER_LETTER);
- if (name.equals("No"))
- return new UnicodeCategoryHandler(Character.OTHER_NUMBER);
- if (name.equals("Po"))
- return new UnicodeCategoryHandler(Character.OTHER_PUNCTUATION);
- if (name.equals("So"))
- return new UnicodeCategoryHandler(Character.OTHER_SYMBOL);
- if (name.equals("Zp"))
- return new UnicodeCategoryHandler(Character.PARAGRAPH_SEPARATOR);
- if (name.equals("Co"))
- return new UnicodeCategoryHandler(Character.PRIVATE_USE);
- if (name.equals("Zs"))
- return new UnicodeCategoryHandler(Character.SPACE_SEPARATOR);
- if (name.equals("Ps"))
- return new UnicodeCategoryHandler(Character.START_PUNCTUATION);
- if (name.equals("Cs"))
- return new UnicodeCategoryHandler(Character.SURROGATE);
- if (name.equals("Lt"))
- return new UnicodeCategoryHandler(Character.TITLECASE_LETTER);
- if (name.equals("Cn"))
- return new UnicodeCategoryHandler(Character.UNASSIGNED);
- if (name.equals("Lu"))
- return new UnicodeCategoryHandler(Character.UPPERCASE_LETTER);
- if (name.equals("all"))
- return new Handler()
- {
- public boolean includes(char c)
- {
- return true;
- }
- };
- if (name.startsWith("java"))
+ // "grouped properties"
+ if (name.equals ("L"))
+ return new UnicodeCategoriesHandler (LETTER);
+ if (name.equals ("M"))
+ return new UnicodeCategoriesHandler (MARK);
+ if (name.equals ("Z"))
+ return new UnicodeCategoriesHandler (SEPARATOR);
+ if (name.equals ("S"))
+ return new UnicodeCategoriesHandler (SYMBOL);
+ if (name.equals ("N"))
+ return new UnicodeCategoriesHandler (NUMBER);
+ if (name.equals ("P"))
+ return new UnicodeCategoriesHandler (PUNCTUATION);
+ if (name.equals ("C"))
+ return new UnicodeCategoriesHandler (OTHER);
+
+ if (name.equals ("Mc"))
+ return new UnicodeCategoryHandler (Character.COMBINING_SPACING_MARK);
+ if (name.equals ("Pc"))
+ return new UnicodeCategoryHandler (Character.CONNECTOR_PUNCTUATION);
+ if (name.equals ("Cc"))
+ return new UnicodeCategoryHandler (Character.CONTROL);
+ if (name.equals ("Sc"))
+ return new UnicodeCategoryHandler (Character.CURRENCY_SYMBOL);
+ if (name.equals ("Pd"))
+ return new UnicodeCategoryHandler (Character.DASH_PUNCTUATION);
+ if (name.equals ("Nd"))
+ return new UnicodeCategoryHandler (Character.DECIMAL_DIGIT_NUMBER);
+ if (name.equals ("Me"))
+ return new UnicodeCategoryHandler (Character.ENCLOSING_MARK);
+ if (name.equals ("Pe"))
+ return new UnicodeCategoryHandler (Character.END_PUNCTUATION);
+ if (name.equals ("Pf"))
+ return new UnicodeCategoryHandler (Character.FINAL_QUOTE_PUNCTUATION);
+ if (name.equals ("Cf"))
+ return new UnicodeCategoryHandler (Character.FORMAT);
+ if (name.equals ("Pi"))
+ return new UnicodeCategoryHandler (Character.INITIAL_QUOTE_PUNCTUATION);
+ if (name.equals ("Nl"))
+ return new UnicodeCategoryHandler (Character.LETTER_NUMBER);
+ if (name.equals ("Zl"))
+ return new UnicodeCategoryHandler (Character.LINE_SEPARATOR);
+ if (name.equals ("Ll"))
+ return new UnicodeCategoryHandler (Character.LOWERCASE_LETTER);
+ if (name.equals ("Sm"))
+ return new UnicodeCategoryHandler (Character.MATH_SYMBOL);
+ if (name.equals ("Lm"))
+ return new UnicodeCategoryHandler (Character.MODIFIER_LETTER);
+ if (name.equals ("Sk"))
+ return new UnicodeCategoryHandler (Character.MODIFIER_SYMBOL);
+ if (name.equals ("Mn"))
+ return new UnicodeCategoryHandler (Character.NON_SPACING_MARK);
+ if (name.equals ("Lo"))
+ return new UnicodeCategoryHandler (Character.OTHER_LETTER);
+ if (name.equals ("No"))
+ return new UnicodeCategoryHandler (Character.OTHER_NUMBER);
+ if (name.equals ("Po"))
+ return new UnicodeCategoryHandler (Character.OTHER_PUNCTUATION);
+ if (name.equals ("So"))
+ return new UnicodeCategoryHandler (Character.OTHER_SYMBOL);
+ if (name.equals ("Zp"))
+ return new UnicodeCategoryHandler (Character.PARAGRAPH_SEPARATOR);
+ if (name.equals ("Co"))
+ return new UnicodeCategoryHandler (Character.PRIVATE_USE);
+ if (name.equals ("Zs"))
+ return new UnicodeCategoryHandler (Character.SPACE_SEPARATOR);
+ if (name.equals ("Ps"))
+ return new UnicodeCategoryHandler (Character.START_PUNCTUATION);
+ if (name.equals ("Cs"))
+ return new UnicodeCategoryHandler (Character.SURROGATE);
+ if (name.equals ("Lt"))
+ return new UnicodeCategoryHandler (Character.TITLECASE_LETTER);
+ if (name.equals ("Cn"))
+ return new UnicodeCategoryHandler (Character.UNASSIGNED);
+ if (name.equals ("Lu"))
+ return new UnicodeCategoryHandler (Character.UPPERCASE_LETTER);
+ if (name.equals ("all"))
+ return new Handler ()
+ {
+ public boolean includes (char c)
+ {
+ return true;
+ }
+ };
+ if (name.startsWith ("java"))
+ {
+ try
{
- try
- {
- Method m = Character.class.getMethod("is" + name.substring(4),
- Character.TYPE);
- return new JavaCategoryHandler(m);
- }
- catch (NoSuchMethodException e)
- {
- throw new REException("Unsupported Java handler: " + name, e,
- REException.REG_ESCAPE, 0);
- }
+ Method m = Character.class.getMethod ("is" + name.substring (4),
+ Character.TYPE);
+ return new JavaCategoryHandler (m);
}
- throw new REException("unsupported name " + name, REException.REG_ESCAPE, 0);
+ catch (NoSuchMethodException e)
+ {
+ throw new REException ("Unsupported Java handler: " + name, e,
+ REException.REG_ESCAPE, 0);
+ }
+ }
+ throw new REException ("unsupported name " + name, REException.REG_ESCAPE,
+ 0);
}
- private static class POSIXHandler extends Handler {
- private RETokenPOSIX retoken;
- public POSIXHandler(String name) {
- int posixId = RETokenPOSIX.intValue(name.toLowerCase());
- if (posixId != -1)
- retoken = new RETokenPOSIX(0,posixId,false,false);
- else
- throw new RuntimeException("Unknown posix ID: " + name);
- }
- public boolean includes(char c) {
- return retoken.matchOneChar(c);
- }
+ private static class POSIXHandler extends Handler
+ {
+ private RETokenPOSIX retoken;
+ public POSIXHandler (String name)
+ {
+ int posixId = RETokenPOSIX.intValue (name.toLowerCase ());
+ if (posixId != -1)
+ retoken = new RETokenPOSIX (0, posixId, false, false);
+ else
+ throw new RuntimeException ("Unknown posix ID: " + name);
+ }
+ public boolean includes (char c)
+ {
+ return retoken.matchOneChar (c);
+ }
}
- private static class UnicodeCategoryHandler extends Handler {
- public UnicodeCategoryHandler(byte category) {
- this.category = (int)category;
- }
- private int category;
- public boolean includes(char c) {
- return Character.getType(c) == category;
- }
+ private static class UnicodeCategoryHandler extends Handler
+ {
+ public UnicodeCategoryHandler (byte category)
+ {
+ this.category = (int) category;
+ }
+ private int category;
+ public boolean includes (char c)
+ {
+ return Character.getType (c) == category;
+ }
}
- private static class UnicodeCategoriesHandler extends Handler {
- public UnicodeCategoriesHandler(byte[] categories) {
- this.categories = categories;
- }
- private byte[] categories;
- public boolean includes(char c) {
- int category = Character.getType(c);
- for (int i = 0; i < categories.length; i++)
- if (category == categories[i])
- return true;
- return false;
- }
+ private static class UnicodeCategoriesHandler extends Handler
+ {
+ public UnicodeCategoriesHandler (byte[]categories)
+ {
+ this.categories = categories;
+ }
+ private byte[] categories;
+ public boolean includes (char c)
+ {
+ int category = Character.getType (c);
+ for (int i = 0; i < categories.length; i++)
+ if (category == categories[i])
+ return true;
+ return false;
+ }
}
- private static class UnicodeBlockHandler extends Handler {
- public UnicodeBlockHandler(Character.UnicodeBlock block) {
- this.block = block;
- }
- private Character.UnicodeBlock block;
- public boolean includes(char c) {
- Character.UnicodeBlock cblock = Character.UnicodeBlock.of(c);
- return (cblock != null && cblock.equals(block));
- }
+ private static class UnicodeBlockHandler extends Handler
+ {
+ public UnicodeBlockHandler (Character.UnicodeBlock block)
+ {
+ this.block = block;
+ }
+ private Character.UnicodeBlock block;
+ public boolean includes (char c)
+ {
+ Character.UnicodeBlock cblock = Character.UnicodeBlock.of (c);
+ return (cblock != null && cblock.equals (block));
+ }
}
/**
@@ -343,30 +381,29 @@ final class RETokenNamedProperty extends REToken {
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
- private static class JavaCategoryHandler
- extends Handler
+ private static class JavaCategoryHandler extends Handler
{
private Method method;
- public JavaCategoryHandler(Method m)
+ public JavaCategoryHandler (Method m)
{
this.method = m;
}
- public boolean includes(char c)
+ public boolean includes (char c)
{
try
- {
- return (Boolean) method.invoke(null, c);
- }
+ {
+ return (Boolean) method.invoke (null, c);
+ }
catch (IllegalAccessException e)
- {
- throw new InternalError("Unable to access method " + method);
- }
+ {
+ throw new InternalError ("Unable to access method " + method);
+ }
catch (InvocationTargetException e)
- {
- throw new InternalError("Error invoking " + method);
- }
+ {
+ throw new InternalError ("Error invoking " + method);
+ }
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java b/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
index 239c2201ca7..fcae3c2d1d9 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenOneOf.java
@@ -36,23 +36,29 @@ obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.java.util.regex;
-import java.util.Vector;
-import java.util.Stack;
-final class RETokenOneOf extends REToken {
- private Vector options;
+import gnu.java.lang.CPStringBuilder;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.List;
+
+final class RETokenOneOf extends REToken
+{
+ private final List < REToken > options;
private boolean negative;
// True if this RETokenOneOf is supposed to match only one character,
// which is typically the case of a character class expression.
private boolean matchesOneChar;
- private Vector addition;
- // This Vector addition is used to store nested character classes.
+ private final List < Object > addition;
+ // This ArrayList addition is used to store nested character classes.
// For example, if the original expression is
// [2-7a-c[f-k][m-z]&&[^p-v][st]]
- // the basic part /2-7a-c/ is stored in the Vector options, and
+ // the basic part /2-7a-c/ is stored in the ArrayList options, and
// the additional part /[f-k][m-z]&&[^p-v][st]/ is stored in the
- // Vector addition in the following order (Reverse Polish Notation):
+ // ArrayList addition in the following order (Reverse Polish Notation):
// -- The matching result of the basic part is assumed here.
// [f-k] -- REToken
// "|" -- or
@@ -65,7 +71,7 @@ final class RETokenOneOf extends REToken {
// "|" -- or
// "&" -- and
//
- // As it is clear from the explanation above, the Vector addition is
+ // As it is clear from the explanation above, the ArrayList addition is
// effective only when this REToken originates from a character class
// expression.
@@ -73,209 +79,254 @@ final class RETokenOneOf extends REToken {
// e.g. \d --> new RETokenOneOf("0123456789",false, ..)
// \D --> new RETokenOneOf("0123456789",true, ..)
- RETokenOneOf(int subIndex, String optionsStr, boolean negative, boolean insens) {
- super(subIndex);
- options = new Vector();
+ RETokenOneOf (int subIndex, String optionsStr, boolean negative,
+ boolean insens)
+ {
+ super (subIndex);
+ options = new ArrayList < REToken > ();
this.negative = negative;
- for (int i = 0; i < optionsStr.length(); i++)
- options.addElement(new RETokenChar(subIndex,optionsStr.charAt(i),insens));
+ for (int i = 0; i < optionsStr.length (); i++)
+ options.add (new RETokenChar (subIndex, optionsStr.charAt (i), insens));
matchesOneChar = true;
+ addition = null;
}
- RETokenOneOf(int subIndex, Vector options, boolean negative) {
- super(subIndex);
- this.options = options;
- this.negative = negative;
- matchesOneChar = negative;
+ RETokenOneOf (int subIndex, List < REToken > options, boolean negative)
+ {
+ this (subIndex, options, null, negative);
}
- RETokenOneOf(int subIndex, Vector options, Vector addition, boolean negative) {
- super(subIndex);
+ RETokenOneOf (int subIndex, List < REToken > options,
+ List < Object > addition, boolean negative)
+ {
+ super (subIndex);
this.options = options;
this.addition = addition;
this.negative = negative;
matchesOneChar = (negative || addition != null);
}
- int getMinimumLength() {
- if (matchesOneChar) return 1;
+ int getMinimumLength ()
+ {
+ if (matchesOneChar)
+ return 1;
int min = Integer.MAX_VALUE;
int x;
- for (int i=0; i < options.size(); i++) {
- if ((x = ((REToken) options.elementAt(i)).getMinimumLength()) < min)
- min = x;
- }
+ for (REToken t:options)
+ {
+ if ((x = t.getMinimumLength ()) < min)
+ min = x;
+ }
return min;
}
- int getMaximumLength() {
- if (matchesOneChar) return 1;
+ int getMaximumLength ()
+ {
+ if (matchesOneChar)
+ return 1;
int max = 0;
int x;
- for (int i=0; i < options.size(); i++) {
- if ((x = ((REToken) options.elementAt(i)).getMaximumLength()) > max)
- max = x;
- }
+ for (REToken t:options)
+ {
+ if ((x = t.getMaximumLength ()) > max)
+ max = x;
+ }
return max;
}
- boolean match(CharIndexed input, REMatch mymatch) {
- setHitEnd(input, mymatch);
- if (matchesOneChar) return matchOneChar(input, mymatch);
- else return matchOneRE(input, mymatch);
- }
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ setHitEnd (input, mymatch);
+ if (matchesOneChar)
+ return matchOneChar (input, mymatch);
+ else
+ return matchOneRE (input, mymatch);
+ }
- boolean matchOneChar(CharIndexed input, REMatch mymatch) {
- REMatch tryMatch;
- boolean tryOnly;
- if (addition == null) {
- tryMatch = mymatch;
- tryOnly = false;
+ boolean matchOneChar (CharIndexed input, REMatch mymatch)
+ {
+ REMatch tryMatch;
+ boolean tryOnly;
+ if (addition == null)
+ {
+ tryMatch = mymatch;
+ tryOnly = false;
}
- else {
- tryMatch = (REMatch) mymatch.clone();
- tryOnly = true;
+ else
+ {
+ tryMatch = (REMatch) mymatch.clone ();
+ tryOnly = true;
}
- boolean b = negative ?
- matchN(input, tryMatch, tryOnly) :
- matchP(input, tryMatch, tryOnly);
- if (addition == null) return b;
+ boolean b = negative ?
+ matchN (input, tryMatch, tryOnly) : matchP (input, tryMatch, tryOnly);
+ if (addition == null)
+ return b;
- Stack stack = new Stack();
- stack.push(new Boolean(b));
- for (int i=0; i < addition.size(); i++) {
- Object obj = addition.elementAt(i);
- if (obj instanceof REToken) {
- b = ((REToken)obj).match(input, (REMatch)mymatch.clone());
- stack.push(new Boolean(b));
- }
- else if (obj instanceof Boolean) {
- stack.push(obj);
- }
- else if (obj.equals("|")) {
- b = ((Boolean)stack.pop()).booleanValue();
- b = ((Boolean)stack.pop()).booleanValue() || b;
- stack.push(new Boolean(b));
- }
- else if (obj.equals("&")) {
- b = ((Boolean)stack.pop()).booleanValue();
- b = ((Boolean)stack.pop()).booleanValue() && b;
- stack.push(new Boolean(b));
- }
- else {
- throw new RuntimeException("Invalid object found");
- }
+ final Deque < Boolean > stack = new ArrayDeque < Boolean > ();
+ stack.push (new Boolean (b));
+ for (Object obj:addition)
+ {
+ if (obj instanceof REToken)
+ {
+ b = ((REToken) obj).match (input, (REMatch) mymatch.clone ());
+ stack.push (new Boolean (b));
+ }
+ else if (obj instanceof Boolean)
+ {
+ stack.push ((Boolean) obj);
+ }
+ else if (obj.equals ("|"))
+ {
+ b = stack.pop ();
+ b = stack.pop () || b;
+ stack.push (new Boolean (b));
+ }
+ else if (obj.equals ("&"))
+ {
+ b = stack.pop ();
+ b = stack.pop () && b;
+ stack.push (new Boolean (b));
+ }
+ else
+ {
+ throw new RuntimeException ("Invalid object found");
+ }
}
- b = ((Boolean)stack.pop()).booleanValue();
- if (b) {
- ++mymatch.index;
- return next(input, mymatch);
+ if (stack.pop ())
+ {
+ ++mymatch.index;
+ return next (input, mymatch);
}
- return false;
- }
+ return false;
+ }
- private boolean matchN(CharIndexed input, REMatch mymatch, boolean tryOnly) {
- if (input.charAt(mymatch.index) == CharIndexed.OUT_OF_BOUNDS)
- return false;
+ private boolean matchN (CharIndexed input, REMatch mymatch, boolean tryOnly)
+ {
+ if (input.charAt (mymatch.index) == CharIndexed.OUT_OF_BOUNDS)
+ return false;
- REMatch newMatch = null;
- REMatch last = null;
- REToken tk;
- for (int i=0; i < options.size(); i++) {
- tk = (REToken) options.elementAt(i);
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tk.match(input, tryMatch)) { // match was successful
+ for (REToken tk:options)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tk.match (input, tryMatch))
+ { // match was successful
return false;
- } // is a match
- } // try next option
+ } // is a match
+ } // try next option
- if (tryOnly) return true;
- ++mymatch.index;
- return next(input, mymatch);
- }
+ if (tryOnly)
+ return true;
+ ++mymatch.index;
+ return next (input, mymatch);
+ }
- private boolean matchP(CharIndexed input, REMatch mymatch, boolean tryOnly) {
- REToken tk;
- for (int i=0; i < options.size(); i++) {
- tk = (REToken) options.elementAt(i);
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tk.match(input, tryMatch)) { // match was successful
- if (tryOnly) return true;
- if (next(input, tryMatch)) {
- mymatch.assignFrom(tryMatch);
+ private boolean matchP (CharIndexed input, REMatch mymatch, boolean tryOnly)
+ {
+ for (REToken tk:options)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tk.match (input, tryMatch))
+ { // match was successful
+ if (tryOnly)
return true;
+ if (next (input, tryMatch))
+ {
+ mymatch.assignFrom (tryMatch);
+ return true;
+ }
}
- }
}
- return false;
- }
+ return false;
+ }
- private boolean matchOneRE(CharIndexed input, REMatch mymatch) {
- REMatch newMatch = findMatch(input, mymatch);
- if (newMatch != null) {
- mymatch.assignFrom(newMatch);
- return true;
+ private boolean matchOneRE (CharIndexed input, REMatch mymatch)
+ {
+ REMatch newMatch = findMatch (input, mymatch);
+ if (newMatch != null)
+ {
+ mymatch.assignFrom (newMatch);
+ return true;
}
- return false;
+ return false;
}
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (matchesOneChar) return super.findMatch(input, mymatch);
- return findMatch(input, mymatch, 0);
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (matchesOneChar)
+ return super.findMatch (input, mymatch);
+ return findMatch (input, mymatch, 0);
}
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- return findMatch(input, mymatch, ((Integer)param).intValue());
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ return findMatch (input, mymatch, ((Integer) param).intValue ());
}
- private REMatch findMatch(CharIndexed input, REMatch mymatch, int optionIndex) {
- for (int i = optionIndex; i < options.size(); i++) {
- REToken tk = (REToken) options.elementAt(i);
- tk = (REToken) tk.clone();
- tk.chain(getNext());
- REMatch tryMatch = (REMatch) mymatch.clone();
- if (tryMatch.backtrackStack == null) {
- tryMatch.backtrackStack = new BacktrackStack();
+ private REMatch findMatch (CharIndexed input, REMatch mymatch,
+ int optionIndex)
+ {
+ for (int i = optionIndex; i < options.size (); i++)
+ {
+ REToken tk = options.get (i);
+ tk = (REToken) tk.clone ();
+ tk.chain (getNext ());
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ if (tryMatch.backtrackStack == null)
+ {
+ tryMatch.backtrackStack = new BacktrackStack ();
}
- boolean stackPushed = false;
- if (i + 1 < options.size()) {
- tryMatch.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, new Integer(i + 1)));
+ boolean stackPushed = false;
+ if (i + 1 < options.size ())
+ {
+ tryMatch.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ i + 1));
stackPushed = true;
- }
- boolean b = tk.match(input, tryMatch);
- if (b) {
- return tryMatch;
}
- if (stackPushed) tryMatch.backtrackStack.pop();
+ if (tk.match (input, tryMatch))
+ {
+ return tryMatch;
+ }
+ if (stackPushed)
+ tryMatch.backtrackStack.pop ();
}
- return null;
+ return null;
}
- boolean returnsFixedLengthMatches() { return matchesOneChar; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return matchesOneChar;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (!matchesOneChar)
- return super.findFixedLengthMatches(input, mymatch, max);
- int numRepeats = 0;
- REMatch m = (REMatch) mymatch.clone();
- REToken tk = (REToken) this.clone();
- tk.chain(null);
- while (true) {
- if (numRepeats >= max) break;
- m = tk.findMatch(input, m);
- if (m == null) break;
- numRepeats++;
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (!matchesOneChar)
+ return super.findFixedLengthMatches (input, mymatch, max);
+ int numRepeats = 0;
+ REMatch m = (REMatch) mymatch.clone ();
+ REToken tk = (REToken) this.clone ();
+ tk.chain (null);
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ m = tk.findMatch (input, m);
+ if (m == null)
+ break;
+ numRepeats++;
}
- return numRepeats;
+ return numRepeats;
}
- void dump(StringBuffer os) {
- os.append(negative ? "[^" : "(?:");
- for (int i = 0; i < options.size(); i++) {
- if (!negative && (i > 0)) os.append('|');
- ((REToken) options.elementAt(i)).dumpAll(os);
- }
- os.append(negative ? ']' : ')');
- }
+ void dump (CPStringBuilder os)
+ {
+ os.append (negative ? "[^" : "(?:");
+ for (int i = 0; i < options.size (); i++)
+ {
+ if (!negative && (i > 0))
+ os.append ('|');
+ options.get (i).dumpAll (os);
+ }
+ os.append (negative ? ']' : ')');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java b/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
index 07298958365..2c809570bbf 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenPOSIX.java
@@ -38,130 +38,158 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenPOSIX extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenPOSIX extends REToken
+{
int type;
boolean insens;
boolean negated;
- static final int ALNUM = 0;
- static final int ALPHA = 1;
- static final int BLANK = 2;
- static final int CNTRL = 3;
- static final int DIGIT = 4;
- static final int GRAPH = 5;
- static final int LOWER = 6;
- static final int PRINT = 7;
- static final int PUNCT = 8;
- static final int SPACE = 9;
- static final int UPPER = 10;
+ static final int ALNUM = 0;
+ static final int ALPHA = 1;
+ static final int BLANK = 2;
+ static final int CNTRL = 3;
+ static final int DIGIT = 4;
+ static final int GRAPH = 5;
+ static final int LOWER = 6;
+ static final int PRINT = 7;
+ static final int PUNCT = 8;
+ static final int SPACE = 9;
+ static final int UPPER = 10;
static final int XDIGIT = 11;
// Array indices correspond to constants defined above.
- static final String[] s_nameTable = {
+ static final String[] s_nameTable = {
"alnum", "alpha", "blank", "cntrl", "digit", "graph", "lower",
- "print", "punct", "space", "upper", "xdigit"
+ "print", "punct", "space", "upper", "xdigit"
};
// The RE constructor uses this to look up the constant for a string
- static int intValue(String key) {
- for (int i = 0; i < s_nameTable.length; i++) {
- if (s_nameTable[i].equals(key)) return i;
- }
+ static int intValue (String key)
+ {
+ for (int i = 0; i < s_nameTable.length; i++)
+ {
+ if (s_nameTable[i].equals (key))
+ return i;
+ }
return -1;
}
- RETokenPOSIX(int subIndex, int type, boolean insens, boolean negated) {
- super(subIndex);
+ RETokenPOSIX (int subIndex, int type, boolean insens, boolean negated)
+ {
+ super (subIndex);
this.type = type;
this.insens = insens;
this.negated = negated;
}
- int getMinimumLength() {
- return 1;
- }
+ int getMinimumLength ()
+ {
+ return 1;
+ }
- int getMaximumLength() {
- return 1;
- }
+ int getMaximumLength ()
+ {
+ return 1;
+ }
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char ch = input.charAt(mymatch.index);
- boolean retval = matchOneChar(ch);
- if (retval) {
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char ch = input.charAt (mymatch.index);
+ boolean retval = matchOneChar (ch);
+ if (retval)
+ {
++mymatch.index;
return mymatch;
}
- return null;
- }
+ return null;
+ }
- boolean matchOneChar(char ch) {
+ boolean matchOneChar (char ch)
+ {
if (ch == CharIndexed.OUT_OF_BOUNDS)
return false;
-
+
boolean retval = false;
- switch (type) {
- case ALNUM:
+ switch (type)
+ {
+ case ALNUM:
// Note that there is some debate over whether '_' should be included
- retval = Character.isLetterOrDigit(ch) || (ch == '_');
+ retval = Character.isLetterOrDigit (ch) || (ch == '_');
break;
- case ALPHA:
- retval = Character.isLetter(ch);
+ case ALPHA:
+ retval = Character.isLetter (ch);
break;
- case BLANK:
+ case BLANK:
retval = ((ch == ' ') || (ch == '\t'));
break;
- case CNTRL:
- retval = Character.isISOControl(ch);
+ case CNTRL:
+ retval = Character.isISOControl (ch);
break;
- case DIGIT:
- retval = Character.isDigit(ch);
+ case DIGIT:
+ retval = Character.isDigit (ch);
break;
- case GRAPH:
- retval = (!(Character.isWhitespace(ch) || Character.isISOControl(ch)));
+ case GRAPH:
+ retval =
+ (!(Character.isWhitespace (ch) || Character.isISOControl (ch)));
break;
- case LOWER:
- retval = ((insens && Character.isLetter(ch)) || Character.isLowerCase(ch));
+ case LOWER:
+ retval = ((insens && Character.isLetter (ch))
+ || Character.isLowerCase (ch));
break;
- case PRINT:
- retval = (!(Character.isWhitespace(ch) || Character.isISOControl(ch)))
- || (ch == ' ');
+ case PRINT:
+ retval =
+ (!(Character.isWhitespace (ch) || Character.isISOControl (ch)))
+ || (ch == ' ');
break;
- case PUNCT:
+ case PUNCT:
// This feels sloppy, especially for non-U.S. locales.
- retval = ("`~!@#$%^&*()-_=+[]{}\\|;:'\"/?,.<>".indexOf(ch)!=-1);
+ retval = ("`~!@#$%^&*()-_=+[]{}\\|;:'\"/?,.<>".indexOf (ch) != -1);
break;
- case SPACE:
- retval = Character.isWhitespace(ch);
+ case SPACE:
+ retval = Character.isWhitespace (ch);
break;
- case UPPER:
- retval = ((insens && Character.isLetter(ch)) || Character.isUpperCase(ch));
+ case UPPER:
+ retval = ((insens && Character.isLetter (ch))
+ || Character.isUpperCase (ch));
break;
- case XDIGIT:
- retval = (Character.isDigit(ch) || ("abcdefABCDEF".indexOf(ch)!=-1));
+ case XDIGIT:
+ retval = (Character.isDigit (ch)
+ || ("abcdefABCDEF".indexOf (ch) != -1));
break;
- }
+ }
- if (negated) retval = !retval;
+ if (negated)
+ retval = !retval;
return retval;
}
- boolean returnsFixedLengthMatches() { return true; }
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
numRepeats++;
}
- return numRepeats;
+ return numRepeats;
}
- void dump(StringBuffer os) {
- if (negated) os.append('^');
- os.append("[:" + s_nameTable[type] + ":]");
+ void dump (CPStringBuilder os)
+ {
+ if (negated)
+ os.append ('^');
+ os.append ("[:" + s_nameTable[type] + ":]");
}
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenRange.java b/libjava/classpath/gnu/java/util/regex/RETokenRange.java
index 8a65f77f13f..2597d4d07cb 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenRange.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenRange.java
@@ -37,64 +37,83 @@ exception statement from your version. */
package gnu.java.util.regex;
-final class RETokenRange extends REToken {
+import gnu.java.lang.CPStringBuilder;
+
+final class RETokenRange extends REToken
+{
private char lo, hi;
private boolean insens;
- RETokenRange(int subIndex, char lo, char hi, boolean ins) {
- super(subIndex);
+ RETokenRange (int subIndex, char lo, char hi, boolean ins)
+ {
+ super (subIndex);
insens = ins;
this.lo = lo;
this.hi = hi;
}
- int getMinimumLength() {
+ int getMinimumLength ()
+ {
return 1;
}
- int getMaximumLength() {
+ int getMaximumLength ()
+ {
return 1;
}
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- char c = input.charAt(mymatch.index);
- if (matchOneChar(c)) {
- ++mymatch.index;
- return mymatch;
- }
- return null;
- }
-
- boolean matchOneChar(char c) {
- if (c == CharIndexed.OUT_OF_BOUNDS) return false;
- boolean matches = (c >= lo) && (c <= hi);
- if (! matches && insens) {
- char c1 = toLowerCase(c, unicodeAware);
- matches = (c1 >= lo) && (c1 <= hi);
- if (!matches) {
- c1 = toUpperCase(c, unicodeAware);
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ char c = input.charAt (mymatch.index);
+ if (matchOneChar (c))
+ {
+ ++mymatch.index;
+ return mymatch;
+ }
+ return null;
+ }
+
+ boolean matchOneChar (char c)
+ {
+ if (c == CharIndexed.OUT_OF_BOUNDS)
+ return false;
+ boolean matches = (c >= lo) && (c <= hi);
+ if (!matches && insens)
+ {
+ char c1 = toLowerCase (c, unicodeAware);
+ matches = (c1 >= lo) && (c1 <= hi);
+ if (!matches)
+ {
+ c1 = toUpperCase (c, unicodeAware);
matches = (c1 >= lo) && (c1 <= hi);
}
- }
- return matches;
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- int index = mymatch.index;
- int numRepeats = 0;
- while (true) {
- if (numRepeats >= max) break;
- char ch = input.charAt(index++);
- if (! matchOneChar(ch)) break;
- numRepeats++;
- }
- return numRepeats;
- }
-
- void dump(StringBuffer os) {
- os.append(lo).append('-').append(hi);
+ }
+ return matches;
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ int index = mymatch.index;
+ int numRepeats = 0;
+ while (true)
+ {
+ if (numRepeats >= max)
+ break;
+ char ch = input.charAt (index++);
+ if (!matchOneChar (ch))
+ break;
+ numRepeats++;
+ }
+ return numRepeats;
}
-}
+ void dump (CPStringBuilder os)
+ {
+ os.append (lo).append ('-').append (hi);
+ }
+}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java b/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
index 7f5e5626f1e..0ba880d3987 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenRepeated.java
@@ -38,493 +38,602 @@ exception statement from your version. */
package gnu.java.util.regex;
-import java.util.ArrayList;
-
-final class RETokenRepeated extends REToken {
- private REToken token;
- private int min,max;
- private boolean stingy;
- private boolean possessive;
- private int tokenFixedLength;
-
- RETokenRepeated(int subIndex, REToken token, int min, int max) {
- super(subIndex);
- this.token = token;
- this.min = min;
- this.max = max;
- if (token.returnsFixedLengthMatches()) {
- tokenFixedLength = token.getMaximumLength();
- }
- else {
- tokenFixedLength = -1;
- }
- }
+import gnu.java.lang.CPStringBuilder;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+final class RETokenRepeated extends REToken
+{
+ private REToken token;
+ private int min, max;
+ private boolean stingy;
+ private boolean possessive;
+ private int tokenFixedLength;
+
+ RETokenRepeated (int subIndex, REToken token, int min, int max)
+ {
+ super (subIndex);
+ this.token = token;
+ this.min = min;
+ this.max = max;
+ if (token.returnsFixedLengthMatches ())
+ {
+ tokenFixedLength = token.getMaximumLength ();
+ }
+ else
+ {
+ tokenFixedLength = -1;
+ }
+ }
/** Sets the minimal matching mode to true. */
- void makeStingy() {
- stingy = true;
- }
-
+ void makeStingy ()
+ {
+ stingy = true;
+ }
+
/** Queries if this token has minimal matching enabled. */
- boolean isStingy() {
- return stingy;
- }
+ boolean isStingy ()
+ {
+ return stingy;
+ }
/** Sets possessive matching mode to true. */
- void makePossessive() {
- possessive = true;
- }
+ void makePossessive ()
+ {
+ possessive = true;
+ }
/** Queries if this token has possessive matching enabled. */
- boolean isPossessive() {
- return possessive;
- }
-
+ boolean isPossessive ()
+ {
+ return possessive;
+ }
+
/**
* The minimum length of a repeated token is the minimum length
* of the token multiplied by the minimum number of times it must
* match.
*/
- int getMinimumLength() {
- return (min * token.getMinimumLength());
+ int getMinimumLength ()
+ {
+ return (min * token.getMinimumLength ());
+ }
+
+ int getMaximumLength ()
+ {
+ if (max == Integer.MAX_VALUE)
+ return Integer.MAX_VALUE;
+ int tmax = token.getMaximumLength ();
+ if (tmax == Integer.MAX_VALUE)
+ return tmax;
+ return (max * tmax);
+ }
+
+ // The comment "MUST make a clone" below means that some tests
+ // failed without doing clone(),
+
+ private static class DoablesFinder
+ {
+ private REToken tk;
+ private CharIndexed input;
+ private REMatch rematch;
+ private boolean findFirst;
+
+ private DoablesFinder (REToken tk, CharIndexed input, REMatch mymatch)
+ {
+ this.tk = tk;
+ this.input = input;
+ this.rematch = (REMatch) mymatch.clone (); // MUST make a clone
+ this.rematch.backtrackStack = new BacktrackStack ();
+ findFirst = true;
}
- int getMaximumLength() {
- if (max == Integer.MAX_VALUE) return Integer.MAX_VALUE;
- int tmax = token.getMaximumLength();
- if (tmax == Integer.MAX_VALUE) return tmax;
- return (max * tmax);
- }
-
- // The comment "MUST make a clone" below means that some tests
- // failed without doing clone(),
-
- private static class DoablesFinder {
- private REToken tk;
- private CharIndexed input;
- private REMatch rematch;
- private boolean findFirst;
-
- private DoablesFinder(REToken tk, CharIndexed input, REMatch mymatch) {
- this.tk = tk;
- this.input = input;
- this.rematch = (REMatch) mymatch.clone(); // MUST make a clone
- this.rematch.backtrackStack = new BacktrackStack();
- findFirst = true;
+ private REMatch find ()
+ {
+ int origin = rematch.index;
+ REMatch rem;
+ if (findFirst)
+ {
+ rem = tk.findMatch (input, rematch);
+ findFirst = false;
}
-
- private REMatch find() {
- int origin = rematch.index;
- REMatch rem;
- if (findFirst) {
- rem = tk.findMatch(input, rematch);
- findFirst = false;
- }
- else {
- while (true) {
- if (rematch.backtrackStack.empty()) {
- rem = null;
- break;
- }
- BacktrackStack.Backtrack bt = rematch.backtrackStack.pop();
- rem = bt.token.backtrack(bt.input, bt.match, bt.param);
- if (rem != null) break;
+ else
+ {
+ while (true)
+ {
+ if (rematch.backtrackStack.empty ())
+ {
+ rem = null;
+ break;
}
+ BacktrackStack.Backtrack bt = rematch.backtrackStack.pop ();
+ rem = bt.token.backtrack (bt.input, bt.match, bt.param);
+ if (rem != null)
+ break;
}
- if (rem == null) return null;
- if (rem.index == origin) rem.empty = true;
- rematch = rem;
- return (REMatch) rem.clone(); // MUST make a clone.
- }
-
- boolean noMore() {
- return rematch.backtrackStack.empty();
- }
- }
-
- REMatch findMatch(CharIndexed input, REMatch mymatch) {
- if (tokenFixedLength >= 0) return findMatchFixedLength(input, mymatch);
- BacktrackStack stack = new BacktrackStack();
- stack.push(new StackedInfo(input, 0, mymatch, null, null));
- return findMatch(stack);
- }
-
- REMatch backtrack(CharIndexed input, REMatch mymatch, Object param) {
- if (tokenFixedLength >= 0) return backtrackFixedLength(input, mymatch, param);
- return findMatch((BacktrackStack)param);
- }
-
- private static class StackedInfo extends BacktrackStack.Backtrack {
- int numRepeats;
- int[] visited;
- DoablesFinder finder;
- StackedInfo(CharIndexed input, int numRepeats, REMatch match,
- int[] visited, DoablesFinder finder) {
- super(null, input, match, null);
- this.numRepeats = numRepeats;
- this.visited = visited;
- this.finder = finder;
}
+ if (rem == null)
+ return null;
+ if (rem.index == origin)
+ rem.empty = true;
+ rematch = rem;
+ return (REMatch) rem.clone (); // MUST make a clone.
}
- private static class FindMatchControlStack extends ArrayList {
- private void push(FindMatchControl control) {
- add(control);
- }
- private FindMatchControl pop() {
- return (FindMatchControl)remove(size()-1);
- }
- private boolean empty() {
- return isEmpty();
- }
+ boolean noMore ()
+ {
+ return rematch.backtrackStack.empty ();
}
-
- private static class FindMatchControl {
- DoablesFinder finder;
- FindMatchControl(DoablesFinder finder) {
- this.finder = finder;
- }
+ }
+
+ REMatch findMatch (CharIndexed input, REMatch mymatch)
+ {
+ if (tokenFixedLength >= 0)
+ return findMatchFixedLength (input, mymatch);
+ BacktrackStack stack = new BacktrackStack ();
+ stack.push (new StackedInfo (input, 0, mymatch, null, null));
+ return findMatch (stack);
+ }
+
+ REMatch backtrack (CharIndexed input, REMatch mymatch, Object param)
+ {
+ if (tokenFixedLength >= 0)
+ return backtrackFixedLength (input, mymatch, param);
+ return findMatch ((BacktrackStack) param);
+ }
+
+ private static class StackedInfo extends BacktrackStack.Backtrack
+ {
+ int numRepeats;
+ int[] visited;
+ DoablesFinder finder;
+ StackedInfo (CharIndexed input, int numRepeats, REMatch match,
+ int[]visited, DoablesFinder finder)
+ {
+ super (null, input, match, null);
+ this.numRepeats = numRepeats;
+ this.visited = visited;
+ this.finder = finder;
}
-
- private REMatch findMatch(BacktrackStack stack) {
- return findMatch(stack, new FindMatchControlStack());
+ }
+
+ private static class FindMatchControl
+ {
+ DoablesFinder finder;
+ FindMatchControl (DoablesFinder finder)
+ {
+ this.finder = finder;
}
-
- private REMatch findMatch(BacktrackStack stack,
- FindMatchControlStack controlStack) {
- REMatch result = null;
- StackedInfo si = null;
- CharIndexed input = null;
- int numRepeats = 0;
- REMatch mymatch = null;
- int[] visited = null;
- DoablesFinder finder = null;
-
- // Avoid using recursive calls because a match can be very long.
-
- // This is the first entry point of this method.
- // If you want to call this method recursively and you need the
- // result returned, save necessary information in a FindMatchControl
- // object and push it to controlStack, then continue from this point.
- // You can check the result after exiting MAIN_LOOP.
- MAIN_LOOP0:
- while (true) {
+ }
+
+ private REMatch findMatch (BacktrackStack stack)
+ {
+ return findMatch (stack, new ArrayDeque < FindMatchControl > ());
+ }
+
+ private REMatch findMatch (BacktrackStack stack,
+ Deque < FindMatchControl > controlStack)
+ {
+ REMatch result = null;
+ StackedInfo si = null;
+ CharIndexed input = null;
+ int numRepeats = 0;
+ REMatch mymatch = null;
+ int[] visited = null;
+ DoablesFinder finder = null;
+
+ // Avoid using recursive calls because a match can be very long.
+
+ // This is the first entry point of this method.
+ // If you want to call this method recursively and you need the
+ // result returned, save necessary information in a FindMatchControl
+ // object and push it to controlStack, then continue from this point.
+ // You can check the result after exiting MAIN_LOOP.
+ MAIN_LOOP0:
+ while (true)
+ {
// This is the second entry point of this method.
// If you want to call this method recursively but you do not need the
// result returned, just continue from this point.
- MAIN_LOOP:
- while (true) {
-
- if (stack.empty()) break MAIN_LOOP;
- si = (StackedInfo)(stack.peek());
- input = si.input;
- numRepeats = si.numRepeats;
- mymatch = si.match;
- visited = si.visited;
- finder = si.finder;
-
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
-
- if (numRepeats >= max) {
- stack.pop();
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
- result = m1;
+ MAIN_LOOP:
+ while (true)
+ {
+
+ if (stack.empty ())
+ break MAIN_LOOP;
+ si = (StackedInfo) (stack.peek ());
+ input = si.input;
+ numRepeats = si.numRepeats;
+ mymatch = si.match;
+ visited = si.visited;
+ finder = si.finder;
+
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+
+ if (numRepeats >= max)
+ {
+ stack.pop ();
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input,
+ mymatch, stack));
+ }
+ result = m1;
+ break MAIN_LOOP;
+ }
+ if (stingy)
+ {
+ continue MAIN_LOOP;
+ }
break MAIN_LOOP;
- }
- if (stingy) {
- continue MAIN_LOOP;
- }
- break MAIN_LOOP;
- }
-
- if (finder == null) {
- finder = new DoablesFinder(token, input, mymatch);
- si.finder = finder;
- }
-
- if (numRepeats < min) {
- while (true) {
- REMatch doable = finder.find();
- if (doable == null) {
- if (stack.empty()) return null;
- stack.pop();
+ }
+
+ if (finder == null)
+ {
+ finder = new DoablesFinder (token, input, mymatch);
+ si.finder = finder;
+ }
+
+ if (numRepeats < min)
+ {
+ while (true)
+ {
+ REMatch doable = finder.find ();
+ if (doable == null)
+ {
+ if (stack.empty ())
+ return null;
+ stack.pop ();
+ continue MAIN_LOOP;
+ }
+ if (finder.noMore ())
+ stack.pop ();
+ int newNumRepeats = (doable.empty ? min : numRepeats + 1);
+ stack.
+ push (new
+ StackedInfo (input, newNumRepeats, doable,
+ visited, null));
continue MAIN_LOOP;
- }
- if (finder.noMore()) stack.pop();
- int newNumRepeats = (doable.empty ? min : numRepeats + 1);
- stack.push(new StackedInfo(
- input, newNumRepeats, doable, visited, null));
- continue MAIN_LOOP;
- }
- }
-
- if (visited == null) visited = initVisited();
-
- if (stingy) {
- REMatch nextMatch = finder.find();
- if (nextMatch != null && !nextMatch.empty) {
- stack.push(new StackedInfo(
- input, numRepeats + 1, nextMatch, visited, null));
- }
- else {
- stack.pop();
- }
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (!stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
+ }
+ }
+
+ if (visited == null)
+ visited = initVisited ();
+
+ if (stingy)
+ {
+ REMatch nextMatch = finder.find ();
+ if (nextMatch != null && !nextMatch.empty)
+ {
+ stack.
+ push (new
+ StackedInfo (input, numRepeats + 1, nextMatch,
+ visited, null));
+ }
+ else
+ {
+ stack.pop ();
+ }
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input,
+ mymatch, stack));
+ }
+ result = m1;
+ break MAIN_LOOP;
+ }
+ else
+ {
+ continue MAIN_LOOP;
+ }
+ }
+
+ visited = addVisited (mymatch.index, visited);
+
+ TryAnotherResult taresult =
+ tryAnother (stack, input, mymatch, numRepeats, finder, visited);
+ visited = taresult.visited;
+ switch (taresult.status)
+ {
+ case TryAnotherResult.TRY_FURTHER:
+ controlStack.push (new FindMatchControl (finder));
+ continue MAIN_LOOP0;
+ case TryAnotherResult.RESULT_FOUND:
+ result = taresult.result;
+ break MAIN_LOOP;
+ }
+
+ if (!stack.empty ())
+ {
+ stack.pop ();
+ }
+ if (possessive)
+ {
+ stack.clear ();
+ }
+ REMatch m1 = matchRest (input, mymatch);
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
+ }
result = m1;
break MAIN_LOOP;
- }
- else {
- continue MAIN_LOOP;
- }
- }
-
- visited = addVisited(mymatch.index, visited);
-
- TryAnotherResult taresult = tryAnother(stack, input, mymatch, numRepeats, finder, visited);
- visited = taresult.visited;
- switch (taresult.status) {
- case TryAnotherResult.TRY_FURTHER:
- controlStack.push(new FindMatchControl(
- finder));
- continue MAIN_LOOP0;
- case TryAnotherResult.RESULT_FOUND:
- result = taresult.result;
- break MAIN_LOOP;
- }
-
- if (!stack.empty()) {
- stack.pop();
- }
- if (possessive) {
- stack.clear();
- }
- REMatch m1 = matchRest(input, mymatch);
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
- }
- result = m1;
- break MAIN_LOOP;
- }
+ }
- } // MAIN_LOOP
+ } // MAIN_LOOP
- if (controlStack.empty()) return result;
- FindMatchControl control = controlStack.pop();
- if (possessive) {
+ if (controlStack.isEmpty ())
+ return result;
+ FindMatchControl control = controlStack.pop ();
+ if (possessive)
+ {
return result;
- }
- if (result != null) {
- result.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
+ }
+ if (result != null)
+ {
+ result.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
return result;
- }
+ }
finder = control.finder;
- TryAnotherResult taresult = tryAnother(stack, input, mymatch, numRepeats, finder, visited);
+ TryAnotherResult taresult =
+ tryAnother (stack, input, mymatch, numRepeats, finder, visited);
visited = taresult.visited;
- switch (taresult.status) {
- case TryAnotherResult.TRY_FURTHER:
- controlStack.push(new FindMatchControl(
- finder));
- continue MAIN_LOOP0;
- case TryAnotherResult.RESULT_FOUND:
- return taresult.result;
- }
+ switch (taresult.status)
+ {
+ case TryAnotherResult.TRY_FURTHER:
+ controlStack.push (new FindMatchControl (finder));
+ continue MAIN_LOOP0;
+ case TryAnotherResult.RESULT_FOUND:
+ return taresult.result;
+ }
continue MAIN_LOOP0;
- } // MAIN_LOOP0
- }
+ } // MAIN_LOOP0
+ }
- private static class TryAnotherResult {
- REMatch result;
- int status;
- static final int RESULT_FOUND = 1;
- static final int TRY_FURTHER = 2;
- static final int NOTHING_FOUND = 3;
- int[] visited;
- }
+ private static class TryAnotherResult
+ {
+ REMatch result;
+ int status;
+ static final int RESULT_FOUND = 1;
+ static final int TRY_FURTHER = 2;
+ static final int NOTHING_FOUND = 3;
+ int[] visited;
+ }
- private TryAnotherResult tryAnother(BacktrackStack stack,
- CharIndexed input, REMatch mymatch, int numRepeats,
- DoablesFinder finder, int[] visited) {
+ private TryAnotherResult tryAnother (BacktrackStack stack,
+ CharIndexed input, REMatch mymatch,
+ int numRepeats, DoablesFinder finder,
+ int[]visited)
+ {
- TryAnotherResult taresult = new TryAnotherResult();
- taresult.visited = visited;
+ TryAnotherResult taresult = new TryAnotherResult ();
+ taresult.visited = visited;
- DO_THIS:
- {
+ DO_THIS:
+ {
- boolean emptyMatchFound = false;
+ boolean emptyMatchFound = false;
- DO_ONE_DOABLE:
- while (true) {
+ DO_ONE_DOABLE:
+ while (true)
+ {
- REMatch doable = finder.find();
- if (doable == null) {
- break DO_THIS;
+ REMatch doable = finder.find ();
+ if (doable == null)
+ {
+ break DO_THIS;
}
- if (doable.empty) emptyMatchFound = true;
-
- if (!emptyMatchFound) {
- int n = doable.index;
- if (visitedContains(n, visited)) {
- continue DO_ONE_DOABLE;
+ if (doable.empty)
+ emptyMatchFound = true;
+
+ if (!emptyMatchFound)
+ {
+ int n = doable.index;
+ if (visitedContains (n, visited))
+ {
+ continue DO_ONE_DOABLE;
}
- visited = addVisited(n, visited);
- stack.push(new StackedInfo(
- input, numRepeats + 1, doable, visited, null));
- taresult.visited = visited;
- taresult.status = TryAnotherResult.TRY_FURTHER;
- return taresult;
+ visited = addVisited (n, visited);
+ stack.
+ push (new
+ StackedInfo (input, numRepeats + 1, doable, visited,
+ null));
+ taresult.visited = visited;
+ taresult.status = TryAnotherResult.TRY_FURTHER;
+ return taresult;
}
- else {
- REMatch m1 = matchRest(input, doable);
- if (possessive) {
- taresult.result = m1;
- taresult.status = TryAnotherResult.RESULT_FOUND;
- return taresult;
+ else
+ {
+ REMatch m1 = matchRest (input, doable);
+ if (possessive)
+ {
+ taresult.result = m1;
+ taresult.status = TryAnotherResult.RESULT_FOUND;
+ return taresult;
}
- if (m1 != null) {
- if (! stack.empty()) {
- m1.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch, stack));
+ if (m1 != null)
+ {
+ if (!stack.empty ())
+ {
+ m1.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ stack));
}
- taresult.result = m1;
- taresult.status = TryAnotherResult.RESULT_FOUND;
- return taresult;
+ taresult.result = m1;
+ taresult.status = TryAnotherResult.RESULT_FOUND;
+ return taresult;
}
}
- } // DO_ONE_DOABLE
-
- } // DO_THIS
-
- taresult.status = TryAnotherResult.NOTHING_FOUND;
- return taresult;
-
- }
-
- boolean match(CharIndexed input, REMatch mymatch) {
- setHitEnd(input, mymatch);
- REMatch m1 = findMatch(input, mymatch);
- if (m1 != null) {
- mymatch.assignFrom(m1);
- return true;
- }
- return false;
- }
-
- // Array visited is an array of character positions we have already
- // visited. visited[0] is used to store the effective length of the
- // array.
- private static int[] initVisited() {
- int[] visited = new int[32];
- visited[0] = 0;
- return visited;
- }
-
- private static boolean visitedContains(int n, int[] visited) {
- // Experience tells that for a small array like this,
- // simple linear search is faster than binary search.
- for (int i = 1; i < visited[0]; i++) {
- if (n == visited[i]) return true;
- }
- return false;
- }
-
- private static int[] addVisited(int n, int[] visited) {
- if (visitedContains(n, visited)) return visited;
- if (visited[0] >= visited.length - 1) {
- int[] newvisited = new int[visited.length + 32];
- System.arraycopy(visited, 0, newvisited, 0, visited.length);
- visited = newvisited;
- }
- visited[0]++;
- visited[visited[0]] = n;
- return visited;
- }
-
- private REMatch matchRest(CharIndexed input, final REMatch newMatch) {
- if (next(input, newMatch)) {
- return newMatch;
- }
- return null;
- }
-
- private REMatch findMatchFixedLength(CharIndexed input, REMatch mymatch) {
- if (mymatch.backtrackStack == null)
- mymatch.backtrackStack = new BacktrackStack();
- int numRepeats = token.findFixedLengthMatches(input, (REMatch)mymatch.clone(), max);
- if (numRepeats == Integer.MAX_VALUE) numRepeats = min;
- int count = numRepeats - min + 1;
- if (count <= 0) return null;
- int index = 0;
- if (!stingy) index = mymatch.index + (tokenFixedLength * numRepeats);
- else index = mymatch.index + (tokenFixedLength * min);
- return findMatchFixedLength(input, mymatch, index, count);
- }
-
- private REMatch backtrackFixedLength(CharIndexed input, REMatch mymatch,
- Object param) {
- int[] params = (int[])param;
- int index = params[0];
- int count = params[1];
- return findMatchFixedLength(input, mymatch, index, count);
- }
-
- private REMatch findMatchFixedLength(CharIndexed input, REMatch mymatch,
- int index, int count) {
- REMatch tryMatch = (REMatch) mymatch.clone();
- while (true) {
- tryMatch.index = index;
- REMatch m = matchRest(input, tryMatch);
- count--;
- if (stingy) index += tokenFixedLength;
- else index -= tokenFixedLength;
- if (possessive) return m;
- if (m != null) {
- if (count > 0) {
- m.backtrackStack.push(new BacktrackStack.Backtrack(
- this, input, mymatch,
- new int[] {index, count}));
- }
- return m;
- }
- if (count <= 0) return null;
- }
- }
-
- void dump(StringBuffer os) {
- os.append("(?:");
- token.dumpAll(os);
- os.append(')');
- if ((max == Integer.MAX_VALUE) && (min <= 1))
- os.append( (min == 0) ? '*' : '+' );
- else if ((min == 0) && (max == 1))
- os.append('?');
- else {
- os.append('{').append(min);
- if (max > min) {
- os.append(',');
- if (max != Integer.MAX_VALUE) os.append(max);
- }
- os.append('}');
- }
- if (stingy) os.append('?');
- }
+ } // DO_ONE_DOABLE
+
+ } // DO_THIS
+
+ taresult.status = TryAnotherResult.NOTHING_FOUND;
+ return taresult;
+
+ }
+
+ boolean match (CharIndexed input, REMatch mymatch)
+ {
+ setHitEnd (input, mymatch);
+ REMatch m1 = findMatch (input, mymatch);
+ if (m1 != null)
+ {
+ mymatch.assignFrom (m1);
+ return true;
+ }
+ return false;
+ }
+
+ // Array visited is an array of character positions we have already
+ // visited. visited[0] is used to store the effective length of the
+ // array.
+ private static int[] initVisited ()
+ {
+ int[] visited = new int[32];
+ visited[0] = 0;
+ return visited;
+ }
+
+ private static boolean visitedContains (int n, int[]visited)
+ {
+ // Experience tells that for a small array like this,
+ // simple linear search is faster than binary search.
+ for (int i = 1; i < visited[0]; i++)
+ {
+ if (n == visited[i])
+ return true;
+ }
+ return false;
+ }
+
+ private static int[] addVisited (int n, int[]visited)
+ {
+ if (visitedContains (n, visited))
+ return visited;
+ if (visited[0] >= visited.length - 1)
+ {
+ int[] newvisited = new int[visited.length + 32];
+ System.arraycopy (visited, 0, newvisited, 0, visited.length);
+ visited = newvisited;
+ }
+ visited[0]++;
+ visited[visited[0]] = n;
+ return visited;
+ }
+
+ private REMatch matchRest (CharIndexed input, final REMatch newMatch)
+ {
+ if (next (input, newMatch))
+ {
+ return newMatch;
+ }
+ return null;
+ }
+
+ private REMatch findMatchFixedLength (CharIndexed input, REMatch mymatch)
+ {
+ if (mymatch.backtrackStack == null)
+ mymatch.backtrackStack = new BacktrackStack ();
+ int numRepeats =
+ token.findFixedLengthMatches (input, (REMatch) mymatch.clone (), max);
+ if (numRepeats == Integer.MAX_VALUE)
+ numRepeats = min;
+ int count = numRepeats - min + 1;
+ if (count <= 0)
+ return null;
+ int index = 0;
+ if (!stingy)
+ index = mymatch.index + (tokenFixedLength * numRepeats);
+ else
+ index = mymatch.index + (tokenFixedLength * min);
+ return findMatchFixedLength (input, mymatch, index, count);
+ }
+
+ private REMatch backtrackFixedLength (CharIndexed input, REMatch mymatch,
+ Object param)
+ {
+ int[] params = (int[]) param;
+ int index = params[0];
+ int count = params[1];
+ return findMatchFixedLength (input, mymatch, index, count);
+ }
+
+ private REMatch findMatchFixedLength (CharIndexed input, REMatch mymatch,
+ int index, int count)
+ {
+ REMatch tryMatch = (REMatch) mymatch.clone ();
+ while (true)
+ {
+ tryMatch.index = index;
+ REMatch m = matchRest (input, tryMatch);
+ count--;
+ if (stingy)
+ index += tokenFixedLength;
+ else
+ index -= tokenFixedLength;
+ if (possessive)
+ return m;
+ if (m != null)
+ {
+ if (count > 0)
+ {
+ m.backtrackStack.push (new BacktrackStack.
+ Backtrack (this, input, mymatch,
+ new int[]
+ {
+ index, count}));
+ }
+ return m;
+ }
+ if (count <= 0)
+ return null;
+ }
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ os.append ("(?:");
+ token.dumpAll (os);
+ os.append (')');
+ if ((max == Integer.MAX_VALUE) && (min <= 1))
+ os.append ((min == 0) ? '*' : '+');
+ else if ((min == 0) && (max == 1))
+ os.append ('?');
+ else
+ {
+ os.append ('{').append (min);
+ if (max > min)
+ {
+ os.append (',');
+ if (max != Integer.MAX_VALUE)
+ os.append (max);
+ }
+ os.append ('}');
+ }
+ if (stingy)
+ os.append ('?');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenStart.java b/libjava/classpath/gnu/java/util/regex/RETokenStart.java
index aa5f0c91401..6a8d247c9d0 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenStart.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenStart.java
@@ -37,85 +37,117 @@ exception statement from your version. */
package gnu.java.util.regex;
-class RETokenStart extends REToken {
- private String newline; // matches after a newline
- private boolean check_java_line_terminators;
-
- RETokenStart(int subIndex, String newline) {
- super(subIndex);
- this.newline = newline;
- this.check_java_line_terminators = false;
- }
-
- RETokenStart(int subIndex, String newline, boolean b) {
- super(subIndex);
- this.newline = newline;
- this.check_java_line_terminators = b;
- }
-
- int getMaximumLength() {
- return 0;
- }
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- // charAt(index-n) may be unknown on a Reader/InputStream. FIXME
- // Match after a newline if in multiline mode
-
- if (check_java_line_terminators) {
- char ch = input.charAt(mymatch.index - 1);
- if (ch != CharIndexed.OUT_OF_BOUNDS) {
- if (ch == '\n') return mymatch;
- if (ch == '\r') {
- char ch1 = input.charAt(mymatch.index);
- if (ch1 != '\n') return mymatch;
- return null;
- }
- if (ch == '\u0085') return mymatch; // A next-line character
- if (ch == '\u2028') return mymatch; // A line-separator character
- if (ch == '\u2029') return mymatch; // A paragraph-separator character
- }
- }
-
- if (newline != null) {
- int len = newline.length();
- if (mymatch.offset >= len) {
- boolean found = true;
- char z;
- int i = 0; // position in REToken.newline
- char ch = input.charAt(mymatch.index - len);
- do {
- z = newline.charAt(i);
- if (ch != z) {
- found = false;
- break;
- }
- ++i;
- ch = input.charAt(mymatch.index - len + i);
- } while (i < len);
-
- if (found) return mymatch;
- }
- }
-
- // Don't match at all if REG_NOTBOL is set.
- if ((mymatch.eflags & RE.REG_NOTBOL) > 0) return null;
-
- if ((mymatch.eflags & RE.REG_ANCHORINDEX) > 0)
- return (mymatch.anchor == mymatch.offset) ?
- mymatch : null;
- else
- return ((mymatch.index == 0) && (mymatch.offset == 0)) ?
- mymatch : null;
- }
-
- boolean returnsFixedLengthmatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if (matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- os.append('^');
- }
+import gnu.java.lang.CPStringBuilder;
+
+class RETokenStart extends REToken
+{
+ private String newline; // matches after a newline
+ private boolean check_java_line_terminators;
+
+ RETokenStart (int subIndex, String newline)
+ {
+ super (subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = false;
+ }
+
+ RETokenStart (int subIndex, String newline, boolean b)
+ {
+ super (subIndex);
+ this.newline = newline;
+ this.check_java_line_terminators = b;
+ }
+
+ @Override
+ int getMaximumLength ()
+ {
+ return 0;
+ }
+
+ @Override
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ // charAt(index-n) may be unknown on a Reader/InputStream. FIXME
+ // Match after a newline if in multiline mode
+
+ if (check_java_line_terminators)
+ {
+ char ch = input.charAt (mymatch.index - 1);
+ if (ch != CharIndexed.OUT_OF_BOUNDS)
+ {
+ if (ch == '\n')
+ return mymatch;
+ if (ch == '\r')
+ {
+ char ch1 = input.charAt (mymatch.index);
+ if (ch1 != '\n')
+ return mymatch;
+ return null;
+ }
+ if (ch == '\u0085')
+ return mymatch; // A next-line character
+ if (ch == '\u2028')
+ return mymatch; // A line-separator character
+ if (ch == '\u2029')
+ return mymatch; // A paragraph-separator character
+ }
+ }
+
+ if (newline != null)
+ {
+ int len = newline.length ();
+ if (mymatch.offset >= len)
+ {
+ boolean found = true;
+ char z;
+ int i = 0; // position in REToken.newline
+ char ch = input.charAt (mymatch.index - len);
+ do
+ {
+ z = newline.charAt (i);
+ if (ch != z)
+ {
+ found = false;
+ break;
+ }
+ ++i;
+ ch = input.charAt (mymatch.index - len + i);
+ }
+ while (i < len);
+
+ if (found)
+ return mymatch;
+ }
+ }
+
+ // Don't match at all if REG_NOTBOL is set.
+ if ((mymatch.eflags & RE.REG_NOTBOL) > 0)
+ return null;
+
+ if ((mymatch.eflags & RE.REG_ANCHORINDEX) > 0)
+ return (mymatch.anchor == mymatch.offset) ? mymatch : null;
+ else
+ return ((mymatch.index == 0) && (mymatch.offset == 0)) ? mymatch : null;
+ }
+
+ @Override
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ @Override
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ @Override
+ void dump (CPStringBuilder os)
+ {
+ os.append ('^');
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java b/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
index 538c6bef40c..9f758b63588 100644
--- a/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
+++ b/libjava/classpath/gnu/java/util/regex/RETokenWordBoundary.java
@@ -38,79 +38,104 @@ exception statement from your version. */
package gnu.java.util.regex;
+import gnu.java.lang.CPStringBuilder;
+
/**
* Represents a combination lookahead/lookbehind for POSIX [:alnum:].
*/
-final class RETokenWordBoundary extends REToken {
- private boolean negated;
- private int where;
- static final int BEGIN = 1;
- static final int END = 2;
-
- RETokenWordBoundary(int subIndex, int where, boolean negated) {
- super(subIndex);
- this.where = where;
- this.negated = negated;
- }
-
- int getMaximumLength() {
- return 0;
- }
-
-
- REMatch matchThis(CharIndexed input, REMatch mymatch) {
- // Word boundary means input[index-1] was a word character
- // and input[index] is not, or input[index] is a word character
- // and input[index-1] was not
- // In the string "one two three", these positions match:
- // |o|n|e| |t|w|o| |t|h|r|e|e|
- // ^ ^ ^ ^ ^ ^
- boolean after = false; // is current character a letter or digit?
- boolean before = false; // is previous character a letter or digit?
- char ch;
-
- // TODO: Also check REG_ANCHORINDEX vs. anchor
- if (((mymatch.eflags & RE.REG_ANCHORINDEX) != RE.REG_ANCHORINDEX)
- || (mymatch.offset + mymatch.index > mymatch.anchor)) {
- if ((ch = input.charAt(mymatch.index - 1)) != CharIndexed.OUT_OF_BOUNDS) {
- before = Character.isLetterOrDigit(ch) || (ch == '_');
- }
- }
-
- if ((ch = input.charAt(mymatch.index)) != CharIndexed.OUT_OF_BOUNDS) {
- after = Character.isLetterOrDigit(ch) || (ch == '_');
- }
-
- // if (before) and (!after), we're at end (\>)
- // if (after) and (!before), we're at beginning (\<)
- boolean doNext = false;
-
- if ((where & BEGIN) == BEGIN) {
- doNext = after && !before;
- }
- if ((where & END) == END) {
- doNext ^= before && !after;
- }
-
- if (negated) doNext = !doNext;
-
- return (doNext ? mymatch : null);
- }
-
- boolean returnsFixedLengthMatches() { return true; }
-
- int findFixedLengthMatches(CharIndexed input, REMatch mymatch, int max) {
- if(matchThis(input, mymatch) != null) return max;
- else return 0;
- }
-
- void dump(StringBuffer os) {
- if (where == (BEGIN | END)) {
- os.append( negated ? "\\B" : "\\b" );
- } else if (where == BEGIN) {
- os.append("\\<");
- } else {
- os.append("\\>");
- }
- }
+final class RETokenWordBoundary extends REToken
+{
+ private boolean negated;
+ private int where;
+ static final int BEGIN = 1;
+ static final int END = 2;
+
+ RETokenWordBoundary (int subIndex, int where, boolean negated)
+ {
+ super (subIndex);
+ this.where = where;
+ this.negated = negated;
+ }
+
+ int getMaximumLength ()
+ {
+ return 0;
+ }
+
+
+ REMatch matchThis (CharIndexed input, REMatch mymatch)
+ {
+ // Word boundary means input[index-1] was a word character
+ // and input[index] is not, or input[index] is a word character
+ // and input[index-1] was not
+ // In the string "one two three", these positions match:
+ // |o|n|e| |t|w|o| |t|h|r|e|e|
+ // ^ ^ ^ ^ ^ ^
+ boolean after = false; // is current character a letter or digit?
+ boolean before = false; // is previous character a letter or digit?
+ char ch;
+
+ // TODO: Also check REG_ANCHORINDEX vs. anchor
+ if (((mymatch.eflags & RE.REG_ANCHORINDEX) != RE.REG_ANCHORINDEX)
+ || (mymatch.offset + mymatch.index > mymatch.anchor))
+ {
+ if ((ch =
+ input.charAt (mymatch.index - 1)) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ before = Character.isLetterOrDigit (ch) || (ch == '_');
+ }
+ }
+
+ if ((ch = input.charAt (mymatch.index)) != CharIndexed.OUT_OF_BOUNDS)
+ {
+ after = Character.isLetterOrDigit (ch) || (ch == '_');
+ }
+
+ // if (before) and (!after), we're at end (\>)
+ // if (after) and (!before), we're at beginning (\<)
+ boolean doNext = false;
+
+ if ((where & BEGIN) == BEGIN)
+ {
+ doNext = after && !before;
+ }
+ if ((where & END) == END)
+ {
+ doNext ^= before && !after;
+ }
+
+ if (negated)
+ doNext = !doNext;
+
+ return (doNext ? mymatch : null);
+ }
+
+ boolean returnsFixedLengthMatches ()
+ {
+ return true;
+ }
+
+ int findFixedLengthMatches (CharIndexed input, REMatch mymatch, int max)
+ {
+ if (matchThis (input, mymatch) != null)
+ return max;
+ else
+ return 0;
+ }
+
+ void dump (CPStringBuilder os)
+ {
+ if (where == (BEGIN | END))
+ {
+ os.append (negated ? "\\B" : "\\b");
+ }
+ else if (where == BEGIN)
+ {
+ os.append ("\\<");
+ }
+ else
+ {
+ os.append ("\\>");
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/util/regex/UncheckedRE.java b/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
index 73a67c65736..5f8c7490232 100644
--- a/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
+++ b/libjava/classpath/gnu/java/util/regex/UncheckedRE.java
@@ -55,7 +55,8 @@ package gnu.java.util.regex;
* @since gnu.regexp 1.1.4
*/
-public final class UncheckedRE extends RE {
+public final class UncheckedRE extends RE
+{
/**
* Constructs a regular expression pattern buffer without any compilation
* flags set, and using the default syntax (RESyntax.RE_SYNTAX_PERL5).
@@ -66,8 +67,9 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern) {
- this(pattern,0,RESyntax.RE_SYNTAX_PERL5);
+ public UncheckedRE (Object pattern)
+ {
+ this (pattern, 0, RESyntax.RE_SYNTAX_PERL5);
}
/**
@@ -81,8 +83,9 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern, int cflags) {
- this(pattern,cflags,RESyntax.RE_SYNTAX_PERL5);
+ public UncheckedRE (Object pattern, int cflags)
+ {
+ this (pattern, cflags, RESyntax.RE_SYNTAX_PERL5);
}
/**
@@ -97,13 +100,15 @@ public final class UncheckedRE extends RE {
* @exception RuntimeException The input pattern could not be parsed.
* @exception NullPointerException The pattern was null.
*/
- public UncheckedRE(Object pattern, int cflags, RESyntax syntax) {
- try {
- initialize(pattern,cflags,syntax,0,0);
- } catch (REException e) {
- throw new RuntimeException(e.getMessage());
- }
+ public UncheckedRE (Object pattern, int cflags, RESyntax syntax)
+ {
+ try
+ {
+ initialize (pattern, cflags, syntax, 0, 0);
+ }
+ catch (REException e)
+ {
+ throw new RuntimeException (e.getMessage ());
+ }
}
}
-
-
diff --git a/libjava/classpath/gnu/javax/activation/viewers/ImageViewer.java b/libjava/classpath/gnu/javax/activation/viewers/ImageViewer.java
new file mode 100644
index 00000000000..829f40cbf84
--- /dev/null
+++ b/libjava/classpath/gnu/javax/activation/viewers/ImageViewer.java
@@ -0,0 +1,138 @@
+/* ImageViewer.java -- Simple image display component.
+ Copyright (C) 2004 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.javax.activation.viewers;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Image;
+import java.awt.Graphics;
+import java.awt.MediaTracker;
+import java.awt.Toolkit;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import javax.activation.CommandObject;
+import javax.activation.DataHandler;
+
+/**
+ * Simple image display component.
+ *
+ * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
+ * @version 1.0.2
+ */
+public class ImageViewer extends Component
+ implements CommandObject
+{
+
+ private Image image;
+
+ /**
+ * Returns the preferred size for this component (the image size).
+ */
+ public Dimension getPreferredSize()
+ {
+ Dimension ps = new Dimension(0, 0);
+ if (image != null)
+ {
+ ps.width = image.getWidth(this);
+ ps.height = image.getHeight(this);
+ }
+ return ps;
+ }
+
+ public void setCommandContext(String verb, DataHandler dh)
+ throws IOException
+ {
+ // Read image into a byte array
+ InputStream in = dh.getInputStream();
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ byte[] buf = new byte[4096];
+ for (int len = in.read(buf); len != -1; len = in.read(buf))
+ bytes.write(buf, 0, len);
+ in.close();
+ // Create and prepare the image
+ Toolkit toolkit = getToolkit();
+ Image img = toolkit.createImage(bytes.toByteArray());
+ try
+ {
+ MediaTracker tracker = new MediaTracker(this);
+ tracker.addImage(img, 0);
+ tracker.waitForID(0);
+ }
+ catch (InterruptedException e)
+ {
+ }
+ toolkit.prepareImage(img, -1, -1, this);
+ }
+
+ /**
+ * Image bits arrive.
+ */
+ public boolean imageUpdate(Image image, int flags, int x, int y,
+ int width, int height)
+ {
+ if ((flags & ALLBITS) != 0)
+ {
+ this.image = image;
+ invalidate();
+ repaint();
+ return false;
+ }
+ return ((flags & ERROR) == 0);
+ }
+
+ /**
+ * Scale the image into this component's bounds.
+ */
+ public void paint(Graphics g)
+ {
+ if (image != null)
+ {
+ Dimension is = new Dimension(image.getWidth(this),
+ image.getHeight(this));
+ if (is.width > -1 && is.height > -1)
+ {
+ Dimension cs = getSize();
+ g.drawImage(image, 0, 0, cs.width, cs.height,
+ 0, 0, is.width, is.height, this);
+ }
+ }
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/activation/viewers/TextEditor.java b/libjava/classpath/gnu/javax/activation/viewers/TextEditor.java
new file mode 100644
index 00000000000..1995ae12282
--- /dev/null
+++ b/libjava/classpath/gnu/javax/activation/viewers/TextEditor.java
@@ -0,0 +1,119 @@
+/* TextEditor.java -- Simple text editor component.
+ Copyright (C) 2004 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.javax.activation.viewers;
+
+import java.awt.Dimension;
+import java.awt.TextArea;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import javax.activation.CommandObject;
+import javax.activation.DataHandler;
+
+/**
+ * Simple text editor component.
+ *
+ * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
+ * @version 1.0.2
+ */
+public class TextEditor extends TextArea
+ implements CommandObject, ActionListener
+{
+
+ private transient DataHandler dh;
+
+ public TextEditor()
+ {
+ super("", 24, 80, 1);
+ }
+
+ public Dimension getPreferredSize()
+ {
+ return getMinimumSize(24, 80);
+ }
+
+ public void setCommandContext(String verb, DataHandler dh)
+ throws IOException
+ {
+ this.dh = dh;
+ InputStream in = dh.getInputStream();
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ byte[] buf = new byte[4096];
+ for (int len = in.read(buf); len != -1; len = in.read(buf))
+ bytes.write(buf, 0, len);
+ in.close();
+ setText(bytes.toString());
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ if ("save".equals(event.getActionCommand()) && dh != null)
+ {
+ OutputStream out = null;
+ try
+ {
+ out = dh.getOutputStream();
+ if (out != null)
+ out.write(getText().getBytes());
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(System.err);
+ }
+ finally
+ {
+ if (out != null)
+ {
+ try
+ {
+
+ out.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace(System.err);
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/activation/viewers/TextViewer.java b/libjava/classpath/gnu/javax/activation/viewers/TextViewer.java
new file mode 100644
index 00000000000..2b4aa90c58f
--- /dev/null
+++ b/libjava/classpath/gnu/javax/activation/viewers/TextViewer.java
@@ -0,0 +1,81 @@
+/* TextViewer.java -- Simple text viewer component.
+ Copyright (C) 2004 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.javax.activation.viewers;
+
+import java.awt.Dimension;
+import java.awt.TextArea;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import javax.activation.CommandObject;
+import javax.activation.DataHandler;
+
+/**
+ * Simple text display component.
+ *
+ * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
+ * @version 1.0.2
+ */
+public class TextViewer extends TextArea
+ implements CommandObject
+{
+
+ public TextViewer()
+ {
+ super("", 24, 80, 1);
+ setEditable(false);
+ }
+
+ public Dimension getPreferredSize()
+ {
+ return getMinimumSize(24, 80);
+ }
+
+ public void setCommandContext(String verb, DataHandler dh)
+ throws IOException
+ {
+ InputStream in = dh.getInputStream();
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ byte[] buf = new byte[4096];
+ for (int len = in.read(buf); len != -1; len = in.read(buf))
+ bytes.write(buf, 0, len);
+ in.close();
+ setText(bytes.toString());
+ }
+
+}
diff --git a/libjava/classpath/gnu/javax/crypto/assembly/TransformerException.java b/libjava/classpath/gnu/javax/crypto/assembly/TransformerException.java
index 2c972f858d3..4e93322efb9 100644
--- a/libjava/classpath/gnu/javax/crypto/assembly/TransformerException.java
+++ b/libjava/classpath/gnu/javax/crypto/assembly/TransformerException.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.assembly;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintStream;
import java.io.PrintWriter;
@@ -129,7 +131,7 @@ public class TransformerException
*/
public String toString()
{
- StringBuffer sb = new StringBuffer(this.getClass().getName())
+ CPStringBuilder sb = new CPStringBuilder(this.getClass().getName())
.append(": ").append(super.toString());
if (_exception != null)
sb.append("; caused by: ").append(_exception.toString());
diff --git a/libjava/classpath/gnu/javax/crypto/cipher/BaseCipher.java b/libjava/classpath/gnu/javax/crypto/cipher/BaseCipher.java
index a5bbe698769..bae142a638d 100644
--- a/libjava/classpath/gnu/javax/crypto/cipher/BaseCipher.java
+++ b/libjava/classpath/gnu/javax/crypto/cipher/BaseCipher.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.cipher;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import java.security.InvalidKeyException;
@@ -88,7 +90,7 @@ public abstract class BaseCipher
public String name()
{
- StringBuffer sb = new StringBuffer(name).append('-');
+ CPStringBuilder sb = new CPStringBuilder(name).append('-');
if (currentKey == null)
sb.append(String.valueOf(8 * defaultBlockSize));
else
diff --git a/libjava/classpath/gnu/javax/crypto/jce/sig/DHParameters.java b/libjava/classpath/gnu/javax/crypto/jce/sig/DHParameters.java
index 0357c163d41..a917e223088 100644
--- a/libjava/classpath/gnu/javax/crypto/jce/sig/DHParameters.java
+++ b/libjava/classpath/gnu/javax/crypto/jce/sig/DHParameters.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.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 DHParameters
protected String engineToString()
{
- StringBuffer sb = new StringBuffer("p=");
+ CPStringBuilder sb = new CPStringBuilder("p=");
if (p == null)
sb.append("???");
else
diff --git a/libjava/classpath/gnu/javax/crypto/key/KeyAgreementException.java b/libjava/classpath/gnu/javax/crypto/key/KeyAgreementException.java
index f0fb1bb83f9..405f011adde 100644
--- a/libjava/classpath/gnu/javax/crypto/key/KeyAgreementException.java
+++ b/libjava/classpath/gnu/javax/crypto/key/KeyAgreementException.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.key;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.Serializable;
@@ -157,7 +159,7 @@ public class KeyAgreementException
*/
public String toString()
{
- StringBuffer sb = new StringBuffer(this.getClass().getName()).append(": ")
+ CPStringBuilder sb = new CPStringBuilder(this.getClass().getName()).append(": ")
.append(super.toString());
if (cause != null)
sb.append("; caused by: ").append(cause.toString());
diff --git a/libjava/classpath/gnu/javax/crypto/mode/BaseMode.java b/libjava/classpath/gnu/javax/crypto/mode/BaseMode.java
index 6d9418ccafa..02e43229044 100644
--- a/libjava/classpath/gnu/javax/crypto/mode/BaseMode.java
+++ b/libjava/classpath/gnu/javax/crypto/mode/BaseMode.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.mode;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.javax.crypto.cipher.IBlockCipher;
import java.security.InvalidKeyException;
@@ -110,7 +112,7 @@ public abstract class BaseMode
public String name()
{
- return new StringBuffer(name).append('(').append(cipher.name()).append(')')
+ return new CPStringBuilder(name).append('(').append(cipher.name()).append(')')
.toString();
}
diff --git a/libjava/classpath/gnu/javax/crypto/pad/BasePad.java b/libjava/classpath/gnu/javax/crypto/pad/BasePad.java
index 8b475d2d8cb..adc2c9bbc02 100644
--- a/libjava/classpath/gnu/javax/crypto/pad/BasePad.java
+++ b/libjava/classpath/gnu/javax/crypto/pad/BasePad.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.pad;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import java.util.Map;
@@ -67,7 +69,7 @@ public abstract class BasePad
public String name()
{
- final StringBuffer sb = new StringBuffer(name);
+ final CPStringBuilder sb = new CPStringBuilder(name);
if (blockSize != -1)
sb.append('-').append(String.valueOf(8 * blockSize));
return sb.toString();
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/crammd5/CramMD5Util.java b/libjava/classpath/gnu/javax/crypto/sasl/crammd5/CramMD5Util.java
index 2145512215a..a6a06b6b849 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/crammd5/CramMD5Util.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/crammd5/CramMD5Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.crammd5;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
import gnu.javax.crypto.mac.HMacFactory;
@@ -83,7 +85,7 @@ class CramMD5Util
final byte[] result;
try
{
- result = new StringBuffer("<")
+ result = new CPStringBuilder("<")
.append(encoded.substring(0,encoded.length()))
.append(".").append(String.valueOf(System.currentTimeMillis()))
.append("@").append(hostname).append(">")
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/crammd5/PasswordFile.java b/libjava/classpath/gnu/javax/crypto/sasl/crammd5/PasswordFile.java
index df952111660..4900842a737 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/crammd5/PasswordFile.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/crammd5/PasswordFile.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.crammd5;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.javax.crypto.sasl.NoSuchUserException;
import gnu.javax.crypto.sasl.UserAlreadyExistsException;
@@ -201,13 +203,13 @@ public class PasswordFile
pw = new PrintWriter(fos);
String key;
String[] fields;
- StringBuffer sb;
+ CPStringBuilder sb;
int i;
for (Iterator it = entries.keySet().iterator(); it.hasNext();)
{
key = (String) it.next();
fields = (String[]) entries.get(key);
- sb = new StringBuffer(fields[0]);
+ sb = new CPStringBuilder(fields[0]);
for (i = 1; i < fields.length; i++)
sb.append(":").append(fields[i]);
pw.println(sb.toString());
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/plain/PasswordFile.java b/libjava/classpath/gnu/javax/crypto/sasl/plain/PasswordFile.java
index b6fb3f87ead..4888214d821 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/plain/PasswordFile.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/plain/PasswordFile.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.plain;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.action.GetPropertyAction;
import gnu.javax.crypto.sasl.NoSuchUserException;
import gnu.javax.crypto.sasl.UserAlreadyExistsException;
@@ -205,13 +207,13 @@ public class PasswordFile
pw = new PrintWriter(fos);
String key;
String[] fields;
- StringBuffer sb;
+ CPStringBuilder sb;
Enumeration keys = entries.keys();
while (keys.hasMoreElements())
{
key = (String) keys.nextElement();
fields = (String[]) entries.get(key);
- sb = new StringBuffer(fields[0]);
+ sb = new CPStringBuilder(fields[0]);
for (int i = 1; i < fields.length; i++)
sb.append(":" + fields[i]);
pw.println(sb.toString());
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/plain/PlainClient.java b/libjava/classpath/gnu/javax/crypto/sasl/plain/PlainClient.java
index 5c60578db67..87fffa01ee1 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/plain/PlainClient.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/plain/PlainClient.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.plain;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.javax.crypto.sasl.ClientMechanism;
@@ -128,7 +130,7 @@ public class PlainClient
}
if (password == null)
throw new SaslException("null password supplied");
- final StringBuffer sb = new StringBuffer();
+ final CPStringBuilder sb = new CPStringBuilder();
if (authorizationID != null)
sb.append(authorizationID);
sb.append('\0');
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/srp/PasswordFile.java b/libjava/classpath/gnu/javax/crypto/sasl/srp/PasswordFile.java
index 36888df8724..7946e84fbcc 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/srp/PasswordFile.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/srp/PasswordFile.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.srp;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Registry;
import gnu.java.security.util.Util;
import gnu.javax.crypto.key.srp6.SRPAlgorithm;
@@ -445,12 +447,12 @@ public class PasswordFile
{
String ndx;
String[] mpi;
- StringBuffer sb;
+ CPStringBuilder sb;
for (Iterator it = configurations.keySet().iterator(); it.hasNext();)
{
ndx = (String) it.next();
mpi = (String[]) configurations.get(ndx);
- sb = new StringBuffer(ndx)
+ sb = new CPStringBuilder(ndx)
.append(":").append(mpi[0])
.append(":").append(mpi[1]);
pw.println(sb.toString());
@@ -591,7 +593,7 @@ public class PasswordFile
{
String user, digestID;
HashMap fields, verifiers;
- StringBuffer sb1, sb2;
+ CPStringBuilder sb1, sb2;
Iterator j;
final Iterator i = entries.keySet().iterator();
while (i.hasNext())
@@ -601,7 +603,7 @@ public class PasswordFile
if (! user.equals(fields.get(USER_FIELD)))
throw new IOException("Inconsistent SRP password data");
verifiers = (HashMap) fields.get(VERIFIERS_FIELD);
- sb1 = new StringBuffer(user)
+ sb1 = new CPStringBuilder(user)
.append(":").append((String) verifiers.get("0"))
.append(":").append((String) fields.get(SALT_FIELD))
.append(":").append((String) fields.get(CONFIG_FIELD));
@@ -614,7 +616,7 @@ public class PasswordFile
if (! "0".equals(digestID))
{
// #0 is the default digest, already present in tpasswd!
- sb2 = new StringBuffer(digestID)
+ sb2 = new CPStringBuilder(digestID)
.append(":").append(user)
.append(":").append((String) verifiers.get(digestID));
pw2.println(sb2.toString());
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPClient.java b/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPClient.java
index f4ef4cc34c1..3406c14cec4 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPClient.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPClient.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.srp;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.hash.MD5;
@@ -863,7 +865,7 @@ public class SRPClient
// For now we just select the defaults. Later we need to add support for
// properties (perhaps in a file) where a user can specify the list of
// algorithms they would prefer to use.
- final StringBuffer sb = new StringBuffer();
+ final CPStringBuilder sb = new CPStringBuilder();
sb.append(SRPRegistry.OPTION_SRP_DIGEST)
.append("=").append(mdName).append(",");
if (replayDetection)
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPServer.java b/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPServer.java
index ff7e4e9d689..3f000deefbf 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPServer.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/srp/SRPServer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.srp;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import gnu.java.security.Registry;
import gnu.java.security.util.PRNG;
@@ -612,7 +614,7 @@ public class SRPServer
s = (String) properties.get(SRPRegistry.SRP_REPLAY_DETECTION);
final boolean replayDetection = (s == null ? SRPRegistry.DEFAULT_REPLAY_DETECTION
: Boolean.valueOf(s).booleanValue());
- final StringBuffer sb = new StringBuffer();
+ final CPStringBuilder sb = new CPStringBuilder();
sb.append(SRPRegistry.OPTION_SRP_DIGEST).append("=")
.append(srp.getAlgorithm()).append(",");
diff --git a/libjava/classpath/gnu/javax/crypto/sasl/srp/ServerStore.java b/libjava/classpath/gnu/javax/crypto/sasl/srp/ServerStore.java
index e9b1a728273..9fa83295a0f 100644
--- a/libjava/classpath/gnu/javax/crypto/sasl/srp/ServerStore.java
+++ b/libjava/classpath/gnu/javax/crypto/sasl/srp/ServerStore.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.crypto.sasl.srp;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.HashMap;
/**
@@ -84,7 +86,7 @@ public class ServerStore
static synchronized final byte[] getNewSessionID()
{
final String sid = String.valueOf(++counter);
- return new StringBuffer("SID-")
+ return new CPStringBuilder("SID-")
.append("0000000000".substring(0, 10 - sid.length())).append(sid)
.toString().getBytes();
}
diff --git a/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriter.java b/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriter.java
index 08b5041c967..be42ffae1ee 100644
--- a/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriter.java
+++ b/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriter.java
@@ -178,7 +178,6 @@ public class BMPImageWriter
encoder.encode(out, streamMetadata, image, param);
else
throw new BMPException("Encoder has not been initialized.");
- out.close();
}
/**
diff --git a/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriterSpi.java b/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriterSpi.java
index b2a4273c93a..32f9f59d1ac 100644
--- a/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriterSpi.java
+++ b/libjava/classpath/gnu/javax/imageio/bmp/BMPImageWriterSpi.java
@@ -51,7 +51,7 @@ public class BMPImageWriterSpi
static final String vendorName = "GNU";
static final String version = "0.1";
static final String writerClassName = "gnu.javax.imageio.bmp.BMPImageWriter";
- static final String[] names = { "Microsoft Windows BMP" };
+ static final String[] names = { "bmp", "BMP", "Microsoft Windows BMP" };
static final String[] suffixes = { ".bmp", ".bm" };
static final String[] MIMETypes = { "image/bmp", "image/x-windows-bmp" };
static final String[] readerSpiNames = { "gnu.javax.imageio.bmp.BMPImageReaderSpi" };
diff --git a/libjava/classpath/gnu/javax/management/Server.java b/libjava/classpath/gnu/javax/management/Server.java
index 8e8d826c00f..e35c3b11745 100644
--- a/libjava/classpath/gnu/javax/management/Server.java
+++ b/libjava/classpath/gnu/javax/management/Server.java
@@ -48,12 +48,13 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.ConcurrentHashMap;
import javax.management.Attribute;
import javax.management.AttributeList;
@@ -113,19 +114,20 @@ public class Server
/**
* The registered beans, represented as a map of
* {@link javax.management.ObjectName}s to
- * {@link java.lang.Object}s.
+ * {@link gnu.javax.management.Server.ServerInfo}s.
*/
- private final Map beans = new HashMap();
+ private final ConcurrentHashMap<ObjectName,ServerInfo> beans =
+ new ConcurrentHashMap<ObjectName,ServerInfo>();
/**
* The default domain.
*/
- private String defaultDomain;
+ private final String defaultDomain;
/**
* The outer server.
*/
- private MBeanServer outer;
+ private final MBeanServer outer;
/**
* The class loader repository.
@@ -134,9 +136,15 @@ public class Server
/**
* The map of listener delegates to the true
- * listener.
+ * listener. We wrap this in an inner class
+ * to delay initialisation until a listener
+ * is actually added.
*/
- private Map listeners;
+ private static class LazyListenersHolder
+ {
+ private static final Map<NotificationListener,NotificationListener> listeners =
+ new ConcurrentHashMap<NotificationListener,NotificationListener>();
+ }
/**
* An MBean that emits notifications when an MBean is registered and
@@ -145,7 +153,10 @@ public class Server
*/
private final MBeanServerDelegate delegate;
- static private final AtomicLong sequenceNumber = new AtomicLong(1);
+ /**
+ * Provides sequencing for notifications about registrations.
+ */
+ private static final AtomicLong sequenceNumber = new AtomicLong(1);
/**
* Initialise the delegate name.
@@ -274,7 +285,7 @@ public class Server
private Object getBean(ObjectName name)
throws InstanceNotFoundException
{
- ServerInfo bean = (ServerInfo) beans.get(name);
+ ServerInfo bean = beans.get(name);
if (bean == null)
throw new InstanceNotFoundException("The bean, " + name +
", was not found.");
@@ -319,12 +330,10 @@ public class Server
if (bean instanceof NotificationBroadcaster)
{
NotificationBroadcaster bbean = (NotificationBroadcaster) bean;
- if (listeners == null)
- listeners = new HashMap();
NotificationListener indirection = new ServerNotificationListener(bean, name,
listener);
bbean.addNotificationListener(indirection, filter, passback);
- listeners.put(listener, indirection);
+ LazyListenersHolder.listeners.put(listener, indirection);
}
}
@@ -671,7 +680,7 @@ public class Server
{
try
{
- Class c = getClassLoaderRepository().loadClass(name);
+ Class<?> c = getClassLoaderRepository().loadClass(name);
return new ServerInputStream(new ByteArrayInputStream(data),
c.getClassLoader());
}
@@ -717,7 +726,7 @@ public class Server
{
try
{
- Class c = getClassLoader(loader).loadClass(name);
+ Class<?> c = getClassLoader(loader).loadClass(name);
return new ServerInputStream(new ByteArrayInputStream(data),
c.getClassLoader());
}
@@ -951,7 +960,6 @@ public class Server
return defaultDomain;
}
-
/**
* Returns an array containing all the domains used by beans registered
* with this server. The ordering of the array is undefined.
@@ -975,11 +983,11 @@ public class Server
public String[] getDomains()
{
checkSecurity(null, null, "getDomains");
- Set domains = new HashSet();
- Iterator iterator = beans.keySet().iterator();
+ Set<String> domains = new HashSet<String>();
+ Iterator<ObjectName> iterator = beans.keySet().iterator();
while (iterator.hasNext())
{
- String d = ((ObjectName) iterator.next()).getDomain();
+ String d = iterator.next().getDomain();
try
{
checkSecurity(new ObjectName(d + ":x=x"), null, "getDomains");
@@ -990,7 +998,7 @@ public class Server
/* Ignored */
}
}
- return (String[]) domains.toArray(new String[domains.size()]);
+ return domains.toArray(new String[domains.size()]);
}
/**
@@ -1077,7 +1085,7 @@ public class Server
public ObjectInstance getObjectInstance(ObjectName name)
throws InstanceNotFoundException
{
- ServerInfo bean = (ServerInfo) beans.get(name);
+ ServerInfo bean = beans.get(name);
if (bean == null)
throw new InstanceNotFoundException("The bean, " + name +
", was not found.");
@@ -1158,7 +1166,7 @@ public class Server
new IllegalArgumentException("The name was null.");
throw new RuntimeOperationsException(e);
}
- Class[] sigTypes = new Class[sig.length];
+ Class<?>[] sigTypes = new Class[sig.length];
for (int a = 0; a < sigTypes.length; ++a)
{
try
@@ -1174,7 +1182,7 @@ public class Server
}
try
{
- Constructor cons =
+ Constructor<?> cons =
repository.loadClass(name).getConstructor(sigTypes);
return cons.newInstance(params);
}
@@ -1288,7 +1296,7 @@ public class Server
throw new RuntimeOperationsException(e);
}
ClassLoader loader = getClassLoader(loaderName);
- Class[] sigTypes = new Class[sig.length];
+ Class<?>[] sigTypes = new Class[sig.length];
for (int a = 0; a < sig.length; ++a)
{
try
@@ -1304,7 +1312,7 @@ public class Server
}
try
{
- Constructor cons =
+ Constructor<?> cons =
Class.forName(name, true, loader).getConstructor(sigTypes);
return cons.newInstance(params);
}
@@ -1433,10 +1441,10 @@ public class Server
}
if (info.getClassName().equals(className))
return true;
- Class bclass = bean.getClass();
+ Class<?> bclass = bean.getClass();
try
{
- Class oclass = Class.forName(className);
+ Class<?> oclass = Class.forName(className);
return (bclass.getClassLoader().equals(oclass.getClassLoader()) &&
oclass.isAssignableFrom(bclass));
}
@@ -1502,21 +1510,19 @@ public class Server
* arise from the execution of the query, in which
* case that particular bean will again be excluded.
*/
- public Set queryMBeans(ObjectName name, QueryExp query)
+ public Set<ObjectInstance> queryMBeans(ObjectName name, QueryExp query)
{
checkSecurity(name, null, "queryMBeans");
- Set results = new HashSet();
- Iterator iterator = beans.entrySet().iterator();
- while (iterator.hasNext())
+ Set<ObjectInstance> results = new HashSet<ObjectInstance>();
+ for (Map.Entry<ObjectName,ServerInfo> entry : beans.entrySet())
{
- Map.Entry entry = (Map.Entry) iterator.next();
- ObjectName nextName = (ObjectName) entry.getKey();
+ ObjectName nextName = entry.getKey();
checkSecurity(name, nextName.toString(), "queryMBeans");
try
{
if ((name == null || name.apply(nextName)) &&
(query == null || query.apply(nextName)))
- results.add(((ServerInfo) entry.getValue()).getInstance());
+ results.add(entry.getValue().getInstance());
}
catch (BadStringOperationException e)
{
@@ -1575,15 +1581,12 @@ public class Server
* Note that these permissions are implied if the
* <code>queryMBeans</code> permissions are available.
*/
- public Set queryNames(ObjectName name, QueryExp query)
+ public Set<ObjectName> queryNames(ObjectName name, QueryExp query)
{
checkSecurity(name, null, "queryNames");
- Set results = new HashSet();
- Iterator iterator = beans.entrySet().iterator();
- while (iterator.hasNext())
+ Set<ObjectName> results = new HashSet<ObjectName>();
+ for (ObjectName nextName : beans.keySet())
{
- Map.Entry entry = (Map.Entry) iterator.next();
- ObjectName nextName = (ObjectName) entry.getKey();
checkSecurity(name, nextName.toString(), "queryNames");
try
{
@@ -1656,7 +1659,7 @@ public class Server
NotCompliantMBeanException
{
SecurityManager sm = System.getSecurityManager();
- Class cl = obj.getClass();
+ Class<?> cl = obj.getClass();
String className = cl.getName();
if (sm != null)
{
@@ -1712,14 +1715,13 @@ public class Server
throw new MBeanRegistrationException(e, "Pre-registration failed.");
}
}
- if (beans.containsKey(name))
+ ObjectInstance obji = new ObjectInstance(name, className);
+ if (beans.putIfAbsent(name, new ServerInfo(obji, obj)) != null)
{
if (register != null)
register.postRegister(Boolean.FALSE);
throw new InstanceAlreadyExistsException(name + "is already registered.");
}
- ObjectInstance obji = new ObjectInstance(name, className);
- beans.put(name, new ServerInfo(obji, obj));
if (register != null)
register.postRegister(Boolean.TRUE);
notify(name, MBeanServerNotification.REGISTRATION_NOTIFICATION);
@@ -1758,15 +1760,8 @@ public class Server
if (bean instanceof NotificationBroadcaster)
{
NotificationBroadcaster bbean = (NotificationBroadcaster) bean;
- NotificationListener indirection = (NotificationListener)
- listeners.get(listener);
- if (indirection == null)
- bbean.removeNotificationListener(listener);
- else
- {
- bbean.removeNotificationListener(indirection);
- listeners.remove(listener);
- }
+ bbean.removeNotificationListener(listener);
+ LazyListenersHolder.listeners.remove(listener);
}
}
@@ -1809,15 +1804,8 @@ public class Server
if (bean instanceof NotificationEmitter)
{
NotificationEmitter bbean = (NotificationEmitter) bean;
- NotificationListener indirection = (NotificationListener)
- listeners.get(listener);
- if (indirection == null)
- bbean.removeNotificationListener(listener, filter, passback);
- else
- {
- bbean.removeNotificationListener(indirection, filter, passback);
- listeners.remove(listener);
- }
+ bbean.removeNotificationListener(listener, filter, passback);
+ LazyListenersHolder.listeners.remove(listener);
}
}
@@ -2011,7 +1999,7 @@ public class Server
Object abean = getBean(name);
checkSecurity(name, null, "setAttribute");
AttributeList list = new AttributeList(attributes.size());
- Iterator it = attributes.iterator();
+ Iterator<Object> it = attributes.iterator();
while (it.hasNext())
{
try
@@ -2113,6 +2101,15 @@ public class Server
register.postDeregister();
}
+ /**
+ * Notifies the delegate of beans being registered
+ * and unregistered.
+ *
+ * @param name the bean being registered.
+ * @param type the type of notification;
+ * {@code REGISTRATION_NOTIFICATION} or
+ * {@code UNREGISTRATION_NOTIFICATION}.
+ */
private void notify(ObjectName name, String type)
{
delegate.sendNotification
@@ -2136,7 +2133,7 @@ public class Server
this.cl = cl;
}
- protected Class resolveClass(ObjectStreamClass osc)
+ protected Class<?> resolveClass(ObjectStreamClass osc)
throws ClassNotFoundException, IOException
{
try
diff --git a/libjava/classpath/gnu/javax/management/Translator.java b/libjava/classpath/gnu/javax/management/Translator.java
index 4ede3743088..a15994429a3 100644
--- a/libjava/classpath/gnu/javax/management/Translator.java
+++ b/libjava/classpath/gnu/javax/management/Translator.java
@@ -143,14 +143,14 @@ public final class Translator
throw new IllegalArgumentException(jtype + " has a " +
"non-comparable element " +
"type, " + elemClass);
- if (((SortedSet) jtype).comparator() != null)
+ if (((SortedSet<?>) jtype).comparator() != null)
throw new IllegalArgumentException(jtype + " does not " +
"use natural ordering.");
}
- Collection<Object> elems = (Collection<Object>) jtype;
+ Collection<?> elems = (Collection<?>) jtype;
int numElems = elems.size();
Object[] celems = new Object[numElems];
- Iterator<Object> i = elems.iterator();
+ Iterator<?> i = elems.iterator();
for (int a = 0; a < numElems; ++a)
{
Object elem = i.next();
@@ -159,7 +159,7 @@ public final class Translator
return makeArraySpecific(celems);
}
if (jtype instanceof Enum)
- return ((Enum) jtype).name();
+ return ((Enum<?>) jtype).name();
if (jtype instanceof Map || jtype instanceof SortedMap)
{
int lparam = tName.indexOf("<");
@@ -177,13 +177,13 @@ public final class Translator
throw new IllegalArgumentException(jtype + " has a " +
"non-comparable element " +
"type, " + keyClass);
- if (((SortedMap) jtype).comparator() != null)
+ if (((SortedMap<?,?>) jtype).comparator() != null)
throw new IllegalArgumentException(jtype + " does not " +
"use natural ordering.");
typeName = "java.util.SortedMap" + tName.substring(lparam);
}
- OpenType k = translate(key).getOpenType();
- OpenType v = translate(value).getOpenType();
+ OpenType<?> k = translate(key).getOpenType();
+ OpenType<?> v = translate(value).getOpenType();
CompositeType rowType = new CompositeType(typeName, typeName,
new String[] { "key", "value" },
new String[] { "Map key", "Map value"},
@@ -191,7 +191,7 @@ public final class Translator
TabularType tabType = new TabularType(typeName, typeName, rowType,
new String[]{"key"});
TabularData data = new TabularDataSupport(tabType);
- for (Map.Entry entry : (Set<Map.Entry>) ((Map) jtype).entrySet())
+ for (Map.Entry<?,?> entry : ((Map<?,?>) jtype).entrySet())
{
try
{
@@ -258,15 +258,15 @@ public final class Translator
if (returnType.isEnum())
{
String ename = (String) otype;
- Enum[] constants = (Enum[]) returnType.getEnumConstants();
- for (Enum c : constants)
+ Enum<?>[] constants = (Enum[]) returnType.getEnumConstants();
+ for (Enum<?> c : constants)
if (c.name().equals(ename))
return c;
}
if (List.class.isAssignableFrom(returnType))
{
Object[] elems = (Object[]) otype;
- List l = new ArrayList(elems.length);
+ List<Object> l = new ArrayList<Object>(elems.length);
for (Object elem : elems)
l.add(elem);
return l;
@@ -274,7 +274,7 @@ public final class Translator
if (Map.class.isAssignableFrom(returnType))
{
TabularData data = (TabularData) otype;
- Map m = new HashMap(data.size());
+ Map<Object,Object> m = new HashMap<Object,Object>(data.size());
for (Object val : data.values())
{
CompositeData vals = (CompositeData) val;
@@ -401,8 +401,8 @@ public final class Translator
int comma = type.indexOf(",", lparam);
int rparam = type.indexOf(">", comma);
String key = type.substring(lparam + 1, comma).trim();
- OpenType k = translate(key).getOpenType();
- OpenType v = translate(type.substring(comma + 1, rparam).trim()).getOpenType();
+ OpenType<?> k = translate(key).getOpenType();
+ OpenType<?> v = translate(type.substring(comma + 1, rparam).trim()).getOpenType();
CompositeType ctype = new CompositeType(Map.class.getName(), Map.class.getName(),
new String[] { "key", "value" },
new String[] { "Map key", "Map value"},
@@ -417,13 +417,13 @@ public final class Translator
{
int lparam = type.indexOf("<");
int rparam = type.indexOf(">");
- OpenType e = translate(type.substring(lparam + 1, rparam).trim()).getOpenType();
+ OpenType<?> e = translate(type.substring(lparam + 1, rparam).trim()).getOpenType();
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
- new ArrayType(1, e)
+ new ArrayType<OpenType<?>>(1, e)
);
}
- Class c;
+ Class<?> c;
try
{
c = Class.forName(type);
@@ -450,15 +450,15 @@ public final class Translator
int depth;
for (depth = 0; c.getName().charAt(depth) == '['; ++depth)
;
- OpenType ot = getTypeFromClass(c.getComponentType());
+ OpenType<?> ot = getTypeFromClass(c.getComponentType());
return new OpenMBeanParameterInfoSupport("TransParam",
"Translated parameter",
- new ArrayType(depth, ot)
+ new ArrayType<OpenType<?>>(depth, ot)
);
}
Method[] methods = c.getDeclaredMethods();
List<String> names = new ArrayList<String>();
- List<OpenType> types = new ArrayList<OpenType>();
+ List<OpenType<?>> types = new ArrayList<OpenType<?>>();
for (int a = 0; a < methods.length; ++a)
{
String name = methods[a].getName();
@@ -495,7 +495,7 @@ public final class Translator
* @return the appropriate instance.
* @throws OpenDataException if the type is not open.
*/
- private static final OpenType getTypeFromClass(Class c)
+ private static final OpenType<?> getTypeFromClass(Class<?> c)
throws OpenDataException
{
return Translator.translate(c.getName()).getOpenType();
diff --git a/libjava/classpath/gnu/javax/naming/giop/CorbalocParser.java b/libjava/classpath/gnu/javax/naming/giop/CorbalocParser.java
index 397b1c7d9e4..95ebb8a0689 100644
--- a/libjava/classpath/gnu/javax/naming/giop/CorbalocParser.java
+++ b/libjava/classpath/gnu/javax/naming/giop/CorbalocParser.java
@@ -43,6 +43,8 @@ import gnu.CORBA.Unexpected;
import gnu.CORBA.Version;
import gnu.CORBA.NamingService.NameTransformer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
@@ -288,7 +290,7 @@ public class CorbalocParser
ior.Internet.version = new Version(major, minor);
// Then host data goes till '/' or ':'.
- StringBuffer bhost = new StringBuffer(corbaloc.length());
+ CPStringBuilder bhost = new CPStringBuilder(corbaloc.length());
while (!t[p].equals(":") && !t[p].equals("/") && !t[p].equals(","))
bhost.append(t[p++]);
@@ -381,7 +383,7 @@ public class CorbalocParser
{
InputStreamReader r = new InputStreamReader(u.openStream());
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
int c;
while ((c = r.read()) > 0)
@@ -418,7 +420,7 @@ public class CorbalocParser
+ "' found");
}
- StringBuffer bKey = new StringBuffer();
+ CPStringBuilder bKey = new CPStringBuilder();
p++;
while (p < t.length && !t[p].equals("#"))
diff --git a/libjava/classpath/gnu/javax/naming/giop/GiopNamingServiceFactory.java b/libjava/classpath/gnu/javax/naming/giop/GiopNamingServiceFactory.java
index 84aa3241365..6c221548f47 100644
--- a/libjava/classpath/gnu/javax/naming/giop/GiopNamingServiceFactory.java
+++ b/libjava/classpath/gnu/javax/naming/giop/GiopNamingServiceFactory.java
@@ -40,6 +40,8 @@ package gnu.javax.naming.giop;
import gnu.CORBA.OrbFunctional;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
@@ -161,7 +163,7 @@ public class GiopNamingServiceFactory
{
TreeMap map = new TreeMap();
map.putAll(props);
- StringBuffer b = new StringBuffer(50*props.size());
+ CPStringBuilder b = new CPStringBuilder(50*props.size());
Iterator iter = map.entrySet().iterator();
Map.Entry m;
diff --git a/libjava/classpath/gnu/javax/naming/giop/ListBindingsEnumeration.java b/libjava/classpath/gnu/javax/naming/giop/ListBindingsEnumeration.java
index 00f4a0779c7..68ba49b3fed 100644
--- a/libjava/classpath/gnu/javax/naming/giop/ListBindingsEnumeration.java
+++ b/libjava/classpath/gnu/javax/naming/giop/ListBindingsEnumeration.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.naming.giop;
+import gnu.java.lang.CPStringBuilder;
+
import javax.naming.NamingEnumeration;
import org.omg.CosNaming.Binding;
@@ -92,7 +94,7 @@ public class ListBindingsEnumeration extends GiopNamingEnumeration implements
*/
public Object convert(Binding binding)
{
- StringBuffer name = new StringBuffer();
+ CPStringBuilder name = new CPStringBuilder();
for (int i = 0; i < binding.binding_name.length; i++)
{
diff --git a/libjava/classpath/gnu/javax/naming/giop/ListEnumeration.java b/libjava/classpath/gnu/javax/naming/giop/ListEnumeration.java
index 2e64e67d393..3fca1e0abc8 100644
--- a/libjava/classpath/gnu/javax/naming/giop/ListEnumeration.java
+++ b/libjava/classpath/gnu/javax/naming/giop/ListEnumeration.java
@@ -29,7 +29,7 @@ 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
+odule. 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
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.naming.giop;
+import gnu.java.lang.CPStringBuilder;
+
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
@@ -85,7 +87,7 @@ public class ListEnumeration extends GiopNamingEnumeration implements
*/
public Object convert(Binding binding)
{
- StringBuffer name = new StringBuffer();
+ CPStringBuilder name = new CPStringBuilder();
for (int i = 0; i < binding.binding_name.length; i++)
{
diff --git a/libjava/classpath/gnu/javax/naming/ictxImpl/trans/GnuName.java b/libjava/classpath/gnu/javax/naming/ictxImpl/trans/GnuName.java
index b20bfa4ea8b..b423c721bc0 100644
--- a/libjava/classpath/gnu/javax/naming/ictxImpl/trans/GnuName.java
+++ b/libjava/classpath/gnu/javax/naming/ictxImpl/trans/GnuName.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.javax.naming.ictxImpl.trans;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Enumeration;
import java.util.NoSuchElementException;
@@ -455,7 +457,7 @@ public class GnuName
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int i = 0; i < length; i++)
{
b.append(get(i));
diff --git a/libjava/classpath/gnu/javax/net/ssl/PrivateCredentials.java b/libjava/classpath/gnu/javax/net/ssl/PrivateCredentials.java
index 4a37cd8b1f9..7fff253dd4f 100644
--- a/libjava/classpath/gnu/javax/net/ssl/PrivateCredentials.java
+++ b/libjava/classpath/gnu/javax/net/ssl/PrivateCredentials.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.net.ssl;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.EOFException;
import java.io.InputStream;
import java.io.IOException;
@@ -137,7 +139,7 @@ public class PrivateCredentials implements ManagerFactoryParameters
boolean encrypted = false;
String cipher = null;
String salt = null;
- StringBuffer base64 = new StringBuffer();
+ CPStringBuilder base64 = new CPStringBuilder();
while (true)
{
line = readLine(privateKey);
@@ -235,7 +237,7 @@ public class PrivateCredentials implements ManagerFactoryParameters
private String readLine(InputStream in) throws IOException
{
boolean eol_is_cr = System.getProperty("line.separator").equals("\r");
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
while (true)
{
int i = in.read();
diff --git a/libjava/classpath/gnu/javax/net/ssl/Session.java b/libjava/classpath/gnu/javax/net/ssl/Session.java
index e2b21aa1e81..09b50eef069 100644
--- a/libjava/classpath/gnu/javax/net/ssl/Session.java
+++ b/libjava/classpath/gnu/javax/net/ssl/Session.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.net.ssl;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
import java.security.Principal;
@@ -349,7 +351,7 @@ public abstract class Session implements SSLSession, Serializable
public String toString()
{
- StringBuffer str = new StringBuffer (3 * id.length + 1);
+ CPStringBuilder str = new CPStringBuilder (3 * id.length + 1);
for (int i = 0; i < id.length; i++)
{
int x = id[i] & 0xFF;
@@ -361,4 +363,4 @@ public abstract class Session implements SSLSession, Serializable
return str.toString ();
}
}
-} \ No newline at end of file
+}
diff --git a/libjava/classpath/gnu/javax/net/ssl/provider/HelloRequest.java b/libjava/classpath/gnu/javax/net/ssl/provider/HelloRequest.java
index 0ffc26c2b5d..81dfce591e5 100644
--- a/libjava/classpath/gnu/javax/net/ssl/provider/HelloRequest.java
+++ b/libjava/classpath/gnu/javax/net/ssl/provider/HelloRequest.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.net.ssl.provider;
+import gnu.java.lang.CPStringBuilder;
+
/**
* The handshake body for a HelloRequest handshake message.
*
@@ -51,7 +53,7 @@ public final class HelloRequest implements Handshake.Body
public String toString (final String prefix)
{
- StringBuffer str = new StringBuffer ();
+ CPStringBuilder str = new CPStringBuilder ();
if (prefix != null)
str.append (prefix);
str.append ("HelloRequest { };");
diff --git a/libjava/classpath/gnu/javax/net/ssl/provider/Util.java b/libjava/classpath/gnu/javax/net/ssl/provider/Util.java
index ba8ea7db70b..57f637c1849 100644
--- a/libjava/classpath/gnu/javax/net/ssl/provider/Util.java
+++ b/libjava/classpath/gnu/javax/net/ssl/provider/Util.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.net.ssl.provider;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -128,7 +130,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));
@@ -157,7 +159,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));
@@ -194,7 +196,7 @@ public final class Util
public static String hexDump(byte[] buf, int off, int len, String prefix)
{
String nl = getProperty("line.separator");
- StringBuffer str = new StringBuffer();
+ CPStringBuilder str = new CPStringBuilder();
int i = 0;
while (i < len)
{
@@ -294,7 +296,7 @@ public final class Util
public static String formatInt(int i, int radix, int len)
{
String s = Integer.toString(i, radix);
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int j = 0; j < len - s.length(); j++)
buf.append("0");
buf.append(s);
diff --git a/libjava/classpath/gnu/javax/print/ipp/IppRequest.java b/libjava/classpath/gnu/javax/print/ipp/IppRequest.java
index 05a6faae72e..3de88715a68 100644
--- a/libjava/classpath/gnu/javax/print/ipp/IppRequest.java
+++ b/libjava/classpath/gnu/javax/print/ipp/IppRequest.java
@@ -469,7 +469,7 @@ public class IppRequest
}
else
{
- new IppException("Unknown target operation attribute combination.");
+ throw new IppException("Unknown target operation attribute combination.");
}
writeAttributes(attributes);
diff --git a/libjava/classpath/gnu/javax/print/ipp/attribute/RequestedAttributes.java b/libjava/classpath/gnu/javax/print/ipp/attribute/RequestedAttributes.java
index ae9d32dfdbd..814fe2d0a74 100644
--- a/libjava/classpath/gnu/javax/print/ipp/attribute/RequestedAttributes.java
+++ b/libjava/classpath/gnu/javax/print/ipp/attribute/RequestedAttributes.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.print.ipp.attribute;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.List;
@@ -117,7 +119,7 @@ public final class RequestedAttributes implements Attribute
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
if (attributes.size() > 0)
b.append(attributes.get(0));
diff --git a/libjava/classpath/gnu/javax/rmi/CORBA/RmiUtilities.java b/libjava/classpath/gnu/javax/rmi/CORBA/RmiUtilities.java
index 91bfa3776dc..5fa78b1e915 100644
--- a/libjava/classpath/gnu/javax/rmi/CORBA/RmiUtilities.java
+++ b/libjava/classpath/gnu/javax/rmi/CORBA/RmiUtilities.java
@@ -46,6 +46,8 @@ import gnu.CORBA.CDR.gnuRuntime;
import gnu.CORBA.CDR.gnuValueStream;
import gnu.CORBA.CDR.HeadlessInput;
+import gnu.java.lang.CPStringBuilder;
+
import org.omg.CORBA.MARSHAL;
import org.omg.CORBA.StringValueHelper;
import org.omg.CORBA.WStringValueHelper;
@@ -393,7 +395,7 @@ public class RmiUtilities
*/
public static String toHex(long l)
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append(Long.toHexString(l).toUpperCase());
while (b.length() < 16)
b.insert(0, '0');
@@ -425,7 +427,7 @@ public class RmiUtilities
return "V";
else if (type.isArray())
{
- StringBuffer l = new StringBuffer("[");
+ CPStringBuilder l = new CPStringBuilder("[");
Class component = type.getComponentType();
while (component.isArray())
@@ -700,13 +702,14 @@ public class RmiUtilities
if (in instanceof HeadlessInput)
((HeadlessInput) in).subsequentCalls = true;
- gnuRuntime g;
+ gnuRuntime g = null;
Serializable object = null;
try
{
g = (gnuRuntime) sender;
- object = g.target;
+ if (sender != null)
+ object = g.target;
}
catch (ClassCastException e)
{
diff --git a/libjava/classpath/gnu/javax/security/auth/callback/AWTCallbackHandler.java b/libjava/classpath/gnu/javax/security/auth/callback/AWTCallbackHandler.java
index 539c4a17e1c..d75ce4104fa 100644
--- a/libjava/classpath/gnu/javax/security/auth/callback/AWTCallbackHandler.java
+++ b/libjava/classpath/gnu/javax/security/auth/callback/AWTCallbackHandler.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.security.auth.callback;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
@@ -238,8 +240,8 @@ public class AWTCallbackHandler extends AbstractCallbackHandler
int defind = 0;
for (int i = 0; i < locales.length; i++)
{
- StringBuffer lang =
- new StringBuffer(locales[i].getDisplayLanguage(locales[i]));
+ CPStringBuilder lang =
+ new CPStringBuilder(locales[i].getDisplayLanguage(locales[i]));
String country = locales[i].getDisplayCountry(locales[i]);
String variant = locales[i].getDisplayVariant(locales[i]);
if (country.length() > 0 && variant.length() > 0)
diff --git a/libjava/classpath/gnu/javax/security/auth/login/ConfigFileTokenizer.java b/libjava/classpath/gnu/javax/security/auth/login/ConfigFileTokenizer.java
index 06a1d2c7ce9..0235c6971c3 100644
--- a/libjava/classpath/gnu/javax/security/auth/login/ConfigFileTokenizer.java
+++ b/libjava/classpath/gnu/javax/security/auth/login/ConfigFileTokenizer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.security.auth.login;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.java.security.Configuration;
import java.io.BufferedReader;
@@ -92,7 +94,7 @@ public class ConfigFileTokenizer
private BufferedReader br;
boolean initialised;
- private StringBuffer sb;
+ private CPStringBuilder sb;
private int sbNdx;
// Constructor(s)
@@ -185,7 +187,7 @@ public class ConfigFileTokenizer
private void init() throws IOException
{
- sb = new StringBuffer();
+ sb = new CPStringBuilder();
String line;
while ((line = br.readLine()) != null)
{
diff --git a/libjava/classpath/gnu/javax/sound/sampled/gstreamer/io/GstAudioFileReader.java b/libjava/classpath/gnu/javax/sound/sampled/gstreamer/io/GstAudioFileReader.java
index b90caef24b5..0514c937a9f 100644
--- a/libjava/classpath/gnu/javax/sound/sampled/gstreamer/io/GstAudioFileReader.java
+++ b/libjava/classpath/gnu/javax/sound/sampled/gstreamer/io/GstAudioFileReader.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.javax.sound.sampled.gstreamer.io;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.javax.sound.sampled.gstreamer.GStreamerMixer;
import java.io.BufferedInputStream;
@@ -65,7 +67,7 @@ public class GstAudioFileReader
public AudioFileFormat getAudioFileFormat(File file)
throws UnsupportedAudioFileException, IOException
{
- StringBuffer name = new StringBuffer(file.getName());
+ CPStringBuilder name = new CPStringBuilder(file.getName());
String _name = name.substring(name.lastIndexOf(".") + 1);
return getAudioFileFormat(
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java
index 7507850e8f9..7f16f1f2dba 100644
--- a/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/htmlValidator.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.swing.text.html.parser;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.javax.swing.text.html.parser.models.node;
import gnu.javax.swing.text.html.parser.models.transformer;
@@ -499,11 +501,11 @@ public abstract class htmlValidator
dtdAttribute = tag.getElement().getAttribute(foundAttribute.toString());
if (dtdAttribute == null)
{
- StringBuffer valid =
- new StringBuffer("The tag <" + tag.getHTMLTag() +
- "> cannot contain the attribute '" + foundAttribute +
- "'. The valid attributes for this tag are: "
- );
+ CPStringBuilder valid =
+ new CPStringBuilder("The tag <" + tag.getHTMLTag() +
+ "> cannot contain the attribute '" + foundAttribute +
+ "'. The valid attributes for this tag are: "
+ );
AttributeList a = tag.getElement().getAttributes();
@@ -545,22 +547,22 @@ public abstract class htmlValidator
!dtdAttribute.values.contains(value.toUpperCase())
)
{
- StringBuffer valid;
+ CPStringBuilder valid;
if (dtdAttribute.values.size() == 1)
valid =
- new StringBuffer("The attribute '" + foundAttribute +
- "' of the tag <" + tag.getHTMLTag() +
- "> cannot have the value '" + value +
- "'. The only valid value is "
- );
+ new CPStringBuilder("The attribute '" + foundAttribute +
+ "' of the tag <" + tag.getHTMLTag() +
+ "> cannot have the value '" + value +
+ "'. The only valid value is "
+ );
else
valid =
- new StringBuffer("The attribute '" + foundAttribute +
- "' of the tag <" + tag.getHTMLTag() +
- "> cannot have the value '" + value + "'. The " +
- dtdAttribute.values.size() +
- " valid values are: "
- );
+ new CPStringBuilder("The attribute '" + foundAttribute +
+ "' of the tag <" + tag.getHTMLTag() +
+ "> cannot have the value '" + value + "'. The " +
+ dtdAttribute.values.size() +
+ " valid values are: "
+ );
Enumeration vv = dtdAttribute.values.elements();
while (vv.hasMoreElements())
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java
index b77ef7fd850..c303ae8571d 100644
--- a/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/list.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
/**
@@ -296,7 +298,7 @@ public class list
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append(" ( ");
for (int i = 0; i < nodes.length; i++)
{
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java b/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java
index 54469b34995..f45a13b3e86 100644
--- a/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/models/node.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Serializable;
/**
@@ -239,7 +241,7 @@ public class node
*/
public String toString()
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
b.append(token);
if (unary != 0)
diff --git a/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java b/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java
index e99be3238e9..b087c3c003c 100644
--- a/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java
+++ b/libjava/classpath/gnu/javax/swing/text/html/parser/support/Parser.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.javax.swing.text.html.parser.support;
+import gnu.java.lang.CPStringBuilder;
+
import gnu.javax.swing.text.html.parser.htmlAttributeSet;
import gnu.javax.swing.text.html.parser.htmlValidator;
import gnu.javax.swing.text.html.parser.support.low.Constants;
@@ -132,12 +134,12 @@ public class Parser
/**
* The buffer to collect the incremental output like text or coment.
*/
- private StringBuffer buffer = new StringBuffer();
+ private final StringBuffer buffer = new StringBuffer();
/**
* The buffer to store the document title.
*/
- private StringBuffer title = new StringBuffer();
+ private final StringBuffer title = new StringBuffer();
/**
* The current token.
@@ -994,7 +996,7 @@ public class Parser
// character, not as a token. The character may be part of
// the unquoted URL.
{
- StringBuffer image = new StringBuffer(value.getImage());
+ CPStringBuilder image = new CPStringBuilder(value.getImage());
while (next.kind == NUMTOKEN || next.kind == SLASH
|| next.kind == OTHER)
{
@@ -1025,7 +1027,7 @@ public class Parser
// character, not as a token. The slash may be part of
// the unquoted URL.
{
- StringBuffer image = new StringBuffer(value.getImage());
+ CPStringBuilder image = new CPStringBuilder(value.getImage());
while (next.kind == NUMTOKEN || next.kind == SLASH)
{
image.append(getNextToken().getImage());
diff --git a/libjava/classpath/gnu/xml/dom/DomAttr.java b/libjava/classpath/gnu/xml/dom/DomAttr.java
index 31d7af2d2f1..6a8da837154 100644
--- a/libjava/classpath/gnu/xml/dom/DomAttr.java
+++ b/libjava/classpath/gnu/xml/dom/DomAttr.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
@@ -106,7 +108,37 @@ public class DomAttr
// and character data change events and when they happen,
// report self-mutation
}
-
+
+ /**
+ * Constructs an Attr node associated with the specified document.
+ * The "specified" flag is initialized to true, since this DOM has
+ * no current "back door" mechanisms to manage default values so
+ * that every value must effectively be "specified".
+ *
+ * <p>This constructor should only be invoked by a Document as part of
+ * its createAttribute functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ * <p>
+ * With this constructor, the prefix and local part are given explicitly
+ * rather than being computed. This allows them to be explicitly set to
+ * {@code null} as required by {@link Document#createAttribute(String)}.
+ * </p>
+ *
+ * @param owner The document with which this node is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this is used to uniquely identify a type of attribute
+ * @param name Name of this attribute, which may include a prefix
+ * @param prefix the namespace prefix of the name. May be {@code null}.
+ * @param localName the local part of the name. May be {@code null}.
+ */
+ protected DomAttr(DomDocument owner, String namespaceURI, String name,
+ String prefix, String localName)
+ {
+ super(ATTRIBUTE_NODE, owner, namespaceURI, name, prefix, localName);
+ specified = true;
+ length = 1;
+ }
+
/**
* <b>DOM L1</b>
* Returns the attribute name (same as getNodeName)
@@ -147,7 +179,7 @@ public class DomAttr
return (value == null) ? "" : value;
}
// Otherwise collect child node-values
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
switch (ctx.nodeType)
diff --git a/libjava/classpath/gnu/xml/dom/DomDocument.java b/libjava/classpath/gnu/xml/dom/DomDocument.java
index bcc729335d5..b32c6b82dfc 100644
--- a/libjava/classpath/gnu/xml/dom/DomDocument.java
+++ b/libjava/classpath/gnu/xml/dom/DomDocument.java
@@ -597,6 +597,8 @@ public class DomDocument
/**
* <b>DOM L1</b>
* Returns a newly created element with the specified name.
+ * The node name of the created element will be equal to {@code name}.
+ * The namespace, prefix and local name will all be {@code null}.
*/
public Element createElement(String name)
{
@@ -612,8 +614,7 @@ public class DomDocument
}
else
{
- DomElement domElement = new DomElement(this, null, name);
- domElement.localName = null;
+ DomElement domElement = new DomElement(this, null, name, null, null);
element = domElement;
}
if (defaultAttributes)
@@ -813,8 +814,7 @@ public class DomDocument
}
else
{
- DomAttr ret = new DomAttr(this, null, name);
- ret.localName = null;
+ DomAttr ret = new DomAttr(this, null, name, null, null);
return ret;
}
}
diff --git a/libjava/classpath/gnu/xml/dom/DomElement.java b/libjava/classpath/gnu/xml/dom/DomElement.java
index 9fd81e9705b..462cb9178a6 100644
--- a/libjava/classpath/gnu/xml/dom/DomElement.java
+++ b/libjava/classpath/gnu/xml/dom/DomElement.java
@@ -90,6 +90,32 @@ public class DomElement
}
/**
+ * <p>
+ * Constructs an Element node associated with the specified document.
+ * This constructor should only be invoked by a Document as part
+ * of its createElement functionality, or through a subclass which is
+ * similarly used in a "Sub-DOM" style layer.
+ * </p>
+ * <p>
+ * With this constructor, the prefix and local part are given explicitly
+ * rather than being computed. This allows them to be explicitly set to
+ * {@code null} as required by {@link Document#createElement(String)}.
+ * </p>
+ *
+ * @param owner The document with which this node is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this is used to uniquely identify a type of element
+ * @param name Name of this element, which may include a prefix
+ * @param prefix the namespace prefix of the name. May be {@code null}.
+ * @param localName the local part of the name. May be {@code null}.
+ */
+ protected DomElement(DomDocument owner, String namespaceURI, String name,
+ String prefix, String localName)
+ {
+ super(ELEMENT_NODE, owner, namespaceURI, name, prefix, localName);
+ }
+
+ /**
* <b>DOM L1</b>
* Returns the element's attributes
*/
diff --git a/libjava/classpath/gnu/xml/dom/DomEvent.java b/libjava/classpath/gnu/xml/dom/DomEvent.java
index d57eac0e445..9190ed8eb0e 100644
--- a/libjava/classpath/gnu/xml/dom/DomEvent.java
+++ b/libjava/classpath/gnu/xml/dom/DomEvent.java
@@ -37,8 +37,15 @@ exception statement from your version. */
package gnu.xml.dom;
-import org.w3c.dom.*;
-import org.w3c.dom.events.*;
+import gnu.java.lang.CPStringBuilder;
+
+import org.w3c.dom.Node;
+
+import org.w3c.dom.events.Event;
+import org.w3c.dom.events.EventTarget;
+import org.w3c.dom.events.MutationEvent;
+import org.w3c.dom.events.UIEvent;
+
import org.w3c.dom.views.AbstractView; // used by UIEvent
/**
@@ -180,7 +187,7 @@ public class DomEvent
*/
public String toString()
{
- StringBuffer buf = new StringBuffer("[Event ");
+ CPStringBuilder buf = new CPStringBuilder("[Event ");
buf.append(type);
switch (eventPhase)
{
diff --git a/libjava/classpath/gnu/xml/dom/DomNode.java b/libjava/classpath/gnu/xml/dom/DomNode.java
index 1cbdc2aecc0..78e1ab85c85 100644
--- a/libjava/classpath/gnu/xml/dom/DomNode.java
+++ b/libjava/classpath/gnu/xml/dom/DomNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.dom;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -1939,7 +1941,7 @@ public abstract class DomNode
case ENTITY_NODE:
case ENTITY_REFERENCE_NODE:
case DOCUMENT_FRAGMENT_NODE:
- StringBuffer buffer = new StringBuffer();
+ CPStringBuilder buffer = new CPStringBuilder();
for (DomNode ctx = first; ctx != null; ctx = ctx.next)
{
String textContent = ctx.getTextContent(false);
@@ -2124,7 +2126,7 @@ public abstract class DomNode
{
String nodeName = getNodeName();
String nodeValue = getNodeValue();
- StringBuffer buf = new StringBuffer(getClass().getName());
+ CPStringBuilder buf = new CPStringBuilder(getClass().getName());
buf.append('[');
if (nodeName != null)
{
@@ -2146,7 +2148,7 @@ public abstract class DomNode
String encode(String value)
{
- StringBuffer buf = null;
+ CPStringBuilder buf = null;
int len = value.length();
for (int i = 0; i < len; i++)
{
@@ -2155,7 +2157,7 @@ public abstract class DomNode
{
if (buf == null)
{
- buf = new StringBuffer(value.substring(0, i));
+ buf = new CPStringBuilder(value.substring(0, i));
}
buf.append("\\n");
}
@@ -2163,7 +2165,7 @@ public abstract class DomNode
{
if (buf == null)
{
- buf = new StringBuffer(value.substring(0, i));
+ buf = new CPStringBuilder(value.substring(0, i));
}
buf.append("\\r");
}
diff --git a/libjava/classpath/gnu/xml/dom/DomNsNode.java b/libjava/classpath/gnu/xml/dom/DomNsNode.java
index b27514ecb56..d3361515b70 100644
--- a/libjava/classpath/gnu/xml/dom/DomNsNode.java
+++ b/libjava/classpath/gnu/xml/dom/DomNsNode.java
@@ -54,7 +54,7 @@ public abstract class DomNsNode
private String name;
private String namespace;
private String prefix;
- String localName;
+ private String localName;
/**
* Constructs a node associated with the specified document, and
@@ -76,6 +76,33 @@ public abstract class DomNsNode
}
/**
+ * Constructs a node associated with the specified document, and
+ * with the specified namespace information. The prefix and local part
+ * are given explicitly rather than being computed. This allows them
+ * to be explicitly set to {@code null} as required by
+ * {@link Document#createElement(String)}.
+ *
+ * @param owner The document with which this entity is associated
+ * @param namespaceURI Combined with the local part of the name,
+ * this identifies a type of element or attribute; may be null.
+ * If this is the empty string, it is reassigned as null so that
+ * applications only need to test that case.
+ * @param name Name of this node, which may include a prefix
+ * @param prefix the namespace prefix of the name. May be {@code null}.
+ * @param localName the local part of the name. May be {@code null}.
+ */
+ // package private
+ DomNsNode(short nodeType, DomDocument owner, String namespaceURI, String name,
+ String prefix, String localName)
+ {
+ super(nodeType, owner);
+ this.name = name.intern();
+ this.prefix = prefix == null ? null : prefix.intern();
+ this.localName = localName == null ? null : localName.intern();
+ setNamespaceURI(namespaceURI);
+ }
+
+ /**
* <b>DOM L1</b>
* Returns the node's name, including any namespace prefix.
*/
diff --git a/libjava/classpath/gnu/xml/dom/DomText.java b/libjava/classpath/gnu/xml/dom/DomText.java
index 3ca17dc9b87..167eba3c1d2 100644
--- a/libjava/classpath/gnu/xml/dom/DomText.java
+++ b/libjava/classpath/gnu/xml/dom/DomText.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.DOMException;
import org.w3c.dom.Text;
@@ -172,7 +174,7 @@ public class DomText
{
ref = ctx;
}
- StringBuffer buf = new StringBuffer(ref.getNodeValue());
+ CPStringBuilder buf = new CPStringBuilder(ref.getNodeValue());
for (ctx = ref.next; ctx != null &&
(ctx.nodeType == TEXT_NODE || ctx.nodeType == CDATA_SECTION_NODE);
ctx = ctx.next)
diff --git a/libjava/classpath/gnu/xml/dom/ls/DomLSInput.java b/libjava/classpath/gnu/xml/dom/ls/DomLSInput.java
index 44274ec4734..68705fdee92 100644
--- a/libjava/classpath/gnu/xml/dom/ls/DomLSInput.java
+++ b/libjava/classpath/gnu/xml/dom/ls/DomLSInput.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.dom.ls;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
@@ -82,7 +84,7 @@ public class DomLSInput
public String getStringData()
{
- StringBuffer acc = new StringBuffer();
+ CPStringBuilder acc = new CPStringBuilder();
Reader reader = getCharacterStream();
try
{
diff --git a/libjava/classpath/gnu/xml/dom/ls/DomLSParser.java b/libjava/classpath/gnu/xml/dom/ls/DomLSParser.java
index 88f9bae23fe..f4f555e8c39 100644
--- a/libjava/classpath/gnu/xml/dom/ls/DomLSParser.java
+++ b/libjava/classpath/gnu/xml/dom/ls/DomLSParser.java
@@ -253,7 +253,7 @@ public class DomLSParser
eventSink = (filter == null) ? new SAXEventSink() :
new FilteredSAXEventSink(filter);
// configure sink
- eventSink.namespaceAware = namespaceAware;
+ eventSink.setNamespaceAware(namespaceAware);
eventSink.ignoreWhitespace = ignoreWhitespace;
eventSink.expandEntityReferences = expandEntityReferences;
eventSink.ignoreComments = ignoreComments;
diff --git a/libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java b/libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java
index 0a165aafbad..1f8de046d42 100644
--- a/libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java
+++ b/libjava/classpath/gnu/xml/dom/ls/SAXEventSink.java
@@ -89,7 +89,7 @@ public class SAXEventSink
PREDEFINED_ENTITIES.add("apos");
}
- boolean namespaceAware;
+ private boolean namespaceAware;
boolean ignoreWhitespace;
boolean expandEntityReferences;
boolean ignoreComments;
@@ -128,6 +128,11 @@ public class SAXEventSink
this.locator = locator;
}
+ public void setNamespaceAware(boolean namespaceAware)
+ {
+ this.namespaceAware = namespaceAware;
+ }
+
public void startDocument()
throws SAXException
{
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeAttr.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeAttr.java
index 24088fb8154..144aaf82862 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeAttr.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeAttr.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
@@ -103,7 +105,7 @@ class GnomeAttr
public String toString()
{
- StringBuffer buffer = new StringBuffer(getClass().getName());
+ CPStringBuilder buffer = new CPStringBuilder(getClass().getName());
buffer.append("[name=");
buffer.append(getName());
buffer.append(",value=");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeCharacterData.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeCharacterData.java
index a3200921df6..aa98652ba83 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeCharacterData.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeCharacterData.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.CharacterData;
import org.w3c.dom.DOMException;
@@ -107,7 +109,7 @@ abstract class GnomeCharacterData
public String toString()
{
- StringBuffer buffer = new StringBuffer(getClass().getName());
+ CPStringBuilder buffer = new CPStringBuilder(getClass().getName());
buffer.append("[data=");
buffer.append(getData());
buffer.append("]");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocument.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocument.java
index 03420c463e8..a5333550e16 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocument.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocument.java
@@ -37,6 +37,9 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+import gnu.xml.dom.DomNodeIterator;
+
import java.util.Iterator;
import org.w3c.dom.Attr;
@@ -66,8 +69,6 @@ import org.w3c.dom.xpath.XPathException;
import org.w3c.dom.xpath.XPathExpression;
import org.w3c.dom.xpath.XPathNSResolver;
-import gnu.xml.dom.DomNodeIterator;
-
/**
* A DOM document node implemented in libxml2.
*
@@ -549,7 +550,7 @@ public class GnomeDocument
public String toString()
{
- StringBuffer buffer = new StringBuffer(getClass().getName());
+ CPStringBuilder buffer = new CPStringBuilder(getClass().getName());
buffer.append("[version=");
buffer.append(getXmlVersion());
buffer.append(",standalone=");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocumentType.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocumentType.java
index 257fbbceb69..eb3a65f1d49 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocumentType.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeDocumentType.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.DocumentType;
import org.w3c.dom.NamedNodeMap;
@@ -79,7 +81,7 @@ implements DocumentType
public String toString ()
{
String publicId = getPublicId ();
- StringBuffer buffer = new StringBuffer (getClass ().getName ());
+ CPStringBuilder buffer = new CPStringBuilder (getClass ().getName ());
buffer.append ("[");
if (publicId != null)
{
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeElement.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeElement.java
index 2770cbbfd1e..e87e3adfe1c 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeElement.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeElement.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.HashSet;
import java.util.Set;
@@ -172,7 +174,7 @@ class GnomeElement
public String toString()
{
- StringBuffer buffer = new StringBuffer(getClass().getName());
+ CPStringBuilder buffer = new CPStringBuilder(getClass().getName());
buffer.append("[tagName=");
buffer.append(getTagName());
buffer.append("]");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeEntity.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeEntity.java
index 76367f8bd4f..8d61a26c1ad 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeEntity.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeEntity.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.Entity;
/**
@@ -83,7 +85,7 @@ implements Entity
public String toString ()
{
String publicId = getPublicId ();
- StringBuffer buffer = new StringBuffer (getClass ().getName ());
+ CPStringBuilder buffer = new CPStringBuilder (getClass ().getName ());
buffer.append ("[");
if (publicId != null)
{
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNode.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNode.java
index 4a2e9ff48d6..6f574ec29dd 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNode.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -368,7 +370,7 @@ class GnomeNode
case ENTITY_NODE:
case ENTITY_REFERENCE_NODE:
case DOCUMENT_FRAGMENT_NODE:
- StringBuffer buffer = new StringBuffer();
+ CPStringBuilder buffer = new CPStringBuilder();
NodeList children = getChildNodes();
int len = children.getLength();
for (int i = 0; i < len; i++)
@@ -489,7 +491,7 @@ class GnomeNode
public String toString()
{
- StringBuffer buffer = new StringBuffer(getClass().getName());
+ CPStringBuilder buffer = new CPStringBuilder(getClass().getName());
buffer.append("[nodeName=");
buffer.append(getNodeName());
buffer.append("]");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNotation.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNotation.java
index ca1560e21bc..7f6fdf44896 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNotation.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeNotation.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.Notation;
/**
@@ -61,7 +63,7 @@ implements Notation
public String toString ()
{
String publicId = getPublicId ();
- StringBuffer buffer = new StringBuffer (getClass ().getName ());
+ CPStringBuilder buffer = new CPStringBuilder (getClass ().getName ());
buffer.append ("[");
if (publicId != null)
{
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeProcessingInstruction.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeProcessingInstruction.java
index a6c47b2e1ca..d2ecd189004 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeProcessingInstruction.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeProcessingInstruction.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.DOMException;
import org.w3c.dom.ProcessingInstruction;
@@ -67,7 +69,7 @@ implements ProcessingInstruction
public String toString ()
{
- StringBuffer buffer = new StringBuffer (getClass ().getName ());
+ CPStringBuilder buffer = new CPStringBuilder (getClass ().getName ());
buffer.append ("[data=");
buffer.append (getData ());
buffer.append ("]");
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeText.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeText.java
index 77677a56223..8b8e5e0c1a4 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeText.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeText.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
@@ -84,7 +86,7 @@ implements Text
first = node;
node = node.getPreviousSibling ();
}
- StringBuffer buf = new StringBuffer (first.getNodeValue ());
+ CPStringBuilder buf = new CPStringBuilder (first.getNodeValue ());
node = first.getNextSibling ();
while (node != null && node instanceof Text)
{
diff --git a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeXPathResult.java b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeXPathResult.java
index d0e1a4f20de..850b5fae08f 100644
--- a/libjava/classpath/gnu/xml/libxmlj/dom/GnomeXPathResult.java
+++ b/libjava/classpath/gnu/xml/libxmlj/dom/GnomeXPathResult.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.libxmlj.dom;
+import gnu.java.lang.CPStringBuilder;
+
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.xpath.XPathException;
@@ -112,7 +114,7 @@ implements XPathResult
case 1:
return getSingleNodeValue ().toString ();
default:
- StringBuffer buffer = new StringBuffer ();
+ CPStringBuilder buffer = new CPStringBuilder ();
for (int i = 0; i < len; i++)
{
if (i > 0)
diff --git a/libjava/classpath/gnu/xml/stream/XMLEventImpl.java b/libjava/classpath/gnu/xml/stream/XMLEventImpl.java
index de2fccb7a1e..8d73b177427 100644
--- a/libjava/classpath/gnu/xml/stream/XMLEventImpl.java
+++ b/libjava/classpath/gnu/xml/stream/XMLEventImpl.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.stream;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.Writer;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
@@ -141,7 +143,7 @@ public abstract class XMLEventImpl
protected String encode(String text, boolean inAttr)
{
int len = text.length();
- StringBuffer buf = null;
+ CPStringBuilder buf = null;
for (int i = 0; i < len; i++)
{
char c = text.charAt(i);
@@ -149,7 +151,7 @@ public abstract class XMLEventImpl
{
if (buf == null)
{
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
}
buf.append("&lt;");
}
@@ -157,7 +159,7 @@ public abstract class XMLEventImpl
{
if (buf == null)
{
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
}
buf.append("&gt;");
}
@@ -165,7 +167,7 @@ public abstract class XMLEventImpl
{
if (buf == null)
{
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
}
buf.append("&amp;");
}
@@ -173,7 +175,7 @@ public abstract class XMLEventImpl
{
if (buf == null)
{
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
}
buf.append("&apos;");
}
@@ -181,7 +183,7 @@ public abstract class XMLEventImpl
{
if (buf == null)
{
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
}
buf.append("&quot;");
}
diff --git a/libjava/classpath/gnu/xml/stream/XMLParser.java b/libjava/classpath/gnu/xml/stream/XMLParser.java
index 049575ac707..27aaa734dd6 100644
--- a/libjava/classpath/gnu/xml/stream/XMLParser.java
+++ b/libjava/classpath/gnu/xml/stream/XMLParser.java
@@ -53,6 +53,8 @@ Partly derived from code which carried the following notice:
package gnu.xml.stream;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedInputStream;
import java.io.EOFException;
import java.io.File;
@@ -691,7 +693,7 @@ public class XMLParser
{
if (event != XMLStreamConstants.START_ELEMENT)
throw new XMLStreamException("current event must be START_ELEMENT");
- StringBuffer elementText = new StringBuffer();
+ CPStringBuilder elementText = new CPStringBuilder();
int depth = stack.size();
while (event != XMLStreamConstants.END_ELEMENT || stack.size() > depth)
{
@@ -2011,7 +2013,7 @@ public class XMLParser
else
{
ContentModel model;
- StringBuffer acc = new StringBuffer();
+ CPStringBuilder acc = new CPStringBuilder();
require('(');
acc.append('(');
skipWhitespace();
@@ -2058,7 +2060,7 @@ public class XMLParser
/**
* Parses an element content model.
*/
- private ElementContentModel readElements(StringBuffer acc)
+ private ElementContentModel readElements(CPStringBuilder acc)
throws IOException, XMLStreamException
{
int separator;
@@ -2159,7 +2161,7 @@ public class XMLParser
/**
* Parse a cp production.
*/
- private ContentParticle readContentParticle(StringBuffer acc)
+ private ContentParticle readContentParticle(CPStringBuilder acc)
throws IOException, XMLStreamException
{
ContentParticle cp = new ContentParticle();
@@ -2228,7 +2230,7 @@ public class XMLParser
{
String name = readNmtoken(true);
requireWhitespace();
- StringBuffer acc = new StringBuffer();
+ CPStringBuilder acc = new CPStringBuilder();
HashSet values = new HashSet();
String type = readAttType(acc, values);
if (validating)
@@ -2277,7 +2279,7 @@ public class XMLParser
/**
* Parse an attribute type.
*/
- private String readAttType(StringBuffer acc, HashSet values)
+ private String readAttType(CPStringBuilder acc, HashSet values)
throws IOException, XMLStreamException
{
if (tryRead('('))
@@ -2313,7 +2315,7 @@ public class XMLParser
/**
* Parse an enumeration.
*/
- private void readEnumeration(boolean isNames, StringBuffer acc,
+ private void readEnumeration(boolean isNames, CPStringBuilder acc,
HashSet values)
throws IOException, XMLStreamException
{
@@ -2344,7 +2346,7 @@ public class XMLParser
/**
* Parse a notation type for an attribute.
*/
- private void readNotationType(StringBuffer acc, HashSet values)
+ private void readNotationType(CPStringBuilder acc, HashSet values)
throws IOException, XMLStreamException
{
requireWhitespace();
@@ -3518,7 +3520,7 @@ public class XMLParser
private char[] readCharacterRef(int base)
throws IOException, XMLStreamException
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
for (int c = readCh(); c != 0x3b && c != -1; c = readCh())
b.append(Character.toChars(c));
try
@@ -4246,7 +4248,7 @@ public class XMLParser
throws XMLStreamException
{
// Use regular expression
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (Iterator i = children.iterator(); i.hasNext(); )
{
buf.append((String) i.next());
@@ -4266,7 +4268,7 @@ public class XMLParser
{
if (model.regex == null)
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append('(');
for (Iterator i = model.contentParticles.iterator(); i.hasNext(); )
{
@@ -4476,7 +4478,7 @@ public class XMLParser
*/
private static String encodeText(String text)
{
- StringBuffer b = new StringBuffer();
+ CPStringBuilder b = new CPStringBuilder();
int len = text.length();
for (int i = 0; i < len; i++)
{
@@ -4584,7 +4586,7 @@ public class XMLParser
public String toString()
{
- StringBuffer buf = new StringBuffer(getClass().getName());
+ CPStringBuilder buf = new CPStringBuilder(getClass().getName());
buf.append('[');
buf.append("name=");
buf.append(name);
diff --git a/libjava/classpath/gnu/xml/transform/AbstractNumberNode.java b/libjava/classpath/gnu/xml/transform/AbstractNumberNode.java
index 6d1202e69b4..fb953e4f66b 100644
--- a/libjava/classpath/gnu/xml/transform/AbstractNumberNode.java
+++ b/libjava/classpath/gnu/xml/transform/AbstractNumberNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -140,7 +142,7 @@ abstract class AbstractNumberNode
start = end;
}
// Process tokens
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
len = tokens.size();
int pos = 0;
for (int i = 0; i < len; i++)
@@ -188,7 +190,7 @@ abstract class AbstractNumberNode
return l;
}*/
- void format(StringBuffer buf, int number, String formatToken)
+ void format(CPStringBuilder buf, int number, String formatToken)
{
int len = formatToken.length();
char c = formatToken.charAt(len - 1);
@@ -254,7 +256,7 @@ abstract class AbstractNumberNode
static final String alphabetic(char offset, int number)
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
while (number > 0)
{
int r = number % 26;
@@ -269,7 +271,7 @@ abstract class AbstractNumberNode
static final String roman(boolean upper, int number)
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int pos = roman_numbers.length - 1; pos >= 0; pos -= 2)
{
int f = number / roman_numbers[pos];
@@ -317,7 +319,7 @@ abstract class AbstractNumberNode
public String toString()
{
- StringBuffer buf = new StringBuffer("number");
+ CPStringBuilder buf = new CPStringBuilder("number");
buf.append('[');
buf.append("format=");
buf.append(format);
diff --git a/libjava/classpath/gnu/xml/transform/ApplyTemplatesNode.java b/libjava/classpath/gnu/xml/transform/ApplyTemplatesNode.java
index 041809bdf1a..0daaa7aeccd 100644
--- a/libjava/classpath/gnu/xml/transform/ApplyTemplatesNode.java
+++ b/libjava/classpath/gnu/xml/transform/ApplyTemplatesNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -192,7 +194,7 @@ final class ApplyTemplatesNode
public String toString()
{
- StringBuffer buf = new StringBuffer("apply-templates");
+ CPStringBuilder buf = new CPStringBuilder("apply-templates");
buf.append('[');
boolean o = false;
if (select != null)
diff --git a/libjava/classpath/gnu/xml/transform/AttributeNode.java b/libjava/classpath/gnu/xml/transform/AttributeNode.java
index 71e2ed0f7af..bbc4e08059e 100644
--- a/libjava/classpath/gnu/xml/transform/AttributeNode.java
+++ b/libjava/classpath/gnu/xml/transform/AttributeNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
@@ -231,7 +233,7 @@ final class AttributeNode
public String toString()
{
- StringBuffer buf = new StringBuffer("attribute");
+ CPStringBuilder buf = new CPStringBuilder("attribute");
buf.append('[');
buf.append("name=");
buf.append(name);
diff --git a/libjava/classpath/gnu/xml/transform/Bindings.java b/libjava/classpath/gnu/xml/transform/Bindings.java
index 4ee08322317..009321315bb 100644
--- a/libjava/classpath/gnu/xml/transform/Bindings.java
+++ b/libjava/classpath/gnu/xml/transform/Bindings.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -259,7 +261,7 @@ public class Bindings
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
boolean next = false;
Collection seen = new HashSet();
Map wctx = (Map) withParameters.getFirst();
diff --git a/libjava/classpath/gnu/xml/transform/CallTemplateNode.java b/libjava/classpath/gnu/xml/transform/CallTemplateNode.java
index 31b26cbcdb0..fe0eea74eff 100644
--- a/libjava/classpath/gnu/xml/transform/CallTemplateNode.java
+++ b/libjava/classpath/gnu/xml/transform/CallTemplateNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
@@ -86,7 +88,7 @@ final class CallTemplateNode
TemplateNode t = stylesheet.getTemplate(mode, name);
if (t != null)
{
- if (withParams != null)
+ if (!withParams.isEmpty())
{
// compute the parameter values
LinkedList values = new LinkedList();
@@ -118,7 +120,7 @@ final class CallTemplateNode
}
t.apply(stylesheet, mode, context, pos, len,
parent, nextSibling);
- if (withParams != null)
+ if (!withParams.isEmpty())
{
// pop the variable context
stylesheet.bindings.pop(Bindings.WITH_PARAM);
@@ -133,20 +135,17 @@ final class CallTemplateNode
public boolean references(QName var)
{
- if (withParams != null)
+ for (Iterator i = withParams.iterator(); i.hasNext(); )
{
- for (Iterator i = withParams.iterator(); i.hasNext(); )
- {
- if (((WithParam) i.next()).references(var))
- return true;
- }
+ if (((WithParam) i.next()).references(var))
+ return true;
}
return super.references(var);
}
public String toString()
{
- StringBuffer buf = new StringBuffer("call-template");
+ CPStringBuilder buf = new CPStringBuilder("call-template");
buf.append('[');
buf.append("name=");
buf.append(name);
diff --git a/libjava/classpath/gnu/xml/transform/ChooseNode.java b/libjava/classpath/gnu/xml/transform/ChooseNode.java
index cf07fa54b07..fe2dc0c2f3a 100644
--- a/libjava/classpath/gnu/xml/transform/ChooseNode.java
+++ b/libjava/classpath/gnu/xml/transform/ChooseNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Node;
@@ -77,7 +79,7 @@ final class ChooseNode
public String toString()
{
- StringBuffer buf = new StringBuffer("choose");
+ CPStringBuilder buf = new CPStringBuilder("choose");
buf.append('[');
buf.append(']');
return buf.toString();
diff --git a/libjava/classpath/gnu/xml/transform/CopyNode.java b/libjava/classpath/gnu/xml/transform/CopyNode.java
index 64cfa519158..bae628d9632 100644
--- a/libjava/classpath/gnu/xml/transform/CopyNode.java
+++ b/libjava/classpath/gnu/xml/transform/CopyNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Iterator;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
@@ -152,7 +154,7 @@ final class CopyNode
public String toString()
{
- StringBuffer buf = new StringBuffer("copy");
+ CPStringBuilder buf = new CPStringBuilder("copy");
if (uas != null)
{
buf.append('[');
diff --git a/libjava/classpath/gnu/xml/transform/CopyOfNode.java b/libjava/classpath/gnu/xml/transform/CopyOfNode.java
index ed4358c90b6..4ce84329fc0 100644
--- a/libjava/classpath/gnu/xml/transform/CopyOfNode.java
+++ b/libjava/classpath/gnu/xml/transform/CopyOfNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -161,7 +163,7 @@ final class CopyOfNode
public String toString()
{
- StringBuffer buf = new StringBuffer("copy-of");
+ CPStringBuilder buf = new CPStringBuilder("copy-of");
buf.append('[');
buf.append("select=");
buf.append(select);
diff --git a/libjava/classpath/gnu/xml/transform/ElementNode.java b/libjava/classpath/gnu/xml/transform/ElementNode.java
index b6a5c365b12..c5a4dd20da4 100644
--- a/libjava/classpath/gnu/xml/transform/ElementNode.java
+++ b/libjava/classpath/gnu/xml/transform/ElementNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -238,7 +240,7 @@ final class ElementNode
public String toString()
{
- StringBuffer buf = new StringBuffer("element");
+ CPStringBuilder buf = new CPStringBuilder("element");
buf.append('[');
buf.append("name=");
if (namespace != null)
diff --git a/libjava/classpath/gnu/xml/transform/ForEachNode.java b/libjava/classpath/gnu/xml/transform/ForEachNode.java
index 25b824534c9..8908114ccf4 100644
--- a/libjava/classpath/gnu/xml/transform/ForEachNode.java
+++ b/libjava/classpath/gnu/xml/transform/ForEachNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -57,9 +59,9 @@ final class ForEachNode
{
final Expr select;
- final List sortKeys;
+ final List<SortKey> sortKeys;
- ForEachNode(Expr select, List sortKeys)
+ ForEachNode(Expr select, List<SortKey> sortKeys)
{
this.select = select;
this.sortKeys = sortKeys;
@@ -67,10 +69,10 @@ final class ForEachNode
TemplateNode clone(Stylesheet stylesheet)
{
- int len = sortKeys != null ? sortKeys.size() : 0;
- List sortKeys2 = new ArrayList(len);
+ int len = sortKeys.size();
+ List<SortKey> sortKeys2 = new ArrayList<SortKey>(len);
for (int i = 0; i < len; i++)
- sortKeys2.add(((Key) sortKeys.get(i)).clone(stylesheet));
+ sortKeys2.add(sortKeys.get(i).clone(stylesheet));
TemplateNode ret = new ForEachNode(select.clone(stylesheet),
sortKeys2);
if (children != null)
@@ -80,6 +82,7 @@ final class ForEachNode
return ret;
}
+ @Override
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
@@ -94,26 +97,26 @@ final class ForEachNode
//System.err.println(toString() + ": " + context+" -> "+ret);
if (ret instanceof Collection)
{
- Collection ns = (Collection) ret;
- List list = new ArrayList(ns);
- if (sortKeys != null)
- {
- for (Iterator i = sortKeys.iterator(); i.hasNext(); )
- {
- SortKey sortKey = (SortKey) i.next();
- sortKey.init(stylesheet, mode, context, pos, len, parent,
- nextSibling);
- }
- Collections.sort(list, new XSLComparator(sortKeys));
- }
- else
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> ns = (Collection<Node>) ret;
+ List<Node> list = new ArrayList<Node>(ns);
+ if (!sortKeys.isEmpty())
+ {
+ for (SortKey sortKey : sortKeys)
+ {
+ sortKey.init(stylesheet, mode, context, pos, len, parent,
+ nextSibling);
+ }
+ Collections.sort(list, new XSLComparator(sortKeys));
+ }
+ else
Collections.sort(list, documentOrderComparator);
// Perform children for each node
int l = list.size();
int p = 1;
- for (Iterator i = list.iterator(); i.hasNext(); )
+ for (Node node : list)
{
- Node node = (Node) i.next();
stylesheet.current = node;
children.apply(stylesheet, mode,
node, p++, l,
@@ -129,24 +132,23 @@ final class ForEachNode
parent, nextSibling);
}
+ @Override
public boolean references(QName var)
{
if (select != null && select.references(var))
return true;
- if (sortKeys != null)
+ for (Iterator<SortKey> i = sortKeys.iterator(); i.hasNext(); )
{
- for (Iterator i = sortKeys.iterator(); i.hasNext(); )
- {
- if (((SortKey) i.next()).references(var))
- return true;
- }
+ if (i.next().references(var))
+ return true;
}
return super.references(var);
}
-
+
+ @Override
public String toString()
{
- StringBuffer buf = new StringBuffer("for-each");
+ CPStringBuilder buf = new CPStringBuilder("for-each");
buf.append('[');
buf.append("select=");
buf.append(select);
diff --git a/libjava/classpath/gnu/xml/transform/IfNode.java b/libjava/classpath/gnu/xml/transform/IfNode.java
index 2a00d64ca82..eeb294138ba 100644
--- a/libjava/classpath/gnu/xml/transform/IfNode.java
+++ b/libjava/classpath/gnu/xml/transform/IfNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Node;
@@ -99,7 +101,7 @@ final class IfNode
public String toString()
{
- StringBuffer buf = new StringBuffer("if");
+ CPStringBuilder buf = new CPStringBuilder("if");
buf.append('[');
buf.append("test=");
buf.append(test);
diff --git a/libjava/classpath/gnu/xml/transform/MessageNode.java b/libjava/classpath/gnu/xml/transform/MessageNode.java
index 890d76f6b1c..a7eeeeef6ee 100644
--- a/libjava/classpath/gnu/xml/transform/MessageNode.java
+++ b/libjava/classpath/gnu/xml/transform/MessageNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
@@ -95,7 +97,7 @@ final class MessageNode
public String toString()
{
- StringBuffer buf = new StringBuffer("message");
+ CPStringBuilder buf = new CPStringBuilder("message");
if (terminate)
{
buf.append('[');
diff --git a/libjava/classpath/gnu/xml/transform/ParameterNode.java b/libjava/classpath/gnu/xml/transform/ParameterNode.java
index 8cd2677cf08..431fbd3b1ea 100644
--- a/libjava/classpath/gnu/xml/transform/ParameterNode.java
+++ b/libjava/classpath/gnu/xml/transform/ParameterNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collections;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
@@ -53,7 +55,7 @@ import gnu.xml.xpath.Expr;
*/
final class ParameterNode
extends TemplateNode
- implements Comparable
+ implements Comparable<ParameterNode>
{
final QName name;
@@ -67,11 +69,12 @@ final class ParameterNode
this.type = type;
}
- TemplateNode clone(Stylesheet stylesheet)
+ @Override
+ ParameterNode clone(Stylesheet stylesheet)
{
- TemplateNode ret = new ParameterNode(name,
- select.clone(stylesheet),
- type);
+ ParameterNode ret = new ParameterNode(name,
+ select == null ? null : select.clone(stylesheet),
+ type);
if (children != null)
ret.children = children.clone(stylesheet);
if (next != null)
@@ -129,26 +132,22 @@ final class ParameterNode
return super.references(var);
}
- public int compareTo(Object other)
+ public int compareTo(ParameterNode pn)
{
- if (other instanceof ParameterNode)
- {
- ParameterNode pn = (ParameterNode) other;
- boolean r1 = references(pn.name);
- boolean r2 = pn.references(name);
- if (r1 && r2)
- throw new IllegalArgumentException("circular definitions");
- if (r1)
- return 1;
- if (r2)
- return -1;
- }
+ boolean r1 = references(pn.name);
+ boolean r2 = pn.references(name);
+ if (r1 && r2)
+ throw new IllegalArgumentException("circular definitions");
+ if (r1)
+ return 1;
+ if (r2)
+ return -1;
return 0;
}
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
switch (type)
{
case Bindings.VARIABLE:
@@ -164,11 +163,8 @@ final class ParameterNode
buf.append('[');
buf.append("name=");
buf.append(name);
- if (select != null)
- {
- buf.append(",select=");
- buf.append(select);
- }
+ buf.append(",select=");
+ buf.append(select);
buf.append(']');
return buf.toString();
}
diff --git a/libjava/classpath/gnu/xml/transform/ProcessingInstructionNode.java b/libjava/classpath/gnu/xml/transform/ProcessingInstructionNode.java
index bf61fc03880..655f51f0130 100644
--- a/libjava/classpath/gnu/xml/transform/ProcessingInstructionNode.java
+++ b/libjava/classpath/gnu/xml/transform/ProcessingInstructionNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
@@ -105,7 +107,7 @@ final class ProcessingInstructionNode
public String toString()
{
- StringBuffer buf = new StringBuffer("processing-instruction");
+ CPStringBuilder buf = new CPStringBuilder("processing-instruction");
buf.append('[');
buf.append("name=");
buf.append(name);
diff --git a/libjava/classpath/gnu/xml/transform/SortKey.java b/libjava/classpath/gnu/xml/transform/SortKey.java
index d4ffb05e224..72934a5b750 100644
--- a/libjava/classpath/gnu/xml/transform/SortKey.java
+++ b/libjava/classpath/gnu/xml/transform/SortKey.java
@@ -45,7 +45,22 @@ import org.w3c.dom.Node;
import gnu.xml.xpath.Expr;
/**
- * An XSL sort key.
+ * <p>
+ * An XSL sort key, as specified by section 10 of the XSL
+ * Transformations specification. This takes the form:
+ * </p>
+ * <pre>
+ * &lt;xsl:sort
+ * select = string-expression
+ * lang = { nmtoken }
+ * data-type = { "text" | "number" | qname-but-not-ncname }
+ * order = { "ascending" | "descending" }
+ * case-order = { "upper-first" | "lower-first" } /&rt;
+ * </pre>
+ * <p>
+ * Note that all but the selection expression are optional,
+ * and so may be {@code null}.
+ * </p>
*
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
@@ -67,6 +82,20 @@ final class SortKey
transient boolean descending;
transient int caseOrder;
+ /**
+ * Constructs a new {@link SortKey} to represent an &lt;xsl:sort&rt;
+ * tag.
+ *
+ * @param select the XPath expression which selects the nodes to be sorted.
+ * @param lang the language of the sort keys or {@code null} if unspecified.
+ * @param dataType the data type of the strings. May be "string", "number",
+ * a QName or {@code null} if unspecified.
+ * @param order the ordering of the nodes, which may be "ascending", "descending"
+ * or {@code null} if unspecified.
+ * @param caseOrder the treatment of case when the data type is a string. This
+ * may be "upper-first", "lower-first" or {@code null} if
+ * unspecified.
+ */
SortKey(Expr select, TemplateNode lang, TemplateNode dataType,
TemplateNode order, TemplateNode caseOrder)
{
@@ -176,4 +205,35 @@ final class SortKey
return false;
}
+ /**
+ * Provides a clone of this {@link SortKey}, using the given
+ * stylesheet as a context.
+ *
+ * @param stylesheet the stylesheet which provides context for the cloning.
+ * @return a clone of this instance.
+ */
+ SortKey clone(Stylesheet stylesheet)
+ {
+ return new SortKey(select.clone(stylesheet),
+ langTemplate == null ? null : cloneAttributeValueTemplate(langTemplate, stylesheet),
+ dataTypeTemplate == null ? null : cloneAttributeValueTemplate(dataTypeTemplate, stylesheet),
+ orderTemplate == null ? null : cloneAttributeValueTemplate(orderTemplate, stylesheet),
+ caseOrderTemplate == null ? null : cloneAttributeValueTemplate(caseOrderTemplate, stylesheet));
+ }
+
+ /**
+ * Clones an attribute value template as created by
+ * {@link Stylesheet#parseAttributeValueTemplate(String, Node)}.
+ * The node may either by a literal node or an xsl:value-of expression.
+ *
+ * @param node the node to clone.
+ * @param stylesheet the stylesheet which provides context for the cloning.
+ * @return the cloned node.
+ */
+ private TemplateNode cloneAttributeValueTemplate(TemplateNode node, Stylesheet stylesheet)
+ {
+ if (node instanceof ValueOfNode)
+ return ((ValueOfNode) node).clone(stylesheet);
+ return ((LiteralNode) node).clone(stylesheet);
+ }
}
diff --git a/libjava/classpath/gnu/xml/transform/StreamSerializer.java b/libjava/classpath/gnu/xml/transform/StreamSerializer.java
index 35323e7353d..28996721884 100644
--- a/libjava/classpath/gnu/xml/transform/StreamSerializer.java
+++ b/libjava/classpath/gnu/xml/transform/StreamSerializer.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -595,7 +597,7 @@ public class StreamSerializer
if (!encoder.canEncode(text) || htmlNeedingEncoding)
{
// Check each character
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int len = text.length();
for (int i = 0; i < len; i++)
{
@@ -648,20 +650,20 @@ public class StreamSerializer
String encode(String text, boolean encodeCtl, boolean inAttr)
{
int len = text.length();
- StringBuffer buf = null;
+ CPStringBuilder buf = null;
for (int i = 0; i < len; i++)
{
char c = text.charAt(i);
if (c == '<')
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
buf.append("&lt;");
}
else if (c == '>')
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
buf.append("&gt;");
}
else if (c == '&')
@@ -675,14 +677,14 @@ public class StreamSerializer
else
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
buf.append("&amp;");
}
}
else if (c == '\'' && inAttr)
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
if (mode == Stylesheet.OUTPUT_HTML)
// HTML does not define &apos;, use character entity ref
buf.append("&#x27;");
@@ -692,7 +694,7 @@ public class StreamSerializer
else if (c == '"' && inAttr)
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
buf.append("&quot;");
}
else if (encodeCtl)
@@ -700,7 +702,7 @@ public class StreamSerializer
if (c < 0x20)
{
if (buf == null)
- buf = new StringBuffer(text.substring(0, i));
+ buf = new CPStringBuilder(text.substring(0, i));
buf.append('&');
buf.append('#');
buf.append((int) c);
diff --git a/libjava/classpath/gnu/xml/transform/Stylesheet.java b/libjava/classpath/gnu/xml/transform/Stylesheet.java
index 41562c3c60a..30bd953495b 100644
--- a/libjava/classpath/gnu/xml/transform/Stylesheet.java
+++ b/libjava/classpath/gnu/xml/transform/Stylesheet.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
@@ -108,18 +110,18 @@ class Stylesheet
*/
String version;
- Collection extensionElementPrefixes;
- Collection excludeResultPrefixes;
+ Collection<String> extensionElementPrefixes;
+ Collection<String> excludeResultPrefixes;
/**
* Set of element names for which we should strip whitespace.
*/
- Set stripSpace;
+ Set<StrippingInstruction> stripSpace;
/**
* Set of element names for which we should preserve whitespace.
*/
- Set preserveSpace;
+ Set<StrippingInstruction> preserveSpace;
/**
* Output options.
@@ -132,34 +134,34 @@ class Stylesheet
boolean outputStandalone;
String outputPublicId;
String outputSystemId;
- Collection outputCdataSectionElements;
+ Collection<String> outputCdataSectionElements;
boolean outputIndent;
String outputMediaType;
/**
* Keys.
*/
- Collection keys;
+ Collection<Key> keys;
/**
* Decimal formats.
*/
- Map decimalFormats;
+ Map<String,DecimalFormat> decimalFormats;
/**
* Namespace aliases.
*/
- Map namespaceAliases;
+ Map<String,String> namespaceAliases;
/**
* Attribute-sets.
*/
- List attributeSets;
+ List<AttributeSet> attributeSets;
/**
* Variables.
*/
- List variables;
+ List<ParameterNode> variables;
/**
* Variable and parameter bindings.
@@ -169,7 +171,7 @@ class Stylesheet
/**
* Templates.
*/
- LinkedList templates;
+ LinkedList<Template> templates;
TemplateNode builtInNodeTemplate;
TemplateNode builtInTextTemplate;
@@ -203,22 +205,22 @@ class Stylesheet
this.systemId = systemId;
this.precedence = precedence;
this.parent = parent;
- extensionElementPrefixes = new HashSet();
- excludeResultPrefixes = new HashSet();
- stripSpace = new LinkedHashSet();
- preserveSpace = new LinkedHashSet();
- outputCdataSectionElements = new LinkedHashSet();
+ extensionElementPrefixes = new HashSet<String>();
+ excludeResultPrefixes = new HashSet<String>();
+ stripSpace = new LinkedHashSet<StrippingInstruction>();
+ preserveSpace = new LinkedHashSet<StrippingInstruction>();
+ outputCdataSectionElements = new LinkedHashSet<String>();
xpath = (XPathImpl) factory.xpathFactory.newXPath();
xpath.setNamespaceContext(this);
if (parent == null)
{
bindings = new Bindings(this);
- attributeSets = new LinkedList();
- variables = new LinkedList();
- namespaceAliases = new LinkedHashMap();
- templates = new LinkedList();
- keys = new LinkedList();
- decimalFormats = new LinkedHashMap();
+ attributeSets = new LinkedList<AttributeSet>();
+ variables = new LinkedList<ParameterNode>();
+ namespaceAliases = new LinkedHashMap<String,String>();
+ templates = new LinkedList<Template>();
+ keys = new LinkedList<Key>();
+ decimalFormats = new LinkedHashMap<String,DecimalFormat>();
initDefaultDecimalFormat();
xpath.setXPathFunctionResolver(this);
}
@@ -247,7 +249,7 @@ class Stylesheet
xpath.setXPathVariableResolver(bindings);
Test anyNode = new NodeTypeTest((short) 0);
- List tests = Collections.singletonList(anyNode);
+ List<Test> tests = Collections.singletonList(anyNode);
builtInNodeTemplate =
new ApplyTemplatesNode(new Selector(Selector.CHILD, tests),
null, null, null, true);
@@ -263,9 +265,8 @@ class Stylesheet
if (debug)
{
System.err.println("Stylesheet: " + doc.getDocumentURI());
- for (Iterator i = templates.iterator(); i.hasNext(); )
+ for (Template t : templates)
{
- Template t = (Template) i.next();
t.list(System.err);
System.err.println("--------------------");
}
@@ -307,34 +308,30 @@ class Stylesheet
Stylesheet clone = (Stylesheet) super.clone();
clone.bindings = (Bindings) bindings.clone();
- LinkedList templates2 = new LinkedList();
- for (Iterator i = templates.iterator(); i.hasNext(); )
+ LinkedList<Template> templates2 = new LinkedList<Template>();
+ for (Template t : templates)
{
- Template t = (Template) i.next();
templates2.add(t.clone(clone));
}
clone.templates = templates2;
- LinkedList attributeSets2 = new LinkedList();
- for (Iterator i = attributeSets.iterator(); i.hasNext(); )
+ LinkedList<AttributeSet> attributeSets2 = new LinkedList<AttributeSet>();
+ for (AttributeSet as : attributeSets)
{
- AttributeSet as = (AttributeSet) i.next();
attributeSets2.add(as.clone(clone));
}
clone.attributeSets = attributeSets2;
- LinkedList variables2 = new LinkedList();
- for (Iterator i = variables.iterator(); i.hasNext(); )
+ LinkedList<ParameterNode> variables2 = new LinkedList<ParameterNode>();
+ for (ParameterNode var : variables)
{
- ParameterNode var = (ParameterNode) i.next();
variables2.add(var.clone(clone));
}
clone.variables = variables2;
- LinkedList keys2 = new LinkedList();
- for (Iterator i = keys.iterator(); i.hasNext(); )
+ LinkedList<Key> keys2 = new LinkedList<Key>();
+ for (Key k : keys)
{
- Key k = (Key) i.next();
keys2.add(k.clone(clone));
}
clone.keys = keys2;
@@ -357,11 +354,10 @@ class Stylesheet
// See XSLT 11.4: "If the template or expression specifying the value of
// a global variable x references a global variable y, then the value
// for y must be computed before the value of x."
- List topLevel = new ArrayList(variables);
+ List<ParameterNode> topLevel = new ArrayList<ParameterNode>(variables);
Collections.sort(topLevel);
- for (Iterator i = topLevel.iterator(); i.hasNext(); )
+ for (ParameterNode var : topLevel)
{
- ParameterNode var = (ParameterNode) i.next();
bindings.set(var.name,
var.getValue(this, null, context, 1, 1),
var.type);
@@ -381,7 +377,7 @@ class Stylesheet
return (current == null) ? null : current.lookupPrefix(namespaceURI);
}
- public Iterator getPrefixes(String namespaceURI)
+ public Iterator<String> getPrefixes(String namespaceURI)
{
// TODO
return Collections.singleton(getPrefix(namespaceURI)).iterator();
@@ -408,9 +404,8 @@ class Stylesheet
if (debug)
System.err.println("getTemplate: mode="+mode+" context="+context);
Template selected = null;
- for (Iterator j = templates.iterator(); j.hasNext(); )
+ for (Template t : templates)
{
- Template t = (Template) j.next();
boolean isMatch = t.matches(mode, context);
if (applyImports)
{
@@ -472,9 +467,8 @@ class Stylesheet
throws TransformerException
{
Template selected = null;
- for (Iterator j = templates.iterator(); j.hasNext(); )
+ for (Template t : templates)
{
- Template t = (Template) j.next();
boolean isMatch = t.matches(name);
if (isMatch)
{
@@ -862,8 +856,8 @@ class Stylesheet
// Tokenize
int len = value.length();
int off = 0;
- List tokens = new ArrayList(); // text tokens
- List types = new ArrayList(); // literal or expression
+ List<String> tokens = new ArrayList<String>(); // text tokens
+ List<Boolean> types = new ArrayList<Boolean>(); // literal or expression
int depth = 0;
for (int i = 0; i < len; i++)
{
@@ -936,8 +930,8 @@ class Stylesheet
len = tokens.size();
for (int i = len - 1; i >= 0; i--)
{
- String token = (String) tokens.get(i);
- Boolean type = (Boolean) types.get(i);
+ String token = tokens.get(i);
+ Boolean type = types.get(i);
if (type == Boolean.TRUE)
{
// Expression text
@@ -989,9 +983,8 @@ class Stylesheet
{
// Conflict resolution
StrippingInstruction ssi = null, psi = null;
- for (Iterator i = stripSpace.iterator(); i.hasNext(); )
+ for (StrippingInstruction si : stripSpace)
{
- StrippingInstruction si = (StrippingInstruction) i.next();
if (si.element.matches(ctx, 1, 1))
{
if (ssi != null)
@@ -1005,9 +998,8 @@ class Stylesheet
ssi = si;
}
}
- for (Iterator i = preserveSpace.iterator(); i.hasNext(); )
+ for (StrippingInstruction si : preserveSpace)
{
- StrippingInstruction si = (StrippingInstruction) i.next();
if (si.element.matches(ctx, 1, 1))
{
if (psi != null)
@@ -1114,8 +1106,8 @@ class Stylesheet
if (s == null)
s = "child::node()";
Node children = node.getFirstChild();
- List sortKeys = parseSortKeys(children);
- List withParams = parseWithParams(children);
+ List<SortKey> sortKeys = parseSortKeys(children);
+ List<WithParam> withParams = parseWithParams(children);
Expr select = (Expr) xpath.compile(s);
return new ApplyTemplatesNode(select, mode,
sortKeys, withParams, false);
@@ -1131,7 +1123,7 @@ class Stylesheet
String n = getRequiredAttribute(attrs, "name", node);
QName name = getQName(n);
Node children = node.getFirstChild();
- List withParams = parseWithParams(children);
+ List<WithParam> withParams = parseWithParams(children);
return new CallTemplateNode(name, withParams);
}
@@ -1158,7 +1150,7 @@ class Stylesheet
NamedNodeMap attrs = node.getAttributes();
String s = getRequiredAttribute(attrs, "select", node);
Node children = node.getFirstChild();
- List sortKeys = parseSortKeys(children);
+ List<SortKey> sortKeys = parseSortKeys(children);
Expr select = (Expr) xpath.compile(s);
ForEachNode ret = new ForEachNode(select, sortKeys);
ret.children = parse(children);
@@ -1620,10 +1612,10 @@ class Stylesheet
return ret;
}
- final List parseSortKeys(Node node)
+ final List<SortKey> parseSortKeys(Node node)
throws TransformerConfigurationException, XPathExpressionException
{
- List ret = new LinkedList();
+ List<SortKey> ret = new LinkedList<SortKey>();
while (node != null)
{
String namespaceUri = node.getNamespaceURI();
@@ -1652,13 +1644,13 @@ class Stylesheet
}
node = node.getNextSibling();
}
- return ret.isEmpty() ? null : ret;
+ return ret;
}
- final List parseWithParams(Node node)
+ final List<WithParam> parseWithParams(Node node)
throws TransformerConfigurationException, XPathExpressionException
{
- List ret = new LinkedList();
+ List<WithParam> ret = new LinkedList<WithParam>();
while (node != null)
{
String namespaceUri = node.getNamespaceURI();
@@ -1688,7 +1680,7 @@ class Stylesheet
}
node = node.getNextSibling();
}
- return ret.isEmpty() ? null : ret;
+ return ret;
}
/**
@@ -1697,7 +1689,7 @@ class Stylesheet
* exclude-result-prefixes.
*/
final void addNamespaceNodes(Node source, Node target, Document doc,
- Collection elementExcludeResultPrefixes)
+ Collection<String> elementExcludeResultPrefixes)
{
NamedNodeMap attrs = source.getAttributes();
if (attrs != null)
@@ -1768,5 +1760,14 @@ class Stylesheet
dst.setUserData(key, data, this);
}
+ public String toString()
+ {
+ CPStringBuilder b = new CPStringBuilder(getClass().getName());
+ b.append("[templates=");
+ b.append(templates);
+ b.append("]");
+ return b.toString();
+ }
+
}
diff --git a/libjava/classpath/gnu/xml/transform/Template.java b/libjava/classpath/gnu/xml/transform/Template.java
index 1414dac9eb3..7ddef0ae50e 100644
--- a/libjava/classpath/gnu/xml/transform/Template.java
+++ b/libjava/classpath/gnu/xml/transform/Template.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.PrintStream;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
@@ -226,7 +228,7 @@ class Template
public String toString()
{
- StringBuffer buf = new StringBuffer(getClass().getName());
+ CPStringBuilder buf = new CPStringBuilder(getClass().getName());
buf.append('[');
if (name != null)
{
@@ -243,6 +245,8 @@ class Template
buf.append(",mode=");
buf.append(mode);
}
+ buf.append(",node=");
+ buf.append(node);
buf.append(']');
return buf.toString();
diff --git a/libjava/classpath/gnu/xml/transform/TemplateNode.java b/libjava/classpath/gnu/xml/transform/TemplateNode.java
index 6ff727c073c..ad80c59f922 100644
--- a/libjava/classpath/gnu/xml/transform/TemplateNode.java
+++ b/libjava/classpath/gnu/xml/transform/TemplateNode.java
@@ -52,7 +52,7 @@ import gnu.xml.xpath.DocumentOrderComparator;
abstract class TemplateNode
{
- static final Comparator documentOrderComparator =
+ static final Comparator<Node> documentOrderComparator =
new DocumentOrderComparator();
TemplateNode children;
diff --git a/libjava/classpath/gnu/xml/transform/TemplatesImpl.java b/libjava/classpath/gnu/xml/transform/TemplatesImpl.java
index 527bd979db0..e5395f6fb22 100644
--- a/libjava/classpath/gnu/xml/transform/TemplatesImpl.java
+++ b/libjava/classpath/gnu/xml/transform/TemplatesImpl.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Properties;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
@@ -76,5 +78,18 @@ class TemplatesImpl
{
return (Properties) outputProperties.clone();
}
-
+
+ public String toString()
+ {
+ CPStringBuilder b = new CPStringBuilder(getClass().getName());
+ b.append("[factory=");
+ b.append(factory);
+ b.append(",stylesheet=");
+ b.append(stylesheet);
+ b.append(",outputProperties=");
+ b.append(outputProperties);
+ b.append("]");
+ return b.toString();
+ }
+
}
diff --git a/libjava/classpath/gnu/xml/transform/TextNode.java b/libjava/classpath/gnu/xml/transform/TextNode.java
index 39423b270eb..93d1d541775 100644
--- a/libjava/classpath/gnu/xml/transform/TextNode.java
+++ b/libjava/classpath/gnu/xml/transform/TextNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
@@ -106,7 +108,7 @@ final class TextNode
public String toString()
{
- StringBuffer buf = new StringBuffer("text");
+ CPStringBuilder buf = new CPStringBuilder("text");
if (disableOutputEscaping)
{
buf.append('[');
diff --git a/libjava/classpath/gnu/xml/transform/TransformerImpl.java b/libjava/classpath/gnu/xml/transform/TransformerImpl.java
index f43b6602f23..a975c691f29 100644
--- a/libjava/classpath/gnu/xml/transform/TransformerImpl.java
+++ b/libjava/classpath/gnu/xml/transform/TransformerImpl.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -722,7 +724,7 @@ class TransformerImpl
}
else
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append('\n');
for (int i = 0; i < offset + 1; i++)
buf.append(INDENT_WHITESPACE);
@@ -733,7 +735,7 @@ class TransformerImpl
node.insertBefore(doc.createTextNode(ws), ctx);
reindent(doc, ctx, offset + 1);
}
- buf = new StringBuffer();
+ buf = new CPStringBuilder();
buf.append('\n');
for (int i = 0; i < offset; i++)
buf.append(INDENT_WHITESPACE);
diff --git a/libjava/classpath/gnu/xml/transform/TransformerOutputProperties.java b/libjava/classpath/gnu/xml/transform/TransformerOutputProperties.java
index cc8593c4601..9ac5cdc0413 100644
--- a/libjava/classpath/gnu/xml/transform/TransformerOutputProperties.java
+++ b/libjava/classpath/gnu/xml/transform/TransformerOutputProperties.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashSet;
@@ -95,7 +97,7 @@ class TransformerOutputProperties
defaultProperties.put(OutputKeys.DOCTYPE_SYSTEM,
stylesheet.outputSystemId);
}
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (Iterator i = stylesheet.outputCdataSectionElements.iterator();
i.hasNext(); )
{
diff --git a/libjava/classpath/gnu/xml/transform/UnparsedEntityUriFunction.java b/libjava/classpath/gnu/xml/transform/UnparsedEntityUriFunction.java
index 92002f1f5b6..7ba0eae21a4 100644
--- a/libjava/classpath/gnu/xml/transform/UnparsedEntityUriFunction.java
+++ b/libjava/classpath/gnu/xml/transform/UnparsedEntityUriFunction.java
@@ -61,27 +61,28 @@ final class UnparsedEntityUriFunction
implements XPathFunction, Function
{
- List args;
+ List<Expr> args;
public Object evaluate(List args)
throws XPathFunctionException
{
// Useless...
- return Collections.EMPTY_SET;
+ return Collections.emptySet();
}
- public void setArguments(List args)
+ public void setArguments(List<Expr> args)
{
this.args = args;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
int arity = args.size();
- List values = new ArrayList(arity);
+ List<Object> values = new ArrayList<Object>(arity);
for (int i = 0; i < arity; i++)
{
- Expr arg = (Expr) args.get(i);
+ Expr arg = args.get(i);
values.add(arg.evaluate(context, pos, len));
}
String name = _string(context, values.get(0));
@@ -107,10 +108,10 @@ final class UnparsedEntityUriFunction
{
UnparsedEntityUriFunction f = new UnparsedEntityUriFunction();
int len = args.size();
- List args2 = new ArrayList(len);
+ List<Expr> args2 = new ArrayList<Expr>(len);
for (int i = 0; i < len; i++)
{
- args2.add(((Expr) args.get(i)).clone(context));
+ args2.add(args.get(i).clone(context));
}
f.setArguments(args2);
return f;
@@ -118,9 +119,9 @@ final class UnparsedEntityUriFunction
public boolean references(QName var)
{
- for (Iterator i = args.iterator(); i.hasNext(); )
+ for (Iterator<Expr> i = args.iterator(); i.hasNext(); )
{
- if (((Expr) i.next()).references(var))
+ if (i.next().references(var))
{
return true;
}
diff --git a/libjava/classpath/gnu/xml/transform/ValueOfNode.java b/libjava/classpath/gnu/xml/transform/ValueOfNode.java
index 68f31e05ae3..156affa77be 100644
--- a/libjava/classpath/gnu/xml/transform/ValueOfNode.java
+++ b/libjava/classpath/gnu/xml/transform/ValueOfNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collection;
import java.util.Iterator;
import javax.xml.namespace.QName;
@@ -74,7 +76,8 @@ final class ValueOfNode
ret.next = next.clone(stylesheet);
return ret;
}
-
+
+ @Override
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
@@ -84,10 +87,9 @@ final class ValueOfNode
String value;
if (ret instanceof Collection)
{
- StringBuffer buf = new StringBuffer();
- for (Iterator i = ((Collection) ret).iterator(); i.hasNext(); )
+ CPStringBuilder buf = new CPStringBuilder();
+ for (Node node : ((Collection<Node>) ret))
{
- Node node = (Node) i.next();
buf.append(Expr.stringValue(node));
}
value = buf.toString();
@@ -126,7 +128,7 @@ final class ValueOfNode
public String toString()
{
- StringBuffer buf = new StringBuffer("value-of");
+ CPStringBuilder buf = new CPStringBuilder("value-of");
buf.append('[');
buf.append("select=");
buf.append(select);
diff --git a/libjava/classpath/gnu/xml/transform/WhenNode.java b/libjava/classpath/gnu/xml/transform/WhenNode.java
index fe3f403ab0c..fc9d5b187ef 100644
--- a/libjava/classpath/gnu/xml/transform/WhenNode.java
+++ b/libjava/classpath/gnu/xml/transform/WhenNode.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.transform;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Node;
@@ -102,7 +104,7 @@ final class WhenNode
public String toString()
{
- StringBuffer buf = new StringBuffer("when");
+ CPStringBuilder buf = new CPStringBuilder("when");
buf.append('[');
buf.append("test=");
buf.append(test);
diff --git a/libjava/classpath/gnu/xml/transform/XSLComparator.java b/libjava/classpath/gnu/xml/transform/XSLComparator.java
index 222f370c8b9..88243693d7f 100644
--- a/libjava/classpath/gnu/xml/transform/XSLComparator.java
+++ b/libjava/classpath/gnu/xml/transform/XSLComparator.java
@@ -51,72 +51,66 @@ import gnu.xml.xpath.Expr;
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
class XSLComparator
- implements Comparator
+ implements Comparator<Node>
{
- final List sortKeys;
+ final List<SortKey> sortKeys;
- XSLComparator(List sortKeys)
+ XSLComparator(List<SortKey> sortKeys)
{
this.sortKeys = sortKeys;
}
- public int compare(Object o1, Object o2)
+ public int compare(Node n1, Node n2)
{
- if (o1 instanceof Node && o2 instanceof Node)
+ for (SortKey sortKey : sortKeys)
{
- Node n1 = (Node) o1;
- Node n2 = (Node) o2;
- for (Iterator i = sortKeys.iterator(); i.hasNext(); )
- {
- SortKey sortKey = (SortKey) i.next();
- String k1 = sortKey.key(n1);
- String k2 = sortKey.key(n2);
- if ("text".equals(sortKey.dataType))
- {
- Locale locale = (sortKey.lang == null) ? Locale.getDefault() :
- new Locale(sortKey.lang);
- Collator collator = Collator.getInstance(locale);
- int d = collator.compare(k1, k2);
- if (d != 0)
- {
- switch (sortKey.caseOrder)
- {
- case SortKey.UPPER_FIRST:
- // TODO
- break;
- case SortKey.LOWER_FIRST:
- // TODO
- break;
- }
- if (sortKey.descending)
- {
- d = -d;
- }
- return d;
- }
- }
- else if ("number".equals(sortKey.dataType))
- {
- double kn1 = Expr._number(n1, k1);
- double kn2 = Expr._number(n2, k2);
- int d;
- if (Double.isNaN(kn1) || Double.isInfinite(kn2))
- {
- d = -1;
- }
- else if (Double.isNaN(kn2) || Double.isInfinite(kn1))
- {
- d = 1;
- }
- else
- {
- // conversion to int may give 0 for small numbers
- d = (kn1 > kn2) ? 1 : (kn1 < kn2) ? -1 : 0;
- }
- return (sortKey.descending) ? -d : d;
- }
- }
+ String k1 = sortKey.key(n1);
+ String k2 = sortKey.key(n2);
+ if ("text".equals(sortKey.dataType))
+ {
+ Locale locale = (sortKey.lang == null) ? Locale.getDefault() :
+ new Locale(sortKey.lang);
+ Collator collator = Collator.getInstance(locale);
+ int d = collator.compare(k1, k2);
+ if (d != 0)
+ {
+ switch (sortKey.caseOrder)
+ {
+ case SortKey.UPPER_FIRST:
+ // TODO
+ break;
+ case SortKey.LOWER_FIRST:
+ // TODO
+ break;
+ }
+ if (sortKey.descending)
+ {
+ d = -d;
+ }
+ return d;
+ }
+ }
+ else if ("number".equals(sortKey.dataType))
+ {
+ double kn1 = Expr._number(n1, k1);
+ double kn2 = Expr._number(n2, k2);
+ int d;
+ if (Double.isNaN(kn1) || Double.isInfinite(kn2))
+ {
+ d = -1;
+ }
+ else if (Double.isNaN(kn2) || Double.isInfinite(kn1))
+ {
+ d = 1;
+ }
+ else
+ {
+ // conversion to int may give 0 for small numbers
+ d = (kn1 > kn2) ? 1 : (kn1 < kn2) ? -1 : 0;
+ }
+ return (sortKey.descending) ? -d : d;
+ }
}
return 0;
}
diff --git a/libjava/classpath/gnu/xml/transform/XSLURIResolver.java b/libjava/classpath/gnu/xml/transform/XSLURIResolver.java
index 8bb8977315e..c1379211ae5 100644
--- a/libjava/classpath/gnu/xml/transform/XSLURIResolver.java
+++ b/libjava/classpath/gnu/xml/transform/XSLURIResolver.java
@@ -75,8 +75,8 @@ class XSLURIResolver
implements URIResolver
{
- Map lastModifiedCache = new HashMap();
- Map nodeCache = new HashMap();
+ final Map<String,Long> lastModifiedCache = new HashMap<String,Long>();
+ final Map<String,Node> nodeCache = new HashMap<String,Node>();
DocumentBuilder builder;
URIResolver userResolver;
ErrorListener userListener;
@@ -157,10 +157,10 @@ class XSLURIResolver
if (url != null)
{
systemId = url.toString();
- node = (Node) nodeCache.get(systemId);
+ node = nodeCache.get(systemId);
// Is the resource up to date?
URLConnection conn = url.openConnection();
- Long llm = (Long) lastModifiedCache.get(systemId);
+ Long llm = lastModifiedCache.get(systemId);
if (llm != null)
{
lastLastModified = llm.longValue();
@@ -301,6 +301,7 @@ class XSLURIResolver
{
SAXEventSink eventSink = new SAXEventSink();
eventSink.setReader(reader);
+ eventSink.setNamespaceAware(true);
reader.setContentHandler(eventSink);
reader.setDTDHandler(eventSink);
reader.setProperty("http://xml.org/sax/properties/lexical-handler",
diff --git a/libjava/classpath/gnu/xml/util/DoParse.java b/libjava/classpath/gnu/xml/util/DoParse.java
index 5da086ed8f9..a8f50969168 100644
--- a/libjava/classpath/gnu/xml/util/DoParse.java
+++ b/libjava/classpath/gnu/xml/util/DoParse.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import org.xml.sax.ErrorHandler;
@@ -271,7 +273,7 @@ final public class DoParse
String label,
SAXParseException e
) {
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
int temp;
buf.append ("** ");
diff --git a/libjava/classpath/gnu/xml/util/XCat.java b/libjava/classpath/gnu/xml/util/XCat.java
index f3704cd25c7..93127f44211 100644
--- a/libjava/classpath/gnu/xml/util/XCat.java
+++ b/libjava/classpath/gnu/xml/util/XCat.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.xml.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
@@ -623,7 +625,7 @@ public class XCat implements EntityResolver2
private static String normalizePublicId (boolean full, String publicId)
{
if (publicId.startsWith ("urn:publicid:")) {
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
char chars [] = publicId.toCharArray ();
boolean hasbug = false;
@@ -814,7 +816,7 @@ System.err.println ("nyet unhexing public id: " + publicId);
replace = (String) rewrites.get (temp);
}
if (prefix != null) {
- StringBuffer buf = new StringBuffer (replace);
+ CPStringBuilder buf = new CPStringBuilder (replace);
buf.append (uri.substring (prefixLen));
// IF the URI is accessible ...
return new InputSource (buf.toString ());
diff --git a/libjava/classpath/gnu/xml/util/XMLWriter.java b/libjava/classpath/gnu/xml/util/XMLWriter.java
index 24b38923fa2..27459472019 100644
--- a/libjava/classpath/gnu/xml/util/XMLWriter.java
+++ b/libjava/classpath/gnu/xml/util/XMLWriter.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.util;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedWriter;
import java.io.CharConversionException;
import java.io.IOException;
@@ -152,7 +154,7 @@ public class XMLWriter
private String eol = sysEOL;
private short dangerMask;
- private StringBuffer stringBuf;
+ private CPStringBuilder stringBuf;
private Locator locator;
private ErrorHandler errHandler;
@@ -289,7 +291,7 @@ public class XMLWriter
}
if (dangerMask != 0)
- stringBuf = new StringBuffer ();
+ stringBuf = new CPStringBuilder ();
}
this.encoding = encoding;
diff --git a/libjava/classpath/gnu/xml/validation/datatype/EntitiesType.java b/libjava/classpath/gnu/xml/validation/datatype/EntitiesType.java
index 98554e1847a..d16106e0044 100644
--- a/libjava/classpath/gnu/xml/validation/datatype/EntitiesType.java
+++ b/libjava/classpath/gnu/xml/validation/datatype/EntitiesType.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.validation.datatype;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.relaxng.datatype.DatatypeException;
@@ -75,7 +77,7 @@ final class EntitiesType
throws DatatypeException
{
super.checkValid(value, context);
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int len = value.length();
for (int i = 0; i < len; i++)
{
diff --git a/libjava/classpath/gnu/xml/validation/datatype/NMTokensType.java b/libjava/classpath/gnu/xml/validation/datatype/NMTokensType.java
index 62524edf7cb..d49964561a6 100644
--- a/libjava/classpath/gnu/xml/validation/datatype/NMTokensType.java
+++ b/libjava/classpath/gnu/xml/validation/datatype/NMTokensType.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.validation.datatype;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
@@ -79,7 +81,7 @@ final class NMTokensType
{
super.checkValid(value, context);
int len = value.length();
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (int i = 0; i < len; i++)
{
char c = value.charAt(i);
diff --git a/libjava/classpath/gnu/xml/xpath/ArithmeticExpr.java b/libjava/classpath/gnu/xml/xpath/ArithmeticExpr.java
index cbc1ee0648b..61098d6e4f2 100644
--- a/libjava/classpath/gnu/xml/xpath/ArithmeticExpr.java
+++ b/libjava/classpath/gnu/xml/xpath/ArithmeticExpr.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
@@ -139,7 +141,7 @@ final class ArithmeticExpr
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(lhs);
buf.append(' ');
switch (op)
diff --git a/libjava/classpath/gnu/xml/xpath/BooleanFunction.java b/libjava/classpath/gnu/xml/xpath/BooleanFunction.java
index 256de0382a8..f661b2ac285 100644
--- a/libjava/classpath/gnu/xml/xpath/BooleanFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/BooleanFunction.java
@@ -61,9 +61,9 @@ final class BooleanFunction
final Expr arg;
- BooleanFunction(List args)
+ BooleanFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
BooleanFunction(Expr arg)
diff --git a/libjava/classpath/gnu/xml/xpath/CeilingFunction.java b/libjava/classpath/gnu/xml/xpath/CeilingFunction.java
index 7db08fc5d61..15398842248 100644
--- a/libjava/classpath/gnu/xml/xpath/CeilingFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/CeilingFunction.java
@@ -54,9 +54,9 @@ final class CeilingFunction
final Expr arg;
- CeilingFunction(List args)
+ CeilingFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
CeilingFunction(Expr arg)
diff --git a/libjava/classpath/gnu/xml/xpath/ConcatFunction.java b/libjava/classpath/gnu/xml/xpath/ConcatFunction.java
index fddd7ae2520..a61a45477b1 100644
--- a/libjava/classpath/gnu/xml/xpath/ConcatFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/ConcatFunction.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -52,19 +54,19 @@ final class ConcatFunction
extends Expr
{
- final List args;
+ final List<Expr> args;
- ConcatFunction(List args)
+ ConcatFunction(List<Expr> args)
{
this.args = args;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
- StringBuffer buf = new StringBuffer();
- for (Iterator i = args.iterator(); i.hasNext(); )
+ CPStringBuilder buf = new CPStringBuilder();
+ for (Expr arg : args)
{
- Expr arg = (Expr) i.next();
Object val = arg.evaluate(context, pos, len);
buf.append(_string(context, val));
}
@@ -74,19 +76,19 @@ final class ConcatFunction
public Expr clone(Object context)
{
int len = args.size();
- List args2 = new ArrayList(len);
+ List<Expr> args2 = new ArrayList<Expr>(len);
for (int i = 0; i < len; i++)
{
- args2.add(((Expr) args.get(i)).clone(context));
+ args2.add(args.get(i).clone(context));
}
return new ConcatFunction(args2);
}
public boolean references(QName var)
{
- for (Iterator i = args.iterator(); i.hasNext(); )
+ for (Iterator<Expr> i = args.iterator(); i.hasNext(); )
{
- if (((Expr) i.next()).references(var))
+ if (i.next().references(var))
{
return true;
}
@@ -96,7 +98,7 @@ final class ConcatFunction
public String toString()
{
- StringBuffer buf = new StringBuffer("concat(");
+ CPStringBuilder buf = new CPStringBuilder("concat(");
int len = args.size();
for (int i = 0; i < len; i++)
{
diff --git a/libjava/classpath/gnu/xml/xpath/ContainsFunction.java b/libjava/classpath/gnu/xml/xpath/ContainsFunction.java
index fc2f33faf52..620606b3f20 100644
--- a/libjava/classpath/gnu/xml/xpath/ContainsFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/ContainsFunction.java
@@ -54,9 +54,9 @@ final class ContainsFunction
final Expr arg1;
final Expr arg2;
- ContainsFunction(List args)
+ ContainsFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1));
+ this(args.get(0), args.get(1));
}
ContainsFunction(Expr arg1, Expr arg2)
@@ -65,6 +65,7 @@ final class ContainsFunction
this.arg2 = arg2;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val1 = arg1.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/CountFunction.java b/libjava/classpath/gnu/xml/xpath/CountFunction.java
index cb534bffc9e..f29d833106d 100644
--- a/libjava/classpath/gnu/xml/xpath/CountFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/CountFunction.java
@@ -54,9 +54,9 @@ final class CountFunction
final Expr arg;
- CountFunction(List args)
+ CountFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
CountFunction(Expr arg)
@@ -64,10 +64,11 @@ final class CountFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
- return new Double((double) ((Collection) val).size());
+ return new Double((double) ((Collection<?>) val).size());
}
public Expr clone(Object context)
diff --git a/libjava/classpath/gnu/xml/xpath/DocumentOrderComparator.java b/libjava/classpath/gnu/xml/xpath/DocumentOrderComparator.java
index c7d7de9f7c7..605749d09d7 100644
--- a/libjava/classpath/gnu/xml/xpath/DocumentOrderComparator.java
+++ b/libjava/classpath/gnu/xml/xpath/DocumentOrderComparator.java
@@ -46,18 +46,12 @@ import org.w3c.dom.Node;
* @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
*/
public class DocumentOrderComparator
- implements Comparator
+ implements Comparator<Node>
{
- public int compare(Object o1, Object o2)
+ public int compare(Node n1, Node n2)
{
- if (o1 instanceof Node && o2 instanceof Node)
- {
- Node n1 = (Node)o1;
- Node n2 = (Node)o2;
- return (int) n1.compareDocumentPosition(n2);
- }
- return 0;
+ return (int) n1.compareDocumentPosition(n2);
}
}
diff --git a/libjava/classpath/gnu/xml/xpath/EqualityExpr.java b/libjava/classpath/gnu/xml/xpath/EqualityExpr.java
index 6d00cee89a9..3b6fd568a86 100644
--- a/libjava/classpath/gnu/xml/xpath/EqualityExpr.java
+++ b/libjava/classpath/gnu/xml/xpath/EqualityExpr.java
@@ -62,6 +62,7 @@ final class EqualityExpr
this.invert = invert;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
boolean val = evaluateImpl(context, pos, len);
@@ -90,19 +91,20 @@ final class EqualityExpr
boolean frns = right instanceof Collection;
if (flns && frns)
{
- Collection lns = (Collection) left;
- Collection rns = (Collection) right;
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> lns = (Collection<Node>) left;
+ @SuppressWarnings("unchecked")
+ Collection<Node> rns = (Collection<Node>) right;
if (lns.isEmpty())
{
return false;
}
boolean all = true;
- for (Iterator i = lns.iterator(); i.hasNext(); )
- {
- Node ltest = (Node) i.next();
- for (Iterator j = rns.iterator(); j.hasNext(); )
- {
- Node rtest = (Node) j.next();
+ for (Node ltest : lns)
+ {
+ for (Node rtest : rns)
+ {
if (ltest == rtest || ltest.equals(rtest))
{
// much shorter
@@ -138,13 +140,14 @@ final class EqualityExpr
boolean frn = right instanceof Double;
if ((flns && frn) || (frns && fln))
{
- Collection ns = flns ? (Collection) left : (Collection) right;
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> ns = flns ? (Collection<Node>) left : (Collection<Node>) right;
double n = fln ? ((Double) left).doubleValue() :
((Double) right).doubleValue();
boolean all = true;
- for (Iterator i = ns.iterator(); i.hasNext(); )
+ for (Node test : ns)
{
- Node test = (Node) i.next();
double nn = _number(context, stringValue(test));
if (nn == n)
{
@@ -171,12 +174,13 @@ final class EqualityExpr
boolean frs = right instanceof String;
if ((flns && frs) || (frns && fls))
{
- Collection ns = flns ? (Collection) left : (Collection) right;
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> ns = flns ? (Collection<Node>) left : (Collection<Node>) right;
String s = fls ? (String) left : (String) right;
boolean all = true;
- for (Iterator i = ns.iterator(); i.hasNext(); )
+ for (Node test : ns)
{
- Node test = (Node) i.next();
if (stringValue(test).equals(s))
{
if (!invert)
@@ -202,7 +206,9 @@ final class EqualityExpr
boolean frb = right instanceof Boolean;
if ((flns && frb) || (frns && flb))
{
- Collection ns = flns ? (Collection) left : (Collection) right;
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> ns = flns ? (Collection<Node>) left : (Collection<Node>) right;
boolean b = flb ? ((Boolean) left).booleanValue() :
((Boolean) right).booleanValue();
return _boolean(context, ns) == b;
diff --git a/libjava/classpath/gnu/xml/xpath/Expr.java b/libjava/classpath/gnu/xml/xpath/Expr.java
index cafc83b0d37..87ce3dfb63c 100644
--- a/libjava/classpath/gnu/xml/xpath/Expr.java
+++ b/libjava/classpath/gnu/xml/xpath/Expr.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
@@ -73,7 +75,7 @@ public abstract class Expr
implements XPathExpression
{
- protected static final Comparator documentOrderComparator =
+ protected static final Comparator<Node> documentOrderComparator =
new DocumentOrderComparator();
protected static final DecimalFormat decimalFormat =
@@ -84,14 +86,14 @@ public abstract class Expr
static class ExprNodeSet implements NodeList
{
- private ArrayList list;
+ private ArrayList<Node> list;
- ExprNodeSet(Collection collection)
+ ExprNodeSet(Collection<Node> collection)
{
if (collection instanceof ArrayList)
- list = (ArrayList) collection;
+ list = (ArrayList<Node>) collection;
else
- list = new ArrayList(collection);
+ list = new ArrayList<Node>(collection);
}
public int getLength()
@@ -103,7 +105,7 @@ public abstract class Expr
{
try
{
- return (Node) list.get(index);
+ return list.get(index);
}
catch (ArrayIndexOutOfBoundsException e)
{
@@ -141,14 +143,17 @@ public abstract class Expr
{
if (ret instanceof Collection)
{
- Collection ns = (Collection) ret;
+ /* Suppression is safe, as we know context
+ produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> ns = (Collection<Node>) ret;
switch (ns.size())
{
case 0:
ret = null;
break;
case 1:
- ret = (Node) ns.iterator().next();
+ ret = ns.iterator().next();
break;
default:
throw new XPathExpressionException("multiple nodes in node-set");
@@ -166,7 +171,12 @@ public abstract class Expr
throw new XPathExpressionException("return value is not a node-set");
}
if (ret != null)
- ret = new ExprNodeSet((Collection) ret);
+ {
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodes = (Collection<Node>) ret;
+ ret = new ExprNodeSet(nodes);
+ }
}
}
return ret;
@@ -229,15 +239,17 @@ public abstract class Expr
* same document as the context node that have a unique ID equal to any of
* the tokens in the list.
*/
- public static Collection _id(Node context, Object object)
+ public static Collection<Node> _id(Node context, Object object)
{
- Set ret = new HashSet();
+ Set<Node> ret = new HashSet<Node>();
if (object instanceof Collection)
{
- Collection nodeSet = (Collection) object;
- for (Iterator i = nodeSet.iterator(); i.hasNext(); )
+ /* Suppression is safe, as the iteration will check each value is a Node */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodeSet = (Collection<Node>) object;
+ for (Iterator<Node> i = nodeSet.iterator(); i.hasNext(); )
{
- String string = stringValue((Node) i.next());
+ String string = stringValue(i.next());
ret.addAll(_id (context, string));
}
}
@@ -266,7 +278,7 @@ public abstract class Expr
* an empty string is returned. If the argument is omitted, it defaults to
* a node-set with the context node as its only member.
*/
- public static String _local_name(Node context, Collection nodeSet)
+ public static String _local_name(Node context, Collection<Node> nodeSet)
{
if (nodeSet == null || nodeSet.isEmpty())
return "";
@@ -283,7 +295,7 @@ public abstract class Expr
* empty string is returned. If the argument is omitted, it defaults to a
* node-set with the context node as its only member.
*/
- public static String _namespace_uri(Node context, Collection nodeSet)
+ public static String _namespace_uri(Node context, Collection<Node> nodeSet)
{
if (nodeSet == null || nodeSet.isEmpty())
return "";
@@ -308,7 +320,7 @@ public abstract class Expr
* string is returned. If the argument it omitted, it defaults to a
* node-set with the context node as its only member.
*/
- public static String _name(Node context, Collection nodeSet)
+ public static String _name(Node context, Collection<Node> nodeSet)
{
if (nodeSet == null || nodeSet.isEmpty())
return "";
@@ -327,11 +339,11 @@ public abstract class Expr
/**
* Returns the first node in the set in document order.
*/
- static Node firstNode(Collection nodeSet)
+ static Node firstNode(Collection<Node> nodeSet)
{
- List list = new ArrayList(nodeSet);
+ List<Node> list = new ArrayList<Node>(nodeSet);
Collections.sort(list, documentOrderComparator);
- return (Node) list.get(0);
+ return list.get(0);
}
/* -- 4.2 String Functions -- */
@@ -387,7 +399,10 @@ public abstract class Expr
}
if (object instanceof Collection)
{
- Collection nodeSet = (Collection) object;
+ /* Suppression is safe, as we fail immediately if the
+ * first element is not a Node and don't use the rest */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodeSet = (Collection<Node>) object;
if (nodeSet.isEmpty())
{
return "";
@@ -422,7 +437,7 @@ public abstract class Expr
}
if (object instanceof Collection)
{
- return ((Collection) object).size() != 0;
+ return ((Collection<?>) object).size() != 0;
}
return false; // TODO user defined types
}
@@ -448,8 +463,12 @@ public abstract class Expr
}
if (object instanceof Collection)
{
+ /* Suppression is safe, as we fail immediately if one
+ * of the elements is not a Node */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodeSet = (Collection<Node>) object;
// Convert node-set to string
- object = stringValue((Collection) object);
+ object = stringValue(nodeSet);
}
if (object instanceof String)
{
@@ -469,12 +488,12 @@ public abstract class Expr
/**
* Computes the XPath string-value of the specified node-set.
*/
- public static String stringValue(Collection nodeSet)
+ public static String stringValue(Collection<Node> nodeSet)
{
- StringBuffer buf = new StringBuffer();
- for (Iterator i = nodeSet.iterator(); i.hasNext(); )
+ CPStringBuilder buf = new CPStringBuilder();
+ for (Iterator<Node> i = nodeSet.iterator(); i.hasNext(); )
{
- buf.append(stringValue((Node) i.next()));
+ buf.append(stringValue(i.next()));
}
return buf.toString();
}
@@ -494,7 +513,7 @@ public abstract class Expr
case Node.DOCUMENT_NODE: // 5.1 Root Node
case Node.DOCUMENT_FRAGMENT_NODE:
case Node.ELEMENT_NODE: // 5.2 Element Nodes
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
for (Node ctx = node.getFirstChild(); ctx != null;
ctx = ctx.getNextSibling())
{
diff --git a/libjava/classpath/gnu/xml/xpath/FloorFunction.java b/libjava/classpath/gnu/xml/xpath/FloorFunction.java
index c03c0e7edaf..bbf56c91178 100644
--- a/libjava/classpath/gnu/xml/xpath/FloorFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/FloorFunction.java
@@ -54,9 +54,9 @@ final class FloorFunction
final Expr arg;
- FloorFunction(List args)
+ FloorFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
FloorFunction(Expr arg)
@@ -64,6 +64,7 @@ final class FloorFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/Function.java b/libjava/classpath/gnu/xml/xpath/Function.java
index aecd49d9c73..12e2e1141fd 100644
--- a/libjava/classpath/gnu/xml/xpath/Function.java
+++ b/libjava/classpath/gnu/xml/xpath/Function.java
@@ -51,7 +51,7 @@ public interface Function
/**
* Sets the list of expressions to evaluate as parameter values.
*/
- void setArguments(List args);
+ void setArguments(List<Expr> args);
}
diff --git a/libjava/classpath/gnu/xml/xpath/FunctionCall.java b/libjava/classpath/gnu/xml/xpath/FunctionCall.java
index 669efbf1866..e811f53a2ab 100644
--- a/libjava/classpath/gnu/xml/xpath/FunctionCall.java
+++ b/libjava/classpath/gnu/xml/xpath/FunctionCall.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -58,20 +60,24 @@ public final class FunctionCall
final XPathFunctionResolver resolver;
final String name;
- final List args;
+ final List<Expr> args;
public FunctionCall(XPathFunctionResolver resolver, String name)
{
- this(resolver, name, Collections.EMPTY_LIST);
+ this(resolver, name, null);
}
- public FunctionCall(XPathFunctionResolver resolver, String name, List args)
+ public FunctionCall(XPathFunctionResolver resolver, String name, List<Expr> args)
{
this.resolver = resolver;
this.name = name;
- this.args = args;
+ if (args == null)
+ this.args = Collections.emptyList();
+ else
+ this.args = args;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
if (resolver != null)
@@ -92,7 +98,7 @@ public final class FunctionCall
}
else
{
- List values = new ArrayList(arity);
+ List<Object> values = new ArrayList<Object>(arity);
for (int i = 0; i < arity; i++)
{
Expr arg = (Expr) args.get(i);
@@ -117,10 +123,10 @@ public final class FunctionCall
public Expr clone(Object context)
{
int len = args.size();
- List args2 = new ArrayList(len);
+ List<Expr> args2 = new ArrayList<Expr>(len);
for (int i = 0; i < len; i++)
{
- args2.add(((Expr) args.get(i)).clone(context));
+ args2.add(args.get(i).clone(context));
}
XPathFunctionResolver r = resolver;
if (context instanceof XPathFunctionResolver)
@@ -132,9 +138,9 @@ public final class FunctionCall
public boolean references(QName var)
{
- for (Iterator i = args.iterator(); i.hasNext(); )
+ for (Iterator<Expr> i = args.iterator(); i.hasNext(); )
{
- if (((Expr) i.next()).references(var))
+ if (i.next().references(var))
{
return true;
}
@@ -144,7 +150,7 @@ public final class FunctionCall
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
buf.append(name);
buf.append('(');
int len = args.size();
diff --git a/libjava/classpath/gnu/xml/xpath/IdFunction.java b/libjava/classpath/gnu/xml/xpath/IdFunction.java
index 74979541957..b3d2208c8e4 100644
--- a/libjava/classpath/gnu/xml/xpath/IdFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/IdFunction.java
@@ -62,9 +62,9 @@ public final class IdFunction
final Expr arg;
- IdFunction(List args)
+ IdFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
public IdFunction(Expr arg)
@@ -75,9 +75,10 @@ public final class IdFunction
public boolean matches(Node context)
{
Object ret = evaluate(context, 1, 1);
- return !((Collection) ret).isEmpty();
+ return !((Collection<?>) ret).isEmpty();
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/LangFunction.java b/libjava/classpath/gnu/xml/xpath/LangFunction.java
index 584787efbf7..33cf8b0a2ab 100644
--- a/libjava/classpath/gnu/xml/xpath/LangFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/LangFunction.java
@@ -64,9 +64,9 @@ final class LangFunction
final Expr arg;
- LangFunction(List args)
+ LangFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
LangFunction(Expr arg)
@@ -74,6 +74,7 @@ final class LangFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java b/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
index 84fb6d48288..dbad9d3b42a 100644
--- a/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
@@ -59,9 +59,9 @@ final class LocalNameFunction
final Expr arg;
- LocalNameFunction(List args)
+ LocalNameFunction(List<Expr> args)
{
- this(args.size() > 0 ? (Expr) args.get(0) : null);
+ this(args.size() > 0 ? args.get(0) : null);
}
LocalNameFunction(Expr arg)
@@ -69,11 +69,14 @@ final class LocalNameFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? Collections.singleton(context) :
- arg.evaluate(context, pos, len);
- return _local_name(context, (Collection) val);
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> val = (arg == null) ? Collections.singleton(context) :
+ (Collection<Node>) arg.evaluate(context, pos, len);
+ return _local_name(context, val);
}
public Expr clone(Object context)
diff --git a/libjava/classpath/gnu/xml/xpath/NameFunction.java b/libjava/classpath/gnu/xml/xpath/NameFunction.java
index ea49741fa57..239a53453be 100644
--- a/libjava/classpath/gnu/xml/xpath/NameFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NameFunction.java
@@ -67,9 +67,9 @@ final class NameFunction
final Expr arg;
- NameFunction(List args)
+ NameFunction(List<Expr> args)
{
- this(args.size() > 0 ? (Expr) args.get(0) : null);
+ this(args.size() > 0 ? args.get(0) : null);
}
NameFunction(Expr arg)
@@ -77,24 +77,30 @@ final class NameFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? Collections.singleton(context) :
- arg.evaluate(context, pos, len);
- return _name(context, (Collection) val);
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> val = (arg == null) ? Collections.singleton(context) :
+ (Collection<Node>) arg.evaluate(context, pos, len);
+ return _name(context, val);
}
+ @Override
public Expr clone(Object context)
{
return new NameFunction((arg == null) ? null :
arg.clone(context));
}
-
+
+ @Override
public boolean references(QName var)
{
return (arg == null) ? false : arg.references(var);
}
+ @Override
public String toString()
{
return (arg == null) ? "name()" : "name(" + arg + ")";
diff --git a/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java b/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
index 3ae46f7ee71..56da90f8c0a 100644
--- a/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
@@ -59,9 +59,9 @@ final class NamespaceUriFunction
final Expr arg;
- NamespaceUriFunction(List args)
+ NamespaceUriFunction(List<Expr> args)
{
- this(args.size() > 0 ? (Expr) args.get(0) : null);
+ this(args.size() > 0 ? args.get(0) : null);
}
NamespaceUriFunction(Expr arg)
@@ -69,11 +69,14 @@ final class NamespaceUriFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? Collections.singleton(context) :
- arg.evaluate(context, pos, len);
- return _namespace_uri(context, (Collection) val);
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> val = (arg == null) ? Collections.singleton(context) :
+ (Collection<Node>) arg.evaluate(context, pos, len);
+ return _namespace_uri(context, val);
}
public Expr clone(Object context)
diff --git a/libjava/classpath/gnu/xml/xpath/NormalizeSpaceFunction.java b/libjava/classpath/gnu/xml/xpath/NormalizeSpaceFunction.java
index b7358e8d8e4..30069acdc43 100644
--- a/libjava/classpath/gnu/xml/xpath/NormalizeSpaceFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NormalizeSpaceFunction.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.List;
import java.util.StringTokenizer;
import javax.xml.namespace.QName;
@@ -59,9 +61,9 @@ final class NormalizeSpaceFunction
final Expr arg;
- NormalizeSpaceFunction(List args)
+ NormalizeSpaceFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
NormalizeSpaceFunction(Expr arg)
@@ -69,12 +71,13 @@ final class NormalizeSpaceFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
String s = _string(context, val);
StringTokenizer st = new StringTokenizer(s, " \t\r\n");
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
if (st.hasMoreTokens())
{
buf.append(st.nextToken());
diff --git a/libjava/classpath/gnu/xml/xpath/NotFunction.java b/libjava/classpath/gnu/xml/xpath/NotFunction.java
index bbed66a7311..188b3dbc40e 100644
--- a/libjava/classpath/gnu/xml/xpath/NotFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NotFunction.java
@@ -53,9 +53,9 @@ final class NotFunction
final Expr arg;
- NotFunction(List args)
+ NotFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
NotFunction(Expr arg)
@@ -63,6 +63,7 @@ final class NotFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/NumberFunction.java b/libjava/classpath/gnu/xml/xpath/NumberFunction.java
index 79553ce81fb..8804a788670 100644
--- a/libjava/classpath/gnu/xml/xpath/NumberFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NumberFunction.java
@@ -68,9 +68,9 @@ final class NumberFunction
final Expr arg;
- NumberFunction(List args)
+ NumberFunction(List<Expr> args)
{
- this(args.size() > 0 ? (Expr) args.get(0) : null);
+ this(args.size() > 0 ? args.get(0) : null);
}
NumberFunction(Expr arg)
@@ -78,6 +78,7 @@ final class NumberFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/ParenthesizedExpr.java b/libjava/classpath/gnu/xml/xpath/ParenthesizedExpr.java
index f343857c313..adadd6745c4 100644
--- a/libjava/classpath/gnu/xml/xpath/ParenthesizedExpr.java
+++ b/libjava/classpath/gnu/xml/xpath/ParenthesizedExpr.java
@@ -60,12 +60,17 @@ final class ParenthesizedExpr
this.expr = expr;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object ret = expr.evaluate(context, pos, len);
if (ret instanceof Collection)
{
- List list = new ArrayList((Collection) ret);
+ /* Suppression is safe, as we know context produces
+ Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodes = (Collection<Node>) ret;
+ List<Node> list = new ArrayList<Node>(nodes);
Collections.sort(list, documentOrderComparator);
ret = list;
}
diff --git a/libjava/classpath/gnu/xml/xpath/Path.java b/libjava/classpath/gnu/xml/xpath/Path.java
index 4b01f0918ab..809f965ccef 100644
--- a/libjava/classpath/gnu/xml/xpath/Path.java
+++ b/libjava/classpath/gnu/xml/xpath/Path.java
@@ -49,6 +49,6 @@ abstract class Path
extends Pattern
{
- abstract Collection evaluate(Node context, Collection nodeSet);
+ abstract Collection<Node> evaluate(Node context, Collection<Node> nodeSet);
}
diff --git a/libjava/classpath/gnu/xml/xpath/Root.java b/libjava/classpath/gnu/xml/xpath/Root.java
index 1f79b395812..cbcb24999bc 100644
--- a/libjava/classpath/gnu/xml/xpath/Root.java
+++ b/libjava/classpath/gnu/xml/xpath/Root.java
@@ -39,6 +39,8 @@ package gnu.xml.xpath;
import java.util.Collection;
import java.util.Collections;
+import java.util.Set;
+
import javax.xml.namespace.QName;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
@@ -59,12 +61,14 @@ public final class Root
public Object evaluate(Node context, int pos, int len)
{
- return evaluate(context, Collections.EMPTY_SET);
+ Set<Node> emptySet = Collections.emptySet();
+ return evaluate(context, emptySet);
}
- Collection evaluate(Node context, Collection ns)
+ @Override
+ Collection<Node> evaluate(Node context, Collection<Node> ns)
{
- Document doc = (context instanceof Document) ? (Document) context :
+ Node doc = (context instanceof Document) ? context :
context.getOwnerDocument();
return Collections.singleton(doc);
}
diff --git a/libjava/classpath/gnu/xml/xpath/RoundFunction.java b/libjava/classpath/gnu/xml/xpath/RoundFunction.java
index bfbfd357da8..2d1bd544722 100644
--- a/libjava/classpath/gnu/xml/xpath/RoundFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/RoundFunction.java
@@ -60,9 +60,9 @@ final class RoundFunction
final Expr arg;
- RoundFunction(List args)
+ RoundFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
RoundFunction(Expr arg)
@@ -70,6 +70,7 @@ final class RoundFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/Selector.java b/libjava/classpath/gnu/xml/xpath/Selector.java
index c7abb33e2ff..429b3f7e20b 100644
--- a/libjava/classpath/gnu/xml/xpath/Selector.java
+++ b/libjava/classpath/gnu/xml/xpath/Selector.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -82,7 +84,7 @@ public final class Selector
*/
final Test[] tests;
- public Selector(int axis, List tests)
+ public Selector(int axis, List<? extends Test> tests)
{
this.axis = axis;
int len = tests.size();
@@ -177,29 +179,31 @@ public final class Selector
return count;
}
+
+ @Override
public Object evaluate(Node context, int pos, int len)
{
- Set acc = new LinkedHashSet();
+ Set<Node> acc = new LinkedHashSet<Node>();
addCandidates(context, acc);
- List candidates = new ArrayList(acc);
- List ret = filterCandidates(candidates, false);
+ List<Node> candidates = new ArrayList<Node>(acc);
+ List<Node> ret = filterCandidates(candidates, false);
return ret;
}
- Collection evaluate(Node context, Collection ns)
+ Collection<Node> evaluate(Node context, Collection<Node> ns)
{
- Set acc = new LinkedHashSet();
- for (Iterator i = ns.iterator(); i.hasNext(); )
- addCandidates((Node) i.next(), acc);
- List candidates = new ArrayList(acc);
- List ret = filterCandidates(candidates, true);
+ Set<Node> acc = new LinkedHashSet<Node>();
+ for (Iterator<Node> i = ns.iterator(); i.hasNext(); )
+ addCandidates(i.next(), acc);
+ List<Node> candidates = new ArrayList<Node>(acc);
+ List<Node> ret = filterCandidates(candidates, true);
return ret;
}
/**
* Filter the given list of candidates according to the node tests.
*/
- List filterCandidates(List candidates, boolean cascade)
+ List<Node> filterCandidates(List<Node> candidates, boolean cascade)
{
int len = candidates.size();
int tlen = tests.length;
@@ -209,10 +213,10 @@ public final class Selector
for (int j = 0; j < tlen && len > 0; j++)
{
Test test = tests[j];
- List successful = new ArrayList(len);
+ List<Node> successful = new ArrayList<Node>(len);
for (int i = 0; i < len; i++)
{
- Node node = (Node) candidates.get(i);
+ Node node = candidates.get(i);
if (cascade)
{
// Documents and DocumentFragments should be considered
@@ -242,7 +246,7 @@ public final class Selector
return candidates;
}
- void addCandidates(Node context, Collection candidates)
+ void addCandidates(Node context, Collection<Node> candidates)
{
// Build list of candidates
switch (axis)
@@ -291,7 +295,7 @@ public final class Selector
}
}
- void addChildNodes(Node context, Collection acc, boolean recurse)
+ void addChildNodes(Node context, Collection<Node> acc, boolean recurse)
{
Node child = context.getFirstChild();
while (child != null)
@@ -303,7 +307,7 @@ public final class Selector
}
}
- void addParentNode(Node context, Collection acc, boolean recurse)
+ void addParentNode(Node context, Collection<Node> acc, boolean recurse)
{
Node parent = (context.getNodeType() == Node.ATTRIBUTE_NODE) ?
((Attr) context).getOwnerElement() : context.getParentNode();
@@ -315,7 +319,7 @@ public final class Selector
}
}
- void addFollowingNodes(Node context, Collection acc, boolean recurse)
+ void addFollowingNodes(Node context, Collection<Node> acc, boolean recurse)
{
if (context != null && recurse)
addChildNodes(context, acc, true);
@@ -349,7 +353,7 @@ public final class Selector
}
}
- void addPrecedingNodes(Node context, Collection acc, boolean recurse)
+ void addPrecedingNodes(Node context, Collection<Node> acc, boolean recurse)
{
Node cur = (context.getNodeType() == Node.ATTRIBUTE_NODE) ? null :
context.getPreviousSibling();
@@ -370,7 +374,7 @@ public final class Selector
}
}
- void addAttributes(Node context, Collection acc)
+ void addAttributes(Node context, Collection<Node> acc)
{
NamedNodeMap attrs = context.getAttributes();
if (attrs != null)
@@ -387,7 +391,7 @@ public final class Selector
}
}
- void addNamespaceAttributes(Node context, Collection acc)
+ void addNamespaceAttributes(Node context, Collection<Node> acc)
{
NamedNodeMap attrs = context.getAttributes();
if (attrs != null)
@@ -413,7 +417,7 @@ public final class Selector
public Expr clone(Object context)
{
int len = tests.length;
- List tests2 = new ArrayList(len);
+ List<Test> tests2 = new ArrayList<Test>(len);
for (int i = 0; i < len; i++)
tests2.add(tests[i].clone(context));
return new Selector(axis, tests2);
@@ -431,7 +435,7 @@ public final class Selector
public String toString()
{
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
switch (axis)
{
case ANCESTOR:
diff --git a/libjava/classpath/gnu/xml/xpath/StartsWithFunction.java b/libjava/classpath/gnu/xml/xpath/StartsWithFunction.java
index ec021551e76..2dc2c409d8d 100644
--- a/libjava/classpath/gnu/xml/xpath/StartsWithFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/StartsWithFunction.java
@@ -54,9 +54,9 @@ final class StartsWithFunction
final Expr arg1;
final Expr arg2;
- StartsWithFunction(List args)
+ StartsWithFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1));
+ this(args.get(0), args.get(1));
}
StartsWithFunction(Expr arg1, Expr arg2)
diff --git a/libjava/classpath/gnu/xml/xpath/Steps.java b/libjava/classpath/gnu/xml/xpath/Steps.java
index 9ef6cd35f3d..427fbe20138 100644
--- a/libjava/classpath/gnu/xml/xpath/Steps.java
+++ b/libjava/classpath/gnu/xml/xpath/Steps.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@@ -56,14 +58,14 @@ public final class Steps
extends Path
{
- final LinkedList path;
+ final LinkedList<Expr> path;
public Steps()
{
- this(new LinkedList());
+ this(new LinkedList<Expr>());
}
- Steps(LinkedList path)
+ Steps(LinkedList<Expr> path)
{
this.path = path;
}
@@ -84,10 +86,8 @@ public final class Steps
if (pos > 0)
{
Pattern left = (Pattern) path.get(pos - 1);
- Iterator j = possibleContexts(right, context).iterator();
- while (j.hasNext())
+ for (Node candidate : possibleContexts(right, context))
{
- Node candidate = (Node) j.next();
if (left.matches(candidate) &&
matches(candidate, pos - 1))
{
@@ -104,12 +104,12 @@ public final class Steps
* Essentially the reverse of Selector.addCandidates.
* The idea is to determine possible context nodes for a match.
*/
- Collection possibleContexts(Pattern pattern, Node context)
+ Collection<Node> possibleContexts(Pattern pattern, Node context)
{
if (pattern instanceof Selector)
{
Selector s = (Selector) pattern;
- Collection candidates = new LinkedHashSet();
+ Collection<Node> candidates = new LinkedHashSet<Node>();
switch (s.axis)
{
case Selector.PARENT:
@@ -157,46 +157,53 @@ public final class Steps
}
return candidates;
}
- return Collections.EMPTY_SET;
+ return Collections.emptySet();
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
//System.err.println(toString()+" evaluate");
// Left to right
- Iterator i = path.iterator();
- Expr lhs = (Expr) i.next();
+ Iterator<Expr> i = path.iterator();
+ Expr lhs = i.next();
Object val = lhs.evaluate(context, pos, len);
//System.err.println("\tevaluate "+lhs+" = "+val);
while (val instanceof Collection && i.hasNext())
{
Path rhs = (Path) i.next();
- val = rhs.evaluate(context, (Collection) val);
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodes = (Collection<Node>) val;
+ val = rhs.evaluate(context, nodes);
//System.err.println("\tevaluate "+rhs+" = "+val);
}
return val;
}
- Collection evaluate(Node context, Collection ns)
+ @Override
+ Collection<Node> evaluate(Node context, Collection<Node> ns)
{
// Left to right
- Iterator i = path.iterator();
- Expr lhs = (Expr) i.next();
+ Iterator<Expr> i = path.iterator();
+ Expr lhs = i.next();
if (lhs instanceof Path)
{
ns = ((Path) lhs).evaluate(context, ns);
}
else
{
- Set acc = new LinkedHashSet();
+ Set<Node> acc = new LinkedHashSet<Node>();
int pos = 1, len = ns.size();
- for (Iterator j = ns.iterator(); j.hasNext(); )
+ for (Node node : ns)
{
- Node node = (Node) j.next();
Object ret = lhs.evaluate(node, pos++, len);
if (ret instanceof Collection)
{
- acc.addAll((Collection) ret);
+ /* Suppression is safe, as we know context produces Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodes = (Collection<Node>) ret;
+ acc.addAll(nodes);
}
}
ns = acc;
@@ -212,19 +219,19 @@ public final class Steps
public Expr clone(Object context)
{
int len = path.size();
- LinkedList path2 = new LinkedList();
+ LinkedList<Expr> path2 = new LinkedList<Expr>();
for (int i = 0; i < len; i++)
{
- path2.add(((Expr) path.get(i)).clone(context));
+ path2.add(path.get(i).clone(context));
}
return new Steps(path2);
}
public boolean references(QName var)
{
- for (Iterator i = path.iterator(); i.hasNext(); )
+ for (Iterator<Expr> i = path.iterator(); i.hasNext(); )
{
- if (((Expr) i.next()).references(var))
+ if (i.next().references(var))
{
return true;
}
@@ -234,16 +241,16 @@ public final class Steps
public String toString()
{
- StringBuffer buf = new StringBuffer();
- Iterator i = path.iterator();
- Expr expr = (Expr) i.next();
+ CPStringBuilder buf = new CPStringBuilder();
+ Iterator<Expr> i = path.iterator();
+ Expr expr = i.next();
if (!(expr instanceof Root))
{
buf.append(expr);
}
while (i.hasNext())
{
- expr = (Expr) i.next();
+ expr = i.next();
buf.append('/');
buf.append(expr);
}
diff --git a/libjava/classpath/gnu/xml/xpath/StringFunction.java b/libjava/classpath/gnu/xml/xpath/StringFunction.java
index 0a4c681d16b..b8cba3798de 100644
--- a/libjava/classpath/gnu/xml/xpath/StringFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/StringFunction.java
@@ -84,9 +84,9 @@ final class StringFunction
final Expr arg;
- StringFunction(List args)
+ StringFunction(List<Expr> args)
{
- this(args.size() > 0 ? (Expr) args.get(0) : null);
+ this(args.size() > 0 ? args.get(0) : null);
}
StringFunction(Expr arg)
diff --git a/libjava/classpath/gnu/xml/xpath/StringLengthFunction.java b/libjava/classpath/gnu/xml/xpath/StringLengthFunction.java
index 7f5ceafeef5..561537e99ba 100644
--- a/libjava/classpath/gnu/xml/xpath/StringLengthFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/StringLengthFunction.java
@@ -55,7 +55,7 @@ final class StringLengthFunction
final Expr arg;
- StringLengthFunction(List args)
+ StringLengthFunction(List<Expr> args)
{
this(args.isEmpty() ? null : (Expr) args.get(0));
}
@@ -65,6 +65,7 @@ final class StringLengthFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/SubstringAfterFunction.java b/libjava/classpath/gnu/xml/xpath/SubstringAfterFunction.java
index 8144cf84433..ad75f2e3c67 100644
--- a/libjava/classpath/gnu/xml/xpath/SubstringAfterFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/SubstringAfterFunction.java
@@ -58,9 +58,9 @@ final class SubstringAfterFunction
final Expr arg1;
final Expr arg2;
- SubstringAfterFunction(List args)
+ SubstringAfterFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1));
+ this(args.get(0), args.get(1));
}
SubstringAfterFunction(Expr arg1, Expr arg2)
diff --git a/libjava/classpath/gnu/xml/xpath/SubstringBeforeFunction.java b/libjava/classpath/gnu/xml/xpath/SubstringBeforeFunction.java
index 2d92a3e0349..1bf165777d0 100644
--- a/libjava/classpath/gnu/xml/xpath/SubstringBeforeFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/SubstringBeforeFunction.java
@@ -57,9 +57,9 @@ final class SubstringBeforeFunction
final Expr arg1;
final Expr arg2;
- SubstringBeforeFunction(List args)
+ SubstringBeforeFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1));
+ this(args.get(0), args.get(1));
}
SubstringBeforeFunction(Expr arg1, Expr arg2)
diff --git a/libjava/classpath/gnu/xml/xpath/SubstringFunction.java b/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
index e926f6c7aeb..33bcade0c2d 100644
--- a/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
@@ -60,10 +60,10 @@ final class SubstringFunction
final Expr arg2;
final Expr arg3;
- SubstringFunction(List args)
+ SubstringFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1),
- (args.size() > 2) ? (Expr) args.get(2) : null);
+ this(args.get(0), args.get(1),
+ (args.size() > 2) ? args.get(2) : null);
}
SubstringFunction(Expr arg1, Expr arg2, Expr arg3)
@@ -73,6 +73,7 @@ final class SubstringFunction
this.arg3 = arg3;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val1 = arg1.evaluate(context, pos, len);
diff --git a/libjava/classpath/gnu/xml/xpath/SumFunction.java b/libjava/classpath/gnu/xml/xpath/SumFunction.java
index 93c2e806d48..73db2a91dc6 100644
--- a/libjava/classpath/gnu/xml/xpath/SumFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/SumFunction.java
@@ -56,9 +56,9 @@ final class SumFunction
final Expr arg;
- SumFunction(List args)
+ SumFunction(List<Expr> args)
{
- this((Expr) args.get(0));
+ this(args.get(0));
}
SumFunction(Expr arg)
@@ -66,15 +66,19 @@ final class SumFunction
this.arg = arg;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object val = arg.evaluate(context, pos, len);
double sum = 0.0d;
if (val instanceof Collection)
{
- for (Iterator i = ((Collection) val).iterator(); i.hasNext(); )
+ /* Suppression is safe, as we know context produces
+ Collection<Node> */
+ @SuppressWarnings("unchecked")
+ Collection<Node> nodes = (Collection<Node>) val;
+ for (Node node : nodes)
{
- Node node = (Node) i.next();
String s = stringValue(node);
sum += _number(context, s);
}
diff --git a/libjava/classpath/gnu/xml/xpath/TranslateFunction.java b/libjava/classpath/gnu/xml/xpath/TranslateFunction.java
index 54e8b9c37f5..8b4b8b2338c 100644
--- a/libjava/classpath/gnu/xml/xpath/TranslateFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/TranslateFunction.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.util.List;
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
@@ -66,9 +68,9 @@ final class TranslateFunction
final Expr arg2;
final Expr arg3;
- TranslateFunction(List args)
+ TranslateFunction(List<Expr> args)
{
- this((Expr) args.get(0), (Expr) args.get(1), (Expr) args.get(2));
+ this(args.get(0), args.get(1), args.get(2));
}
TranslateFunction(Expr arg1, Expr arg2, Expr arg3)
@@ -86,7 +88,7 @@ final class TranslateFunction
String string = _string(context, val1);
String search = _string(context, val2);
String replace = _string(context, val3);
- StringBuffer buf = new StringBuffer();
+ CPStringBuilder buf = new CPStringBuilder();
int l1 = string.length();
int l2 = search.length();
int l3 = replace.length();
@@ -110,7 +112,7 @@ final class TranslateFunction
buf.append(c);
}
}
- return new String(buf);
+ return buf.toString();
}
public Expr clone(Object context)
diff --git a/libjava/classpath/gnu/xml/xpath/UnionExpr.java b/libjava/classpath/gnu/xml/xpath/UnionExpr.java
index 5078713b693..03ae5c06d70 100644
--- a/libjava/classpath/gnu/xml/xpath/UnionExpr.java
+++ b/libjava/classpath/gnu/xml/xpath/UnionExpr.java
@@ -74,20 +74,29 @@ public final class UnionExpr
return false;
}
+ @Override
public Object evaluate(Node context, int pos, int len)
{
Object left = lhs.evaluate(context, pos, len);
Object right = rhs.evaluate(context, pos, len);
+ List<Node> list;
if (left instanceof Collection && right instanceof Collection)
{
- Set set = new HashSet();
- set.addAll ((Collection) left);
- set.addAll ((Collection) right);
- List list = new ArrayList(set);
+ Set<Node> set = new HashSet<Node>();
+ /* Suppression is safe as addAll will check the types
+ of the elements and throw a ClassCastException as necessary */
+ @SuppressWarnings("unchecked")
+ Collection<Node> l = (Collection<Node>) left;
+ @SuppressWarnings("unchecked")
+ Collection<Node> r = (Collection<Node>) right;
+ set.addAll (l);
+ set.addAll (r);
+ list = new ArrayList<Node>(set);
Collections.sort(list, documentOrderComparator);
- return list;
}
- return Collections.EMPTY_SET;
+ else
+ list = Collections.emptyList();
+ return list;
}
public Expr clone(Object context)
diff --git a/libjava/classpath/gnu/xml/xpath/VariableReference.java b/libjava/classpath/gnu/xml/xpath/VariableReference.java
index 813a37f96eb..9ef6f160ff8 100644
--- a/libjava/classpath/gnu/xml/xpath/VariableReference.java
+++ b/libjava/classpath/gnu/xml/xpath/VariableReference.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import javax.xml.namespace.QName;
import javax.xml.xpath.XPathVariableResolver;
import org.w3c.dom.Node;
@@ -86,7 +88,7 @@ public class VariableReference
public String toString()
{
- StringBuffer buf = new StringBuffer("$");
+ CPStringBuilder buf = new CPStringBuilder("$");
String prefix = name.getPrefix();
if (prefix != null && !"".equals(prefix))
{
diff --git a/libjava/classpath/gnu/xml/xpath/XPathParser.java b/libjava/classpath/gnu/xml/xpath/XPathParser.java
index 9b7540a4a40..e8c8e94da79 100644
--- a/libjava/classpath/gnu/xml/xpath/XPathParser.java
+++ b/libjava/classpath/gnu/xml/xpath/XPathParser.java
@@ -79,7 +79,7 @@ public class XPathParser
return qName;
}
- Expr lookupFunction(String name, List args)
+ Expr lookupFunction(String name, List<Expr> args)
{
int arity = args.size();
if ("position".equals(name) && arity == 0)
@@ -491,7 +491,7 @@ case 5:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[0+yyTop]);
+ steps.path.addFirst((Expr) yyVals[0+yyTop]);
}
steps.path.addFirst(new Root());
yyVal = steps;
@@ -512,7 +512,7 @@ case 6:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[0+yyTop]);
+ steps.path.addFirst((Expr) yyVals[0+yyTop]);
}
steps.path.addFirst(s);
steps.path.addFirst(new Root());
@@ -532,9 +532,9 @@ case 8:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[-2+yyTop]);
+ steps.path.addFirst((Expr) yyVals[-2+yyTop]);
}
- steps.path.addLast(yyVals[0+yyTop]);
+ steps.path.addLast((Expr) yyVals[0+yyTop]);
yyVal = steps;
/*$$ = new Step((Expr) $1, (Path) $3);*/
}
@@ -553,10 +553,10 @@ case 9:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[-2+yyTop]);
+ steps.path.addFirst((Expr) yyVals[-2+yyTop]);
}
steps.path.addLast(s);
- steps.path.addLast(yyVals[0+yyTop]);
+ steps.path.addLast((Expr) yyVals[0+yyTop]);
yyVal = steps;
/*Step step = new Step(s, (Path) $3);*/
/*$$ = new Step((Expr) $1, step);*/
@@ -565,48 +565,56 @@ case 9:
case 10:
// line 362 "XPathParser.y"
{
- yyVal = new Selector (Selector.CHILD, (List) yyVals[0+yyTop]);
- }
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) yyVals[0+yyTop];
+ yyVal = new Selector (Selector.CHILD, tests);
+ }
break;
case 11:
// line 366 "XPathParser.y"
{
- yyVal = new Selector (Selector.ATTRIBUTE, (List) yyVals[0+yyTop]);
- }
+ /* This is safe as we create this in one of the other cases */
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) yyVals[0+yyTop];
+ yyVal = new Selector (Selector.ATTRIBUTE, tests);
+ }
break;
case 12:
// line 370 "XPathParser.y"
{
- yyVal = new Selector (((Integer) yyVals[-2+yyTop]).intValue (), (List) yyVals[0+yyTop]);
- }
+ /* This is safe as we create this in one of the other cases */
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) yyVals[0+yyTop];
+ yyVal = new Selector (((Integer) yyVals[-2+yyTop]).intValue (), tests);
+ }
break;
case 13:
// line 374 "XPathParser.y"
{
- yyVal = new Selector (Selector.SELF, Collections.EMPTY_LIST);
- }
+ List<Test> emptyList = Collections.emptyList();
+ yyVal = new Selector (Selector.SELF, emptyList);
+ }
break;
case 14:
// line 378 "XPathParser.y"
{
- yyVal = new Selector (Selector.PARENT, Collections.EMPTY_LIST);
- }
+ List<Test> emptyList = Collections.emptyList();
+ yyVal = new Selector (Selector.PARENT, emptyList);
+ }
break;
case 15:
// line 385 "XPathParser.y"
{
- List list = new ArrayList();
- list.add(yyVals[0+yyTop]);
+ List<Test> list = new ArrayList<Test>();
+ list.add((Test) yyVals[0+yyTop]);
yyVal = list;
}
break;
case 16:
// line 391 "XPathParser.y"
{
- List list = (List)yyVals[-1+yyTop];
- list.add(yyVals[0+yyTop]);
- yyVal = list;
- }
+ /* This is safe as we create this in one of the other cases */
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>)yyVals[-1+yyTop];
+ tests.add((Test) yyVals[0+yyTop]);
+ yyVal = tests;
+ }
break;
case 17:
// line 415 "XPathParser.y"
@@ -725,30 +733,34 @@ case 37:
case 39:
// line 508 "XPathParser.y"
{
- yyVal = lookupFunction((String) yyVals[-2+yyTop], Collections.EMPTY_LIST);
- }
+ List<Expr> emptyList = Collections.emptyList();
+ yyVal = lookupFunction((String) yyVals[-2+yyTop], emptyList);
+ }
break;
case 40:
// line 512 "XPathParser.y"
{
- yyVal = lookupFunction((String) yyVals[-3+yyTop], (List) yyVals[-1+yyTop]);
- }
+ /* This is safe as we create this below */
+ @SuppressWarnings("unchecked") List<Expr> exprs = (List<Expr>) yyVals[-1+yyTop];
+ yyVal = lookupFunction((String) yyVals[-3+yyTop], exprs);
+ }
break;
case 41:
// line 519 "XPathParser.y"
{
- List list = new ArrayList();
- list.add(yyVals[0+yyTop]);
+ List<Expr> list = new ArrayList<Expr>();
+ list.add((Expr) yyVals[0+yyTop]);
yyVal = list;
}
break;
case 42:
// line 525 "XPathParser.y"
{
- List list = (List) yyVals[0+yyTop];
- list.add(0, yyVals[-2+yyTop]);
- yyVal = list;
- }
+ /* This is safe as we create this above */
+ @SuppressWarnings("unchecked") List<Expr> list = (List<Expr>) yyVals[0+yyTop];
+ list.add(0, (Expr) yyVals[-2+yyTop]);
+ yyVal = list;
+ }
break;
case 44:
// line 535 "XPathParser.y"
@@ -767,9 +779,9 @@ case 47:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[0+yyTop]);
+ steps.path.addFirst((Expr) yyVals[0+yyTop]);
}
- steps.path.addFirst(yyVals[-2+yyTop]);
+ steps.path.addFirst((Expr) yyVals[-2+yyTop]);
yyVal = steps;
/*$$ = new Step ((Expr) $1, (Path) $3);*/
}
@@ -788,10 +800,10 @@ case 48:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[0+yyTop]);
+ steps.path.addFirst((Expr) yyVals[0+yyTop]);
}
steps.path.addFirst(s);
- steps.path.addFirst(yyVals[-2+yyTop]);
+ steps.path.addFirst((Expr) yyVals[-2+yyTop]);
yyVal = steps;
/*Step step = new Step (s, (Path) $3);*/
/*$$ = new Step ((Expr) $1, step);*/
@@ -811,7 +823,7 @@ case 50:
else
{
steps = new Steps();
- steps.path.addFirst(yyVals[-1+yyTop]);
+ steps.path.addFirst((Expr) yyVals[-1+yyTop]);
}
steps.path.addLast(s);
yyVal = steps;
diff --git a/libjava/classpath/gnu/xml/xpath/XPathParser.y b/libjava/classpath/gnu/xml/xpath/XPathParser.y
index 55015138655..a6d3fd130b0 100644
--- a/libjava/classpath/gnu/xml/xpath/XPathParser.y
+++ b/libjava/classpath/gnu/xml/xpath/XPathParser.y
@@ -78,7 +78,7 @@ public class XPathParser
return qName;
}
- Expr lookupFunction(String name, List args)
+ Expr lookupFunction(String name, List<Expr> args)
{
int arity = args.size();
if ("position".equals(name) && arity == 0)
@@ -287,7 +287,7 @@ absolute_location_path:
else
{
steps = new Steps();
- steps.path.addFirst($2);
+ steps.path.addFirst((Expr) $2);
}
steps.path.addFirst(new Root());
$$ = steps;
@@ -306,7 +306,7 @@ absolute_location_path:
else
{
steps = new Steps();
- steps.path.addFirst($2);
+ steps.path.addFirst((Expr) $2);
}
steps.path.addFirst(s);
steps.path.addFirst(new Root());
@@ -328,9 +328,9 @@ relative_location_path:
else
{
steps = new Steps();
- steps.path.addFirst($1);
+ steps.path.addFirst((Expr) $1);
}
- steps.path.addLast($3);
+ steps.path.addLast((Expr) $3);
$$ = steps;
//$$ = new Step((Expr) $1, (Path) $3);
}
@@ -347,10 +347,10 @@ relative_location_path:
else
{
steps = new Steps();
- steps.path.addFirst($1);
+ steps.path.addFirst((Expr) $1);
}
steps.path.addLast(s);
- steps.path.addLast($3);
+ steps.path.addLast((Expr) $3);
$$ = steps;
//Step step = new Step(s, (Path) $3);
//$$ = new Step((Expr) $1, step);
@@ -360,37 +360,43 @@ relative_location_path:
step:
step_node_test
{
- $$ = new Selector (Selector.CHILD, (List) $1);
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) $1;
+ $$ = new Selector (Selector.CHILD, tests);
}
| AT step_node_test
{
- $$ = new Selector (Selector.ATTRIBUTE, (List) $2);
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) $2;
+ $$ = new Selector (Selector.ATTRIBUTE, tests);
}
| axis_name DOUBLE_COLON step_node_test
{
- $$ = new Selector (((Integer) $1).intValue (), (List) $3);
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>) $3;
+ $$ = new Selector (((Integer) $1).intValue (), tests);
}
| DOT
{
- $$ = new Selector (Selector.SELF, Collections.EMPTY_LIST);
+ List<Test> emptyList = Collections.emptyList();
+ $$ = new Selector (Selector.SELF, emptyList);
}
| DOUBLE_DOT
{
- $$ = new Selector (Selector.PARENT, Collections.EMPTY_LIST);
+ List<Test> emptyList = Collections.emptyList();
+ $$ = new Selector (Selector.PARENT, emptyList);
}
;
step_node_test:
node_test
{
- List list = new ArrayList();
- list.add($1);
+ List<Test> list = new ArrayList<Test>();
+ list.add((Test) $1);
$$ = list;
}
| step_node_test predicate
{
- List list = (List)$1;
- list.add($2);
+ /* This is safe as we create this in one of the other cases */
+ @SuppressWarnings("unchecked") List<Test> tests = (List<Test>)$1;
+ tests.add((Test) $2);
$$ = list;
}
;
@@ -506,25 +512,29 @@ primary_expr:
function_call:
function_name LP RP
{
- $$ = lookupFunction((String) $1, Collections.EMPTY_LIST);
+ List<Expr> emptyList = Collections.emptyList();
+ $$ = lookupFunction((String) $1, emptyList);
}
| function_name LP argument_list RP
{
- $$ = lookupFunction((String) $1, (List) $3);
+ /* This is safe as we create this below */
+ @SuppressWarnings("unchecked") List<Expr> exprs = (List<Expr>) $3;
+ $$ = lookupFunction((String) $1, (List) exprs);
}
;
argument_list:
expr
{
- List list = new ArrayList();
- list.add($1);
+ List<Expr> list = new ArrayList<Expr>();
+ list.add((Expr) $1);
$$ = list;
}
| expr COMMA argument_list
{
- List list = (List) $3;
- list.add(0, $1);
+ /* This is safe as we create this above */
+ @SuppressWarnings("unchecked") List<Expr> list = (List<Expr>) $3;
+ list.add(0, (Expr) $1);
$$ = list;
}
;
@@ -550,9 +560,9 @@ path_expr:
else
{
steps = new Steps();
- steps.path.addFirst($3);
+ steps.path.addFirst((Expr) $3);
}
- steps.path.addFirst($1);
+ steps.path.addFirst((Expr) $1);
$$ = steps;
//$$ = new Step ((Expr) $1, (Path) $3);
}
@@ -572,7 +582,7 @@ path_expr:
steps.path.addFirst($3);
}
steps.path.addFirst(s);
- steps.path.addFirst($1);
+ steps.path.addFirst((Expr) $1);
$$ = steps;
//Step step = new Step (s, (Path) $3);
//$$ = new Step ((Expr) $1, step);
@@ -594,7 +604,7 @@ filter_expr:
else
{
steps = new Steps();
- steps.path.addFirst($1);
+ steps.path.addFirst((Expr) $1);
}
steps.path.addLast(s);
$$ = steps;
diff --git a/libjava/classpath/gnu/xml/xpath/XPathTokenizer.java b/libjava/classpath/gnu/xml/xpath/XPathTokenizer.java
index a287137827b..bf4516afae7 100644
--- a/libjava/classpath/gnu/xml/xpath/XPathTokenizer.java
+++ b/libjava/classpath/gnu/xml/xpath/XPathTokenizer.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.xml.xpath;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
@@ -90,7 +92,7 @@ implements XPathParser.yyInput
}
- static final Map keywords = new TreeMap ();
+ static final Map<String,Integer> keywords = new TreeMap<String,Integer> ();
static
{
keywords.put ("ancestor", new Integer (XPathParser.ANCESTOR));
@@ -314,7 +316,7 @@ implements XPathParser.yyInput
XPathToken consume_literal (int delimiter)
throws IOException
{
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
while (true)
{
int c = in.read ();
@@ -336,7 +338,7 @@ implements XPathParser.yyInput
XPathToken consume_digits (int c)
throws IOException
{
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
buf.append ((char) c);
while (true)
{
@@ -357,7 +359,7 @@ implements XPathParser.yyInput
XPathToken consume_name (int c)
throws IOException
{
- StringBuffer buf = new StringBuffer ();
+ CPStringBuilder buf = new CPStringBuilder ();
buf.append ((char) c);
while (true)
{