/* db_tex.c - main-Routinen für dbtex; UKE/EDV, Bernd Paradies, 05.11.90 */

/* db2tex.c: db2tex.h  db_tex.c */

#include "db2tex.h"

/* -- importierte Variablen */

IMPORT  char   SpTab[MAXSPALTEN][50];
IMPORT  int    SpLen[MAXSPALTEN], SpNr;

IMPORT  char  *prgname;

IMPORT  int    TxtZeilen, GetRepZeilen, RepZeilen, DefZeilen, InpZeilen;
IMPORT  int    MaxReport, OptQuiet, OptOutput, OptCompile;

IMPORT  BOOL   BeginDocument, EndDocument;
IMPORT  FILE  *InpFile, *DefFile, *ShFile, *stdlog;

/* -- Funktions-Prototypen */

PUBLIC  int    PutTexRep ();        /* wird von GetReport ausgeführt */
PRIVATE int    GetTex();            /* bearbeitet die TeX-Datei */
PUBLIC  void   do_tex();            /* main für dbtex */

/* ---------------------------------------------------------------------- */

PRIVATE int   GetTex(Nr,Zeile)
	int   Nr;
	char *Zeile;
{
char  Spalte[MAXZEILE];
char  TmpZeile[MAXZEILE];                /* Zeile im printf-Format  */
char *Zptr;                              /* wandert durch Zeile        */
char *Tptr;                              /* zeigt auf den letzten Text */

    if (Nr == 1)                          /* SQL-Zeile auswerten */
      return (GetSQL (Zeile));

    if (strncmp (ENDDOC, Zeile, strlen(ENDDOC)) == 0)
      EndDocument = TRUE;

    if (EndDocument) return (0);          /* alles ab EndDoc. ignorieren */

    if (!BeginDocument)                   /* noch im Definitions-Bereich */
    {
      if (strncmp (BEGINDOC, Zeile, strlen(BEGINDOC)) == 0)
	BeginDocument = TRUE;
      else
      {
	fprintf (DefFile, "%s", Zeile);
	DefZeilen++;
      }
      return (0);
    }

    strcpy (TmpZeile, "");                 /* Initialisierung */
    Zptr = Tptr = Zeile;

    while ( (Zptr=strchr(Zptr, '%')) != NULL)     /* schnelle Vorprüfung */
      if ( *(++Zptr) == '$' )
      {
	strncat (TmpZeile, Tptr, Zptr - Tptr - 1);     /* kopiere bis % */
	sscanf (++Zptr, "%[^, ]", Spalte);             /* hole Spaltenname */

	if ( ChkName(Spalte) == NULL )
	  warning ("Ungültiger Spaltenname ignoriert. Zeile", Nr);
	else
	{
	  strcat  (TmpZeile, TEXMAC);                  /* Backslash */
	  strcat  (TmpZeile, strtoupper(Spalte));      /* alles groß */
	  Zptr += strlen (Spalte);                 /* Spalte überspringen */
	}
	Tptr = Zptr;                                  /* neuer Textbeginn */
      }

    strcat (TmpZeile, Tptr);                /* kopiere den Rest der Zeile */
    fprintf (InpFile, "%s", TmpZeile);
    InpZeilen++;
#ifdef __TEST__
    printf ("IN : %s",   Zeile);
    printf ("  >: %s\n", TmpZeile);
#endif __TEST__
}

/* ---------------------------------------------------------------------- */

PUBLIC int   PutTexRep(Nr, Zeile)
       int   Nr;
       char *Zeile;
{
char   *Sptr;
REG     ii;

  fprintf (DefFile, TEXLINE);
  fprintf (DefFile, "%% --- Exemplar Nr. %i ---\n", Nr-2);
  fprintf (DefFile, "\\newpage \\setcounter{page}{1}\n");
  Zeile[strlen(Zeile)-1] = 0;
  Sptr = Zeile;
  for (ii=0; ii != SpNr; ii++)
  {
    *(Sptr + SpLen[ii]) = 0;
    fprintf (DefFile, "\\def\\%s{%s \\ }\n", SpTab[ii], delblank(Sptr) );
    Sptr += SpLen[ii] + 3;
  }
  fprintf (DefFile, "\\input {%s}\n", InpName);
  DefZeilen += SpNr + 4;
}

/* ---------------------------------------------------------------------- */

PUBLIC int do_tex(void)
{
char  Command[100];
char  Temp[30];

  DefFile   = _fopen (DefName, "w");
  InpFile   = _fopen (InpName, "w");

  fprintf (DefFile, "%% --- Definitions-Sektion von %s ---\n", TxtName );
  fprintf (DefFile, TEXLINE);
  TxtZeilen = WalkFile(TxtName, GetTex);

  fprintf (DefFile, "%s\n", BEGINDOC);
  RepZeilen = WalkFile(RepName, GetReport);

  if (!EndDocument)
    error ("syntax error in LaTeX file: missing \\end{document}");

  fprintf (DefFile, TEXLINE);
  fprintf (DefFile, "%s\n", ENDDOC);

  fclose (InpFile);
  fclose (DefFile);

  if (OptCompile)             /* RETURN !!! bei -c Option */
    return (0);


  if (!OptQuiet)   printf ("TeX wird gestartet...\n");

  /* -- 1) deutsche Umlaute in dbtex.def für LaTeX */
  sprintf (Command, "%s < %s > out.tex", UMLT2TEX, DefName );
  if (system(Command) != 0)  error ("umlt2tex liefert Fehler zurück !");

  /* -- 2) deutsche Umlaute in dbtex.inp für LaTeX */
  sprintf (Command, "mv %s %s.tmp; %s < %s.tmp > %s",
	   InpName, prgname, UMLT2TEX, prgname, InpName);
  if (system(Command) != 0)  error ("umlt2tex liefert Fehler zurück !");

  /* -- 3) TeX wird aufgerufen */
  sprintf (Command, "%s out.tex > /dev/null", VIRTEX );
  if (system(Command) != 0)  error ("virtex liefert Fehler zurück !");

  /* -- 4) Aufräumarbeiten */
  sprintf (Command, "rm out.aux out.log out.tex %s.tmp; mv out.dvi %s",
		    prgname, DviName);
  system (Command);

  /* -- 5) Ausgabe (quiet, Dateiname, Drucker oder Bildschirm) */

  if (OptQuiet || OptOutput)
  {
    if (!OptOutput)
      sprintf (Command, "%s %s | lp -d%s", DVITPS, DviName, PRINTER );
    else
      sprintf (Command, "%s %s > %s", DVITTY, DviName, OutName);
    return (system (Command));      /* RETURN !!! */
  }

  printf ("Zwischendateien erfolgreich angelegt !\n");

  while (TRUE)        /* Endlos-Schleife terminiert bei 'e' */
  {
    printf ("\nEnde oder Ausgabe auf den Drucker oder Bildschirm ? [e/d/b]: ");
    switch ( getchar() )
    {
      case 'd' :
	   sprintf (Command, "%s %s | lp -d%s", DVITPS, DviName, PRINTER );
	   printf ("%s\n", Command);
	   system (Command);
	   break;
      case 'b' :
	   sprintf (Command, "%s %s", DVITTY, DviName );
	   printf ("%s\n", Command);
	   system (Command);
	   break;
      case 'e' : return (0);         /* RETURN !!! */
    }
    getchar();  /* wg. return */
  }
} /* ENDE: do_tex() */

/* ENDE: db_tex.c */
