From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/tiny_c2l/tiny_t2l.l | 632 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 632 insertions(+) create mode 100644 support/tiny_c2l/tiny_t2l.l (limited to 'support/tiny_c2l/tiny_t2l.l') diff --git a/support/tiny_c2l/tiny_t2l.l b/support/tiny_c2l/tiny_t2l.l new file mode 100644 index 0000000000..c53aa71902 --- /dev/null +++ b/support/tiny_c2l/tiny_t2l.l @@ -0,0 +1,632 @@ +/*\v + % write table of contents (only in single file mode): + \ifmfiles\else\pagenumbering{roman} + \tableofcontents\newpage\pagenumbering{arabic}\fi + \centerline{\huge\bf File tiny\_t2l.l} +*/ + +/*\b + <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + <<<<<<<<<<<<<<<<<<<<<<<<<<<<***********************>>>>>>>>>>>>>>>>>>>>>>>> + <* filename : tiny_t2l.l *> + <* purpose : this is a little lex file as an example for a simple *> + <* : converter using the position macros. Only a few *> + <* : basic conversions are implemented; all fonts etc. are *> + <* : hard-coded. You may use this file as example for use *> + <* : of the position macros or as starting point for an own *> + <* : converter project. *> + <* : *> + <* cvt2ltx : This file is the tiny version of c2ltx; keywords, *> + <* equiv. : strings and comments are recognized. A very simple *> + <* : version of embedded LaTeX is implemented (only append *> + <* : mode and verbatim mode; everything is copied verbatim *> + <* : to the output file in both cases. *> + <* : *> + <* version : 1.4.0 from 25-feb-2000 *> + <* author : Michael Plugge *> + <<<<<<<<<<<<<<<<<<<<<<<<<<<<***********************>>>>>>>>>>>>>>>>>>>>>>>> + <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +*/ + +%{ + /*\v \section{Declaration Part} */ +#define VERSION "1.4.0" +#define VERSION_DATE "25-feb-2000" + +#define TAB2SPC 3 +#define BASE_FONT "basefont" +#define BLOCK_FONT "blockfont" +#define KEYWORD_FONT "keywordfont" +#define STRING_FONT "stringfont" +#define COMMENT_FONT "commentfont" +#define HEADFONT "headfont" +#define FOOTFONT "footfont" +#define LHEAD "" +#define CHEAD "Produced from %f on %D %t" +#define RHEAD "" +#define LFOOT "" +#define CFOOT "Page %p" +#define RFOOT "" +#define L2E_STYLE " \\documentclass[10pt]{article}\n\ + \\usepackage{a4,position,fancyhdr}\n\ + \\usepackage[latin1]{inputenc}\n\ + \\textwidth18cm\\textheight25cm\\hoffset-3cm\\voffset-1cm" +#define L209_STYLE " \\documentstyle[a4,position,fancyhdr]{article}\n\ + \\textwidth18cm\\textheight25cm\\hoffset-3cm\\voffset-1cm" +#define L2E_STYLE_LINE " \\documentclass[10pt]{article}\n\ + \\usepackage{a4,position,fancyhdr}\n\ + \\usepackage[latin1]{inputenc}\n\ + \\textwidth18cm\\textheight25cm\\hoffset-3cm\\voffset-1cm" +#define L209_STYLE_LINE " \\documentstyle[a4,position,fancyhdr]{article}\n\ + \\textwidth18cm\\textheight25cm\\hoffset-3cm\\voffset-1cm" + +#define LEN(val) if((leng+=val)>70){leng=0; fprintf(yyout,"%%\n ");} +#if VMS +#undef ECHO +#define ECHO yyleng==1 ? fputc(*yytext,yyout) : fprintf(yyout,"%s",yytext) +#endif + +#include +#include + +char *ptr,*ptr1,*kern,*inputname,buffer[256],init=1,cmt_mode; +int pos,old_pos,brace_open,tmp,leng,tab2spc=TAB2SPC,skip_cnt,cmt_pos,line=1,show_lines,use_header=1; +long year; +time_t time_val; +struct tm *atime; + +char *lhead=LHEAD,*chead=CHEAD,*rhead=RHEAD,*headfont=HEADFONT, + *lfoot=LFOOT,*cfoot=CFOOT,*rfoot=RFOOT,*footfont=FOOTFONT, + *latex_prolog1= +"%%%% This file was generated by tiny_t2l (version %s, %s)\n\n\ +\\ifx\\getformat\\undefined\n\ + \\newcount\\getformat\\getformat0\n\ +\\else\n\ + \\mfilestrue\\getformat3\n\ +\\fi\n\ +\\ifx\\documentclass\\undefined\\advance\\getformat1\\fi\n\n\ +\\ifcase\\getformat\n\ +%s\n\ +\\or\n\ +%s\n\ +\\else\\fi %% multiple file input: don't load format\n%s", + + *latex_prolog2="\\ifmfiles\\else\\begin{document}\\fi\\begin{flushleft}\n\n", + +*month[]={ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" +}, +*local_month[]={ + "Januar", + "Februar", + "März", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember" +}, +*month1[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}, +*local_month1[]={"Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"}, +*usage_text1=" Usage: tiny_t2l [options] [infile [outfile]] [options]\n\ + infile and/or outfile may be omitted; in this case stdin/stdout are used.\n\ + valid options are:\n\ + -hn don't generate header or footer text\n\ + -hl header text: left side (default \"\")\n\ + -hc header text: center (default \"Produced from %f on %D %t\")\n\ + -hr header text: right side (default \"\")\n\ + -fl footer text: left side (default \"\")\n\ + -fc footer text: center (default \"Page %p\")\n\ + -fr footer text: right side (default \"\")\n\ + possible escape sequences for the -h. and -f. switches are:\n\ + %f: input file name %m: month (numeric value)\n\ + %p: page number %n: (english) name of month (full form)\n\ + %t: time (HH:MM) %s: (english) name of month (short form)\n\ + %D: date (DD-MMM-YYYY) %N: (local) name of month (full form)\n\ + %h: hour %S: (local) name of month (short form)\n\ + %M: minute %y: year\n\ + %d: day of month %: the `%' character itself\n\ + -o outputname (if stdin is used for input)\n\ + -t number of spaces per tab character (default: ", +*usage_text2=")\n\ + -d debug (debug output is written to tiny_t2l.dbg)\n\ + -? show this help screen\n"; + +void keyword(void); +void skip_msg(void); +void print_jmpo(int linebegin); +void init_out(int mode); +int die(char *cmd,int mode); +void substitute_format(char *format); +char *subst(int c); +void current_line(void); +%} + +SP [ \t]+ +SPO [ \t]* +WS [ \t\n] +WSO [ \t\n]* +WSSEMI [ \t\n;] +WSBRSEMI [ \t\n(;] +WSBR [ \t\n(] +WSBR2 [ \t\n)] +WSBC [ \t\n{] +WSS [ \t\n*] +WSSB [ \t\n*)] +WSC [ \t\n:] +OPER [ \t\n+\-*/%|&^~!=<>\[(,] +CA [ \t\n<] +WSB2 [ \t\n\[(] +NEW_DEL [ \t\n\[(<] + +%x LINE_BEGIN OMIT + +%option 8bit noyywrap outfile="tiny_t2l.c" debug + +%% + /*\v \section{Rules section}\subsection{\LaTeX Prolog} */ + if(show_lines) + fprintf(yyout,latex_prolog1,VERSION,VERSION_DATE,L2E_STYLE_LINE, + L209_STYLE_LINE,use_header?"\\pagestyle{fancy}\n":""); + else + fprintf(yyout,latex_prolog1,VERSION,VERSION_DATE,L2E_STYLE, + L209_STYLE,use_header?"\\pagestyle{fancy}\n":""); + fprintf(yyout,"\\plcntmargin{777}\n"); + if(use_header){ + fprintf(yyout,"\\lhead{\\%s ",headfont); + substitute_format(lhead); + fprintf(yyout,"\\chead{\\%s ",headfont); + substitute_format(chead); + fprintf(yyout,"\\rhead{\\%s ",headfont); + substitute_format(rhead); + fprintf(yyout,"\\lfoot{\\%s ",footfont); + substitute_format(lfoot); + fprintf(yyout,"\\cfoot{\\%s ",footfont); + substitute_format(cfoot); + fprintf(yyout,"\\rfoot{\\%s ",footfont); + substitute_format(rfoot); + } + if(!show_lines) + fprintf(yyout,"\\plinenowidth0pt\n"); + else + fprintf(yyout,"\\plcntmargin{77}\n"); + fprintf(yyout,latex_prolog2); + BEGIN(LINE_BEGIN); + + /*\v \subsection{Rules for Line Begin} */ +{ + /* special cases: blank lines, Blanks at end of line */ + ^{SPO}\n { + fprintf(yyout,"\\init0"); + current_line(); + fprintf(yyout,"\\n\n"); + pos=brace_open=0; + line++; + } + {SP}$ /* ignore spaces at end of line */ + + /* general line begin (we need the \init macro here) */ + ^" " pos++; fprintf(yyout,"\\init1"); current_line(); fprintf(yyout,"\\njo{-1}{"); brace_open=1; leng=16; BEGIN(INITIAL); + ^{SP} print_jmpo(1); BEGIN(INITIAL); + ^[^ \t\n] { + fprintf(yyout,"\\init0"); current_line(); fprintf(yyout,"\\njo0{"); + yyless(0); + brace_open=1; + leng=14; + cmt_pos=1; + BEGIN(INITIAL); + } + . yyless(0); cmt_pos=pos+1; BEGIN(INITIAL); +} + + /*\v \subsection{Rules for Blanks and Tabs} */ +{ + " " { + pos++; + if(brace_open)fputc('}',yyout); + fprintf(yyout,"\\njo{%d}{",pos); + brace_open=1; + LEN(10); + } + {SP} print_jmpo(0); +} + +\n { + if(brace_open)fputc('}',yyout); + line++; + pos=leng=brace_open=0; + fprintf(yyout,"\\n\n"); + BEGIN(LINE_BEGIN); + } + +{ + {SP}$ /* ignore spaces at end of line */ + + /*\v \subsection{Rules for special characters} */ + \<{2,9} init_out(0); fprintf(yyout,"\\mlt{%d}",yyleng); LEN(7); + \>{2,9} init_out(0); fprintf(yyout,"\\mgt{%d}",yyleng); LEN(7); + \\{2,} init_out(0); fprintf(yyout,"\\bs{%d}",yyleng); LEN(6); + \*{2,9} init_out(0); fprintf(yyout,"\\mast{%d}",yyleng); LEN(8); + + /*\v \subsection{``Leader'' rules} */ + \<{10,} | + \>{10,} | + \+{10,} | + \${10,} | + \#{10,} | + \%{10,} | + \~{10,} | + \*{10,} { + switch(*yytext){ + case '<': kern="-2pt"; ptr="$<$"; break; + case '>': kern="-2pt"; ptr="$>$"; break; + case '+': kern="0pt"; ptr="+"; break; + case '$': kern="0pt"; ptr="\\$"; break; + case '#': kern="0pt"; ptr="\\#"; break; + case '%': kern="0pt"; ptr="\\%"; break; + case '~': kern="0pt"; ptr="$\\sim$"; break; + case '*': kern="2pt"; ptr="$\\ast$"; break; + default: kern="0pt"; ptr=""; break; + } + if(brace_open)fputc('}',yyout); + fprintf(yyout,"\\mpout{%d}{%d}{%s}{%s}",pos,pos+yyleng-1,ptr,kern); + pos+=yyleng; + brace_open=0; + LEN(strlen(kern)+strlen(ptr)+19); + } +} + + +{ + . { + init_out(0); + fprintf(yyout,"%s",subst(*yytext)); + } + \f\n? fprintf(yyout,"\\newpage\n"); if(*(yytext+yyleng-1)=='\n')line++; + [a-zA-Z0-9]+ init_out(0); fprintf(yyout,"%s",yytext); +} + + /*\v \subsection{Rules for omitting Code} */ +{ + {SPO}"/*"\\o[q+]"*/"{SPO}\n { + for(ptr=yytext;*ptr++!='o';); + if(*ptr=='+') + skip_cnt=0; + else + skip_cnt= -1; + tmp= -1; + BEGIN(OMIT); + line++; + } + {SPO}"/*"\\o[1-9]+q?"*/"{SPO}\n { + for(ptr=yytext;*ptr++!='o';); + tmp=atoi(ptr); + skip_cnt= -1; + for(;*ptr && *ptr!='q';ptr++)if(*ptr=='*')skip_cnt=0; + BEGIN(OMIT); + line++; + } +} + +{ + {SPO}"/*\\o-*/"{SPO}\n { + skip_msg(); + brace_open=0; + BEGIN(LINE_BEGIN); + line++; + } + \*+ + \/+ + \\ + [^\\\"*\/\n]+ /* skip */ + \n { + if(skip_cnt>=0)skip_cnt++; + line++; + if(!--tmp){ + skip_msg(); + brace_open=0; + BEGIN(LINE_BEGIN); + } + } + <> skip_msg(); yyterminate(); +} + +%% + + /*\v \subsection{Function skip\_msg(void)} */ +void skip_msg(void) +{ + if(skip_cnt==1) + fprintf(yyout,"\\par\\centerline{/\\mast{20}{ \\commentfont SKIP A LINE }\\mast{20}/}\\par\n"); + else if(skip_cnt>1) + fprintf(yyout,"\\par\\centerline{/\\mast{20}{ \\commentfont SKIP %d LINES }\\mast{20}/}\\par\n",skip_cnt); +} + + /*\v \subsection{Function init\_out(void)} */ +void init_out(int mode) +{ + /* mode==0: kein \cmtinit + * mode==1: \cmtinit für C-Kommentar + * mode==2: \cmtinit für C++-Kommentar + */ + pos+=yyleng; + if(mode==0){ + if(!brace_open){ + fprintf(yyout,"\\njo0{"); + leng+=7; + } + } + brace_open=1; +} + + /*\v \subsection{Function print\_jmpo(int linebegin)} */ +void print_jmpo(int linebegin) +{ + int old=pos; + for(ptr=yytext;*ptr==' ' || *ptr=='\t';ptr++){ + if(*ptr=='\t') + pos+=tab2spc-pos%tab2spc; + else + pos++; + } + if(linebegin){ + fprintf(yyout,"\\init{%d}",pos); + current_line(); + fprintf(yyout,"\\njo{%d}{",-pos); + leng=18; + } + else if(brace_open){ + fputc('}',yyout); + fprintf(yyout,"\\jmpo{%d}{",pos); + LEN(10); + } + else{ + fprintf(yyout,"\\jmpo{%d}{",pos); + LEN(10); + } + brace_open=1; +} + + /*\v \subsection{Function die(char *cmd,int mode)} */ +int die(char *cmd,int mode) +{ + switch(mode){ + case 1: + fprintf(stderr,"Can't open %s for read; exit\n",cmd); + exit(4); + case 2: + fprintf(stderr,"Can't open %s for write; exit\n",cmd); + exit(4); + case 3: + fprintf(stderr,"%s\n",cmd); + exit(4); + default: + return 0; + } +} + + /*\v \subsection{Function subst(int c)} */ +char *subst(int c) +{ + static char retbuffer[2]; + + if(c<0)c+=256; + switch(c){ + case '#': leng+=2; return "\\#"; + case '$': leng+=2; return "\\$"; + case '%': leng+=2; return "\\%"; + case '&': leng+=2; return "\\&"; + case '\'': leng+=3; return "\\sq{}"; + case '*': leng+=6; return "$\\ast$"; + case '-': leng+=5; return "{\\mm}"; + case '<': leng+=3; return "$<$"; + case '>': leng+=3; return "$>$"; + case '[': leng+=3; return "{[}"; + case '\\': leng+=4; return "\\bs{1}"; + case ']': leng+=3; return "{]}"; + case '^': leng+=9; return "$\\hat{~}$"; + case '_': leng+=5; return "{\\ul}"; + case '`': leng+=3; return "{`}"; + case '{': leng+=6; return "\\brl{}"; + case '|': leng+=6; return "$\\mid$"; + case '}': leng+=6; return "\\brr{}"; + case '~': leng+=6; return "$\\sim$"; + case '"': leng+=7; return "{\\tt \"}"; + default: leng++; *retbuffer=c; return retbuffer; + } +} + + /*\v \subsection{Function substitute\_format(char *format)} */ +void substitute_format(char *format) +{ + char c,*ptr1; + + for(ptr=format;*ptr;ptr++){ + if(*ptr=='%'){ /* escape sequences: */ + switch(*++ptr){ + case 'd': /* %d: day of month */ + fprintf(yyout,"%d",atime->tm_mday); + break; + case 'D': /* %D: date (format DD-MMM-YYYY) */ + fprintf(yyout,"%d{\\mm}%s{\\mm}%ld",atime->tm_mday,month1[atime->tm_mon],year); + break; + case 'f': /* %f: input file name */ + for(ptr1=inputname;*ptr1;)fprintf(yyout,"%s",subst(*ptr1++)); + break; + case 'h': + fprintf(yyout,"%02d",atime->tm_hour); + break; + case 'm': /* %m: month (numeric value) */ + fprintf(yyout,"%d",atime->tm_mon+1); + break; + case 'M': /* %M: minute */ + fprintf(yyout,"%02d",atime->tm_min); + break; + case 'n': /* %n: (english) name of month (full form) */ + fprintf(yyout,"%s",month[atime->tm_mon]); + break; + case 'N': /* %N: (local) name of month (full form) */ + fprintf(yyout,"%s",local_month[atime->tm_mon]); + break; + case 's': /* %s: (english) name of month (short form) */ + fprintf(yyout,"%s",month1[atime->tm_mon]); + break; + case 'S': /* %S: (local) name of month (short form) */ + fprintf(yyout,"%s",local_month1[atime->tm_mon]); + break; + case 'p': /* %p: page (in the LaTeX file) */ + fprintf(yyout,"\\thepage"); + break; + case 't': /* %t: time (format HH:MM) */ + fprintf(yyout,"%02d:%02d",atime->tm_hour,atime->tm_min); + break; + case 'y': /* %y: year */ + fprintf(yyout,"%ld",year); + break; + case '%': /* %%: the `%' character itself */ + fputc('\\',yyout); + fputc('%',yyout); + break; + default: /* unknown escape sequence: just print it out */ + fprintf(stderr,"Unknown escape sequence `%%%c' detected; print it out.\n",*ptr); + fprintf(stderr,"(format string was >%s<)\n",format); + fputc('%',yyout); + fprintf(yyout,"%s",subst(*ptr)); + break; + } + } + else + fprintf(yyout,"%s",subst(*ptr)); + } + fprintf(yyout,"}\n"); +} + + /*\v \subsection{Function current\_line(void)} */ +void current_line(void) +{ + if(show_lines>0 && line%show_lines==0){ + fprintf(yyout,"{%d}",line); + } + else + fprintf(yyout,"{}"); + LEN(10); +} + + /*\v \subsection{Function main(int argc, char **argv)} */ +int main(int argc, char **argv) +{ + int i; + +#ifdef FLEX_DEBUG + yy_flex_debug=0; +#endif /* FLEX_DEBUG */ + time(&time_val); + atime=localtime(&time_val); + year=time_val/(365L*24L*60L*60L)+1970L; + for(i=1;i