added two hacks to XML.java to support Doc.java
authoradam <adam@megacz.com>
Thu, 25 Mar 2004 12:23:28 +0000 (12:23 +0000)
committeradam <adam@megacz.com>
Thu, 25 Mar 2004 12:23:28 +0000 (12:23 +0000)
darcs-hash:20040325122328-5007d-9512fc9c902ac93743f34571cee5a0969af7e96d.gz

src/org/ibex/util/XML.java

index e148fb9..d0775c7 100644 (file)
@@ -70,6 +70,7 @@ public abstract class XML
     private Reader in;
     private char[] buf;
     private int    off;
+    private int    base;  // base+off == distance into the stream
     private int    len;
 
     private Element current;
@@ -87,13 +88,15 @@ public abstract class XML
         if (current == null) current = new Element();
     }
 
-
     /** Returns the line number at the beginning of the last process call. */
     public int getLine() { return line; }
 
     /** Returns the column number at the beginning of the last process call. */
     public int getCol()  { return col; }
 
+    /** Returns the global file offset at the beginning of the last process call. */
+    public int getGlobalOffset() { return base + off; }
+
     /**
      * Parse given input and call the abstract event functions.
      *
@@ -691,12 +694,14 @@ public abstract class XML
         } else if (off >= min) {
             // moving offset data to start will leave enough free space on the end
             System.arraycopy(buf, off, buf, 0, len); 
+            base += off;
             off = 0;
         } else {
             // buffer size will have to be increased
             char[] newbuf = new char[buf.length * 2];
             System.arraycopy(buf, off, newbuf, 0, len);
             buf = newbuf;
+            base += off;
             off = 0;
         }
 
@@ -774,7 +779,6 @@ public abstract class XML
 
         protected Exn[] errors = new Exn[] {};
 
-
         /** Parent of current element. */
         public Element getParent() { return parent; }
 
@@ -825,10 +829,23 @@ public abstract class XML
         /** Current number of attributes in the element. */
         public int getAttrLen() { return len; }
 
+        /** Poor performance, but easier to use when speed is not a concern */
+        public Hash getAttrHash() {
+            Hash ret = new Hash(getAttrLen() * 2, 3);
+            for(int i=0; i<len; i++)
+                ret.put(getAttrKey(i), getAttrVal(i));
+            return ret;
+        }
+
+        /** Poor performance, but easier to use */
+        public String getAttrVal(String key) {
+            for(int i=0; i<len; i++) if (keys[i].equals(key)) return vals[i];
+            return null;
+        }
+
         /** An array of non-fatal errors related to this element. */
         public Exn[] getErrors() { return errors; }
 
-
         protected Element() { }
 
         /** Add (replace if exists in current element) a Namespace prefix/uri map. */