1*d219b4ceSAdam Hornacek /* 2*d219b4ceSAdam Hornacek * CDDL HEADER START 3*d219b4ceSAdam Hornacek * 4*d219b4ceSAdam Hornacek * The contents of this file are subject to the terms of the 5*d219b4ceSAdam Hornacek * Common Development and Distribution License (the "License"). 6*d219b4ceSAdam Hornacek * You may not use this file except in compliance with the License. 7*d219b4ceSAdam Hornacek * 8*d219b4ceSAdam Hornacek * See LICENSE.txt included in this distribution for the specific 9*d219b4ceSAdam Hornacek * language governing permissions and limitations under the License. 10*d219b4ceSAdam Hornacek * 11*d219b4ceSAdam Hornacek * When distributing Covered Code, include this CDDL HEADER in each 12*d219b4ceSAdam Hornacek * file and include the License file at LICENSE.txt. 13*d219b4ceSAdam Hornacek * If applicable, add the following below this CDDL HEADER, with the 14*d219b4ceSAdam Hornacek * fields enclosed by brackets "[]" replaced with your own identifying 15*d219b4ceSAdam Hornacek * information: Portions Copyright [yyyy] [name of copyright owner] 16*d219b4ceSAdam Hornacek * 17*d219b4ceSAdam Hornacek * CDDL HEADER END 18*d219b4ceSAdam Hornacek */ 19*d219b4ceSAdam Hornacek 20*d219b4ceSAdam Hornacek /* 21*d219b4ceSAdam Hornacek * Copyright (c) 2005, 2021, Oracle and/or its affiliates. All rights reserved. 22*d219b4ceSAdam Hornacek * Copyright (c) 2012, 2013 Constantine A. Murenin <C++@Cns.SU> 23*d219b4ceSAdam Hornacek * Portions Copyright (c) 2017-2018, Chris Fraire <cfraire@me.com>. 24*d219b4ceSAdam Hornacek */ 25*d219b4ceSAdam Hornacek 26*d219b4ceSAdam Hornacek package org.opengrok.indexer.analysis.uue; 27*d219b4ceSAdam Hornacek 28*d219b4ceSAdam Hornacek import java.util.Locale; 29*d219b4ceSAdam Hornacek import org.opengrok.indexer.analysis.JFlexSymbolMatcher; 30*d219b4ceSAdam Hornacek %% 31*d219b4ceSAdam Hornacek %public 32*d219b4ceSAdam Hornacek %class UuencodeFullTokenizer 33*d219b4ceSAdam Hornacek %extends JFlexSymbolMatcher 34*d219b4ceSAdam Hornacek %unicode 35*d219b4ceSAdam Hornacek %int 36*d219b4ceSAdam Hornacek %include ../CommonLexer.lexh 37*d219b4ceSAdam Hornacek %caseless 38*d219b4ceSAdam Hornacek %char 39*d219b4ceSAdam Hornacek %{ 40*d219b4ceSAdam Hornacek boolean b64; 41*d219b4ceSAdam Hornacek boolean modeFound; 42*d219b4ceSAdam Hornacek boolean nameFound; 43*d219b4ceSAdam Hornacek 44*d219b4ceSAdam Hornacek /** 45*d219b4ceSAdam Hornacek * Resets the uuencode tracked state after 46*d219b4ceSAdam Hornacek * {@link JFlexSymbolMatcher#reset()}. 47*d219b4ceSAdam Hornacek */ 48*d219b4ceSAdam Hornacek @Override reset()49*d219b4ceSAdam Hornacek public void reset() { 50*d219b4ceSAdam Hornacek super.reset(); 51*d219b4ceSAdam Hornacek b64 = false; 52*d219b4ceSAdam Hornacek modeFound = false; 53*d219b4ceSAdam Hornacek nameFound = false; 54*d219b4ceSAdam Hornacek } 55*d219b4ceSAdam Hornacek %} 56*d219b4ceSAdam Hornacek 57*d219b4ceSAdam Hornacek //WhiteSpace = [ \t\f\r]+|\n 58*d219b4ceSAdam Hornacek Identifier = [a-zA-Z_] [a-zA-Z0-9_]* 59*d219b4ceSAdam Hornacek Number = [0-9]+|[0-9]+\.[0-9]+| "0[xX]" [0-9a-fA-F]+ 60*d219b4ceSAdam Hornacek Printable = [\@\$\%\^\&\-+=\?\.\:] 61*d219b4ceSAdam Hornacek 62*d219b4ceSAdam Hornacek %state BEGIN MODE NAME UUE 63*d219b4ceSAdam Hornacek 64*d219b4ceSAdam Hornacek %% 65*d219b4ceSAdam Hornacek 66*d219b4ceSAdam Hornacek <YYINITIAL> { 67*d219b4ceSAdam Hornacek ^ ( "begin " | "begin-" ) { 68*d219b4ceSAdam Hornacek b64 = false; 69*d219b4ceSAdam Hornacek modeFound = false; 70*d219b4ceSAdam Hornacek nameFound = false; 71*d219b4ceSAdam Hornacek yybegin(BEGIN); 72*d219b4ceSAdam Hornacek yypushback(1); 73*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 74*d219b4ceSAdam Hornacek return yystate(); 75*d219b4ceSAdam Hornacek } 76*d219b4ceSAdam Hornacek 77*d219b4ceSAdam Hornacek {Identifier}|{Number}|{Printable} { 78*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 79*d219b4ceSAdam Hornacek return yystate(); 80*d219b4ceSAdam Hornacek } 81*d219b4ceSAdam Hornacek 82*d219b4ceSAdam Hornacek [^] {} 83*d219b4ceSAdam Hornacek } 84*d219b4ceSAdam Hornacek 85*d219b4ceSAdam Hornacek <BEGIN> { 86*d219b4ceSAdam Hornacek " " { 87*d219b4ceSAdam Hornacek if (!b64) 88*d219b4ceSAdam Hornacek yybegin(MODE); 89*d219b4ceSAdam Hornacek else 90*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 91*d219b4ceSAdam Hornacek } 92*d219b4ceSAdam Hornacek "-" { 93*d219b4ceSAdam Hornacek if (b64) 94*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 95*d219b4ceSAdam Hornacek b64 = true; 96*d219b4ceSAdam Hornacek onSymbolMatched(yytext(), yychar); 97*d219b4ceSAdam Hornacek return yystate(); 98*d219b4ceSAdam Hornacek } 99*d219b4ceSAdam Hornacek "base64 " { 100*d219b4ceSAdam Hornacek if (b64) 101*d219b4ceSAdam Hornacek yybegin(MODE); 102*d219b4ceSAdam Hornacek else 103*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 104*d219b4ceSAdam Hornacek yypushback(1); 105*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 106*d219b4ceSAdam Hornacek return yystate(); 107*d219b4ceSAdam Hornacek } 108*d219b4ceSAdam Hornacek [^] { yybegin(YYINITIAL); yypushback(1); } 109*d219b4ceSAdam Hornacek } 110*d219b4ceSAdam Hornacek 111*d219b4ceSAdam Hornacek <MODE> { 112*d219b4ceSAdam Hornacek " " { if (modeFound) yybegin(NAME); } 113*d219b4ceSAdam Hornacek {Identifier}|{Number}|{Printable} { 114*d219b4ceSAdam Hornacek modeFound = true; 115*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 116*d219b4ceSAdam Hornacek return yystate(); 117*d219b4ceSAdam Hornacek } 118*d219b4ceSAdam Hornacek [^] { yybegin(YYINITIAL); yypushback(1); } 119*d219b4ceSAdam Hornacek } 120*d219b4ceSAdam Hornacek 121*d219b4ceSAdam Hornacek <NAME>{ 122*d219b4ceSAdam Hornacek \n { 123*d219b4ceSAdam Hornacek if (nameFound) 124*d219b4ceSAdam Hornacek yybegin(UUE); 125*d219b4ceSAdam Hornacek else 126*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 127*d219b4ceSAdam Hornacek } 128*d219b4ceSAdam Hornacek {Identifier}|{Number}|{Printable} { 129*d219b4ceSAdam Hornacek nameFound = true; 130*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 131*d219b4ceSAdam Hornacek return yystate(); 132*d219b4ceSAdam Hornacek } 133*d219b4ceSAdam Hornacek [^\n] { yybegin(YYINITIAL); yypushback(1); } 134*d219b4ceSAdam Hornacek } 135*d219b4ceSAdam Hornacek 136*d219b4ceSAdam Hornacek <UUE> { 137*d219b4ceSAdam Hornacek ^ ( "end" | "====" ) \n { 138*d219b4ceSAdam Hornacek yypushback(1); 139*d219b4ceSAdam Hornacek String t = yytext(); 140*d219b4ceSAdam Hornacek if (t.equals("end") && !b64) { 141*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 142*d219b4ceSAdam Hornacek onSymbolMatched(yytext().toLowerCase(Locale.ROOT), yychar); 143*d219b4ceSAdam Hornacek return yystate(); 144*d219b4ceSAdam Hornacek } else if (t.equals("====") && b64) 145*d219b4ceSAdam Hornacek yybegin(YYINITIAL); 146*d219b4ceSAdam Hornacek } 147*d219b4ceSAdam Hornacek [^] {} 148*d219b4ceSAdam Hornacek } 149