You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by de...@apache.org on 2001/11/14 21:03:32 UTC

cvs commit: xml-batik/sources/org/apache/batik/parser AngleParser.java LengthListParser.java LengthParser.java NumberParser.java PathParser.java PointsParser.java TransformListParser.java

deweese     01/11/14 12:03:32

  Modified:    sources/org/apache/batik/bridge BridgeContext.java
                        SVGUseElementBridge.java URIResolver.java
               sources/org/apache/batik/dom/util XLinkSupport.java
               sources/org/apache/batik/gvt/renderer
                        StrokingTextPainter.java
               sources/org/apache/batik/parser AngleParser.java
                        LengthListParser.java LengthParser.java
                        NumberParser.java PathParser.java PointsParser.java
                        TransformListParser.java
  Log:
  1) New float parser that is much faster than Float.parseFloat(...) [it isn't
     quite as accurate in a small number of cases it may give different
     results].
  2) Better error reporting on use (correctly identifies a missing xlink:href,
     and when an href doesn't point at an element - used to say it points at
     a document).
  3) Few small changes to help Fop.
  
  Revision  Changes    Path
  1.30      +2 -2      xml-batik/sources/org/apache/batik/bridge/BridgeContext.java
  
  Index: BridgeContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeContext.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- BridgeContext.java	2001/10/09 22:17:10	1.29
  +++ BridgeContext.java	2001/11/14 20:03:31	1.30
  @@ -45,7 +45,7 @@
    * a SVG DOM tree such as the current viewport or the user agent.
    *
    * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
  - * @version $Id: BridgeContext.java,v 1.29 2001/10/09 22:17:10 deweese Exp $
  + * @version $Id: BridgeContext.java,v 1.30 2001/11/14 20:03:31 deweese Exp $
    */
   public class BridgeContext implements ErrorConstants {
   
  @@ -272,7 +272,7 @@
               URIResolver ur = new URIResolver(document, documentLoader);
               Element ref = ur.getElement(uri, e);
               if (ref == null) {
  -                throw new BridgeException(e, ERR_URI_REFERENCE_A_DOCUMENT,
  +                throw new BridgeException(e, ERR_URI_BAD_TARGET,
                                             new Object[] {uri});
               } else {
                   return ref;
  
  
  
  1.14      +5 -1      xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java
  
  Index: SVGUseElementBridge.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- SVGUseElementBridge.java	2001/11/13 15:20:58	1.13
  +++ SVGUseElementBridge.java	2001/11/14 20:03:31	1.14
  @@ -33,7 +33,7 @@
    * Bridge class for the &lt;use> element.
    *
    * @author <a href="mailto:tkormann@apache.org">Thierry Kormann</a>
  - * @version $Id: SVGUseElementBridge.java,v 1.13 2001/11/13 15:20:58 tkormann Exp $
  + * @version $Id: SVGUseElementBridge.java,v 1.14 2001/11/14 20:03:31 deweese Exp $
    */
   public class SVGUseElementBridge extends AbstractSVGBridge
       implements GraphicsNodeBridge, ErrorConstants {
  @@ -65,6 +65,10 @@
   
           // get the referenced element
           String uri = XLinkSupport.getXLinkHref(e);
  +        if (uri.length() == 0)
  +            throw new BridgeException(e, ERR_URI_MALFORMED, 
  +                                      new Object[] {uri});
  +            
           Element refElement = ctx.getReferencedElement(e, uri);
           SVGOMDocument document
               = (SVGOMDocument)e.getOwnerDocument();
  
  
  
  1.14      +2 -2      xml-batik/sources/org/apache/batik/bridge/URIResolver.java
  
  Index: URIResolver.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/URIResolver.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- URIResolver.java	2001/10/24 14:52:36	1.13
  +++ URIResolver.java	2001/11/14 20:03:31	1.14
  @@ -28,7 +28,7 @@
    * This class is used to resolve the URI that can be found in a SVG document.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: URIResolver.java,v 1.13 2001/10/24 14:52:36 tkormann Exp $
  + * @version $Id: URIResolver.java,v 1.14 2001/11/14 20:03:31 deweese Exp $
    */
   public class URIResolver {
       /**
  @@ -113,7 +113,7 @@
               //                    pDocURL.getPort()     + " - " +
               //                    pDocURL.getHost()     + " - " +
               //                    pDocURL.getProtocol());
  -                               
  +
   
               // Check if the rest of the URL matches...
               // if so then return the referenced element.
  
  
  
  1.2       +2 -2      xml-batik/sources/org/apache/batik/dom/util/XLinkSupport.java
  
  Index: XLinkSupport.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/util/XLinkSupport.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XLinkSupport.java	2000/10/10 18:39:31	1.1
  +++ XLinkSupport.java	2001/11/14 20:03:32	1.2
  @@ -15,7 +15,7 @@
    * This class provides support for XLink features.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: XLinkSupport.java,v 1.1 2000/10/10 18:39:31 hillion Exp $
  + * @version $Id: XLinkSupport.java,v 1.2 2001/11/14 20:03:32 deweese Exp $
    */
   public class XLinkSupport {
       /**
  @@ -129,7 +129,7 @@
        * Returns the value of the 'xlink:href' attribute of the given element.
        */
       public static String getXLinkHref(Element elt) {
  -	return elt.getAttributeNS(XLINK_NAMESPACE_URI, "href");
  +        return elt.getAttributeNS(XLINK_NAMESPACE_URI, "href");
       }
   
       /**
  
  
  
  1.22      +3 -3      xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java
  
  Index: StrokingTextPainter.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/StrokingTextPainter.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- StrokingTextPainter.java	2001/11/09 15:32:57	1.21
  +++ StrokingTextPainter.java	2001/11/14 20:03:32	1.22
  @@ -60,7 +60,7 @@
    * @see org.apache.batik.gvt.text.GVTAttributedCharacterIterator
    *
    * @author <a href="bill.haneman@ireland.sun.com>Bill Haneman</a>
  - * @version $Id: StrokingTextPainter.java,v 1.21 2001/11/09 15:32:57 deweese Exp $
  + * @version $Id: StrokingTextPainter.java,v 1.22 2001/11/14 20:03:32 deweese Exp $
    */
   public class StrokingTextPainter extends BasicTextPainter {
   
  @@ -133,7 +133,7 @@
           System.out.println("");
       }
   
  -    private List getTextRuns(TextNode node, AttributedCharacterIterator aci) {
  +    public List getTextRuns(TextNode node, AttributedCharacterIterator aci) {
           List textRuns = node.getTextRuns();
           if (textRuns != null) {
               return textRuns;
  @@ -1384,7 +1384,7 @@
        * Inner convenience class for associating a TextLayout for
        * sub-spans, and the ACI which iterates over that subspan.
        */
  -    class TextRun {
  +    public class TextRun {
   
           private AttributedCharacterIterator aci;
           private TextSpanLayout layout;
  
  
  
  1.4       +3 -28     xml-batik/sources/org/apache/batik/parser/AngleParser.java
  
  Index: AngleParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/AngleParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AngleParser.java	2001/11/08 23:02:43	1.3
  +++ AngleParser.java	2001/11/14 20:03:32	1.4
  @@ -15,7 +15,7 @@
    * values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: AngleParser.java,v 1.3 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: AngleParser.java,v 1.4 2001/11/14 20:03:32 deweese Exp $
    */
   
   public class AngleParser extends NumberParser {
  @@ -141,34 +141,9 @@
   			    new Object[] { new Integer(current) });
   	    }
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   	}
   	angleHandler.endAngle();
  -    }
  -
  -    /**
  -     * Implements {@link NumberParser#readNumber()}.
  -     */
  -    protected void readNumber() throws ParseException {
  -	bufferSize = 0;
  -	bufferize();
  -        for (;;) {
  -	    read();
  -	    switch (current) {
  -	    case 0x20:
  -	    case 0x9:
  -	    case 0xD:
  -	    case 0xA:
  -	    case 'd':
  -	    case 'g':
  -	    case 'r':
  -		return;
  -	    default:
  -		if (current == -1) {
  -		    return;
  -		}
  -		bufferize();
  -	    }
  -	}
       }
   }
  
  
  
  1.4       +3 -2      xml-batik/sources/org/apache/batik/parser/LengthListParser.java
  
  Index: LengthListParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/LengthListParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LengthListParser.java	2001/11/08 23:02:43	1.3
  +++ LengthListParser.java	2001/11/14 20:03:32	1.4
  @@ -16,7 +16,7 @@
    * list values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: LengthListParser.java,v 1.3 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: LengthListParser.java,v 1.4 2001/11/14 20:03:32 deweese Exp $
    */
   public class LengthListParser extends LengthParser {
   
  @@ -69,7 +69,8 @@
   		}
   	    }
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	}
   	((LengthListHandler)lengthHandler).endLengthList();
       }
  
  
  
  1.4       +203 -155  xml-batik/sources/org/apache/batik/parser/LengthParser.java
  
  Index: LengthParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/LengthParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LengthParser.java	2001/11/08 23:02:43	1.3
  +++ LengthParser.java	2001/11/14 20:03:32	1.4
  @@ -15,9 +15,9 @@
    * values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: LengthParser.java,v 1.3 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: LengthParser.java,v 1.4 2001/11/14 20:03:32 deweese Exp $
    */
  -public class LengthParser extends NumberParser {
  +public class LengthParser extends AbstractParser {
   
       /**
        * The length handler used to report parse events.
  @@ -25,11 +25,6 @@
       protected LengthHandler lengthHandler;
   
       /**
  -     * Whether the last character was a 'e' or 'E'.
  -     */
  -    protected boolean eRead;
  -
  -    /**
        * Creates a new LengthParser.
        */
       public LengthParser() {
  @@ -59,23 +54,24 @@
       }
   
       protected void doParse() throws ParseException {
  -	lengthHandler.startLength();
  +        lengthHandler.startLength();
   
  -	read();
  -	skipSpaces();
  +        read();
  +        skipSpaces();
   	
  -	try {
  -	    parseLength();
  +        try {
  +            parseLength();
   
  -	    skipSpaces();
  -	    if (current != -1) {
  -		reportError("end.of.stream.expected",
  -			    new Object[] { new Integer(current) });
  -	    }
  -	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  -	}
  -	lengthHandler.endLength();
  +            skipSpaces();
  +            if (current != -1) {
  +                reportError("end.of.stream.expected",
  +                            new Object[] { new Integer(current) });
  +            }
  +        } catch (NumberFormatException e) {
  +            reportError("character.unexpected", 
  +                        new Object[] { new Integer(current) });
  +        }
  +        lengthHandler.endLength();
       }
   
       /**
  @@ -84,142 +80,194 @@
       protected void parseLength()
   	throws ParseException,
   	       NumberFormatException {
  -	float f = parseFloat();
  +        // readNumber();
  +        // float ret = Float.parseFloat(getBufferContent());
  +
  +        int mant       =0;
  +        int mantDig    =0;
  +        boolean mantPos=true;
  +        boolean mantRead=false;
  +        int exp        =0;
  +        int expDig     =0;
  +        int expAdj     =0;
  +        boolean expPos =true;
  +
  +        int     eRead     = 0;
  +        boolean eJustRead = false;
  +        boolean first     = true;
  +        boolean done      = false;
  +        boolean unitDone  = false;
  +        boolean dotRead   = false;
  +
  +        while (!done) {
  +            switch (current) {
  +            case '0': case '1': case '2': case '3': case '4': 
  +            case '5': case '6': case '7': case '8': case '9': 
  +                if (eRead==0) {
  +                    // Still creating mantisa
  +                    mantRead = true;
  +                    // Only keep first 9 digits rest won't count anyway...
  +                    if (mantDig >= 9) {
  +                        if (!dotRead)
  +                            expAdj++;
  +                        break;
  +                    }
  +                    if (dotRead) expAdj--;
  +                    if ((mantDig != 0) || (current != '0')) {
  +                                // Ignore leading zeros.
  +                        mantDig++;
  +                        mant = mant*10+(current-'0');
  +                    }
  +                } else {
  +                    // Working on exp.
  +                    if (expDig >= 3) break;
  +                    if ((expDig != 0) || (current != '0')) {
  +                                // Ignore leading zeros.
  +                        expDig++;
  +                        expDig = expDig*10+(current-'0');
  +                    }
  +                }
  +                eJustRead = false;
  +                break;
  +            case 'e': case 'E':
  +                if (eRead > 1) {
  +                    done = true;
  +                    break;
  +                }
  +                eJustRead = true;
  +                eRead++;
  +                break;
  +            case 'm': // Confusing case between 10e5 and 10em
  +            case 'x':
  +                if (!eJustRead) {
  +                    done = true;
  +                    break;
  +                }
  +                if (current == 'm')
  +                    lengthHandler.em();
  +                else 
  +                    lengthHandler.ex();
  +                done     = true;
  +                unitDone = true;
  +                read(); // eat the 'm' or 'x' char.
  +                break;
  +            case '.':
  +                if ((eRead!=0) || dotRead) {
  +                    done=true;
  +                    break;
  +                }
  +                dotRead = true;
  +                break;
  +            case '+': 
  +                if ((!first) && (!eJustRead))
  +                    done=true;
  +                eJustRead = false;
  +                break;
  +            case '-':
  +                if      (first)     mantPos = false;
  +                else if (eJustRead) expPos  = false;
  +                else                done    = true;
  +                eJustRead = false;
  +                break;
  +
  +            case 10:
  +                line++;
  +                column =1;
  +                done = true;
  +                break;
  +                
  +            default:
  +                done=true;
  +                break;
  +            }
  +            if (!done) {
  +                first = false;
  +                if ((position == count) && (!fillBuffer())) {
  +                    current = -1;
  +                    break;
  +                }
  +                current = buffer[position++];
  +                column++;
  +            }
  +        }
  +
  +        if (!mantRead)
  +            throw new NumberFormatException
  +                ("No digits where number expected '" + ((char)current) + "'");
  +
  +        if (!expPos) exp = -exp;
  +        exp += expAdj; // account for digits after 'dot'.
  +        if (!mantPos) mant = -mant;
   
  -	lengthHandler.lengthValue(f);
  +        lengthHandler.lengthValue(NumberParser.buildFloat(mant, exp));
   	
  -	s: if (eRead || current != -1) {
  -	    switch (current) {
  -	    case 0xD: case 0xA: case 0x20: case 0x9:
  -		break s;
  -	    }
  -	    
  -	    if (eRead) {
  -		switch (current) {
  -		case 'm':
  -		    lengthHandler.em();
  -		    read();
  -		    break;
  -		case 'x':
  -		    lengthHandler.ex();
  -		    read();
  -		    break;
  -		default:
  -		    reportError("character.unexpected",
  -				new Object[] { new Integer(current) });
  -		}
  -	    } else {
  -		switch (current) {
  -		case 'p':
  -		    read();
  -		    switch (current) {
  -		    case 'c':
  -			lengthHandler.pc();
  -			read();
  -			break;
  -		    case 't':
  -			lengthHandler.pt();
  -			read();
  -			break;
  -		    case 'x':
  -			lengthHandler.px();
  -			read();
  -			break;
  -		    default:
  -			reportError("character.unexpected",
  -				    new Object[] { new Integer(current) });
  -		    }
  -		    break;
  -		case 'i':
  -		    read();
  -		    if (current != 'n') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('n'),
  -						   new Integer(current) });
  -			break;
  -		    }
  -		    lengthHandler.in();
  -		    read();
  -		    break;
  -		case 'c':
  -		    read();
  -		    if (current != 'm') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('m'),
  -						   new Integer(current) });
  -			break;
  -		    }
  -		    lengthHandler.cm();
  -		    read();
  -		    break;
  -		case 'm':
  -		    read();
  -		    if (current != 'm') {
  -			reportError("character.expected",
  -				    new Object[] { new Character('m'),
  -						   new Integer(current) });
  -			break;
  -		    }
  -		    lengthHandler.mm();
  -		    read();
  -		    break;
  -		case '%':
  -		    lengthHandler.percentage();
  -		    read();
  -		    break;
  -		default:
  -		    reportError("character.unexpected",
  -				new Object[] { new Integer(current) });
  -		}
  -	    }
  -	}
  -    }
  +        if(unitDone)
  +            return;
   
  -    /**
  -     * Implements {@link NumberParser#readNumber()}.
  -     */
  -    protected void readNumber() throws ParseException {
  -	bufferSize = 0;
  -	bufferize();
  -	eRead = false;
  -        for (;;) {
  -	    read();
  -	    switch (current) {
  -	    case 0x20:
  -	    case 0x9:
  -	    case 0xD:
  -	    case 0xA:
  -	    case 'c':
  -	    case 'i':
  -	    case 'p':
  -	    case '%':
  -		return;
  -	    case 'e': case 'E':
  -		eRead = true;
  -		bufferize();
  -		break;
  -	    case 'm':
  -		if (!eRead) {
  -		    return;
  -		}
  -	    case 'x':
  -		bufferSize--;
  -		return;
  -	    case '+':
  -	    case '-':
  -		if (!eRead) {
  -		    return;
  -		}
  -		eRead = false;
  -		bufferize();
  -		break;
  -	    default:
  -		if (current == -1) {
  -		    return;
  -		}
  -		eRead = false;
  -		bufferize();
  -	    }
  -	}
  +        switch (current) {
  +	    case -1: case 0xD: case 0xA: case 0x20: case 0x9:
  +            return;
  +        case 'p':
  +            read();
  +            switch (current) {
  +            case 'c':
  +                lengthHandler.pc();
  +                read();
  +                break;
  +            case 't':
  +                lengthHandler.pt();
  +                read();
  +                break;
  +            case 'x':
  +                lengthHandler.px();
  +                read();
  +                break;
  +            default:
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +            }
  +            break;
  +
  +        case 'i':
  +            read();
  +            if (current != 'n') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('n'),
  +                                           new Integer(current) });
  +                break;
  +            }
  +            lengthHandler.in();
  +            read();
  +            break;
  +        case 'c':
  +            read();
  +            if (current != 'm') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('m'),
  +                                           new Integer(current) });
  +                break;
  +            }
  +            lengthHandler.cm();
  +            read();
  +            break;
  +        case 'm':
  +            read();
  +            if (current != 'm') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('m'),
  +                                           new Integer(current) });
  +                break;
  +            }
  +            lengthHandler.mm();
  +            read();
  +            break;
  +        case '%':
  +            lengthHandler.percentage();
  +            read();
  +            break;
  +        default:
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +        }
       }
   }
  
  
  
  1.2       +127 -36   xml-batik/sources/org/apache/batik/parser/NumberParser.java
  
  Index: NumberParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/NumberParser.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NumberParser.java	2001/01/03 14:17:39	1.1
  +++ NumberParser.java	2001/11/14 20:03:32	1.2
  @@ -15,53 +15,144 @@
    * This class represents a parser with support for numbers.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: NumberParser.java,v 1.1 2001/01/03 14:17:39 hillion Exp $
  + * @version $Id: NumberParser.java,v 1.2 2001/11/14 20:03:32 deweese Exp $
    */
   public abstract class NumberParser extends AbstractParser {
   
       /**
  -     * The buffer used for numbers.
  -     */
  -    protected char[] buffer = new char[16];
  -
  -    /**
  -     * The buffer size.
  -     */
  -    protected int bufferSize;
  -
  -    /**
  -     * Reads a number from the current stream and put it in the buffer.
  -     */
  -    protected abstract void readNumber() throws ParseException;
  -
  -    /**
        * Parses the content of the buffer and converts it to a float.
        */
       protected float parseFloat()
  -	throws NumberFormatException,
  -	       ParseException {
  -	readNumber();
  -	return Float.parseFloat(getBufferContent());
  +        throws NumberFormatException,
  +               ParseException {
  +        // readNumber();
  +        // float ret = Float.parseFloat(getBufferContent());
  +
  +        int mant       =0;
  +        int mantDig    =0;
  +        boolean mantPos=true;
  +        boolean mantRead=false;
  +        int exp        =0;
  +        int expDig     =0;
  +        int expAdj     =0;
  +        boolean expPos =true;
  +
  +        boolean eRead     = false;
  +        boolean eJustRead = false;
  +        boolean first     = true;
  +        boolean done      = false;
  +        boolean dotRead   = false;
  +
  +        while (!done) {
  +            switch (current) {
  +            case '0': case '1': case '2': case '3': case '4': 
  +            case '5': case '6': case '7': case '8': case '9': 
  +                if (!eRead) {
  +                    // Still creating mantisa
  +                    mantRead = true;
  +                    // Only keep first 9 digits rest won't count anyway...
  +                    if (mantDig >= 9) {
  +                        if (!dotRead)
  +                            expAdj++;
  +                        break;
  +                    }
  +                    if (dotRead) expAdj--;
  +                    if ((mantDig != 0) || (current != '0')) {
  +                                // Ignore leading zeros.
  +                        mantDig++;
  +                        mant = mant*10+(current-'0');
  +                    }
  +                } else {
  +                    // Working on exp.
  +                    if (expDig >= 3) break;
  +                    if ((expDig != 0) || (current != '0')) {
  +                                // Ignore leading zeros.
  +                        expDig++;
  +                        expDig = expDig*10+(current-'0');
  +                    }
  +                }
  +                eJustRead = false;
  +                break;
  +            case 'e': case 'E':
  +                if (eRead) {
  +                    done = true;
  +                    break;
  +                }
  +                eJustRead = true;
  +                eRead = true;
  +                break;
  +            case '.':
  +                if (eRead || dotRead) {
  +                    done=true;
  +                    break;
  +                }
  +                dotRead = true;
  +                break;
  +            case '+': 
  +                if ((!first) && (!eJustRead))
  +                    done=true;
  +                eJustRead = false;
  +                break;
  +            case '-':
  +                if      (first)     mantPos = false;
  +                else if (eJustRead) expPos  = false;
  +                else                done    = true;
  +                eJustRead = false;
  +                break;
  +
  +            case 10:
  +                line++;
  +                column =1;
  +                done = true;
  +                break;
  +            default:
  +                done=true;
  +                break;
  +            }
  +            if (!done) {
  +                first = false;
  +                if ((position == count) && (!fillBuffer())) {
  +                    current = -1;
  +                    break;
  +                }
  +                current = buffer[position++];
  +                column++;
  +            }
  +        }
  +        if (!mantRead)
  +            throw new NumberFormatException
  +                ("No digits where number expected '" + ((char)current) + "'");
  +
  +        if (!expPos) exp = -exp;
  +        exp += expAdj; // account for digits after 'dot'.
  +        if (!mantPos) mant = -mant;
  +
  +        return buildFloat(mant, exp);
       }
   
  -    /**
  -     * Returns the content of the buffer.
  -     */
  -    protected String getBufferContent() {
  -	return new String(buffer, 0, bufferSize);
  +    public static float buildFloat(int mant, int exp) {
  +        if ((exp < -125) || (mant==0)) return 0f;
  +        if (exp >  128) {
  +            if (mant > 0) return Float.POSITIVE_INFINITY;
  +            else          return Float.NEGATIVE_INFINITY;
  +        }
  +
  +        if (exp == 0) return mant;
  +            
  +        if (mant >= 1<<26)
  +            mant++;  // round up trailing bits if they will be dropped.
  +
  +        if (exp >  0) return mant*pow10[exp];
  +        else          return mant/pow10[-exp];
       }
   
       /**
  -     * Adds the current character to the buffer.
  +     * Array of powers of ten.
        */
  -    protected void bufferize() {
  -	if (bufferSize >= buffer.length) {
  -	    char[] t = new char[buffer.length * 2];
  -	    for (int i = 0; i < bufferSize; i++) {
  -		t[i] = buffer[i];
  -	    }
  -	    buffer = t;
  -	}
  -	buffer[bufferSize++] = (char)current;
  -    }
  +    private static final float pow10[] = new float [128];
  +    static {
  +      for (int i=0; i<pow10.length; i++) {
  +        pow10[i] = (float)Math.pow(10, i);
  +      }
  +    };
   }
  
  
  
  1.8       +52 -107   xml-batik/sources/org/apache/batik/parser/PathParser.java
  
  Index: PathParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/PathParser.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- PathParser.java	2001/11/08 23:02:43	1.7
  +++ PathParser.java	2001/11/14 20:03:32	1.8
  @@ -15,7 +15,7 @@
    * attribute values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PathParser.java,v 1.7 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: PathParser.java,v 1.8 2001/11/14 20:03:32 deweese Exp $
    */
   public class PathParser extends NumberParser {
   
  @@ -139,7 +139,7 @@
   	}
   
   	pathHandler.endPath();
  -    }    
  +    }
   
       /**
        * Parses a 'm' command.
  @@ -155,7 +155,8 @@
   
   	    pathHandler.movetoRel(x, y);
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipSubPath();
   	}
           skipCommaSpaces();
  @@ -181,9 +182,9 @@
   
   		    pathHandler.linetoRel(x, y);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -				new Object[] { getBufferContent() });
  -		    skipSubPath();
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
   		    return;
   		}
   		break;
  @@ -208,7 +209,8 @@
   	    
   	    pathHandler.movetoAbs(x, y);
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipSubPath();
   	}	
           skipCommaSpaces();
  @@ -234,8 +236,8 @@
   
   		    pathHandler.linetoAbs(x, y);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -                                new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		    skipSubPath();
   		    return;
   		}
  @@ -263,8 +265,8 @@
   		    float x = parseFloat();
   		    pathHandler.linetoHorizontalRel(x);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -				new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		    skipSubPath();
   		    return;
   		}
  @@ -292,8 +294,8 @@
   		    float x = parseFloat();
   		    pathHandler.linetoHorizontalAbs(x);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -				new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		    skipSubPath();
   		    return;
   		}
  @@ -321,8 +323,8 @@
   		    float x = parseFloat();
   		    pathHandler.linetoVerticalRel(x);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -				new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		    skipSubPath();
   		    return;
   		}
  @@ -350,8 +352,8 @@
   		    float x = parseFloat();
   		    pathHandler.linetoVerticalAbs(x);
   		} catch (NumberFormatException e) {
  -		    reportError("float.format",
  -				new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		    skipSubPath();
   		    return;
   		}
  @@ -394,10 +396,10 @@
   
   		pathHandler.curvetoCubicRel(x1, y1, x2, y2, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  -		return;
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
  +            return;
   	    }
   	    skipCommaSpaces();
   	}
  @@ -434,10 +436,10 @@
   
   		pathHandler.curvetoCubicAbs(x1, y1, x2, y2, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  -		return;
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
  +            return;
   	    }
   	    skipCommaSpaces();
   	}
  @@ -470,9 +472,9 @@
   
   		pathHandler.curvetoQuadraticRel(x1, y1, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
   		return;
   	    }
   	    skipCommaSpaces();
  @@ -506,8 +508,8 @@
   
   		pathHandler.curvetoQuadraticAbs(x1, y1, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		skipSubPath();
   		return;
   	    }
  @@ -542,9 +544,9 @@
   
   		pathHandler.curvetoCubicSmoothRel(x2, y2, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
   		return;
   	    }
   	    skipCommaSpaces();
  @@ -578,8 +580,8 @@
   
   		pathHandler.curvetoCubicSmoothAbs(x2, y2, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   		skipSubPath();
   		return;
   	    }
  @@ -610,9 +612,9 @@
   
   		pathHandler.curvetoQuadraticSmoothRel(x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
   		return;
   	    }
   	    skipCommaSpaces();
  @@ -642,10 +644,10 @@
   
   		pathHandler.curvetoQuadraticSmoothAbs(x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  -		return;
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
  +            return;
   	    }
   	    skipCommaSpaces();
   	}		
  @@ -717,10 +719,10 @@
   
   		pathHandler.arcRel(rx, ry, ax, laf, sf, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -                            new Object[] { getBufferContent() });
  -		skipSubPath();
  -		return;
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
  +            return;
   	    }
   	    skipCommaSpaces();
   	}
  @@ -791,10 +793,10 @@
   
   		pathHandler.arcAbs(rx, ry, ax, laf, sf, x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  -		skipSubPath();
  -		return;
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
  +            skipSubPath();
  +            return;
   	    }
   	    skipCommaSpaces();
   	}
  @@ -814,63 +816,6 @@
   		    return;
   		}
   		read();
  -	    }
  -	}
  -    }
  -
  -    /**
  -     * Implements {@link NumberParser#readNumber()}.
  -     */
  -    protected void readNumber() throws ParseException {
  -	bufferSize = 0;
  -	bufferize();
  -	boolean eRead = false;
  -	boolean eJustRead = false;
  -	boolean dotRead = current == '.';
  -
  -        for (;;) {
  -	    read();
  -	    switch (current) {
  -	    case 0x20:
  -	    case 0x9:
  -	    case 0xD:
  -	    case 0xA:
  -	    case 'm': case 'M':
  -	    case 'c': case 'C':
  -	    case 's': case 'S':
  -	    case 'q': case 'Q':
  -	    case 't': case 'T':
  -	    case 'l': case 'L':
  -	    case 'h': case 'H':
  -	    case 'v': case 'V':
  -	    case 'a': case 'A':
  -	    case 'z': case 'Z':
  -	    case ',':
  -            case -1:
  -		return;
  -	    case 'e': case 'E':
  -                if (eRead) {
  -                    return;
  -                }
  -		eJustRead = true;
  -		eRead = true;
  -		bufferize();
  -		break;
  -            case '.':
  -                if (eRead || dotRead) {
  -                    return;
  -                }
  -                dotRead = true;
  -                bufferize();
  -                break;
  -	    case '+':
  -	    case '-':
  -		if (!eJustRead) {
  -		    return;
  -		}
  -	    default:
  -		eJustRead = false;
  -		bufferize();
   	    }
   	}
       }
  
  
  
  1.4       +3 -42     xml-batik/sources/org/apache/batik/parser/PointsParser.java
  
  Index: PointsParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/PointsParser.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- PointsParser.java	2001/11/08 23:02:43	1.3
  +++ PointsParser.java	2001/11/14 20:03:32	1.4
  @@ -15,7 +15,7 @@
    * attribute values (used with polyline and polygon elements).
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PointsParser.java,v 1.3 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: PointsParser.java,v 1.4 2001/11/14 20:03:32 deweese Exp $
    */
   public class PointsParser extends NumberParser {
   
  @@ -78,51 +78,12 @@
   		    
   		pointsHandler.point(x, y);
   	    } catch (NumberFormatException e) {
  -		reportError("float.format",
  -			    new Object[] { getBufferContent() });
  +            reportError("character.unexpected",
  +                        new Object[] { new Integer(current) });
   	    }
   	    skipCommaSpaces();
   	}
   
   	pointsHandler.endPoints();
  -    }
  -
  -    /**
  -     * Implements {@link NumberParser#readNumber()}.
  -     */
  -    protected void readNumber() throws ParseException {
  -	bufferSize = 0;
  -	bufferize();
  -	eRead = false;
  -        for (;;) {
  -	    read();
  -	    switch (current) {
  -	    case 0x20:
  -	    case 0x9:
  -	    case 0xD:
  -	    case 0xA:
  -	    case ',':
  -		eRead = false;
  -		return;
  -	    case 'e': case 'E':
  -		eRead = true;
  -		bufferize();
  -		break;
  -	    case '+':
  -	    case '-':
  -		if (!eRead) {
  -		    return;
  -		}
  -		eRead = false;
  -		bufferize();
  -		break;
  -	    default:
  -		if (current == -1) {
  -		    return;
  -		}
  -		eRead = false;
  -		bufferize();
  -	    }
  -	}
       }
   }
  
  
  
  1.5       +11 -33    xml-batik/sources/org/apache/batik/parser/TransformListParser.java
  
  Index: TransformListParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/TransformListParser.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TransformListParser.java	2001/11/08 23:02:43	1.4
  +++ TransformListParser.java	2001/11/14 20:03:32	1.5
  @@ -15,7 +15,7 @@
    * attribute values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: TransformListParser.java,v 1.4 2001/11/08 23:02:43 deweese Exp $
  + * @version $Id: TransformListParser.java,v 1.5 2001/11/14 20:03:32 deweese Exp $
    */
   public class TransformListParser extends NumberParser {
   
  @@ -193,7 +193,8 @@
   
   	    transformListHandler.matrix(a, b, c, d, e, f);
   	} catch (NumberFormatException ex) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipTransform();
   	}
       }
  @@ -287,7 +288,8 @@
   
   	    transformListHandler.rotate(theta, cx, cy);
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipTransform();
   	}
       }
  @@ -403,7 +405,8 @@
   
   	    transformListHandler.translate(tx, ty);
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipTransform();
   	}
       }
  @@ -478,7 +481,8 @@
   
   	    transformListHandler.scale(sx, sy);
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipTransform();
   	}
       }
  @@ -552,7 +556,8 @@
   		transformListHandler.skewY(sk);
   	    }
   	} catch (NumberFormatException e) {
  -	    reportError("float.format", new Object[] { getBufferContent() });
  +        reportError("character.unexpected",
  +                    new Object[] { new Integer(current) });
   	    skipTransform();
   	}
       }
  @@ -571,33 +576,6 @@
   		if (current == -1) {
   		    break loop;
   		}
  -	    }
  -	}
  -    }
  -
  -    /**
  -     * Implements {@link NumberParser#readNumber()}.
  -     */
  -    protected void readNumber() throws ParseException {
  -	bufferSize = 0;
  -	bufferize();
  -        for (;;) {
  -	    read();
  -	    switch (current) {
  -	    case 0x20:
  -	    case 0x9:
  -	    case 0xD:
  -	    case 0xA:
  -	    case ',':
  -	    case ')':
  -		return;
  -	    default:
  -		if (current == -1) {
  -		    reportError("end.of.stream",  new Object[] {});
  -		    skipTransform();
  -		    return;
  -		}
  -		bufferize();
   	    }
   	}
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org