This is texconv.c in view mode; [Download] [Up]
#include <stdio.h> #include <time.h> FILE *Input_Fp = stdin; FILE *Output_Fp = stdout; static int begin_parse (void); /* -------------- Output routines ----------------------------------*/ static int Quiet_Mode; static void msg_error (char *err, int severity) { if (Quiet_Mode && !severity) return; if (severity == 0) fprintf (stderr, "Not understood: %s\n", err); else fprintf (stderr, "%s\n", err); } static void usage (void) { fputs ("\ Usage: texconv [-hlp] [-quiet] input-file-name output-file-name\n\ -hlp : generate a VMS style hlp file\n\ -quiet: suppress warnings\n\ ", stderr); exit (-1); } static int Hlp_Mode = 0; static int Section_Num; static int SubSection_Num; static int SubSubSection_Num; static int This_Column = 1; static int Doing_Section; static int Output_Ok; static int No_Output; static void my_putc (int x) { if (No_Output || (Output_Ok == 0)) return; if (Doing_Section && Hlp_Mode && (x == ' ')) x = '_'; putc(x, Output_Fp); if (x == '\n') { if (Doing_Section && !Hlp_Mode) { x = Doing_Section; while (This_Column--) putc (x, Output_Fp); putc ('\n', Output_Fp); } Doing_Section = 0; This_Column = 1; } else This_Column++; } static void my_print (char *line) { while (*line) my_putc ((int) *line++); } /* --------------------- routines to handle LaTeX commands ------------- */ int bf_fun (char *tok) { return begin_parse (); } int em_fun (char *tok) { return begin_parse (); } int verb_fun (char *tok) { int ch1, ch; ch1 = getc (Input_Fp); while ((ch1 != (ch = getc (Input_Fp))) && (ch != EOF)) { my_putc (ch); } return 0; } int swallow_argument (char *tok) { int ch; while (((ch = getc (Input_Fp)) != EOF) && (ch != '{')); No_Output++; begin_parse (); No_Output--; } int swallow_double_argument (char *tok) { swallow_argument (tok); return swallow_argument (tok); } int parbox_cmd (char *tok) { int ch; while (((ch = getc (Input_Fp)) != EOF) && (ch != '{') && (ch != '[')); if (ch == '[') while (((ch = getc (Input_Fp)) != EOF) && (ch != ']')); swallow_argument (tok); } int section_fun (char *tok) { int ch; char line[256]; Section_Num++; SubSection_Num = SubSubSection_Num = 0; if (Hlp_Mode) my_print ("\n1"); else { sprintf (line, "\n%d ", Section_Num); my_print (line); } while (((ch = getc (Input_Fp)) != EOF) && (ch != '{')); Doing_Section = '='; begin_parse (); return 0; } int subsection_fun (char *tok) { char line[256]; int ch; SubSection_Num++; SubSubSection_Num = 0; if (Hlp_Mode) my_print ("\n2"); else { sprintf (line, "\n%d.%d ", Section_Num, SubSection_Num); my_print (line); } while (((ch = getc (Input_Fp)) != EOF) && (ch != '{')); Doing_Section = '-'; begin_parse (); my_putc ('\n'); return 0; } int subsubsection_fun (char *tok) { char line[256]; int ch; SubSubSection_Num++; if (Hlp_Mode) my_print ("\n3"); else { sprintf (line, "\n%d.%d.%d ", Section_Num, SubSection_Num, SubSubSection_Num); my_print (line); } while (((ch = getc (Input_Fp)) != EOF) && (ch != '{')); Doing_Section = '.'; begin_parse (); my_putc ('\n'); return 0; } int extract_token (char *token) { int ch; while (ch = getc (Input_Fp), (ch <= ' ') && (ch != EOF)); while ((ch > ' ') && (ch != '}') && (ch != EOF)) { *token++ = (char) ch; ch = getc (Input_Fp); } *token = 0; if (ch == EOF) { msg_error ("Unexpected end of file.", 1); } return ch; } int begin_fun (char *tok) { int ch; char token[80], *t; char *verb = "end{verbatim}"; while (ch = getc (Input_Fp), (ch != '{') && (ch != EOF)); if (ch == EOF) { msg_error ("Unexpected end of file.", 1); return ch; } ch = extract_token (token); while ((ch != '}') && (ch != EOF)) ch = getc (Input_Fp); if (!strcmp (token, "document")) Output_Ok = 1; if (!strcmp (token, "verbatim")) { if (Output_Ok == 0) return 0; while ((ch = getc (Input_Fp)) != EOF) { if (ch == '\\') { char *t1 = verb; t = verb; while (((ch = getc (Input_Fp)) != EOF) && *t) { if ((char) ch == *t) t++; else break; } if (ch == EOF) { msg_error ("Unexpected end of file.", 1); break; } if ((*t == 0) && (ch <= ' ')) break; /* verbatim finished */ my_putc ('\\'); while (t1 < t) { my_putc (*t1); t1++; } ungetc (ch, Input_Fp); } else my_putc (ch); } } my_putc ('\n'); return ch; } int end_fun (char *tok) { int ch; while (ch = getc (Input_Fp), (ch != '{') && (ch != EOF)); if (ch == EOF) { msg_error ("Unexpected end of file.", 1); return EOF; } /* Later I will parse what we are ending */ while ((ch != '}') && (ch != EOF)) ch = getc (Input_Fp); my_putc ('\n'); return 0; } int item_fun (char *tok) { /* Later I will worry about actually indenting it. */ my_print ("\n * "); return 0; } int verbatim_fun (char *t) { int ch; char *verb = "\\ev"; if (Output_Ok == 0) return 0; while ((ch = getc (Input_Fp)) != EOF) { if (ch == '\n') { char *t1 = verb; t = verb; while (((ch = getc (Input_Fp)) != EOF) && *t) { if ((char) ch == *t) t++; else break; } if (ch == EOF) { msg_error ("Unexpected end of file.", 1); break; } my_putc ('\n'); if ((*t == 0) && (ch <= ' ')) break; /* verbatim finished */ while (t1 < t) { my_putc (*t1); t1++; } ungetc (ch, Input_Fp); } else my_putc (ch); } my_putc ('\n'); return 0; } int quote_fun (char *tok) { int c; while (((c = getc (Input_Fp)) != EOF) && (c != '{')); my_putc ('`'); begin_parse (); my_putc ('\''); return 0; } int today_fun (char *tok) { char *the_time; time_t clock; clock = time((time_t *) 0); the_time = (char *) ctime(&clock); /* returns the form Sun Sep 16 01:03:52 1985\n\0 */ the_time[24] = '\0'; my_print (the_time); return 0; } typedef struct { char name[30]; int (*fun)(char *); int type; } Token_List_Type; Token_List_Type Token_List [] = { /* local extensions */ {"bv", verbatim_fun, 0}, {"key", quote_fun, 0}, {"var", quote_fun, 0}, {"exmp", quote_fun, 0}, {"jed", (int (*)(char *)) "JED", 1}, {"slang", (int (*)(char *)) "S-Lang", 1}, {"MYBOX", NULL, 0}, /* partially implemented */ {"bf", bf_fun, 0}, {"em", em_fun, 0}, {"tt", em_fun, 0}, {"it", em_fun, 0}, {"sc", em_fun, 0}, {"section", section_fun, 0}, {"begin", begin_fun, 0}, {"end", end_fun, 0}, {"subsection", subsection_fun, 0}, {"subsubsection", subsubsection_fun, 0}, {"item", item_fun, 0}, {"hspace", swallow_argument, 0}, {"vspace", swallow_argument, 0}, {"pagestyle", swallow_argument, 0}, {"thispagestyle", swallow_argument, 0}, {"verb", verb_fun, 0}, {"today", today_fun, 0}, {"times", (int (*)(char *)) "x", 1}, {"bullet", (int (*)(char *)) " * ", 1}, {"ldots", (int (*)(char *)) "...", 1}, {"cdot", (int (*)(char *)) ".", 1}, {"TeX", (int (*)(char *)) "TeX", 1}, {"LaTeX", (int (*)(char *)) "LaTeX", 1}, /* Not implemented (ignored) */ {"bigskip", NULL, 0}, {"par", NULL, 0}, {"newline", NULL, 0}, {"smallskip", NULL, 0}, {"baselinestretch", NULL, 0}, {"cleardoublepage", NULL, 0}, {"pagenumbering", swallow_argument, 0}, {"appendix", NULL, 0}, {"newpage", NULL, 0}, {"pagebreak", NULL, 0}, {"parbox", parbox_cmd, 0}, {"textwidth", NULL, 0}, {"mbox", NULL, 0}, {"hfill", NULL, 0}, {"large", NULL, 0}, {"huge", NULL, 0}, {"documentstyle", NULL, 0}, {"newcommand", NULL, 0}, {"underline", NULL, 0}, {"thepage", NULL, 0}, {"def", NULL, 0}, {"vfill", NULL, 0}, {"tableofcontents", NULL, 0}, {"hbox", NULL, 0}, {"cal", NULL, 0}, {"nopagebreak", NULL, 0}, {"footnotesize", NULL, 0}, {"Huge", NULL, 0}, {"Large", NULL, 0}, {"LARGE", NULL, 0}, {"normalsize", NULL, 0}, {"renewcommand", NULL, 0}, {"small", NULL, 0}, {"chapter", NULL, 0}, {"evensidemargin", NULL, 0}, {"oddsidemargin", NULL, 0}, {"headsep", NULL, 0}, {"topmargin", NULL, 0}, {"fbox", NULL, 0}, {"centerline", NULL, 0}, {"kill", NULL, 0}, {"parindent", NULL, 0}, {"parskip", NULL, 0}, {"vskip", NULL, 0}, {"noindent", NULL, 0}, {"hangindent", NULL, 0}, {"break", NULL, 0}, {"circ", NULL, 0}, {"setlength", swallow_double_argument, 0}, {"input", swallow_argument, 0}, {"textheight", swallow_argument, 0}, {"", NULL} }; static int alpha_token (int ch) { char token[80], *t; Token_List_Type *tl; char ch1, ch2; t = token + 1; *token = (char) ch; while ((ch = getc (Input_Fp)) != EOF) { if (((ch | 0x20) >= 'a') && ((ch | 0x20) <= 'z')) *t++ = (char) ch; else break; } *t = 0; if (ch == EOF) return -1; if (ch != ' ') ungetc (ch, Input_Fp); tl = Token_List; ch2 = *token; while ((ch1 = tl->name[0]) != 0) { if ((ch1 == ch2) && !strcmp (tl->name, token)) { if (tl->fun != NULL) { if (tl->type == 0) { if ((Output_Ok == 0) && (tl->fun != begin_fun)) return 0; return (*tl->fun) (token); } my_print ((char *) tl->fun); } return 0; } tl++; } my_putc ('\\'); my_print (token); my_putc (' '); msg_error (token, 0); return 0; } void non_alpha_token (int ch) { int ch1; ch1 = getc (Input_Fp); switch (ch) { case '\'': switch (ch1) { /* ISO-Latin 1 */ case 'A': ch1 = 193; break; case 'E': ch1 = 201; break; case 'I': ch1 = 205; break; case 'O': ch1 = 211; break; case 'U': ch1 = 218; break; case 'Y': ch1 = 221; break; case 'a': ch1 = 225; break; case 'e': ch1 = 233; break; case 'i': ch1 = 237; break; case 'o': ch1 = 243; break; case 'u': ch1 = 250; break; case 'y': ch1 = 253; break; } my_putc (ch1); break; case '{': case '}': case '%': case '$': case '&': case '_': case '^': my_putc (ch); /* drop */ default: ungetc (ch1, Input_Fp); break; } } static int begin_parse (void) { int ch; while ((ch = getc (Input_Fp)) != EOF) { /* Handle most common case */ if ((ch >= 'a') && (ch <= 'z')) my_putc (ch); else if (ch == '%') { while ((ch = getc (Input_Fp)) != EOF) { if (ch == '\n') break; } if (ch == EOF) break; } else if (ch == '\\') { if ((ch = getc (Input_Fp)) == EOF) break; if (((ch | 0x20) >= 'a') && ((ch | 0x20) <= 'z')) { alpha_token (ch); } else non_alpha_token (ch); } else if (ch == '{') { if (Output_Ok) begin_parse (); /* new level */ } else if (ch == '}') { if (Output_Ok) return ch; /* end level */ } else if (ch != '$') my_putc (ch); } return ch; } int main (int argc, char **argv) { argv++; argc--; while (argc) { if (!strcmp (*argv, "-hlp")) { Hlp_Mode = 1; argv++; argc--; } else if (!strcmp (*argv, "-quiet")) { Quiet_Mode = 1; argv++; argc--; } else break; } if ((argc < 1) || (argc > 2)) usage (); if ((Input_Fp = fopen (*argv, "r")) == NULL) { fprintf (stderr, "Unable to open input file: %s\n", *argv); exit (-1); } argv++; argc--; if (argc) if ((Output_Fp = fopen (*argv, "w")) == NULL) { fprintf (stderr, "Unable to open output file: %s\n", *argv); exit (-1); } if (EOF != begin_parse ()) { fprintf (stderr, "Parse Error.\n"); return -1; } return 0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.