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

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 408
b0610cd08440
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     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-2012
    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 {
    62     public static final boolean staticFlag = false;
    64     static final int hexval(char c) {
    65         switch (c) {
    66             case '0':
    67                 return 0;
    68             case '1':
    69                 return 1;
    70             case '2':
    71                 return 2;
    72             case '3':
    73                 return 3;
    74             case '4':
    75                 return 4;
    76             case '5':
    77                 return 5;
    78             case '6':
    79                 return 6;
    80             case '7':
    81                 return 7;
    82             case '8':
    83                 return 8;
    84             case '9':
    85                 return 9;
    87             case 'a':
    88             case 'A':
    89                 return 10;
    90             case 'b':
    91             case 'B':
    92                 return 11;
    93             case 'c':
    94             case 'C':
    95                 return 12;
    96             case 'd':
    97             case 'D':
    98                 return 13;
    99             case 'e':
   100             case 'E':
   101                 return 14;
   102             case 'f':
   103             case 'F':
   104                 return 15;
   105         }
   106         return -1;
   107     }
   108     public int bufpos = -1;
   109     int bufsize;
   110     int available;
   111     int tokenBegin;
   112     private int bufline[];
   113     private int bufcolumn[];
   114     private int column = 0;
   115     private int line = 1;
   116     private java.io.Reader inputStream;
   117     private boolean closed = false;
   118     private boolean prevCharIsLF = false;
   119     private char[] nextCharBuf;
   120     private char[] buffer;
   121     private int maxNextCharInd = 0;
   122     private int nextCharInd = -1;
   123     private int inBuf = 0;
   125     private final void ExpandBuff(boolean wrapAround) {
   126         char[] newbuffer = new char[bufsize + 2048];
   127         int newbufline[] = new int[bufsize + 2048];
   128         int newbufcolumn[] = new int[bufsize + 2048];
   130         if (wrapAround) {
   131             System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
   132             System.arraycopy(buffer, 0, newbuffer,
   133                     bufsize - tokenBegin, bufpos);
   134             buffer = newbuffer;
   136             System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
   137             System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
   138             bufline = newbufline;
   140             System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
   141             System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
   142             bufcolumn = newbufcolumn;
   144             bufpos += (bufsize - tokenBegin);
   145         } else {
   146             System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
   147             buffer = newbuffer;
   149             System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
   150             bufline = newbufline;
   152             System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
   153             bufcolumn = newbufcolumn;
   155             bufpos -= tokenBegin;
   156         }
   158         available = (bufsize += 2048);
   159         tokenBegin = 0;
   160     }
   162     private final void FillBuff() throws EOFException {
   163         int i;
   164         if (maxNextCharInd == 4096) {
   165             maxNextCharInd = nextCharInd = 0;
   166         }
   168         if (closed) {
   169             throw new EOFException();
   170         }
   171         try {
   172             if ((i = inputStream.read(nextCharBuf, maxNextCharInd, 4096 - maxNextCharInd)) == -1) {
   173                 closed = true;
   174                 inputStream.close();
   175                 throw new EOFException();
   176             } else {
   177                 maxNextCharInd += i;
   178             }
   179         } catch (IOException e) {
   180             throw new BuildException(e);
   181         }
   182     }
   184     private final char ReadChar() throws EOFException {
   185         if (++nextCharInd >= maxNextCharInd) {
   186             FillBuff();
   187         }
   189         return nextCharBuf[nextCharInd];
   190     }
   192     private final char PeekChar() throws EOFException {
   193         char c = ReadChar();
   194         --nextCharInd;
   195         return c;
   196     }
   198     public final char BeginToken() throws EOFException {
   199         if (inBuf > 0) {
   200             --inBuf;
   201             return buffer[tokenBegin = (bufpos == bufsize - 1) ? (bufpos = 0)
   202                     : ++bufpos];
   203         }
   205         tokenBegin = 0;
   206         bufpos = -1;
   208         return readChar();
   209     }
   211     private final void AdjustBuffSize() {
   212         if (available == bufsize) {
   213             if (tokenBegin > 2048) {
   214                 bufpos = 0;
   215                 available = tokenBegin;
   216             } else {
   217                 ExpandBuff(false);
   218             }
   219         } else if (available > tokenBegin) {
   220             available = bufsize;
   221         } else if ((tokenBegin - available) < 2048) {
   222             ExpandBuff(true);
   223         } else {
   224             available = tokenBegin;
   225         }
   226     }
   228     private final void UpdateLineColumn(char c) {
   229         column++;
   231         if (prevCharIsLF) {
   232             prevCharIsLF = false;
   233             line += (column = 1);
   234         }
   236         switch (c) {
   237             case NEWLINE_MARKER:
   238                 prevCharIsLF = true;
   239                 break;
   240             case '\t':
   241                 column--;
   242                 column += (8 - (column & 07));
   243                 break;
   244             default:
   245                 break;
   246         }
   248         bufline[bufpos] = line;
   249         bufcolumn[bufpos] = column;
   250     }
   251     private static final char NEWLINE_MARKER = '\u0000';
   253     public final char readChar() throws EOFException {
   254         if (inBuf > 0) {
   255             --inBuf;
   256             return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos];
   257         }
   259         char c;
   260         try {
   261             c = ReadChar();
   262             switch (c) {
   263                 case '\r':
   264                     c = NEWLINE_MARKER;
   265                     try {
   266                         if (PeekChar() == '\n') {
   267                             ReadChar();
   268                         }
   269                     } catch (EOFException e) {
   270                     }
   271                     break;
   272                 case '\n':
   273                     c = NEWLINE_MARKER;
   274                     break;
   275                 case '\t':
   276                     break;
   277                 default:
   278                     if (c >= 0x20) {
   279                         if (Utf16.isSurrogate(c)) {
   280                             if (Utf16.isSurrogate2(c)) {
   281                                 throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1);
   282                             }
   283                             if (++bufpos == available) {
   284                                 AdjustBuffSize();
   285                             }
   286                             buffer[bufpos] = c;
   287                             // UpdateLineColumn(c);
   288                             try {
   289                                 c = ReadChar();
   290                             } catch (EOFException e) {
   291                                 throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 1);
   292                             }
   293                             if (!Utf16.isSurrogate2(c)) {
   294                                 throw new EscapeSyntaxException("illegal_surrogate_pair", line, column + 2);
   295                             }
   296                         }
   297                         break;
   298                     }
   299                 // fall through
   300                 case '\uFFFE':
   301                 case '\uFFFF':
   302                     throw new EscapeSyntaxException("illegal_char_code", line, column + 1);
   303             }
   304         } catch (EOFException e) {
   305             if (bufpos == -1) {
   306                 if (++bufpos == available) {
   307                     AdjustBuffSize();
   308                 }
   309                 bufline[bufpos] = line;
   310                 bufcolumn[bufpos] = column;
   311             }
   312             throw e;
   313         }
   314         if (++bufpos == available) {
   315             AdjustBuffSize();
   316         }
   317         buffer[bufpos] = c;
   318         UpdateLineColumn(c);
   319         try {
   320             if (c != '\\' || PeekChar() != 'x') {
   321                 return c;
   322             }
   323         } catch (EOFException e) {
   324             return c;
   325         }
   327         int xCnt = 1;
   328         for (;;) {
   329             ReadChar();
   330             if (++bufpos == available) {
   331                 AdjustBuffSize();
   332             }
   333             buffer[bufpos] = 'x';
   334             UpdateLineColumn('x');
   335             try {
   336                 c = PeekChar();
   337             } catch (EOFException e) {
   338                 backup(xCnt);
   339                 return '\\';
   340             }
   341             if (c == '{') {
   342                 ReadChar();
   343                 column++;
   344                 // backup past the 'x's
   345                 bufpos -= xCnt;
   346                 if (bufpos < 0) {
   347                     bufpos += bufsize;
   348                 }
   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             }
   363             while ((c = ReadChar()) != '}') {
   364                 column++;
   365                 int n = hexval(c);
   366                 if (n < 0) {
   367                     throw new EscapeSyntaxException("illegal_hex_digit", line, column);
   368                 }
   369                 scalarValue <<= 4;
   370                 scalarValue |= n;
   371                 if (scalarValue >= 0x110000) {
   372                     throw new EscapeSyntaxException("char_code_too_big", line, column);
   373                 }
   374             }
   375             column++; // for the '}'
   376             if (scalarValue <= 0xFFFF) {
   377                 c = (char) scalarValue;
   378                 switch (c) {
   379                     case '\n':
   380                     case '\r':
   381                     case '\t':
   382                         break;
   383                     default:
   384                         if (c >= 0x20 && !Utf16.isSurrogate(c)) {
   385                             break;
   386                         }
   387                     // fall through
   388                     case '\uFFFE':
   389                     case '\uFFFF':
   390                         throw new EscapeSyntaxException("illegal_char_code_ref", line, column);
   391                 }
   392                 buffer[bufpos] = c;
   393                 return c;
   394             }
   395             c = Utf16.surrogate1(scalarValue);
   396             buffer[bufpos] = c;
   397             int bufpos1 = bufpos;
   398             if (++bufpos == bufsize) {
   399                 bufpos = 0;
   400             }
   401             buffer[bufpos] = Utf16.surrogate2(scalarValue);
   402             bufline[bufpos] = bufline[bufpos1];
   403             bufcolumn[bufpos] = bufcolumn[bufpos1];
   404             backup(1);
   405             return c;
   406         } catch (EOFException e) {
   407             throw new EscapeSyntaxException("incomplete_escape", line, column);
   408         }
   409     }
   411     /**
   412      * @deprecated @see #getEndColumn
   413      */
   414     public final int getColumn() {
   415         return bufcolumn[bufpos];
   416     }
   418     /**
   419      * @deprecated @see #getEndLine
   420      */
   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         }
   447     }
   449     public UCode_UCodeESC_CharStream(java.io.Reader dstream,
   450             int startline, int startcolumn, int buffersize) {
   451         inputStream = dstream;
   452         line = startline;
   453         column = startcolumn - 1;
   455         available = bufsize = buffersize;
   456         buffer = new char[buffersize];
   457         bufline = new int[buffersize];
   458         bufcolumn = new int[buffersize];
   459         nextCharBuf = new char[4096];
   460         skipBOM();
   461     }
   463     public UCode_UCodeESC_CharStream(java.io.Reader dstream,
   464             int startline, int startcolumn) {
   465         this(dstream, startline, startcolumn, 4096);
   466     }
   468     public void ReInit(java.io.Reader dstream,
   469             int startline, int startcolumn, int buffersize) {
   470         inputStream = dstream;
   471         closed = false;
   472         line = startline;
   473         column = startcolumn - 1;
   475         if (buffer == null || buffersize != buffer.length) {
   476             available = bufsize = buffersize;
   477             buffer = new char[buffersize];
   478             bufline = new int[buffersize];
   479             bufcolumn = new int[buffersize];
   480             nextCharBuf = new char[4096];
   481         }
   482         prevCharIsLF = false;
   483         tokenBegin = inBuf = maxNextCharInd = 0;
   484         nextCharInd = bufpos = -1;
   485         skipBOM();
   486     }
   488     public void ReInit(java.io.Reader dstream,
   489             int startline, int startcolumn) {
   490         ReInit(dstream, startline, startcolumn, 4096);
   491     }
   493     public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline,
   494             int startcolumn, int buffersize) {
   495         this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
   496     }
   498     public UCode_UCodeESC_CharStream(java.io.InputStream dstream, int startline,
   499             int startcolumn) {
   500         this(dstream, startline, startcolumn, 4096);
   501     }
   503     public void ReInit(java.io.InputStream dstream, int startline,
   504             int startcolumn, int buffersize) {
   505         ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
   506     }
   508     public void ReInit(java.io.InputStream dstream, int startline,
   509             int startcolumn) {
   510         ReInit(dstream, startline, startcolumn, 4096);
   511     }
   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         }
   530     }
   532     public final char[] GetSuffix(int len) {
   533         char[] ret = new char[len];
   535         if ((bufpos + 1) >= len) {
   536             System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
   537         } else {
   538             System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
   539                     len - bufpos - 1);
   540             System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
   541         }
   543         return ret;
   544     }
   546     public void Done() {
   547         nextCharBuf = null;
   548         buffer = null;
   549         bufline = null;
   550         bufcolumn = null;
   551     }
   553     /**
   554      * Method to adjust line and column numbers for the start of a token.<BR>
   555      */
   556     public void adjustBeginLineColumn(int newLine, int newCol) {
   557         int start = tokenBegin;
   558         int len;
   560         if (bufpos >= tokenBegin) {
   561             len = bufpos - tokenBegin + inBuf + 1;
   562         } else {
   563             len = bufsize - tokenBegin + bufpos + 1 + inBuf;
   564         }
   566         int i = 0, j = 0, k = 0;
   567         int nextColDiff, 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             }
   589         }
   591         line = bufline[j];
   592         column = bufcolumn[j];
   593     }
   594 }

mercurial