summaryrefslogtreecommitdiff
path: root/support/C++2LaTeX-1_1pl1/c++2latex.l
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/C++2LaTeX-1_1pl1/c++2latex.l
Initial commit
Diffstat (limited to 'support/C++2LaTeX-1_1pl1/c++2latex.l')
-rw-r--r--support/C++2LaTeX-1_1pl1/c++2latex.l553
1 files changed, 553 insertions, 0 deletions
diff --git a/support/C++2LaTeX-1_1pl1/c++2latex.l b/support/C++2LaTeX-1_1pl1/c++2latex.l
new file mode 100644
index 0000000000..ab8d836b59
--- /dev/null
+++ b/support/C++2LaTeX-1_1pl1/c++2latex.l
@@ -0,0 +1,553 @@
+
+%x STRING BCOMMENT INCLUDE
+%s CPLUSPLUS
+
+%{
+int hfillon = 0;
+
+#define KEY printf ("{\\%s %s}", keyword_font, yytext); hfillon = 1
+#define CPP printf ("{\\%s \\%s}", cpp_font, yytext); hfillon = 1
+#define SYM(x) printf ("$\\%s$", x); hfillon = 1
+#define OUT(x) printf ("%s", x); hfillon = 1
+#define SUB(x) substitute(x)
+#define IND indent(yytext); hfillon = 0
+
+#include <stdio.h>
+
+#ifdef ANSI_C
+ #ifdef C_PLUSPLUS
+ #error ANSI_C and C_PLUSPLUS are mutually exclusive
+ #else
+ int cplusplus_mode = 0;
+ #endif
+#else /* CPLUSPLUS or default */
+ int cplusplus_mode = 1;
+#endif
+
+int complete_file = 0;
+int header = 0;
+int tabtotab = 8;
+int piped = 0;
+char * font_size = "11";
+char * indentation = "0.5em";
+char * comment_font = "it";
+char * keyword_font = "bf";
+char * header_font = "sl";
+char * cpp_font = "tt";
+char * string_font = "tt";
+void substitute(const char *);
+void indent(const char *);
+void newpage(int);
+void usage(const char *);
+%}
+
+%%
+
+ if (cplusplus_mode)
+ BEGIN (CPLUSPLUS);
+
+"#"[ \t]*"include" { CPP; BEGIN (INCLUDE); }
+"#"[ \t]*"define" |
+"#"[ \t]*"undef" |
+"#"[ \t]*"if" |
+"#"[ \t]*"ifdef" |
+"#"[ \t]*"ifndef" |
+"#"[ \t]*"elif" |
+"#"[ \t]*"else" |
+"#"[ \t]*"endif" CPP;
+
+<INCLUDE>"<"[^>]*/">" { OUT ("$<${\\"); OUT (string_font);
+ OUT ("{}"); SUB (yytext+1); OUT ("}$>$");
+ input(); BEGIN (INITIAL); }
+<INCLUDE>\"[^\"]*/\" { OUT ("\"{\\"); OUT (string_font);
+ OUT ("{}"); SUB (yytext+1); OUT ("}\"");
+ input(); BEGIN (INITIAL); }
+<INCLUDE>[ \t]+ ECHO;
+<INCLUDE>[\n] OUT ("\\mbox{}\\\\\n");
+<INCLUDE>. { yyless (0); BEGIN (INITIAL); }
+
+"auto" |
+"double" |
+"int" |
+"struct" |
+"break" |
+"else" |
+"long" |
+"switch" |
+"case" |
+"enum" |
+"register" |
+"typedef" |
+"char" |
+"extern" |
+"return" |
+"union" |
+"const" |
+"float" |
+"short" |
+"unsigned" |
+"continue" |
+"for" |
+"signed" |
+"void" |
+"default" |
+"goto" |
+"sizeof" |
+"volatile" |
+"do" |
+"if" |
+"static" |
+"while" |
+<CPLUSPLUS>"new" |
+<CPLUSPLUS>"delete" |
+<CPLUSPLUS>"this" |
+<CPLUSPLUS>"operator" |
+<CPLUSPLUS>"class" |
+<CPLUSPLUS>"public" |
+<CPLUSPLUS>"protected" |
+<CPLUSPLUS>"private" |
+<CPLUSPLUS>"virtual" |
+<CPLUSPLUS>"friend" |
+<CPLUSPLUS>"inline" |
+<CPLUSPLUS>"overload" KEY;
+"->" SYM ("rightarrow");
+"<<" SYM ("ll");
+">>" SYM ("gg");
+"<=" SYM ("leq");
+">=" SYM ("geq");
+"!=" SYM ("neq");
+"||" SYM ("mid\\mid");
+"..." SYM ("ldots");
+"*=" SYM ("ast=");
+"<<=" SYM ("ll=");
+">>=" SYM ("gg=");
+"^=" SYM ("vee=");
+"|=" SYM ("mid=");
+"~" SYM ("sim");
+"*" SYM ("ast");
+"^" SYM ("wedge");
+"|" SYM ("mid");
+<CPLUSPLUS>"->*" SYM ("rightarrow\\ast");
+"/" OUT ("$/$");
+"<" OUT ("$<$");
+">" OUT ("$>$");
+"&&" OUT ("\\&\\&");
+"%=" OUT ("\\%=");
+"&=" OUT ("\\&=");
+"{" OUT ("\\{");
+"}" OUT ("\\}");
+"&" OUT ("\\&");
+"%" OUT ("\\%");
+"--" OUT ("-{}-");
+<CPLUSPLUS>".*" OUT (".$\\ast$");
+"?" |
+":" |
+"=" |
+"," |
+"." |
+";" |
+"!" |
+"-" |
+"+" |
+"/=" |
+"==" |
+"++" |
+"+=" |
+"-=" |
+"(" |
+")" |
+"[" |
+"]" |
+<CPLUSPLUS>"::" ECHO;
+
+<CPLUSPLUS>[a-zA-Z_$][a-zA-Z_$0-9]* |
+[a-zA-Z_][a-zA-Z_0-9]* SUB (yytext);
+
+^"/*" { BEGIN (BCOMMENT);
+ OUT ("{$/\\ast$\\");
+ OUT (comment_font); OUT ("{}"); }
+"/*" { BEGIN (BCOMMENT);
+ if (hfillon==1) { OUT ("\\hfill"); }
+ OUT ("{$/\\ast$\\");
+ OUT (comment_font); OUT ("{}"); }
+<BCOMMENT>"*/" { BEGIN (INITIAL); OUT ("$\\ast/$}"); }
+<BCOMMENT>"\n" OUT ("\\mbox{}\\\\\n");
+<BCOMMENT>^[ \t]+ IND;
+<BCOMMENT>. SUB (yytext);
+
+
+L?\" { BEGIN (STRING); OUT ("{\\");
+ OUT (string_font); OUT ("\""); }
+<STRING>\\\\ OUT ("$\\backslash\\backslash$");
+<STRING>\\[bfnrtv'"] { OUT ("$\\backslash$"); SUB (yytext+1); }
+<STRING>\" { BEGIN (INITIAL); OUT ("\"}"); }
+<STRING>"\n" OUT ("\\mbox{}\\\\\n");
+<STRING>^[ \t]+ IND;
+<STRING>. SUB (yytext);
+
+([0-9]*\.[0-9]+[fFlL]?) |
+([0-9]+\.[0-9]*[fFlL]?) |
+([0-9]*\.?[0-9]+[eE][+-]?[0-9]+) |
+([0-9]+\.?[0-9]*[eE][+-]?[0-9]+) ECHO;
+
+[0-9]+[uUlL]? ECHO;
+
+L?'[ -~]' SUB (yytext);
+L?'\\[ntvbrfa\\?'"]' |
+L?'\\[0-7]{1,3}' |
+L?'\\x[0-9a-fA-F]{1,2}' ECHO;
+
+0[0-7]+[uUlL]? ECHO;
+
+0x[0-9a-fA-F]+[uUlL]? ECHO;
+
+"\\\n" OUT ("$\\backslash$\\\\\n");
+^[ \t]+ IND;
+[ \t]+ ECHO;
+"\f"[\n]? OUT ("\\newpage\n");
+"\n" OUT ("\\mbox{}\\\\\n");
+
+%%
+
+void substitute (const char * input)
+{
+ while (*input)
+ {
+ switch (*input)
+ {
+ case '_':
+ case '&':
+ case '#':
+ case '$':
+ case '%':
+ case '{':
+ case '}':
+ printf ("\\%c", *input);
+ break;
+ case '+':
+ case '=':
+ case '<':
+ case '>':
+ printf ("$%c$", *input);
+ break;
+ case '*':
+ printf ("$\\ast$");
+ break;
+ case '|':
+ printf ("$\\mid$");
+ break;
+ case '\\':
+ printf ("$\\backslash$");
+ break;
+ case '^':
+ printf ("$\\wedge$");
+ break;
+ case '~':
+ printf ("$\\sim$");
+ break;
+ default:
+ printf ("%c", *input);
+ break;
+ }
+ input++;
+ }
+}
+
+void
+indent(const char * blanks)
+{
+ int i;
+
+ i = 0;
+ while (*blanks)
+ {
+ if (*blanks == ' ')
+ {
+ i++;
+ }
+ else /* *blanks == '\t' */
+ {
+ while (++i % tabtotab) ;
+ }
+ blanks++;
+ }
+ printf ("\\hspace*{%d\\indentation}", i);
+}
+
+#include "getopt.h"
+#include <string.h>
+#include <fcntl.h>
+#include <malloc.h>
+
+extern char * version_string;
+
+static struct option opts[] =
+{
+ {"ansi-c", 0, 0, 'a'},
+ {"c-plusplus", 0, 0, 'p'},
+ {"complete-file", 0, 0, 'c'},
+ {"font-size", 1, 0, 's'},
+ {"indentation", 1, 0, 'i'},
+ {"header", 0, 0, 'h'},
+ {"piped", 0, 0, 't'},
+ {"output", 1, 0, 'o'},
+ {"tabstop", 1, 0, 'T'},
+ {"comment-font", 1, 0, 'C'},
+ {"string-font", 1, 0, 'S'},
+ {"keyword-font", 1, 0, 'K'},
+ {"header-font", 1, 0, 'H'},
+ {"cpp-font", 1, 0, 'P'},
+ {"version", 0, 0, 'V'},
+ {0, 0, 0, 0}
+};
+
+
+main (int argc, char** argv)
+{
+ int c;
+ int index;
+ int i;
+ int has_filename;
+ char * input_name;
+ char * output_name;
+ char * program_name;
+
+ input_name = "Standard Input";
+ output_name = 0;
+
+ program_name = strrchr (argv[0], '/');
+ if (program_name == NULL) /* no pathname */
+ {
+ program_name = argv[0];
+ }
+ else
+ {
+ program_name++;
+ }
+
+#ifdef USE_NAME
+#if defined(ANSI_C) || defined(C_PLUSPLUS)
+#error USE_NAME, ANSI_C and C_PLUSPLUS are mutually exclusive
+#else
+ /* simple heuristic: '+' in name means C++ */
+ cplusplus_mode = (strchr (program_name, '+') != 0);
+#endif
+#endif
+
+ while ((c = getopt_long (argc, argv,
+ "acpo:s:i:thT:C:H:S:K:P:V", opts, &index))
+ != EOF)
+ {
+ if (c == 0) /* Long option */
+ {
+ c = opts[index].val;
+ }
+ switch (c)
+ {
+ case 'a':
+ cplusplus_mode = 0;
+ break;
+ case 'p':
+ cplusplus_mode = 1;
+ break;
+ case 'c':
+ complete_file = 1;
+ break;
+ case 'o':
+ if (piped)
+ {
+ fprintf (stderr,
+ "%s: Can't use {-t,+pipe} and {-o,+output} together\n",
+ program_name);
+ exit(5);
+ }
+ output_name = optarg;
+ break;
+ case 's':
+ font_size = optarg;
+ break;
+ case 'i':
+ indentation = optarg;
+ break;
+ case 'T':
+ tabtotab = atoi(optarg);
+ break;
+ case 't':
+ if (output_name != 0)
+ {
+ fprintf (stderr,
+ "%s: Can't use {-t,+pipe} and {-o,+output} together\n",
+ program_name);
+ exit(5);
+ }
+ piped = 1;
+ break;
+ case 'h':
+ header = 1;
+ complete_file = 1; /* header implies complete-file */
+ break;
+ case 'C':
+ comment_font = optarg;
+ break;
+ case 'H':
+ header_font = optarg;
+ break;
+ case 'P':
+ cpp_font = optarg;
+ break;
+ case 'S':
+ string_font = optarg;
+ break;
+ case 'K':
+ keyword_font = optarg;
+ break;
+ case 'V':
+ fprintf (stderr, "%s\n", version_string);
+ break;
+ default:
+ usage(program_name);
+ }
+ }
+ has_filename = (argc - optind == 1);
+ if (has_filename) /* last argument is input file name */
+ {
+ input_name = argv[optind];
+ if (freopen (input_name, "r", stdin) == NULL)
+ {
+ fprintf (stderr, "%s: Can't open `%s' for reading\n",
+ program_name, input_name);
+ exit (2);
+ }
+ }
+ if ((output_name == 0) && !piped)
+ {
+ char * tmp;
+ if (has_filename)
+ {
+ char * point;
+
+ point = strrchr (input_name, '/');
+ if (point == 0) /* plain filename */
+ {
+ point = input_name;
+ }
+ else
+ {
+ point++;
+ }
+ tmp = malloc (strlen (point) + 1);
+ if (tmp == 0)
+ {
+ fprintf (stderr, "%s: Virtual memory exhausted\n", program_name);
+ exit (3);
+ }
+ strcpy (tmp, point);
+ point = strrchr (tmp, '.');
+ if (point != 0)
+ {
+ *point = '\0';
+ }
+ }
+ else
+ {
+ tmp = program_name;
+ }
+ output_name = malloc (strlen (tmp) + 4);
+ if (output_name == 0)
+ {
+ fprintf (stderr, "%s: Virtual memory exhausted\n", program_name);
+ exit (3);
+ }
+ strcpy (output_name, tmp);
+ strcat (output_name, ".tex");
+ }
+ if (!piped)
+ {
+ if (freopen (output_name, "w", stdout) == NULL)
+ {
+ fprintf (stderr, "%s: Can't open `%s' for writing\n",
+ program_name, output_name);
+ exit (4);
+ }
+ }
+ printf ("\
+%%\n\
+%% This file was automatically produced at " __DATE__ ", " __TIME__" by\n\
+%% %s", program_name);
+ for (i = 1; i < argc; i++)
+ {
+ printf(" %s", argv[i]);
+ }
+ if (!has_filename)
+ {
+ printf(" (from Standard Input)");
+ }
+ printf("\n%%\n");
+ if (complete_file)
+ {
+ if (header)
+ {
+ if (strcmp (font_size, "10") == 0)
+ {
+ printf ("\\documentstyle[fancyheadings]{article}\n");
+ }
+ else
+ {
+ printf ("\\documentstyle[%spt,fancyheadings]{article}\n",
+ font_size);
+ }
+ }
+ else
+ {
+ if (strcmp (font_size, "10") == 0)
+ {
+ printf ("\\documentstyle{article}\n");
+ }
+ else
+ {
+ printf ("\\documentstyle[%spt]{article}\n", font_size);
+ }
+ }
+ printf ("\\setlength{\\textwidth}{15cm}\n");
+ printf ("\\setlength{\\textheight}{22.5cm}\n");
+ printf ("\\setlength{\\hoffset}{-2cm}\n");
+ printf ("\\setlength{\\voffset}{-2cm}\n");
+ if (header)
+ {
+ printf ("\\chead{\\%s Produced from ", header_font);
+ substitute(input_name);
+ printf (" at " __DATE__ ", " __TIME__"}\n");
+ printf ("\\cfoot{\\rm\\thepage}\n");
+ printf ("\\addtolength{\\headheight}{14pt}\n");
+ printf ("\\pagestyle{fancy}\n");
+ }
+ printf ("\\begin{document}\n");
+ }
+ printf ("\\expandafter\\ifx\\csname indentation\\endcsname\\relax%\n");
+ printf ("\\newlength{\\indentation}\\fi\n");
+ printf ("\\setlength{\\indentation}{%s}\n", indentation);
+ printf ("\\begin{flushleft}\n");
+ yylex();
+ printf ("\\end{flushleft}\n");
+ if (complete_file)
+ {
+ printf ("\\end{document}\n");
+ }
+}
+
+void
+usage(const char * name)
+{
+ fprintf (stderr, "%s\n", version_string);
+ fprintf (stderr, "\
+Usage: %s [-a] [-c] [-h] [-i length] [-o path] [-p] [-s size] [-t]\n\
+ [-C font][-H font] [-K font] [-P font] [-S font] [-T wide] [-V]\n\
+ [+ansi-c] [+complete-file] [+header] [+indentation length]\n\
+ [+output path] [+c-plusplus] [+font-size size] [+pipe]\n\
+ [+comment-font font] [+keyword-font font] [+cpp-font font]\n\
+ [+header-font font] [+string-font font] [+tabstop wide]\n\
+ [+version] [path]\n", name);
+ exit (1);
+}
+
+yywrap(){}