/*
   main function of xetal,
   Copyright (C) 1991 Raphael Cerf (e-mail: [email protected])

   This file is part of xetal.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 1, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include "proto.h"

/*
* main
*/

main(argc, argv)
int argc;
char **argv;
{
       extern char *optarg;
       extern int optind;

       int i, j, c;
       /* option flags */
       int Aflg, aflg, bflg, Cflg, cflg, dflg;
       int eflg, Eflg, errflg, Fflg, fflg, gflg, hflg;
       int iflg, jflg, Mflg, mflg, Nflg, nflg;
       int oflg, pflg, rflg, Sflg, sflg, tflg;
       int uflg, wflg, zflg;
       char *nN, *el;
       char i_name[W_LGTH];


#ifdef MALDEBUG
       malloc_debug(2);
#endif

       if ((devnull=fopen("/dev/null", "w"))==(FILE *)NULL) {
               fprintf(stderr, "Can't open /dev/null\n");
               exit(2);
       }

/*
* default options
*/

       d_accent=0;
       d_bl=1;
       d_bls=1;
       d_comment=0;
       d_command=0;
       d_error=1;
       d_fname=1;
       d_macrodef=0;
       d_math=0;
       d_mot=1;
       d_nl=1;
       d_operator=1;
       d_punct=1;
       d_report=0;
       d_slashed=1;
       d_special=1;
       d_text=1;
       d_unknown=0;
       d_warning=1;
       do_fill=1;
       do_fill_acco=0;
       do_fill_slash=0;
       do_incl=1;
       c_fill=' ';
       s_accent=(char)0;
       n_nl=0;N=0;

/*
* options handling
*/

       Aflg=aflg=bflg=Cflg=cflg=dflg=eflg=Eflg=errflg=0;
       Fflg=fflg=gflg=hflg=iflg=jflg=Mflg=mflg=Nflg=0;
       nflg=oflg=pflg=rflg=Sflg=sflg=tflg=uflg=wflg=0;
       zflg=0;
while ((c = getopt(argc, argv, "a:AbcCde:Ef:FghijmMn:oNpsSrtuwz")) != -1)
       switch (c) {
               case 'A':
                       Aflg=1;
                       break;
               case 'a':
                       aflg=1;
                       s_accent = optarg[0];
                       break;
               case 'b':
                       bflg=1;
                       break;
               case 'C':
                       Cflg=1;
                       break;
               case 'c':
                       cflg=1;
                       break;
               case 'd':
                       dflg=1;
                       break;
               case 'e':
                       eflg=1;
                       el=strdup(optarg);
                       break;
               case 'E':
                       Eflg=1;
                       break;
               case 'F':
                       Fflg=1;
                       break;
               case 'f':
                       fflg=1;
                       c_fill = optarg[0];
                       break;
               case 'g':
                       gflg=1;
                       break;
               case 'h':
                       hflg=1;
                       break;
               case 'i':
                       iflg=1;
                       break;
               case 'j':
                       jflg=1;
                       break;
               case 'M':
                       Mflg=1;
                       break;
               case 'm':
                       mflg=1;
                       break;
               case 'N':
                       Nflg=1;
                       break;
               case 'n':
                       nflg=1;
                       nN = optarg;
                       break;
               case 'o':
                       oflg=1;
                       break;
               case 'p':
                       pflg=1;
                       break;
               case 'r':
                       rflg=1;
                       break;
               case 'S':
                       Sflg=1;
                       break;
               case 's':
                       sflg=1;
                       break;
               case 't':
                       tflg=1;
                       break;
               case 'u':
                       uflg=1;
                       break;
               case 'w':
                       wflg=1;
                       break;
               case 'z':
                       zflg=1;
                       break;
               case '?':
                       errflg++;
       }
       if (hflg) {
               fprintf(stderr, "usage:");
               fprintf(stderr,
       "xetal \-\[a:AbcCde:Ef:FghijmMn:oNpsSrtuwz\] \[file1\] \[file2\] ...\n");
               exit (2);
       }

       /* test for .tex suffix */
       for (i=optind; i < argc; i++) {
               strcpy(i_name, argv[i]);strcat(i_name, ".tex");
               if (access(argv[i], R_OK) && access(i_name, R_OK)) {
               fprintf(stderr,"Can't access file: %s\n", argv[i]);
                       exit(2);
               }
       }

       if (Aflg) { d_accent=!d_accent; s_accent=(char)NULL; }
       if (aflg) d_accent=!d_accent;
       if (bflg) d_bls=!d_bls;
       if (cflg) d_command=!d_command;
       if (Cflg) d_comment=!d_comment;
       if (Eflg) d_error=!d_error;
       if (Fflg) do_fill=0;
       if (gflg) do_fill_acco=1;
       if (iflg) do_incl=0;
       if (jflg);
       if (mflg) d_math=!d_math;
       if (Nflg) d_fname=-1;
       if (nflg) { N=atoi(nN); n_nl=1; if (N==0) n_nl=0; }
       if (oflg) d_macrodef=!d_macrodef;
       if (pflg) d_punct=!d_punct;
       if (rflg) d_report=!d_report;
       if (sflg) d_special=!d_special;
       if (tflg) d_text=!d_text;
       if (uflg) d_unknown=1;
       if (wflg) d_warning=0;
       if (zflg) d_anything=!d_anything;

       if (eflg) {
               char *p=el;
               if ((envrt[n_envrt++]=strtok(p, ","))!=(char *)NULL) {
                       p=(char *)NULL;
                       while ((envrt[n_envrt++]=strtok(p, ","))!=(char *)NULL);
                       n_envrt--;
               }
       }
       if (Sflg) {
               d_text=d_command=d_comment=d_accent=0;
               d_punct=d_special=d_slashed=d_math=0;
               d_operator=d_bl=d_nl=d_mot=d_punct=0;
               d_bls=do_fill=n_nl=0;
       }

/*
* initialization of lexical analyzer
*/
       init_lex();

/*
* initialization of symbol list
*/

       init_symbol(envrt, n_envrt);

/*
* begining of program
*/

       if (dflg)
#ifdef YYDEBUG
       yydebug=1;
#else
       {
fprintf(stderr, "You little joker ! The manual said don't try -d ...\n");
       exit(2);
       }
#endif

#ifdef MALDEBUG
       if (Mflg) { fprintf(stderr, "mallocmap\n");mallocmap(); }
#else
       if (Mflg) { fprintf(stderr, "Sorry, mallocmap not available\n"); }
#endif

       if (optind==argc) {
               /* only one file name in argument line */
               fich_t n_fich;
               n_fich.name="";
               n_fich.fd=stdin;
               n_fich.line=0L;
               n_fich.last_string=(char *)NULL;
               n_fich.last_char=(char)NULL;
               f_push(&n_fich);

               *f_in=stdin;
               f_name="";
               lineno=0L;

               if (dflg) fprintf(stderr, "yyparse()==%d\n",yyparse());
               else yyparse();

               for (j=0; j<n_ionly; j++) {
                       str_destroy(if_name[j]);
               }
               n_ionly=-1;
       } else {

       /* several file names in argument line */
       for (i=optind; i < argc; i++) {
               strcpy(i_name, argv[i]);strcat(i_name, ".tex");
               if ((*f_in=fopen(argv[i], "r"))==(FILE *)NULL) {
                       if ((*f_in=fopen(i_name, "r"))==(FILE *)NULL) {
               if (d_warning)
               fprintf(stderr, "\nCan't open file: %s\n", argv[i]);
                       }
               }
               if (*f_in!=(FILE *)NULL) {
               fich_t n_fich;

               n_fich.name=strdup(argv[i]);
               n_fich.fd=*f_in;
               n_fich.line=lineno;
               n_fich.last_string=(char *)NULL;
               n_fich.last_char=(char)NULL;
               f_push(&n_fich);

               f_name=n_fich.name;
               lineno=0L;

               init_lex();
               if (dflg) fprintf(stderr, "yyparse()==%d\n",yyparse());
               else yyparse();

               }
               for (j=0; j<n_ionly; j++) {
                       str_destroy(if_name[j]);
               }
               n_ionly=-1;
       } /* for */

       } /* else */

       for (i=0; i<n_adsymbol; i++) {
               str_destroy(adsymbol[i].name);
       }

#ifdef MALDEBUG
       if (Mflg) { fprintf(stderr, "mallocmap\n");mallocmap(); }
#else
       if (Mflg) { fprintf(stderr, "Sorry, mallocmap not available\n"); }
#endif

       if (d_report) {
       fprintf(stderr, "*** xetal report ***\n");
       fprintf(stderr, "%d lines, %d characters\n", total_lines, charpos);
       fprintf(stderr, "%d formulas\n", n_formule);
       fprintf(stderr, "%d charaters skipped\n", c_skipped);
       }

       fclose(devnull);
}