summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/hitexdir/hishrink-lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/hitexdir/hishrink-lexer.l')
-rw-r--r--Build/source/texk/web2c/hitexdir/hishrink-lexer.l422
1 files changed, 422 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/hitexdir/hishrink-lexer.l b/Build/source/texk/web2c/hitexdir/hishrink-lexer.l
new file mode 100644
index 00000000000..a73b071561f
--- /dev/null
+++ b/Build/source/texk/web2c/hitexdir/hishrink-lexer.l
@@ -0,0 +1,422 @@
+ /*509:*/
+
+%{
+#include "basetypes.h"
+#include "error.h"
+#include "hformat.h"
+#include "hput.h"
+
+ /*423:*/
+
+#ifdef DEBUG
+#define YYDEBUG 1
+extern int yydebug;
+#else
+#define YYDEBUG 0
+#endif
+ /*:423*/
+
+#include "hishrink-parser.h"
+
+ /*22:*/
+
+#define SCAN_UDEC(S) yylval.u= strtoul(S,NULL,10)
+ /*:22*/ /*25:*/
+
+#define SCAN_HEX(S) yylval.u= strtoul(S,NULL,16)
+ /*:25*/ /*28:*/
+
+#define SCAN_DEC(S) yylval.i= strtol(S,NULL,10)
+ /*:28*/ /*31:*/
+
+#define MAX_STR (1<<10)
+static char str_buffer[MAX_STR];
+static int str_length;
+#define STR_START (str_length= 0)
+#define STR_PUT(C) (str_buffer[str_length++]= (C))
+#define STR_ADD(C) STR_PUT(C);RNG("String length",str_length,0,MAX_STR-1)
+#define STR_END str_buffer[str_length]= 0
+#define SCAN_STR yylval.s= str_buffer
+ /*:31*/ /*40:*/
+
+#define SCAN_UTF8_1(S) yylval.u= ((S)[0]&0x7F)
+ /*:40*/ /*42:*/
+
+#define SCAN_UTF8_2(S) yylval.u= (((S)[0]&0x1F)<<6)+((S)[1]&0x3F)
+ /*:42*/ /*44:*/
+
+#define SCAN_UTF8_3(S) yylval.u= (((S)[0]&0x0F)<<12)+(((S)[1]&0x3F)<<6)+((S)[2]&0x3F)
+ /*:44*/ /*46:*/
+
+#define SCAN_UTF8_4(S) yylval.u= (((S)[0]&0x03)<<18)+(((S)[1]&0x3F)<<12)+(((S)[2]&0x3F)<<6)+((S)[3]&0x3F)
+ /*:46*/ /*57:*/
+
+#define SCAN_DECFLOAT yylval.f= atof(yytext)
+ /*:57*/ /*60:*/
+
+#define SCAN_HEXFLOAT yylval.f= xtof(yytext)
+ /*:60*/ /*152:*/
+
+#define SCAN_REF(K) yylval.rf.k= K; yylval.rf.n= atoi(yytext+2)
+static int scan_level= 0;
+#define SCAN_START yy_push_state(INITIAL);if (1==scan_level++) hpos0= hpos;
+#define SCAN_END if (scan_level--) yy_pop_state(); else QUIT("Too many '>' in line %d",yylineno)
+#define SCAN_TXT_START BEGIN(TXT)
+#define SCAN_TXT_END BEGIN(INITIAL)
+ /*:152*/
+
+ /*61:*/
+
+
+float64_t xtof(char*x)
+{int sign,digits,exp;
+uint64_t mantissa= 0;
+DBG(DBGFLOAT,"converting %s:\n",x);
+ /*62:*/
+
+if(*x=='-'){sign= -1;x++;}
+else if(*x=='+'){sign= +1;x++;}
+else sign= +1;
+DBG(DBGFLOAT,"\tsign=%d\n",sign);
+ /*:62*/
+
+x= x+2;
+ /*63:*/
+
+digits= 0;
+while(*x=='0')x++;
+while(*x!='.')
+{mantissa= mantissa<<4;
+if(*x<'A')mantissa= mantissa+*x-'0';
+else mantissa= mantissa+*x-'A'+10;
+x++;
+digits++;
+}
+x++;
+exp= 0;
+while(*x!=0&&*x!='x')
+{mantissa= mantissa<<4;
+exp= exp-4;
+if(*x<'A')mantissa= mantissa+*x-'0';
+else mantissa= mantissa+*x-'A'+10;
+x++;
+digits++;
+}
+DBG(DBGFLOAT,"\tdigits=%d mantissa=0x%"PRIx64", exp=%d\n",digits,mantissa,exp);
+ /*:63*/
+
+ /*64:*/
+
+if(mantissa==0)return 0.0;
+{int s;
+s= digits-DBL_M_BITS/4;
+if(s> 1)
+mantissa= mantissa>>(4*(s-1));
+else if(s<1)
+mantissa= mantissa<<(4*(1-s));
+exp= exp+4*(digits-1);
+DBG(DBGFLOAT,"\tdigits=%d mantissa=0x%"PRIx64", exp=%d\n",digits,mantissa,exp);
+while((mantissa>>DBL_M_BITS)> 1){mantissa= mantissa>>1;exp++;}
+DBG(DBGFLOAT,"\tdigits=%d mantissa=0x%"PRIx64", exp=%d\n",digits,mantissa,exp);
+mantissa= mantissa&~((uint64_t)1<<DBL_M_BITS);
+DBG(DBGFLOAT,"\tdigits=%d mantissa=0x%"PRIx64", exp=%d\n",digits,mantissa,exp);
+}
+ /*:64*/
+
+ /*65:*/
+
+if(*x=='x')
+{int s;
+x++;
+if(*x=='-'){s= -1;x++;}
+else if(*x=='+'){s= +1;x++;}
+else s= +1;
+DBG(DBGFLOAT,"\texpsign=%d\n",s);
+DBG(DBGFLOAT,"\texp=%d\n",exp);
+while(*x!=0)
+{if(*x<'A')exp= exp+4*s*(*x-'0');
+else exp= exp+4*s*(*x-'A'+10);
+x++;
+DBG(DBGFLOAT,"\texp=%d\n",exp);
+}
+}
+RNG("Floating point exponent",exp,-DBL_EXCESS,DBL_EXCESS);
+ /*:65*/
+
+ /*66:*/
+
+{union{float64_t d;uint64_t bits;}u;
+if(sign<0)sign= 1;else sign= 0;
+exp= exp+DBL_EXCESS;
+u.bits= ((uint64_t)sign<<63)
+|((uint64_t)exp<<DBL_M_BITS)|mantissa;
+DBG(DBGFLOAT," return %f\n",u.d);
+return u.d;
+}
+ /*:66*/
+
+}
+ /*:61*/
+
+int yywrap(void){return 1;}
+#ifdef _MSC_VER
+#pragma warning( disable : 4267)
+#endif
+%}
+
+%option yylineno batch stack
+%option debug
+%option nounistd nounput noinput noyy_top_state
+
+ /*23:*/
+
+HEX [0-9A-F]
+ /*:23*/ /*32:*/
+
+%x STR
+ /*:32*/ /*39:*/
+
+UTF8_1 [\x00-\x7F]
+ /*:39*/ /*41:*/
+
+UTF8_2 [\xC0-\xDF][\x80-\xBF]
+ /*:41*/ /*43:*/
+
+UTF8_3 [\xE0-\xEF][\x80-\xBF][\x80-\xBF]
+ /*:43*/ /*45:*/
+
+UTF8_4 [\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]
+ /*:45*/ /*149:*/
+
+%x TXT
+ /*:149*/
+
+
+%%
+
+ /*3:*/
+
+"<" SCAN_START;return START;
+">" SCAN_END;return END;
+glyph return GLYPH;
+0|[1-9][0-9]* SCAN_UDEC(yytext);return UNSIGNED;
+\*(0|[1-9][0-9]*) SCAN_UDEC(yytext+1);return REFERENCE;
+[[:space:]] ;
+\([^()\n]*[)\n] ;
+ /*:3*/ /*24:*/
+
+0x{HEX}+ SCAN_HEX(yytext+2);return UNSIGNED;
+ /*:24*/ /*27:*/
+
+[+-](0|[1-9][0-9]*) SCAN_DEC(yytext);return SIGNED;
+ /*:27*/ /*34:*/
+
+' STR_START;BEGIN(STR);
+<STR>{
+' STR_END;SCAN_STR;BEGIN(INITIAL);return STRING;
+'' STR_ADD('\'');
+[\x20-\x7E] STR_ADD(yytext[0]);
+. RNG("String character",yytext[0],0x20,0x7E);
+\n QUIT("Unterminated String in line %d",yylineno);
+}
+
+
+ /*:34*/ /*48:*/
+
+''' STR_START;STR_PUT('\'');BEGIN(STR);
+'''' SCAN_UTF8_1(yytext+1);return CHARCODE;
+'[\x20-\x7E]'' STR_START;STR_PUT(yytext[1]);STR_PUT('\'');BEGIN(STR);
+''''' STR_START;STR_PUT('\'');STR_PUT('\'');BEGIN(STR);
+'{UTF8_1}' SCAN_UTF8_1(yytext+1);return CHARCODE;
+'{UTF8_2}' SCAN_UTF8_2(yytext+1);return CHARCODE;
+'{UTF8_3}' SCAN_UTF8_3(yytext+1);return CHARCODE;
+'{UTF8_4}' SCAN_UTF8_4(yytext+1);return CHARCODE;
+ /*:48*/ /*55:*/
+
+[+-]?[0-9]+\.[0-9]+(e[+-]?[0-9])? SCAN_DECFLOAT;return FPNUM;
+ /*:55*/ /*59:*/
+
+[+-]?0x{HEX}+\.{HEX}+(x[+-]?{HEX}+)? SCAN_HEXFLOAT;return FPNUM;
+ /*:59*/ /*80:*/
+
+dimen return DIMEN;
+pt return PT;
+mm return MM;
+in return INCH;
+ /*:80*/ /*88:*/
+
+xdimen return XDIMEN;
+h return H;
+v return V;
+ /*:88*/ /*99:*/
+
+fil return FIL;
+fill return FILL;
+filll return FILLL;
+ /*:99*/ /*103:*/
+
+penalty return PENALTY;
+int return INTEGER;
+ /*:103*/ /*109:*/
+
+language return LANGUAGE;
+ /*:109*/ /*115:*/
+
+rule return RULE;
+"|" return RUNNING;
+"_" return RUNNING;
+ /*:115*/ /*124:*/
+
+kern return KERN;
+! return EXPLICIT;
+ /*:124*/ /*133:*/
+
+glue return GLUE;
+plus return PLUS;
+minus return MINUS;
+ /*:133*/ /*151:*/
+
+\" SCAN_TXT_START;return TXT_START;
+
+<TXT>{
+\" SCAN_TXT_END;return TXT_END;
+
+"<" SCAN_START;return START;
+">" QUIT("> not allowed in text mode");
+
+\\\\ yylval.u= '\\';return TXT_CC;
+\\\" yylval.u= '"';return TXT_CC;
+\\"<" yylval.u= '<';return TXT_CC;
+\\">" yylval.u= '>';return TXT_CC;
+\\" " yylval.u= ' ';return TXT_CC;
+\\"-" yylval.u= '-';return TXT_CC;
+\\"@" return TXT_IGNORE;
+
+[ \t\r]*(\n[ \t\r]*)+ return TXT_FONT_GLUE;
+\\[ \t\r]*\n[ \t\r]* ;
+
+\\[0-7] yylval.u= yytext[1]-'0';return TXT_FONT;
+
+\\F[0-9]+\\ SCAN_REF(font_kind);return TXT_GLOBAL;
+\\P[0-9]+\\ SCAN_REF(penalty_kind);return TXT_GLOBAL;
+\\K[0-9]+\\ SCAN_REF(kern_kind);return TXT_GLOBAL;
+\\L[0-9]+\\ SCAN_REF(ligature_kind);return TXT_GLOBAL;
+\\D[0-9]+\\ SCAN_REF(disc_kind);return TXT_GLOBAL;
+\\G[0-9]+\\ SCAN_REF(glue_kind);return TXT_GLOBAL;
+\\S[0-9]+\\ SCAN_REF(language_kind);return TXT_GLOBAL;
+\\R[0-9]+\\ SCAN_REF(rule_kind);return TXT_GLOBAL;
+\\I[0-9]+\\ SCAN_REF(image_kind);return TXT_GLOBAL;
+
+
+\\C[0-9]+\\ SCAN_UDEC(yytext+2);return TXT_CC;
+
+\\[a-l] yylval.u= yytext[1]-'a';return TXT_LOCAL;
+" " return TXT_FONT_GLUE;
+"-" return TXT_FONT_HYPHEN;
+
+{UTF8_1} SCAN_UTF8_1(yytext);return TXT_CC;
+{UTF8_2} SCAN_UTF8_2(yytext);return TXT_CC;
+{UTF8_3} SCAN_UTF8_3(yytext);return TXT_CC;
+{UTF8_4} SCAN_UTF8_4(yytext);return TXT_CC;
+}
+ /*:151*/ /*162:*/
+
+hbox return HBOX;
+vbox return VBOX;
+shifted return SHIFTED;
+ /*:162*/ /*170:*/
+
+hpack return HPACK;
+hset return HSET;
+vpack return VPACK;
+vset return VSET;
+add return ADD;
+to return TO;
+depth return DEPTH;
+ /*:170*/ /*175:*/
+
+leaders return LEADERS;
+align return ALIGN;
+center return CENTER;
+expand return EXPAND;
+ /*:175*/ /*182:*/
+
+baseline return BASELINE;
+ /*:182*/ /*189:*/
+
+ligature return LIGATURE;
+ /*:189*/ /*197:*/
+
+disc return DISC;
+ /*:197*/ /*205:*/
+
+par return PAR;
+ /*:205*/ /*210:*/
+
+math return MATH;
+ /*:210*/ /*215:*/
+
+on return ON;
+off return OFF;
+ /*:215*/ /*219:*/
+
+adjust return ADJUST;
+ /*:219*/ /*223:*/
+
+table return TABLE;
+item return ITEM;
+row return ITEM;
+column return ITEM;
+ /*:223*/ /*230:*/
+
+image return IMAGE;
+ /*:230*/ /*247:*/
+
+label return LABEL;
+bot return BOT;
+mid return MID;
+ /*:247*/ /*261:*/
+
+link return LINK;
+ /*:261*/ /*271:*/
+
+outline return OUTLINE;
+ /*:271*/ /*278:*/
+
+stream if(section_no==1)return STREAMDEF;else return STREAM;
+first return FIRST;
+last return LAST;
+top return TOP;
+\* return NOREFERENCE;
+ /*:278*/ /*288:*/
+
+page return PAGE;
+ /*:288*/ /*296:*/
+
+range return RANGE;
+ /*:296*/ /*323:*/
+
+directory return DIRECTORY;
+section return SECTION;
+ /*:323*/ /*342:*/
+
+definitions return DEFINITIONS;
+ /*:342*/ /*350:*/
+
+max return MAX;
+ /*:350*/ /*365:*/
+
+param return PARAM;
+ /*:365*/ /*374:*/
+
+font return FONT;
+ /*:374*/ /*402:*/
+
+content return CONTENT;
+ /*:402*/
+
+[a-z]+ QUIT("Unexpected keyword '%s' in line %d",yytext,yylineno);
+. QUIT("Unexpected character '%c' (0x%02X) in line %d",yytext[0]> ' '?yytext[0]:' ',yytext[0],yylineno);
+
+%%
+ /*:509*/