# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# This patch file was generated by NetBeans IDE
# It uses platform neutral UTF-8 encoding and \n newlines.
--- JadeColoringLexer.java
+++ JadeColoringLexer.java.patched
@@ -565,7 +565,7 @@
    * Returns the text matched by the current regular expression.
    */
   public final String yytext() {
-    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+    return input.readText().toString();
   }
 
 
@@ -581,7 +581,7 @@
    * @return the character at position pos
    */
   public final char yycharat(int pos) {
-    return zzBuffer[zzStartRead+pos];
+    return input.readText().charAt(pos);
   }
 
 
@@ -589,7 +589,7 @@
    * Returns the length of the matched text region.
    */
   public final int yylength() {
-    return zzMarkedPos-zzStartRead;
+    return input.readLength();
   }
 
 
@@ -632,7 +632,7 @@
     if ( number > yylength() )
       zzScanError(ZZ_PUSHBACK_2BIG);
 
-    zzMarkedPos -= number;
+    input.backup(number);
   }
 
 
@@ -648,10 +648,7 @@
     int zzAction;
 
     // cached fields:
-    int zzCurrentPosL;
     int zzMarkedPosL;
-    int zzEndReadL = zzEndRead;
-    char [] zzBufferL = zzBuffer;
     char [] zzCMapL = ZZ_CMAP;
 
     int [] zzTransL = ZZ_TRANS;
@@ -665,7 +662,7 @@
 
       zzAction = -1;
 
-      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+      int tokenLength = 0;
   
       zzState = ZZ_LEXSTATE[zzLexicalState];
 
@@ -673,30 +670,12 @@
       zzForAction: {
         while (true) {
     
-          if (zzCurrentPosL < zzEndReadL)
-            zzInput = zzBufferL[zzCurrentPosL++];
-          else if (zzAtEOF) {
+          zzInput = input.read();
+         if(zzInput == LexerInput.EOF) {
             zzInput = YYEOF;
             break zzForAction;
           }
-          else {
-            // store back cached positions
-            zzCurrentPos  = zzCurrentPosL;
-            zzMarkedPos   = zzMarkedPosL;
-            boolean eof = zzRefill();
-            // get translated positions and possibly new buffer
-            zzCurrentPosL  = zzCurrentPos;
-            zzMarkedPosL   = zzMarkedPos;
-            zzBufferL      = zzBuffer;
-            zzEndReadL     = zzEndRead;
-            if (eof) {
-              zzInput = YYEOF;
-              break zzForAction;
-            }
-            else {
-              zzInput = zzBufferL[zzCurrentPosL++];
-            }
-          }
+          
           int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
           if (zzNext == -1) break zzForAction;
           zzState = zzNext;
@@ -704,7 +683,7 @@
           int zzAttributes = zzAttrL[zzState];
           if ( (zzAttributes & 1) == 1 ) {
             zzAction = zzState;
-            zzMarkedPosL = zzCurrentPosL;
+            tokenLength = input.readLength();
             if ( (zzAttributes & 8) == 8 ) break zzForAction;
           }
 
@@ -712,7 +691,9 @@
       }
 
       // store back cached position
-      zzMarkedPos = zzMarkedPosL;
+      if(zzInput != YYEOF) {
+          input.backup(input.readLength() - tokenLength);
+      }
 
       switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
         case 2: 
