/*
** tr2latex - troff to LaTeX converter
** COPYRIGHT (C) 1987 Kamal Al-Yahya, 1991,1992 Christian Engel
**
** Module: tr2latex.c
**
** This module contains the main function inititating the translation
** and supporting the Usage.
*/

#define MAIN

#include "getopt.h"
#include        "setups.h"
#include        "protos.h"
#include <assert.h>

const char *version = "2.6";

int     man,            /* option -m: manual page */
 fontsize,     /* option -9/-10/-11/-12: font size */
 twoside,      /* option -t: twoside */
 piped_in;

char *document = "article";     /* document type, see also -s option */

FILE *out_file;         /* in case they can't use UN*X redirecting or piping */

char *prgname;
char inbuf[MAXLEN],
 outbuf[MAXLEN];

static void usage (int exitcode)
{
 printf ("tr2latex (c) 1986/1987 Kamal Al-Yahya, 1991 C. Engel, 2008..2016 Dirk Jagdmann\n"
         "Version %s\n",
         version);
 printf ("tr2latex - troff to LaTeX converter\n"
         "SYNTAX:  tr2latex [-m] [-t] [-<n>] [-s <style>] [-o <outfile>] [-d] [-b] [<file>...]\n"
         "options: -m            for manual\n"
         "         -t            twoside page style\n"
         "         -<n>          a number n gives the font size (default is 12pt\n"
         "                       for man, 11pt otherwise)\n"
         "         -s <style>    use documentstyle <style> (default is article)\n"
         "         -o <outfile>  send output to <outfile> (default is stdout)\n"
         "         -d            debug output\n"
         "         -b            LaTeX body, don't print declarations\n"
         );

 exit (exitcode);
}

static void process (FILE *in_file, char *f_name, char *pin, char *pout)
{
 static char sep[] = "--------------------------------------------------";

 const size_t r = fread(pin, 1, MAXLEN, in_file);
 if (r == MAXLEN)
 {
     fprintf(stderr, "Sorry: document is too large, you have to increase MAXLEN\n");
     exit(EXIT_FAILURE);
 }
 assert(r < MAXLEN);
 pin[r] = EOS;

 fprintf (out_file, "%%%s\n%% start of input file: %s\n%%\n", sep, f_name);
 troff_tex (pin, pout, 0, 0);
 fputs (pout, out_file);
 fprintf (out_file, "%%\n%% end of input file: %s\n%%%s\n", f_name, sep);
}

int main (int argc, char *argv[])
{
 char *pin = inbuf,
   *pout = outbuf;
 FILE *in_file;
 time_t timeval;
 int c, only_body=0;

 prgname = argv [0];
 out_file = stdout;            /* default output */

 /* process option flags */
 while((c=getopt(argc, argv, "0123456789bhmtds:o:")) != EOF)
   switch(c)
     {
     default:
     case '?':
     case 'h': usage (EXIT_SUCCESS);

     case 'b': only_body=1; break;
     case 'm': man = 1; break;
     case 't': twoside = 1; break;
     case 's': document = optarg; break;
     case 'o':
       if ((out_file = fopen(optarg, "w")) == NULL)
         {
           fprintf(stderr, "%s: can't open %s\n", prgname, optarg);
           usage (EXIT_FAILURE);
         }
       break;
     case 'd': debug_o = 1; break;

     case '0': fontsize = 10; break;
     case '1': fontsize = 11; break;
     case '2': fontsize = 12; break;
     case '3': fontsize = 13; break;
     case '4': fontsize = 14; break;
     case '5': fontsize = 15; break;
     case '6': fontsize = 16; break;
     case '7': fontsize = 17; break;
     case '8': fontsize = 18; break;
     case '9': fontsize = 9; break;
     }

 /* initialize spacing and indentation parameters */
 strcpy(linespacing.def_units,"\\normalbaselineskip");
 strcpy(linespacing.old_units,"\\normalbaselineskip");
 strcpy(indent.def_units,"em");
 strcpy(indent.old_units,"em");
 strcpy(tmpind.def_units,"em");
 strcpy(tmpind.old_units,"em");
 strcpy(space.def_units,"\\baselineskip");
 strcpy(space.old_units,"\\baselineskip");
 strcpy(vspace.def_units,"pt");
 strcpy(vspace.old_units,"pt");
 linespacing.value = 1.;
 linespacing.old_value = 1.;
 indent.value = 0.;
 indent.old_value = 0.;
 tmpind.value = 0.;
 tmpind.old_value = 0.;
 space.value = 1.;
 space.old_value = 1.;
 vspace.value = 1.;
 vspace.old_value = 1.;
 linespacing.def_value = 0;
 indent.def_value = 0;
 tmpind.def_value = 0;
 space.def_value = 1;
 vspace.def_value = 1;

 math_mode = 0;                                        /* start with non-math mode */
 de_arg = 0;                     /* not a .de argument */

 /* start of translated document */

 timeval = time(0);
 fprintf (out_file,
          "%% -*-LaTeX-*-\n"
          "%% Converted automatically from troff to LaTeX\n"
          "%% by tr2latex %s\n"
          "%% on %s"
          "%% tr2latex was written by Kamal Al-Yahya at Stanford University <Kamal%%[email protected]>\n"
          "%% and substantially enhanced by Christian Engel at RWTH Aachen <[email protected]>\n"
          "%% it is currently maintained by Dirk Jagdmann <[email protected]>\n"
          "%% visit http://www.ctan.org/pkg/tr2latex for details.\n"
          "%%\n"
          "%% troff input file%s:%s",
          version,
          ctime(&timeval),
          argc>2?"s":"",
          argc==1?" <stdin>":"");
#if 0
 for (argi = 1; argi < argc; argi++)
   {
     if (strcmp (argv [argi], "-") == 0)
       fprintf (out_file, " <stdin>");
     else
       fprintf (out_file, " %s", argv[argi]);
   }
#endif

 if(!only_body)
   {
     /* document style and options */
     fprintf (out_file,"\n\n\\documentclass[");
     if (fontsize == 0 && !man)
       fontsize = 11;
     if (fontsize != 0)
       fprintf (out_file,"%dpt", fontsize);
     if (twoside)
       fputs (",twoside", out_file);
     fprintf (out_file,"]{%s}", document);
     fprintf (out_file,"\n\n\\usepackage{%s}", man? "troffman": "troffms");
         fprintf (out_file,"\n\\usepackage{textcomp}\n");
     fprintf (out_file,"\n\n\\begin{document}\n");
   }

 if (optind == argc)
   process (stdin, "<stdin>", pin, pout);
 else
   {
     for (; optind!=argc; ++optind)
       {
         if (strcmp (argv[optind], "-") == 0)
           process (stdin, "<stdin>", pin, pout);
         else if ((in_file = fopen(argv[optind],"r")) == NULL)
           fprintf(stderr,"%s: Cannot open input file `%s'\n",
                   prgname,argv[optind]);
         else
           {
             process (in_file, argv[optind], pin, pout);
             fclose(in_file);
           }
       }
   }

 if(!only_body)
   {
     /* close translated document */
     fputs("\\end{document}\n",out_file);
   }

 exit(EXIT_SUCCESS);
}

void errexit (int exitcode)
{
 fprintf (stderr, "%s: Error #%03d ", prgname, exitcode);
 exit (exitcode);
}