src/share/jaxws_classes/com/sun/xml/internal/rngom/parse/compact/UCode_UCodeESC_CharStream.java

Tue, 06 Mar 2012 16:09:35 -0800

author
ohair
date
Tue, 06 Mar 2012 16:09:35 -0800
changeset 286
f50545b5e2f1
child 408
b0610cd08440
permissions
-rw-r--r--

7150322: Stop using drop source bundles in jaxws
Reviewed-by: darcy, ohrstrom

     1 /*
     2  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 /*
    26  * Copyright (C) 2004-2011
    27  *
    28  * Permission is hereby granted, free of charge, to any person obtaining a copy
    29  * of this software and associated documentation files (the "Software"), to deal
    30  * in the Software without restriction, including without limitation the rights
    31  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    32  * copies of the Software, and to permit persons to whom the Software is
    33  * furnished to do so, subject to the following conditions:
    34  *
    35  * The above copyright notice and this permission notice shall be included in
    36  * all copies or substantial portions of the Software.
    37  *
    38  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    39  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    40  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    41  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    42  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    43  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    44  * THE SOFTWARE.
    45  */
    46 /* Generated By:JavaCC: Do not edit this line. UCode_UCodeESC_CharStream.java Version 0.7pre6 */
    47 /* The previous line keeps JavaCC quiet. In fact, the JavaCC generated file
    48    has been edited to fix some bugs. */
    49 package com.sun.xml.internal.rngom.parse.compact;
    51 import com.sun.xml.internal.rngom.util.Utf16;
    52 import com.sun.xml.internal.rngom.ast.builder.BuildException;
    54 import java.io.IOException;
    56 /**
    57  * An implementation of interface CharStream, where the stream is assumed to
    58  * contain 16-bit unicode characters.
    59  */
    60 public final class UCode_UCodeESC_CharStream {
    61   public static final boolean staticFlag = false;
    63   static final int hexval(char c) {
    64     switch (c) {
    65     case '0':
    66       return 0;
    67     case '1':
    68       return 1;
    69     case '2':
    70       return 2;
    71     case '3':
    72       return 3;
    73     case '4':
    74       return 4;
    75     case '5':
    76       return 5;
    77     case '6':
    78       return 6;
    79     case '7':
    80       return 7;
    81     case '8':
    82       return 8;
    83     case '9':
    84       return 9;
    86     case 'a':
    87     case 'A':
    88       return 10;
    89     case 'b':
    90     case 'B':
    91       return 11;
    92     case 'c':
    93     case 'C':
    94       return 12;
    95     case 'd':
    96     case 'D':
    97       return 13;
    98     case 'e':
    99     case 'E':
   100       return 14;
   101     case 'f':
   102     case 'F':
   103       return 15;
   104     }
   105     return -1;
   106   }
   108   public int bufpos = -1;
   109   int bufsize;
   110   int available;
   111   int tokenBegin;
   112   private int bufline[];
   113   private int bufcolumn[];
   115   private int column = 0;
   116   private int line = 1;
   118   private java.io.Reader inputStream;
   119   private boolean closed = false;
   121   private boolean prevCharIsLF = false;
   123   private char[] nextCharBuf;
   124   private char[] buffer;
   125   private int maxNextCharInd = 0;
   126   private int nextCharInd = -1;
   127   private int inBuf = 0;
   129   private final void ExpandBuff(boolean wrapAround) {
   130     char[] newbuffer = new char[bufsize + 2048];
   131     int newbufline[] = new int[bufsize + 2048];
   132     int newbufcolumn[] = new int[bufsize + 2048];
   134     if (wrapAround) {
   135       System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
   136       System.arraycopy(buffer, 0, newbuffer,
   137                        bufsize - tokenBegin, bufpos);
   138       buffer = newbuffer;
   140       System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
   141       System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
   142       bufline = newbufline;
   144       System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
   145       System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
   146       bufcolumn = newbufcolumn;
   148       bufpos += (bufsize - tokenBegin);
   149     }
   150     else {
   151       System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
   152       buffer = newbuffer;
   154       System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
   155       bufline = newbufline;
   157       System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
   158       bufcolumn = newbufcolumn;
   160       bufpos -= tokenBegin;
   161     }
   163     available = (bufsize += 2048);
   164     tokenBegin = 0;
   165   }
   167   private final void FillBuff() throws EOFException {
   168     int i;
   169     if (maxNextCharInd == 4096)
   170       maxNextCharInd = nextCharInd = 0;
   172     if (closed)
   173       throw new EOFException();
   174     try {
   175       if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 4096 - maxNextCharInd)) == -1) {
   176         closed = true;
   177         inputStream.close();
   178         throw new EOFException();
   179       }
   180       else
   181         maxNextCharInd += i;
   182     }
   183     catch (IOException e) {
   184       throw new BuildException(e);
   185     }
   186   }
   188   private final char ReadChar() throws EOFException {
   189     if (++nextCharInd >= maxNextCharInd)
   190       FillBuff();
   192     return nextCharBuf[nextCharInd];
   193   }
   195   private final char PeekChar() throws EOFException {
   196     char c = ReadChar();
   197     --nextCharInd;
   198     return c;
   199   }
   201   public final char BeginToken() throws EOFException {
   202     if (inBuf > 0) {
   203       --inBuf;
   204       return buffer[tokenBegin = (bufpos == bufsize - 1) ? (bufpos = 0)
   205               : ++bufpos];
   206     }
   208     tokenBegin = 0;
   209     bufpos = -1;
   211     return readChar();
   212   }
   214   private final void AdjustBuffSize() {
   215     if (available == bufsize) {
   216       if (tokenBegin > 2048) {
   217         bufpos = 0;
   218         available = tokenBegin;
   219       }
   220       else
   221         ExpandBuff(false);
   222     }
   223     else if (available > tokenBegin)
   224       available = bufsize;
   225     else if ((tokenBegin - available) < 2048)
   226       ExpandBuff(true);
   227     else
   228       available = tokenBegin;
   229   }
   231   private final void UpdateLineColumn(char c) {
   232     column++;
   234     if (prevCharIsLF) {
   235       prevCharIsLF = false;
   236       line += (column = 1);
   237     }
   239     switch (c) {
   240     case NEWLINE_MARKER:
   241       prevCharIsLF = true;
   242       break;
   243     case '\t':
   244       column--;
   245       column += (8 - (column & 07));
   246       break;
   247     default :
   248       break;
   249     }
   251     bufline[bufpos] = line;
   252     bufcolumn[bufpos] = column;
   253   }
   255   private final char NEWLINE_MARKER = '\u0000';
   257   public final char readChar() throws EOFException {
   258     if (inBuf > 0) {
   259       --inBuf;
   260       return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos];
   261     }
   263     char c;
   264     try {
   265       c = ReadChar();
   266       switch (c) {
   267       case '\r':
   268         c = NEWLINE_MARKER;
   269         try {
   270           if (PeekChar() == '\n')
   271             ReadChar();
   272         }
   273         catch (EOFException e) {
   274         }
   275         break;
   276       case '\n':
   277         c = NEWLINE_MARKER;
   278         break;
   279       case '\t':
   280         break;
   281       default:
   282         if (c >= 0x20) {
   283           if (Utf16.isSurrogate(c)) {
   284             if (Utf16.isSurrogate2(c))
   285               throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1);
   286             if (++bufpos == available)
   287               AdjustBuffSize();
   288             buffer[bufpos] = c;
   289             // UpdateLineColumn(c);
   290             try {
   291               c = ReadChar();
   292             }
   293             catch (EOFException e) {
   294               throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1);
   295             }
   296             if (!Utf16.isSurrogate2(c))
   297               throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 2);
   298           }
   299           break;
   300         }
   301         // fall through
   302       case '\uFFFE':
   303       case '\uFFFF':
   304         throw new EscapeSyntaxException("illegal_char_code", line, column + 1);
   305       }
   306     }
   307     catch (EOFException e) {
   308       if (bufpos == -1) {
   309         if (++bufpos == available)
   310           AdjustBuffSize();
   311         bufline[bufpos] = line;
   312         bufcolumn[bufpos] = column;
   313       }
   314       throw e;
   315     }
   316     if (++bufpos == available)
   317       AdjustBuffSize();
   318     buffer[bufpos] = c;
   319     UpdateLineColumn(c);
   320     try {
   321       if (c != '\\' || PeekChar() != 'x')
   322         return c;
   323     }
   324     catch (EOFException e) {
   325       return c;
   326     }
   328     int xCnt = 1;
   329     for (;;) {
   330       ReadChar();
   331       if (++bufpos == available)
   332         AdjustBuffSize();
   333       buffer[bufpos] = 'x';
   334       UpdateLineColumn('x');
   335       try {
   336         c = PeekChar();
   337       }
   338       catch (EOFException e) {
   339         backup(xCnt);
   340         return '\\';
   341       }
   342       if (c == '{') {
   343         ReadChar();
   344         column++;
   345         // backup past the 'x's
   346         bufpos -= xCnt;
   347         if (bufpos < 0)
   348           bufpos += bufsize;
   349         break;
   350       }
   351       if (c != 'x') {
   352         backup(xCnt);
   353         return '\\';
   354       }
   355       xCnt++;
   356     }
   357     try {
   358       int scalarValue = hexval(ReadChar());
   359       column++;
   360       if (scalarValue < 0)
   361         throw new EscapeSyntaxException("illegal_hex_digit", line, column);
   362       while ((c = ReadChar()) != '}') {
   363         column++;
   364         int n = hexval(c);
   365         if (n < 0)
   366           throw new EscapeSyntaxException("illegal_hex_digit", line, column);
   367         scalarValue <<= 4;
   368         scalarValue |= n;
   369         if (scalarValue >= 0x110000)
   370           throw new EscapeSyntaxException("char_code_too_big", line, column);
   371       }
   372       column++; // for the '}'
   373       if (scalarValue <= 0xFFFF) {
   374         c = (char)scalarValue;
   375         switch (c) {
   376         case '\n':
   377         case '\r':
   378         case '\t':
   379           break;
   380         default:
   381           if (c >= 0x20 && !Utf16.isSurrogate(c))
   382             break;
   383           // fall through
   384         case '\uFFFE':
   385         case '\uFFFF':
   386           throw new EscapeSyntaxException("illegal_char_code_ref", line, column);
   387         }
   388         buffer[bufpos] = c;
   389         return c;
   390       }
   391       c = Utf16.surrogate1(scalarValue);
   392       buffer[bufpos] = c;
   393       int bufpos1 = bufpos;
   394       if (++bufpos == bufsize)
   395         bufpos = 0;
   396       buffer[bufpos] = Utf16.surrogate2(scalarValue);
   397       bufline[bufpos] = bufline[bufpos1];
   398       bufcolumn[bufpos] = bufcolumn[bufpos1];
   399       backup(1);
   400       return c;
   401     }
   402     catch (EOFException e) {
   403       throw new EscapeSyntaxException("incomplete_escape", line, column);
   404     }
   405   }
   407   /**
   408    * @deprecated
   409    * @see #getEndColumn
   410    */
   412   public final int getColumn() {
   413     return bufcolumn[bufpos];
   414   }
   416   /**
   417    * @deprecated
   418    * @see #getEndLine
   419    */
   421   public final int getLine() {
   422     return bufline[bufpos];
   423   }
   425   public final int getEndColumn() {
   426     return bufcolumn[bufpos];
   427   }
   429   public final int getEndLine() {
   430     return bufline[bufpos];
   431   }
   433   public final int getBeginColumn() {
   434     return bufcolumn[tokenBegin];
   435   }
   437   public final int getBeginLine() {
   438     return bufline[tokenBegin];
   439   }
   441   public final void backup(int amount) {
   443     inBuf += amount;
   444     if ((bufpos -= amount) < 0)
   445       bufpos += bufsize;
   446   }
   448   public UCode_UCodeESC_CharStream(java.io.Reader dstream,
   449                                    int startline, int startcolumn, int buffersize) {
   450     inputStream = dstream;
   451     line = startline;
   452     column = startcolumn - 1;
   454     available = bufsize = buffersize;
   455     buffer = new char[buffersize];
   456     bufline = new int[buffersize];
   457     bufcolumn = new int[buffersize];
   458     nextCharBuf = new char[4096];
   459     skipBOM();
   460   }
   462   public UCode_UCodeESC_CharStream(java.io.Reader dstream,
   463                                    int startline, int startcolumn) {
   464     this(dstream, startline, startcolumn, 4096);
   465   }
   467   public void ReInit(java.io.Reader dstream,
   468                      int startline, int startcolumn, int buffersize) {
   469     inputStream = dstream;
   470     closed = false;
   471     line = startline;
   472     column = startcolumn - 1;
   474     if (buffer == null || buffersize != buffer.length) {
   475       available = bufsize = buffersize;
   476       buffer = new char[buffersize];
   477       bufline = new int[buffersize];
   478       bufcolumn = new int[buffersize];
   479       nextCharBuf = new char[4096];
   480     }
   481     prevCharIsLF = false;
   482     tokenBegin = inBuf = maxNextCharInd = 0;
   483     nextCharInd = bufpos = -1;
   484     skipBOM();
   485   }
   487   public void ReInit(java.io.Reader dstream,
   488                      int startline, int startcolumn) {
   489     ReInit(dstream, startline, startcolumn, 4096);
   490   }
   492   public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline,
   493                                    int startcolumn, int buffersize) {
   494     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
   495   }
   497   public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline,
   498                                    int startcolumn) {
   499     this(dstream, startline, startcolumn, 4096);
   500   }
   502   public void ReInit(java.io.InputStream dstream, int startline,
   503                      int startcolumn, int buffersize) {
   504     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
   505   }
   507   public void ReInit(java.io.InputStream dstream, int startline,
   508                      int startcolumn) {
   509     ReInit(dstream, startline, startcolumn, 4096);
   510   }
   512   static private final char BOM = '\ufeff';
   514   private void skipBOM() {
   515     try {
   516       if (PeekChar() == BOM)
   517         ReadChar();
   518     }
   519     catch (EOFException e) {
   520     }
   521   }
   523   public final String GetImage() {
   524     if (bufpos >= tokenBegin)
   525       return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
   526     else
   527       return new String(buffer, tokenBegin, bufsize - tokenBegin) +
   528               new String(buffer, 0, bufpos + 1);
   529   }
   531   public final char[] GetSuffix(int len) {
   532     char[] ret = new char[len];
   534     if ((bufpos + 1) >= len)
   535       System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
   536     else {
   537       System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
   538                        len - bufpos - 1);
   539       System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
   540     }
   542     return ret;
   543   }
   545   public void Done() {
   546     nextCharBuf = null;
   547     buffer = null;
   548     bufline = null;
   549     bufcolumn = null;
   550   }
   552   /**
   553    * Method to adjust line and column numbers for the start of a token.<BR>
   554    */
   555   public void adjustBeginLineColumn(int newLine, int newCol) {
   556     int start = tokenBegin;
   557     int len;
   559     if (bufpos >= tokenBegin) {
   560       len = bufpos - tokenBegin + inBuf + 1;
   561     }
   562     else {
   563       len = bufsize - tokenBegin + bufpos + 1 + inBuf;
   564     }
   566     int i = 0, j = 0, k = 0;
   567     int nextColDiff = 0, columnDiff = 0;
   569     while (i < len &&
   570             bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) {
   571       bufline[j] = newLine;
   572       nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
   573       bufcolumn[j] = newCol + columnDiff;
   574       columnDiff = nextColDiff;
   575       i++;
   576     }
   578     if (i < len) {
   579       bufline[j] = newLine++;
   580       bufcolumn[j] = newCol + columnDiff;
   582       while (i++ < len) {
   583         if (bufline[j = start % bufsize] != bufline[++start % bufsize])
   584           bufline[j] = newLine++;
   585         else
   586           bufline[j] = newLine;
   587       }
   588     }
   590     line = bufline[j];
   591     column = bufcolumn[j];
   592   }
   594 }

mercurial