--- /home/cpdev/src/classpath/gnu/xml/stream/XMLStreamWriterImpl.java	2006-01-16 17:32:45.000000000 +0000
+++ gnu/xml/stream/XMLStreamWriterImpl.java	2006-01-10 17:33:44.000000000 +0000
@@ -104,9 +104,6 @@
   private NamespaceSupport namespaces;
   private int count = 0;
 
-  private boolean xml11;
-  private boolean hasXML11RestrictedChars;
-
   /**
    * Constructor.
    * @see #writer
@@ -148,9 +145,6 @@
   {
     try
       {
-        if (!isName(localName))
-          throw new IllegalArgumentException("illegal Name: " + localName);
-
         endStartElement();
         namespaces.pushContext();
         
@@ -173,11 +167,6 @@
   {
     try
       {
-        if (namespaceURI != null && !isURI(namespaceURI))
-          throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-        if (!isName(localName))
-          throw new IllegalArgumentException("illegal Name: " + localName);
-
         endStartElement();
         namespaces.pushContext();
         
@@ -201,7 +190,7 @@
         inStartElement = true;
         if (!isDeclared)
           {
-            writeNamespaceImpl(prefix, namespaceURI);
+            writeNamespace(prefix, namespaceURI);
           }
         
         elements.addLast(new String[] { prefix, localName });
@@ -240,13 +229,6 @@
   {
     try
       {
-        if (namespaceURI != null && !isURI(namespaceURI))
-          throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-        if (prefix != null && !isNCName(prefix))
-          throw new IllegalArgumentException("illegal NCName: " + prefix);
-        if (!isNCName(localName))
-          throw new IllegalArgumentException("illegal NCName: " + localName);
-
         endStartElement();
         namespaces.pushContext();
         
@@ -261,7 +243,7 @@
         writer.write(localName);
         if (prefixDefaulting && !isCurrent)
           {
-            writeNamespaceImpl(prefix, namespaceURI);
+            writeNamespace(prefix, namespaceURI);
           }
         
         elements.addLast(new String[] { prefix, localName });
@@ -361,19 +343,11 @@
       throw new IllegalStateException();
     try
       {
-        if (!isName(localName))
-          throw new IllegalArgumentException("illegal Name: " + localName);
-        if (!isChars(value))
-          throw new IllegalArgumentException("illegal character: " + value);
-
         writer.write(' ');
         writer.write(localName);
         writer.write('=');
         writer.write('"');
-        if (hasXML11RestrictedChars)
-          writeEncodedWithRestrictedChars(value, true);
-        else
-          writeEncoded(value, true);
+        writeEncoded(value, true);
         writer.write('"');
       }
     catch (IOException e)
@@ -392,20 +366,11 @@
       throw new IllegalStateException();
     try
       {
-        if (namespaceURI != null && !isURI(namespaceURI))
-          throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-        if (prefix != null && !isNCName(prefix))
-          throw new IllegalArgumentException("illegal NCName: " + prefix);
-        if (!isNCName(localName))
-          throw new IllegalArgumentException("illegal NCName: " + localName);
-        if (!isChars(value))
-          throw new IllegalArgumentException("illegal character: " + value);
-
         String currentPrefix = getPrefix(namespaceURI);
         if (currentPrefix == null)
           {
             if (prefixDefaulting)
-              writeNamespaceImpl(prefix, namespaceURI);
+              writeNamespace(prefix, namespaceURI);
             else
               throw new XMLStreamException("namespace " + namespaceURI +
                                            " is not bound");
@@ -423,10 +388,7 @@
         writer.write(localName);
         writer.write('=');
         writer.write('"');
-        if (hasXML11RestrictedChars)
-          writeEncodedWithRestrictedChars(value, true);
-        else
-          writeEncoded(value, true);
+        writeEncoded(value, true);
         writer.write('"');
       }
     catch (IOException e)
@@ -445,20 +407,13 @@
       throw new IllegalStateException();
     try
       {
-        if (namespaceURI != null && !isURI(namespaceURI))
-          throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-        if (!isName(localName))
-          throw new IllegalArgumentException("illegal Name: " + localName);
-        if (!isChars(value))
-          throw new IllegalArgumentException("illegal character: " + value);
-        
         String prefix = getPrefix(namespaceURI);
         if (prefix == null)
           {
             if (prefixDefaulting)
               {
                 prefix = XMLConstants.DEFAULT_NS_PREFIX;
-                writeNamespaceImpl(prefix, namespaceURI);
+                writeNamespace(prefix, namespaceURI);
               }
             else
               throw new XMLStreamException("namespace " + namespaceURI +
@@ -473,10 +428,7 @@
         writer.write(localName);
         writer.write('=');
         writer.write('"');
-        if (hasXML11RestrictedChars)
-          writeEncodedWithRestrictedChars(value, true);
-        else
-          writeEncoded(value, true);
+        writeEncoded(value, true);
         writer.write('"');
       }
     catch (IOException e)
@@ -494,25 +446,6 @@
       throw new IllegalStateException();
     try
       {
-        if (!isURI(namespaceURI))
-          throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-        if (!isNCName(prefix))
-          throw new IllegalArgumentException("illegal NCName: " + prefix);
-      }
-    catch (IOException e)
-      {
-        XMLStreamException e2 = new XMLStreamException(e);
-        e2.initCause(e);
-        throw e2;
-      }
-    writeNamespaceImpl(prefix, namespaceURI);
-  }
-
-  private void writeNamespaceImpl(String prefix, String namespaceURI)
-    throws XMLStreamException
-  {
-    try
-      {
         if (prefix == null)
           prefix = XMLConstants.DEFAULT_NS_PREFIX;
 
@@ -541,41 +474,21 @@
   public void writeDefaultNamespace(String namespaceURI)
     throws XMLStreamException
   {
-    if (!inStartElement)
-      throw new IllegalStateException();
-    if (!isURI(namespaceURI))
-      throw new IllegalArgumentException("illegal URI: " + namespaceURI);
-    writeNamespaceImpl(XMLConstants.DEFAULT_NS_PREFIX, namespaceURI);
+    writeNamespace(XMLConstants.DEFAULT_NS_PREFIX, namespaceURI);
   }
 
   public void writeComment(String data)
     throws XMLStreamException
   {
-    if (data == null)
-      return;
     try
       {
-        if (!isChars(data))
-          throw new IllegalArgumentException("illegal XML character: " + data);
-        if (data.indexOf("--") != -1)
-          throw new IllegalArgumentException("illegal comment: " + data);
-
         endStartElement();
         
+        if (data != null && data.indexOf("--") != -1)
+          throw new IllegalArgumentException(data);
+        
         writer.write("<!--");
-        if (hasXML11RestrictedChars)
-          {
-            int[] seq = UnicodeReader.toCodePointArray(data);
-            for (int i = 0; i < seq.length; i++)
-              {
-                int c = seq[i];
-                if (XMLParser.isXML11RestrictedChar(c))
-                  writer.write("&#x" + Integer.toHexString(c) + ";");
-                else
-                  writer.write(Character.toChars(i));
-              }
-          }
-        else
+        if (data != null)
           writer.write(data);
         writer.write("-->");
       }
@@ -598,11 +511,6 @@
   {
     try
       {
-        if (!isName(target) || "xml".equalsIgnoreCase(target))
-          throw new IllegalArgumentException("illegal PITarget: " + target);
-        if (data != null && !isChars(data))
-          throw new IllegalArgumentException("illegal XML character: " + data);
-
         endStartElement();
 
         writer.write('<');
@@ -611,20 +519,7 @@
         if (data != null)
           {
             writer.write(' ');
-            if (hasXML11RestrictedChars)
-              {
-                int[] seq = UnicodeReader.toCodePointArray(data);
-                for (int i = 0; i < seq.length; i++)
-                  {
-                    int c = seq[i];
-                    if (XMLParser.isXML11RestrictedChar(c))
-                      writer.write("&#x" + Integer.toHexString(c) + ";");
-                    else
-                      writer.write(Character.toChars(i));
-                  }
-              }
-            else
-              writer.write(data);
+            writer.write(data);
           }
         writer.write('?');
         writer.write('>');
@@ -642,13 +537,11 @@
   {
     try
       {
-        if (!isChars(data) || hasXML11RestrictedChars)
-          throw new IllegalArgumentException("illegal XML character: " + data);
-        if (data.indexOf("]]") != -1)
-          throw new IllegalArgumentException("illegal CDATA section: " + data);
-        
         endStartElement();
 
+        if (data.indexOf("]]") != -1)
+          throw new IllegalArgumentException(data);
+
         writer.write("<![CDATA[");
         writer.write(data);
         writer.write("]]>");
@@ -664,12 +557,8 @@
   public void writeDTD(String dtd)
     throws XMLStreamException
   {
-    // Really thoroughly pointless method...
     try
       {
-        if (!isName(dtd))
-          throw new IllegalArgumentException("illegal Name: " + dtd);
-
         writer.write("<!DOCTYPE ");
         writer.write(dtd);
         writer.write('>');
@@ -687,9 +576,6 @@
   {
     try
       {
-        if (!isName(name))
-          throw new IllegalArgumentException("illegal Name: " + name);
-
         endStartElement();
 
         writer.write('&');
@@ -721,8 +607,6 @@
   {
     if (version == null)
       version = "1.0";
-    else if ("1.1".equals(version))
-      xml11 = true;
     encoding = this.encoding; // YES: the parameter must be ignored
     if (encoding == null)
       encoding = "UTF-8";
@@ -748,18 +632,11 @@
   public void writeCharacters(String text)
     throws XMLStreamException
   {
-    if (text == null)
-      return;
     try
       {
-        if (!isChars(text))
-          throw new IllegalArgumentException("illegal XML character: " + text);
-
         endStartElement();
 
-        if (hasXML11RestrictedChars)
-          writeEncodedWithRestrictedChars(text, false);
-        else
+        if (text != null)
           writeEncoded(text, false);
       }
     catch (IOException e)
@@ -773,7 +650,39 @@
   public void writeCharacters(char[] text, int start, int len)
     throws XMLStreamException
   {
-    writeCharacters(new String(text, start, len));
+    try
+      {
+        endStartElement();
+
+        int end = start + len;
+        len = 0;
+        for (int i = start; i < end; i++)
+          {
+            char c = text[i];
+            if (c == '<' || c == '>' || c == '&')
+              {
+                writer.write(text, start, len);
+                if (c == '<')
+                  writer.write("&lt;");
+                else if (c == '>')
+                  writer.write("&gt;");
+                else
+                  writer.write("&amp;");
+                start = i + 1;
+                len = 0;
+              }
+            else
+              len++;
+          }
+        if (len > 0)
+          writer.write(text, start, len);
+      }
+    catch (IOException e)
+      {
+        XMLStreamException e2 = new XMLStreamException(e);
+        e2.initCause(e);
+        throw e2;
+      }
   }
 
   public String getPrefix(String uri)
@@ -788,19 +697,6 @@
   public void setPrefix(String prefix, String uri)
     throws XMLStreamException
   {
-    try
-      {
-        if (!isURI(uri))
-          throw new IllegalArgumentException("illegal URI: " + uri);
-        if (!isNCName(prefix))
-          throw new IllegalArgumentException("illegal NCName: " + prefix);
-      }
-    catch (IOException e)
-      {
-        XMLStreamException e2 = new XMLStreamException(e);
-        e2.initCause(e);
-        throw e2;
-      }
     if (!namespaces.declarePrefix(prefix, uri))
       throw new XMLStreamException("illegal prefix " + prefix);
   }
@@ -808,8 +704,6 @@
   public void setDefaultNamespace(String uri)
     throws XMLStreamException
   {
-    if (!isURI(uri))
-      throw new IllegalArgumentException("illegal URI: " + uri);
     if (!namespaces.declarePrefix(XMLConstants.DEFAULT_NS_PREFIX, uri))
       throw new XMLStreamException("illegal default namespace prefix");
   }
@@ -875,131 +769,6 @@
     if (len > 0)
       writer.write(chars, start, len);
   }
-
-  /**
-   * Writes the specified text, in the knowledge that some of the
-   * characters are XML 1.1 restricted characters.
-   */
-  private void writeEncodedWithRestrictedChars(String text, boolean inAttr)
-    throws IOException
-  {
-    int[] seq = UnicodeReader.toCodePointArray(text);
-    for (int i = 0; i < seq.length; i++)
-      {
-        int c = seq[i];
-        switch (c)
-          {
-          case 0x3c: // '<'
-            writer.write("&lt;");
-            break;
-          case 0x3e: // '>'
-            writer.write("&gt;");
-            break;
-          case 0x26: // '&'
-            writer.write("&amp;");
-            break;
-          case 0x22: // '"'
-            if (inAttr)
-              writer.write("&quot;");
-            else
-              writer.write(c);
-            break;
-          case 0x27: // '\''
-            if (inAttr)
-              writer.write("&apos;");
-            else
-              writer.write(c);
-            break;
-          default:
-            if (XMLParser.isXML11RestrictedChar(c))
-              writer.write("&#x" + Integer.toHexString(c) + ";");
-            else
-              {
-                char[] chars = Character.toChars(c);
-                writer.write(chars, 0, chars.length);
-              }
-          }
-      }
-  }
-
-  private boolean isName(String text)
-    throws IOException
-  {
-    if (text == null)
-      return false;
-    int[] seq = UnicodeReader.toCodePointArray(text);
-    if (seq.length < 1)
-      return false;
-    if (!XMLParser.isNameStartCharacter(seq[0], xml11))
-      return false;
-    for (int i = 1; i < seq.length; i++)
-      {
-        if (!XMLParser.isNameCharacter(seq[i], xml11))
-          return false;
-      }
-    return true;
-  }
-
-  private boolean isNCName(String text)
-    throws IOException
-  {
-    if (text == null)
-      return false;
-    int[] seq = UnicodeReader.toCodePointArray(text);
-    if (seq.length < 1)
-      return false;
-    if (!XMLParser.isNameStartCharacter(seq[0], xml11) || seq[0] == 0x3a)
-      return false;
-    for (int i = 1; i < seq.length; i++)
-      {
-        if (!XMLParser.isNameCharacter(seq[i], xml11) || seq[i] == 0x3a)
-          return false;
-      }
-    return true;
-  }
-
-  private boolean isChars(String text)
-    throws IOException
-  {
-    if (text == null)
-      return false;
-    int[] seq = UnicodeReader.toCodePointArray(text);
-    hasXML11RestrictedChars = false;
-    if (xml11)
-      {
-        for (int i = 0; i < seq.length; i++)
-          {
-            if (!XMLParser.isXML11Char(seq[i]))
-              return false;
-            if (XMLParser.isXML11RestrictedChar(seq[i]))
-              hasXML11RestrictedChars = true;
-          }
-      }
-    else
-      {
-        for (int i = 0; i < seq.length; i++)
-          {
-            if (!XMLParser.isChar(seq[i]))
-              return false;
-          }
-      }
-    return true;
-  }
-
-  private boolean isURI(String text)
-  {
-    if (text == null)
-      return false;
-    char[] chars = text.toCharArray();
-    if (chars.length < 1)
-      return false;
-    for (int i = 0; i < chars.length; i++)
-      {
-        if (chars[i] < 0x20 || chars[i] >= 0x7f)
-          return false;
-      }
-    return true;
-  }
   
 }
 
