/*
 * $Id$
 */

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

    Datei CODEGEN.H zum Projekt RTF2TEX.C

    Codeerzeugung zu den RTF-Kommandos
    
    letzte "Anderung: am 4.9.1991 um 17:23

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "rtf2tex.h"

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

extern int German,                  /* LaTeX Option 'german'            */
           Textcode,                /* Defaulteinstellung Textcodierung
                                       Ben"otigt f"ur Tabellenzugriff auf
                                       Hexadezimal codierte Zeichen     */
           Parflag,                 /* Wird mit neuem Absatz gesetzt    */
           Pardepth,                /* Formatierung f"ur Absatz gsetzt
                                       Wurde diese nicht am Absatzanfang
                                       gesetzt, dann Linksb"undig !!!    */
           Underlinedepth,          /* Verschachtelung \underline       */
           Switchattribut,          /* Textattributumschaltung an       */
           Hochtiefflag,            /* Hoch- oder Tiefstellung an       */
           Footnoteflag,            /* Fu"snote an                       */
           Newleftskip,             /* \leftskip ge"andert               */
           Newrightskip,            /* \rightskip ge"andert              */
           Newparindent,            /* \parindent ge"andert              */
           Noblocksatz,             /* kein Blocksatz im Absatz         */
           Formatset,               /* Merker f"ur Attributumschaltung   */
           Smallcaps,               /* Merker f"ur Textattribute         */
           Boldface,
           Italic;

extern FILE *Eingabefile,           /* Descriptor f"ur Ausgabefile       */
            *Ausgabefile;           /* Descriptor f"ur Eingabefile       */

extern struct scantoken Token;      /* Struktur mit gescanntem Token    */

extern struct hexvalue Hextab[];    /* "Ubersetzungstabelle Hexzahlen    */

extern struct normchar Chartab[];   /* "Ubersetzungstabelle Zeichen      */

extern char *sysmsg[];              /* Tabelle mit Systemmeldungen      */
            
/*----------------------------------------------------------------------*/

int gen_pc()                                    /* Textcodierung setzen */
{
    Textcode = PCCODE;
    return(0);
}

int gen_mac()                                   /* Textcodierung setzen */
{
    Textcode = MACCODE;
    return(0);
}

int gen_ansi()                                  /* Textcodierung setzen */
{
    Textcode = ANSICODE;
    return(0);
}

int gen_tab()                                           /* Tabulator    */
{
    int length;

    length = fprintf(Ausgabefile, " ");
    checknewline(length, BREAKALLOWED);
    return(0);
}

int gen_par()                               /* Neuen Absatz erzeugen    */
{
    int length;
    
    if(Hochtiefflag)
    {
        length=fprintf(Ausgabefile,"}}$");
        checknewline(length,!BREAKALLOWED);
        Hochtiefflag = FALSE;
    }
    if(Switchattribut)
    {
        length=fprintf(Ausgabefile,"}");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = FALSE;
        Smallcaps = Boldface = Italic = FALSE;
    }
    while(Underlinedepth)
    {
        length=fprintf(Ausgabefile,"}");
        checknewline(length,!BREAKALLOWED);
        Underlinedepth--;
    }
    if(Parflag)
    {
        fprintf(Ausgabefile,"\\vspace{\\baselineskip}");
        if(Pardepth)
        {
            fprintf(Ausgabefile,"}");
            Pardepth--;
        }
        fprintf(Ausgabefile,"\n\n");
    }
    else
    {
        if(Pardepth)
        {
            length=0;
            if(Newleftskip || Newrightskip || Newparindent || Noblocksatz)
                length=fprintf(Ausgabefile,"\\par");
            length += fprintf(Ausgabefile,"}");
            checknewline(length,!BREAKALLOWED);
            Pardepth--;
        }
        if(!Pardepth && !Footnoteflag)  
            /* Nur Absatzumgebung, nicht \footnote */
        {
            checknewline(LINEBREAK,!BREAKALLOWED);  /* Alten Absatz beenden */
            checknewline(LINEBREAK,!BREAKALLOWED);  /* Leerzeile einf"ugen */
            Parflag = TRUE;
        }
    }
    return(0);
}

int gen_pard()              /* Standard-Absatzparameter (Absatzanfang)  */
{
    int length;

    length=fprintf(Ausgabefile,"{");
    Pardepth++;
    checknewline(length,!BREAKALLOWED);
    Formatset = FALSE;
    Newleftskip = FALSE;
    Newrightskip = FALSE;
    Newparindent = FALSE;
    return(0);
}

int gen_footnote()                              /* Fussnote erzeugen    */
{
    int length;
    
    length=fprintf(Ausgabefile," \\footnote{");
    checknewline(length,!BREAKALLOWED);
    Footnoteflag = TRUE;
    return(0);
}

int gen_ql()                                            /* Linksb"undig  */
{
    int length;
    
    length=fprintf(Ausgabefile,"\\raggedright ");
    checknewline(length,BREAKALLOWED);
    Formatset = TRUE;
    if(!Footnoteflag)
        Noblocksatz = TRUE;
    return(0);
}

int gen_qr()                                            /* Rechtsb"undig */
{
    int length;
    
    length=fprintf(Ausgabefile,"\\raggedleft ");
    checknewline(length,BREAKALLOWED);
    Formatset = TRUE;
    if(!Footnoteflag)
        Noblocksatz = TRUE;
    return(0);
}

int gen_qc()                                            /* Zentriert    */
{
    int length;

    length=fprintf(Ausgabefile,"\\centering ");
    checknewline(length,BREAKALLOWED);
    Formatset = TRUE;
    if(!Footnoteflag)
        Noblocksatz = TRUE;
    return(0);
}

int gen_qj()                                            /* Blocksatz    */
{
    Formatset = TRUE;
    if(!Footnoteflag)
        Noblocksatz = FALSE;
    return(0);
}


int gen_fi()                                /* Einr"uckung erste Zeile   */
{   
    int length;
    double value;
    
    value = atof(Token.value.cmd.parm);
    value /= 20;            /* Einheit RTF = 1/20 pt */
    length = fprintf(Ausgabefile,"\\parindent %dpt ",(int)value);
    checknewline(length,BREAKALLOWED); 
    Newparindent = TRUE;
    return(0);
}

int gen_li()                                /* Linker Rand des Absatzes */
{
    int length;
    double value;
    
    value = atof(Token.value.cmd.parm);
    value /= 20;            /* Einheit RTF = 1/20 pt */
    length = fprintf(Ausgabefile,"\\leftskip %dpt ",(int)value);
    checknewline(length,BREAKALLOWED); 
    Newleftskip = TRUE;
    return(0);
}

int gen_ri()                                /* Rechter Rand des Asatzes */
{
    int length;
    double value;
    
    value = atof(Token.value.cmd.parm);
    value /= 20;            /* Einheit RTF = 1/20 pt */
    length = fprintf(Ausgabefile,"\\rightskip %dpt ",(int)value);
    checknewline(length,BREAKALLOWED); 
    Newrightskip = TRUE;
    return(0);
}

int gen_ul()                                        /* Unterstrichen    */
{
    int length;
    
    length=fprintf(Ausgabefile,"\\underline{");
    checknewline(length,!BREAKALLOWED);
    Underlinedepth++;
    return(0);
}

int gen_uldb()                              /* doppelt unterstrichen    */
{
    int length;
    
    length=fprintf(Ausgabefile,"\\underline{\\underline{");
    checknewline(length,!BREAKALLOWED);
    Underlinedepth += 2;
    return(0);
}

int gen_i()                                                 /* Kursiv   */
{
    int length;
    
    if(!Switchattribut)
    {
        length=fprintf(Ausgabefile,"{");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = TRUE;
        Italic = TRUE;
    }
    length=fprintf(Ausgabefile,"\\it ");
    checknewline(length,BREAKALLOWED);
    return(0);
}

int gen_b()                                             /* Fettschrift  */
{
    int length;
    
    if(!Switchattribut)
    {
        length=fprintf(Ausgabefile,"{");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = TRUE;
        Boldface = TRUE;
    }
    length=fprintf(Ausgabefile,"\\bf ");
    checknewline(length,BREAKALLOWED);
    return(0);
}

int gen_scaps()                                         /* Small Caps   */
{
    int length;
    
    if(!Switchattribut)
    {
        length=fprintf(Ausgabefile,"{");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = TRUE;
        Smallcaps = TRUE;
    }
    length=fprintf(Ausgabefile,"\\sc ");
    checknewline(length,BREAKALLOWED);
    return(0);
}

int gen_plain()                             /* Standard-Textattribute   */
{
    int length;
    
    if(Hochtiefflag)
    {
        length=fprintf(Ausgabefile,"}}$");
        checknewline(length,!BREAKALLOWED);
        Hochtiefflag = FALSE;
    }
    if(Switchattribut)
    {
        length=fprintf(Ausgabefile,"}");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = FALSE;
        Smallcaps = Boldface = Italic = FALSE;
    }
    while(Underlinedepth)
    {
        length=fprintf(Ausgabefile,"}");
        checknewline(length,!BREAKALLOWED);
        Underlinedepth--;
    }
    return(0);
}

int gen_up()                                            /* Hochstellung */
{
    int length;
    
    length=fprintf(Ausgabefile,"$^{\\mbox{");
    checknewline(length,!BREAKALLOWED);
    Hochtiefflag = TRUE;
    return(0);
}

int gen_dn()                                            /* Tiefstellung */
{
    int length;
    
    length=fprintf(Ausgabefile,"$_{\\mbox{");
    checknewline(length,!BREAKALLOWED);
    Hochtiefflag = TRUE;
    return(0);
}

int gen_page()                                      /* Seitenumbruch    */
{
    
    fprintf(Ausgabefile," \\newpage");
    checknewline(LINEBREAK,!BREAKALLOWED);
    return(0);
}

int gen_line()                                      /* Zeilenumbruch    */
{
    fprintf(Ausgabefile," \\newline");
    checknewline(LINEBREAK,!BREAKALLOWED);
    return(0);
}

int gen_fs()                                    /* Fontgr"o"se umschalten */
{
    int length;
    double value;
    char *outstring = "";
    
    value = atof(Token.value.cmd.parm);
    value /= 2;         /* Einheit im RTF = 1/2 pt */
    if(value < 6.5)
        outstring = "\\tiny ";
    if(value >= 6.5 && value < 7.5)
        outstring = "\\scriptsize ";
    if(value >= 7.5 && value < 8.5)
        outstring = "\\footnotesize ";
    if(value >= 8.5 && value < 9.5)
        outstring = "\\small ";
    if(value >= 9.5 && value < 10.5)
        outstring = "";                     /* \normalsize */
    if(value >= 10.5 && value < 11.5)
        outstring = "\\large ";
    if(value >= 11.5 && value < 13)
        outstring = "\\Large ";
    if(value >= 13 && value < 18)
        outstring = "\\LARGE ";
    if(value >= 18 && value < 22)
        outstring = "\\huge ";
    if(value >= 22)
        outstring = "\\Huge ";
    length = (int)strlen(outstring);
    if(!Switchattribut && length)
    {
        length=fprintf(Ausgabefile,"{");
        checknewline(length,!BREAKALLOWED);
        Switchattribut = TRUE;
    }
    if(length)
    {
        fprintf(Ausgabefile,outstring);
        checknewline(length,BREAKALLOWED); 
        if(Italic)
            gen_i();
        if(Boldface)
            gen_b();
        if(Smallcaps)
            gen_scaps();
    }
    return(0);
}

int gen_v()                             /* Verborgen -> LaTeX Inline    */
{
    int length;
    
    while(gettoken())
    {
        if(Token.type == NORMCMD && !strcmp(Token.value.cmd.text,"plain"))
        {
            gen_plain();
            break;
        }
        if(Token.type == NORMCHAR)
        {
            length=fprintf(Ausgabefile,"%c",Token.value.zeichen);
            checknewline(length,Token.value.zeichen);
        }
    }
    return(0);
}

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

int gen_title()                                     /* \title "uberlesen */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_subject()                               /* \subject "uberlesen   */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_operator()                              /* \operator "uberlesen  */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_author()                                /* \author "uberlesen    */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_keywords()                              /* \keywords "uberlesen  */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_doccomm()                               /* \doccomm "uberlesen   */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_version()                               /* \version "uberlesen   */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_nextfile()                              /* \nextfile "uberlesen  */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

int gen_info()                              /* \info-Block "uberlesen    */
{
    int depth=1;

    while(gettoken())
    {
        switch(Token.type)
        {
            case GROUPBEGIN:
                depth++;
                break;
            
            case GROUPEND:
                depth--;
                break;
        }
        if(!depth)
            break;
    }
    return(0);  
}

int gen_stylesheet()                    /* \stylesheet-Block "uberlesen  */
{
    int depth=1;

    while(gettoken())
    {
        switch(Token.type)
        {
            case GROUPBEGIN:
                depth++;
                break;
            
            case GROUPEND:
                depth--;
                break;
        }
        if(!depth)
            break;
    }
    return(0);  
}

int gen_fonttbl()                           /* \fonttbl-Block "uberlesen */
{
    int depth=1;

    while(gettoken())
    {
        switch(Token.type)
        {
            case GROUPBEGIN:
                depth++;
                break;
            
            case GROUPEND:
                depth--;
                break;
        }
        if(!depth)
            break;
    }
    return(0);  
}

int gen_colortbl()                          /* Farbtabelle "uberspringen */
{
    while(gettoken())
    {
        if(Token.type == GROUPEND)
            break;
    }
    return(0);
}

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

int gen_commentdocsize()                /* Dokumentgr"o"se als Kommentar  */
{
    double value;
    
    value = atof(Token.value.cmd.parm);
    value /= 20;            /* Einheit RTF = 1/20 pt */
    fprintf(Ausgabefile,"%% %s %dpt",Token.value.cmd.text,(int)value);
    checknewline(LINEBREAK,!BREAKALLOWED);
    return(0);
}

/*------------------------------ E N D E -------------------------------*/
