%{ /* * The Bocal document system * * Copyright (C) 2007 Edouard Thiel * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ /* * comp/bocal.lex - 02/07/2008 * * Compiler for boc language, generate Html and LaTeX files. */ #include #include #include #include #include enum { TOK_NULL, TOK_MOTBAL, TOK_CHAINE, TOK_VERB, TOK_LANG, TOK_IF, TOK_MACRO, TOK_EXPAND, TOK_HTML, TOK_LATEX, TOK_T1, TOK_T2, TOK_T3, TOK_T4, TOK_TIT_B, TOK_TIT_C, TOK_TIT_D, TOK_E_TIT, TOK_CODE, TOK_E_CODE, TOK_ITALIC, TOK_E_ITALIC, TOK_BOLD, TOK_E_BOLD, TOK_SUP, TOK_E_SUP, TOK_SUB, TOK_E_SUB, TOK_CENTER, TOK_E_CENTER, TOK_P, TOK_BR, TOK_UL, TOK_E_UL, TOK_OL, TOK_E_OL, TOK_LI, TOK_E_LI, TOK_IMG, TOK_A, TOK_E_A, TOK_A_URL_STR, TOK_A_REF_STR, TOK_A_REFN, TOK_A_REFT, TOK_A_REFNT, TOK_SPLIT_HTML, TOK_EQUAL, TOK_NBSP, TOK_CESURE, TOK_SLOPPY, TOK_REFN, TOK_REFT, TOK_CODEPRE, TOK_E_CODEPRE, TOK_FILEC, TOK_RUN, TOK_TABMAT, TOK_TABMAT_B, TOK_SHORT, TOK_LONG, TOK_CHAP, TOK_BOCAL, TOK_E_BOCAL, TOK_E_BOCAL_B, TOK_ECHO, TOK_INCLUDE, TOK_THECUR, TOK_THENEXT, TOK_THEPREV, TOK_THECURT1, TOK_THENEXTT1, TOK_THEPREVT1, TOK_THECURT2, TOK_THENEXTT2, TOK_THEPREVT2 }; char *empty_str = "", last_car_put = '\n', *file_in, *file_out; enum { E_OFF, E_ON, E_FIRST, E_HTML, E_LATEX }; int etat_passe = E_OFF, etat_verb = E_OFF, etat_lang = E_OFF, etat_copre = E_OFF, etat_if = E_OFF, etat_macro = E_OFF, etat_titre = 0; #define BA_MAX 100 int ba_count = 0; char *ba_str[BA_MAX]; int ba_tok[BA_MAX]; typedef struct { int len, max; char *str; } Buf_string; Buf_string buf_verb, buf_lang, buf_copre, buf_if, buf_tit; #define CLE_MACRO_LEN 64 #define LISTE_MACRO_MAX 200 typedef struct { char cle[CLE_MACRO_LEN]; Buf_string buf; } Entree_macro; Entree_macro liste_macro[LISTE_MACRO_MAX]; int liste_macro_count = 0; Buf_string *buf_macro_ptr; #define TIT_MAX 1000 typedef struct { int t[5], niv; char *num, *label, *titre; } Titre_st; int tit_count = 0, tit_recount; Titre_st tit_tab[TIT_MAX]; int tabmat_count, tabmat_state, tabmat_categ, tabmat_niv; #define TABMAT_LABEL_MAX 80 char tabmat_label[TABMAT_LABEL_MAX]; #define MAX_INCLUDE_DEPTH 20 #define FILE_STACK_NAME 80 typedef struct { YY_BUFFER_STATE state; int lineno; char name[FILE_STACK_NAME]; } File_stack; File_stack inc_stack[MAX_INCLUDE_DEPTH]; int inc_stack_count = 0; int split_html = 0; char split_fbase[256]; FILE *split_old_fd; /* Prototypes */ void Erreur (const char *format, ...); void BadUsage (const char *s); void InitPasse (int passe); void BaInit (); void BaFree (); void BaMemo (int tok); void BaMemoChaine (char *s); void BaSubsti (int tok); void BaEtats(); void BaParse(); void BufInit (Buf_string *buf); void BufFree (Buf_string *buf); void BufMemo (Buf_string *buf); void BufMemoStr (Buf_string *buf, char *str, int len); void BufTabsToSpaces (Buf_string *buf); char *BufNextLine (Buf_string *buf); void VbParse (Buf_string *buf); void LaParse (Buf_string *buf); void CoParse (Buf_string *buf); void IfParse (Buf_string *buf); int MacroFind (char *cle); void MacroInit (); void MacroMemoStr (char *cle, char *str); void ExpandMacroBa (); int ExpandMacroStr (char *cle); void AffiMacros (); void DefaultMacros (); void DebutDocHtml (); void FinDocAHtml (); void FinDocBHtml (); void DebutDocLatex (); void FinDocLatex (); void AddTitre (int niv); void DebutTitAHtml (); void DebutTitBHtml (); void DebutTitCHtml (); void DebutTitDHtml (); void FinTitHtml (); void DebutTitALatex (); void DebutTitBLatex (); void FinTitLatex (); void TitParse (Buf_string *buf); int FindRefBa (); int FindRefStr (char *s); void RefNumHtml (); void RefNumLatex (); void RefTitHtml (); void RefTitLatex (); void RecopieHtml (); void A_UrlStr_Html (); void A_UrlStr_Latex (); void A_RefStr_Html (); void A_RefStr_Latex (); void A_RefNT_Html (); void A_RefNT_Latex (); void EchoBaHtml (); void EchoBaLatex (); void InitSplitHtml (); char *NameSplitHtml (int chap); void DebutSplitHtml (int chap); void FinSplitHtml (); void AffiTabmat (); void TabMatAHtml (); void TabMatBHtml (); void TabMatALatex (); void TabMatBLatex (); void CodePreDebHtml (); void CodePreFinHtml (); void CodePreDebLatex (); void CodePreFinLatex (); char *PathBeforeStr (char *fullpath, char *str); void FileC_Run_Html(); void FileC_Run_Latex(); void Run_Html(); void Run_Latex(); void InclureFichier (); void EcritMot (); void EcritSlashCar (); void EcritCar (); void TransStrHtml (char *s); void TransStrLatex (char *s); void TransCarHtml (char c); void TransCarLatex (char c); void UnputStr (char *s); void Tputc (char c); void Tputs (char *s); void Tprintf (const char *format, ...); %} /* options pour flex ; préférer en ligne de commande */ /* %option yylineno caseless lex-compat */ %s BALISE VERB CODEPRE LANG IF MACRO TITRE CARSTR (\\["\\]|[^"\\]) CHAINE (\"{CARSTR}*\") CARCOM (\\[<>\\]|[^<>\\]) COMMENT ("") ALPHA ([a-zA-Z_]) DIGIT ([0-9]) ALNUM ({ALPHA}|{DIGIT}) CARBAL ({ALNUM}|[-]) MOTBAL ({CARBAL}+) %% { {ALPHA}{ALNUM}* { /* Un mot */ EcritMot(); } {COMMENT} { /* Saute un commentaire */ } "<" { /* Début d'une balise */ BaInit(); BEGIN(BALISE); } "\\"[<>\\] { /* Autorise \< \> \\ */ EcritSlashCar(); } [>\\] { /* Interdit > ou \ */ Erreur("token '>' or '\\' unexpected"); } [ \t]* { /* compression des blancs */ if (last_car_put != ' ' && last_car_put != '\n') Tputc (' '); } [ \t\n]* { /* blanc avec au moins 1 saut de ligne */ if (last_car_put != '\n') Tputc ('\n'); } . { /* Tout autre caractère */ EcritCar(); } } { "verb" { BaMemo(TOK_VERB); BufInit(&buf_verb); } "lang" { BaMemo(TOK_LANG); BufInit(&buf_lang); } [\t ]*"codepre" { BaMemo(TOK_CODEPRE); BufInit(&buf_copre); } "/codepre" { BaMemo(TOK_E_CODEPRE); } "if" { BaMemo(TOK_IF); BufInit(&buf_if); } "macro" { BaMemo(TOK_MACRO);} "expand" { BaMemo(TOK_EXPAND);} "html" { BaMemo(TOK_HTML); } "latex" { BaMemo(TOK_LATEX); } "t1" { BaMemo(TOK_T1); BufInit(&buf_tit); etat_titre = 1; } "t2" { BaMemo(TOK_T2); BufInit(&buf_tit); etat_titre = 2; } "t3" { BaMemo(TOK_T3); BufInit(&buf_tit); etat_titre = 3; } "t4" { BaMemo(TOK_T4); BufInit(&buf_tit); etat_titre = 4; } "/t"[1-4] { BaMemo(TOK_E_TIT); } "tit-b" { BaMemo(TOK_TIT_B); } "tit-c" { BaMemo(TOK_TIT_C); } "tit-d" { BaMemo(TOK_TIT_D); } "c" { BaMemo(TOK_CODE); } "/c" { BaMemo(TOK_E_CODE); } "i" { BaMemo(TOK_ITALIC); } "/i" { BaMemo(TOK_E_ITALIC); } "b" { BaMemo(TOK_BOLD); } "/b" { BaMemo(TOK_E_BOLD); } "sup" { BaMemo(TOK_SUP); } "/sup" { BaMemo(TOK_E_SUP); } "sub" { BaMemo(TOK_SUB); } "/sub" { BaMemo(TOK_E_SUB); } "center" { BaMemo(TOK_CENTER); } "/center" { BaMemo(TOK_E_CENTER); } "nbsp" { BaMemo(TOK_NBSP); } "-" { BaMemo(TOK_CESURE); } "sloppy" { BaMemo(TOK_SLOPPY); } "p" { BaMemo(TOK_P); } "br" { BaMemo(TOK_BR); } "ul" { BaMemo(TOK_UL); } "/ul" { BaMemo(TOK_E_UL); } "ol" { BaMemo(TOK_OL); } "/ol" { BaMemo(TOK_E_OL); } "li" { BaMemo(TOK_LI); } "/li" { BaMemo(TOK_E_LI); } "a" { BaMemo(TOK_A); } "/a" { BaMemo(TOK_E_A); } "a-url-str" { BaMemo(TOK_A_URL_STR); } "a-ref-str" { BaMemo(TOK_A_REF_STR); } "a-refn" { BaMemo(TOK_A_REFN); } "a-reft" { BaMemo(TOK_A_REFT); } "a-refnt" { BaMemo(TOK_A_REFNT); } "split-html" { BaMemo(TOK_SPLIT_HTML); } "img" { BaMemo(TOK_IMG); } "=" { BaMemo(TOK_EQUAL); } "refn" { BaMemo(TOK_REFN); } "reft" { BaMemo(TOK_REFT); } "filec" { BaMemo(TOK_FILEC); } "run" { BaMemo(TOK_RUN); } "tabmat" { BaMemo(TOK_TABMAT); } "tabmat-b" { BaMemo(TOK_TABMAT_B); } "short" { BaMemo(TOK_SHORT); } "long" { BaMemo(TOK_LONG); } "chap" { BaMemo(TOK_CHAP); } "include" { BaMemo(TOK_INCLUDE); } "bocal" { BaMemo(TOK_BOCAL); } "/bocal" { BaMemo(TOK_E_BOCAL); } "/bocal-b" { BaMemo(TOK_E_BOCAL_B); } "echo" { BaMemo(TOK_ECHO); } "$thecur" { BaSubsti(TOK_THECUR); } "$thenext" { BaSubsti(TOK_THENEXT); } "$theprev" { BaSubsti(TOK_THEPREV); } "$thecurt1" { BaSubsti(TOK_THECURT1); } "$thenextt1" { BaSubsti(TOK_THENEXTT1); } "$theprevt1" { BaSubsti(TOK_THEPREVT1); } "$thecurt2" { BaSubsti(TOK_THECURT2); } "$thenextt2" { BaSubsti(TOK_THENEXTT2); } "$theprevt2" { BaSubsti(TOK_THEPREVT2); } {MOTBAL} { BaMemo(TOK_MOTBAL); } {CHAINE} { BaMemo(TOK_CHAINE); } ">" { /* Fin de la balise */ BaEtats(); BaParse(); BaFree(); if (etat_verb != E_OFF) BEGIN(VERB); else if (etat_lang != E_OFF) BEGIN(LANG); else if (etat_copre != E_OFF) BEGIN(CODEPRE); else if (etat_if != E_OFF) BEGIN(IF); else if (etat_macro != 0) BEGIN(MACRO); else if (etat_titre != 0) BEGIN(TITRE); else BEGIN(INITIAL); } [\n\t ]+ { /* Séparateurs */ } . { /* Interdit tout autre caractère */ Erreur("char '%s' unexpected", yytext); } } { "" { /* Fin du mode verb */ VbParse(&buf_verb); BufFree(&buf_verb); BEGIN(INITIAL); etat_verb = E_OFF; } .|\n { /* Mémorise tout autre caractère */ BufMemo(&buf_verb); } } { [\t ]*"" { /* Fin du mode codepre */ CoParse(&buf_copre); BufFree(&buf_copre); BEGIN(INITIAL); etat_copre = E_OFF; } \t { /* Remplace tabs par espaces */ BufTabsToSpaces(&buf_copre); } .|\n { /* Mémorise tout autre caractère */ BufMemo(&buf_copre); } } { "" { /* Fin du mode lang */ LaParse(&buf_lang); BufFree(&buf_lang); BEGIN(INITIAL); etat_lang = E_OFF; } \t { /* Remplace tabs par espaces */ BufTabsToSpaces(&buf_lang); } .|\n { /* Mémorise tout autre caractère */ BufMemo(&buf_lang); } } { "" { /* Fin du mode if */ IfParse(&buf_if); BufFree(&buf_if); BEGIN(INITIAL); etat_if = E_OFF; } .|\n { /* Mémorise tout autre caractère */ BufMemo(&buf_if); } } { "" { /* Fin du mode macro */ BEGIN(INITIAL); etat_macro = E_OFF; } .|\n { /* Mémorise tout autre caractère */ if (etat_passe == E_FIRST) BufMemo(buf_macro_ptr); } } { "" { /* Fin du mode titre */ TitParse(&buf_tit); BufFree(&buf_tit); BEGIN(INITIAL); etat_titre = 0; } .|\n { /* Mémorise tout autre caractère */ BufMemo(&buf_tit); } } <> { if ( --inc_stack_count < 0 ) yyterminate(); else { fclose (yyin); yy_delete_buffer (YY_CURRENT_BUFFER); yy_switch_to_buffer( inc_stack[inc_stack_count].state ); yylineno = inc_stack[inc_stack_count].lineno; } } %% /*----------------------------- D I V E R S -----------------------------*/ void Erreur (const char *format, ...) { va_list ap; int res; fprintf (stderr, "%s:%d: ", inc_stack_count > 0 ? inc_stack[inc_stack_count-1].name : file_in, yylineno); va_start (ap, format); res = vfprintf (stderr, format, ap); fflush (stderr); va_end (ap); fprintf (stderr, "\n"); exit(1); } void BadUsage (const char *s) { fprintf (stderr, "Error: bad usage, %s\n", s); exit(1); } void InitPasse (int passe) { etat_passe = passe; tit_recount = -1; inc_stack_count = 0; yylineno = 1; if (passe == E_HTML && split_html) InitSplitHtml(); } /*---------- M E M O R I S A T I O N D ' U N E B A L I S E ----------*/ void BaInit () { ba_count = 0; } void BaFree () { int i; for (i = 0; i < ba_count; i++) free (ba_str[i]); } void BaMemo (int tok) { if (ba_count >= BA_MAX) Erreur("too many arguments in tag"); if (yyleng > 0 && yytext[0] == '"' && yytext[yyleng-1] == '"') { ba_str[ba_count] = malloc (yyleng-1); strncpy(ba_str[ba_count], yytext+1, yyleng-2); ba_str[ba_count][yyleng-2] = 0; } else ba_str[ba_count] = strdup(yytext); ba_tok[ba_count] = tok; ba_count++; } void BaMemoChaine (char *s) { if (ba_count >= BA_MAX) Erreur("too many arguments in tag"); ba_str[ba_count] = strdup(s); ba_tok[ba_count] = TOK_CHAINE; ba_count++; } /*----------------------- S U B S T I T U T I O N -----------------------*/ void BaSubsti (int tok) { switch (tok) { case TOK_THECUR : if (tit_recount < 0) BaMemoChaine(""); else BaMemoChaine(tit_tab[tit_recount].label); break; case TOK_THENEXT : if (tit_recount < 0 || tit_recount >= tit_count-1) BaMemoChaine(""); else BaMemoChaine(tit_tab[tit_recount+1].label); break; case TOK_THEPREV : if (tit_recount < 1) BaMemoChaine(""); else BaMemoChaine(tit_tab[tit_recount-1].label); break; case TOK_THECURT1 : { int i, trouve = 0; for (i = tit_recount; i >= 0; i--) if (tit_tab[i].niv == 1) { trouve = 1; break; } BaMemoChaine(trouve ? tit_tab[i].label : ""); } break; case TOK_THENEXTT1 : { int i, trouve = 0; for (i = tit_recount+1; i >= 0 && i < tit_count; i++) if (tit_tab[i].niv == 1) { trouve = 1; break; } BaMemoChaine(trouve ? tit_tab[i].label : ""); } break; case TOK_THEPREVT1 : { int i, trouve = 0; for (i = tit_recount; i >= 0; i--) if (tit_tab[i].niv == 1) { if (++trouve == 2) break; } BaMemoChaine(trouve == 2 ? tit_tab[i].label : ""); } break; case TOK_THECURT2 : { int i, trouve = 0; for (i = tit_recount; i >= 0; i--) if (tit_tab[i].niv <= 2) { trouve = 1; break; } BaMemoChaine(trouve ? tit_tab[i].label : ""); } break; case TOK_THENEXTT2 : { int i, trouve = 0; for (i = tit_recount+1; i >= 0 && i < tit_count; i++) if (tit_tab[i].niv <= 2) { trouve = 1; break; } BaMemoChaine(trouve ? tit_tab[i].label : ""); } break; case TOK_THEPREVT2 : { int i, trouve = 0; for (i = tit_recount; i >= 0; i--) if (tit_tab[i].niv <= 2) { if (++trouve == 2) break; } BaMemoChaine(trouve == 2 ? tit_tab[i].label : ""); } break; } } /*--------------- A N A L Y S E D ' U N E B A L I S E ---------------*/ void BaEtats () { if (ba_count < 1) return; switch (ba_tok[0]) { case TOK_VERB : if (ba_count != 1) Erreur (" no argument expected"); etat_verb = E_ON; break; case TOK_LANG : if (ba_count != 2) Erreur (" argument missing"); switch (ba_tok[1]) { case TOK_HTML : etat_lang = E_HTML; break; case TOK_LATEX : etat_lang = E_LATEX; break; default : Erreur (" unexpected", ba_str[1]); } break; case TOK_CODEPRE : if (ba_count > 2) Erreur (" too many arguments"); etat_copre = E_ON; break; case TOK_IF : if (ba_count < 2) { etat_if = E_ON; break; } switch (ba_tok[1]) { case TOK_HTML : etat_if = E_HTML; break; case TOK_LATEX : etat_if = E_LATEX; break; default : Erreur (" unexpected", ba_str[1]); } break; case TOK_MACRO : if (ba_count < 2) Erreur (" argument missing"); etat_macro = E_ON; break; } } void BaParse () { if (ba_count < 1) return; if (etat_passe == E_FIRST) { switch (ba_tok[0]) { case TOK_T1 : AddTitre(1); break; case TOK_T2 : AddTitre(2); break; case TOK_T3 : AddTitre(3); break; case TOK_T4 : AddTitre(4); break; case TOK_INCLUDE : InclureFichier(); break; case TOK_MACRO : MacroInit (); break; case TOK_SPLIT_HTML : split_html = 1; break; } } else if (etat_passe == E_HTML) { switch (ba_tok[0]) { case TOK_T1 : case TOK_T2 : case TOK_T3 : case TOK_T4 : DebutTitAHtml(); break; case TOK_TIT_B : DebutTitBHtml(); break; case TOK_TIT_C : DebutTitCHtml(); break; case TOK_TIT_D : DebutTitDHtml(); break; case TOK_E_TIT : FinTitHtml(); break; case TOK_REFN : RefNumHtml(); break; case TOK_REFT : RefTitHtml(); break; case TOK_FILEC : FileC_Run_Html(); break; case TOK_RUN : Run_Html(); break; case TOK_TABMAT : TabMatAHtml(); break; case TOK_TABMAT_B : TabMatBHtml(); break; case TOK_INCLUDE : InclureFichier(); break; case TOK_EXPAND : ExpandMacroBa(); break; case TOK_BOCAL : DebutDocHtml(); break; case TOK_E_BOCAL : FinDocAHtml(); break; case TOK_E_BOCAL_B : FinDocBHtml(); break; case TOK_CODE : Tputs( "" ); break; case TOK_E_CODE : Tputs( "" ); break; case TOK_ITALIC : Tputs( "" ); break; case TOK_E_ITALIC : Tputs( "" ); break; case TOK_BOLD : Tputs( "" ); break; case TOK_E_BOLD : Tputs( "" ); break; case TOK_NBSP : Tputs( " " ); break; case TOK_CESURE : /* ignoré */ break; case TOK_SLOPPY : /* ignoré */ break; case TOK_P : Tputs( "

\n\n" ); break; case TOK_BR : Tputs( "
\n\n"); break; case TOK_UL : Tputs( "

    " ); break; case TOK_E_UL : Tputs( "
" ); break; case TOK_OL : Tputs( "
    " ); break; case TOK_E_OL : Tputs( "
" ); break; case TOK_LI : Tputs( "
  • " ); break; case TOK_E_LI : Tputs( "
  • " ); break; case TOK_SUP : Tputs( ""); break; case TOK_E_SUP : Tputs( ""); break; case TOK_SUB : Tputs( ""); break; case TOK_E_SUB : Tputs( ""); break; case TOK_CENTER : Tputs( "
    "); break; case TOK_E_CENTER : Tputs( "
    "); break; case TOK_CODEPRE : CodePreDebHtml(); break; case TOK_E_CODEPRE : CodePreFinHtml(); break; case TOK_IMG : RecopieHtml(); break; case TOK_A : RecopieHtml(); break; case TOK_E_A : Tputs( ""); break; case TOK_A_URL_STR : A_UrlStr_Html(); break; case TOK_A_REF_STR : A_RefStr_Html(); break; case TOK_A_REFN : case TOK_A_REFT : case TOK_A_REFNT : A_RefNT_Html(); break; case TOK_ECHO : EchoBaHtml(); break; /* On ne fait rien */ case TOK_VERB : break; case TOK_LANG : break; case TOK_IF : break; case TOK_MACRO : break; case TOK_SPLIT_HTML : break; default : Erreur ("token <%s> unexpected", ba_str[0]); } } else if (etat_passe == E_LATEX) { switch (ba_tok[0]) { case TOK_T1 : case TOK_T2 : case TOK_T3 : case TOK_T4 : DebutTitALatex(); break; case TOK_TIT_B : DebutTitBLatex(); break; case TOK_E_TIT : FinTitLatex(); break; case TOK_REFN : RefNumLatex(); break; case TOK_REFT : RefTitLatex(); break; case TOK_FILEC : FileC_Run_Latex(); break; case TOK_RUN : Run_Latex(); break; case TOK_TABMAT : TabMatALatex(); break; case TOK_TABMAT_B : TabMatBLatex(); break; case TOK_INCLUDE : InclureFichier(); break; case TOK_EXPAND : ExpandMacroBa(); break; case TOK_BOCAL : DebutDocLatex(); break; case TOK_E_BOCAL : FinDocLatex(); break; case TOK_CODE : Tputs( "{\\tt "); break; case TOK_E_CODE : Tputs( "}" ); break; case TOK_ITALIC : Tputs( "{\\it "); break; case TOK_E_ITALIC : Tputs( "}" ); break; case TOK_BOLD : Tputs( "{\\bf "); break; case TOK_E_BOLD : Tputs( "}" ); break; case TOK_NBSP : Tputs( "~" ); break; case TOK_CESURE : Tputs( "\\-" ); break; case TOK_SLOPPY : Tputs( "\\sloppy" ); break; case TOK_P : Tputs( "\n\n" ); break; case TOK_BR : Tputs( "\\\\\n"); break; case TOK_UL : Tputs ("\\begin{itemize} " "\\topsep=0mm \\itemsep=0mm"); break; case TOK_E_UL : Tputs ("\\end{itemize}"); break; case TOK_OL : Tputs ("\\begin{enumerate} " "\\topsep=0mm \\itemsep=0mm"); break; case TOK_E_OL : Tputs ("\\end{enumerate}"); break; case TOK_LI : Tputs ("\n\\item "); break; case TOK_E_LI : Tputs ("\n"); break; case TOK_SUP : Tputs( "$^{\\mbox{\\scriptsize "); break; case TOK_E_SUP : Tputs( "}}$"); break; case TOK_SUB : Tputs( "$_{\\mbox{\\scriptsize "); break; case TOK_E_SUB : Tputs( "}}$"); break; case TOK_CENTER : Tputs( "\\begin{center}"); break; case TOK_E_CENTER : Tputs( "\\end{center}"); break; case TOK_CODEPRE : CodePreDebLatex(); break; case TOK_E_CODEPRE : CodePreFinLatex(); break; case TOK_A_URL_STR : A_UrlStr_Latex(); break; case TOK_A_REF_STR : A_RefStr_Latex(); break; case TOK_A_REFN : case TOK_A_REFT : case TOK_A_REFNT : A_RefNT_Latex(); break; case TOK_ECHO : EchoBaLatex(); break; /* On ne fait rien */ case TOK_IMG : break; case TOK_A : break; case TOK_E_A : break; case TOK_VERB : break; case TOK_LANG : break; case TOK_IF : break; case TOK_MACRO : break; case TOK_SPLIT_HTML : break; default : Erreur ("token <%s> unexpected", ba_str[0]); } } } /*-------------- M E M O R I S A T I O N D E T E X T E --------------*/ void BufInit (Buf_string *buf) { buf->len = 0; buf->max = 1024; buf->str = malloc (buf->max); if (buf->str == NULL) Erreur ("malloc(%d)", buf->max); buf->str[0] = 0; } void BufFree (Buf_string *buf) { free (buf->str); buf->str = NULL; buf->max = buf->len = 0; } void BufMemo (Buf_string *buf) { BufMemoStr (buf, yytext, yyleng); } void BufMemoStr (Buf_string *buf, char *str, int len) { /* Gestion mémoire */ if (buf->len + len + 16 > buf->max) { buf->max = buf->len + len + 1000; buf->str = realloc (buf->str, buf->max); if (buf->str == NULL) Erreur ("realloc(%d)", buf->max); } /* Concaténation */ strcat (buf->str + buf->len, str); buf->len += len; } void BufTabsToSpaces (Buf_string *buf) { int i, trouve = 0; char blancs[] = " "; for (i = buf->len-1; i >= 0; i--) if (buf->str[i] == '\n') { trouve = 1; break; } if (!trouve) { UnputStr(" "); return; } blancs[ 8 - (buf->len-i-1)%8 ] = 0; UnputStr(blancs); } /* Saute la première ligne si elle est vide et renvoie la position du premier caractère de la ligne suivante */ char *BufNextLine (Buf_string *buf) { int i, trouve = 0; for (i = 0; i < buf->len; i++) { if (buf->str[i] == '\n') { trouve = 1; break; } if (buf->str[i] == '\t' || buf->str[i] == ' ') continue; break; /* Autre caractère -> la ligne n'est pas vide */ } return (trouve) ? buf->str+i+1 : buf->str; } /*-------------------- A N A L Y S E D U V E R B --------------------*/ void VbParse (Buf_string *buf) { if (etat_verb == E_ON) { /* Les balises boc ne sont pas interprétées ; les caractères sont traduits en html ou en latex */ if (etat_passe == E_HTML) TransStrHtml(buf->str); else if (etat_passe == E_LATEX) TransStrLatex(buf->str); } } /*-------------------- A N A L Y S E D U L A N G --------------------*/ void LaParse (Buf_string *buf) { if (etat_lang == etat_passe && (etat_passe == E_HTML || etat_passe == E_LATEX) ) { /* Rien n'est interprété, les caractères ne sont pas traduits ; n'apparait que dans la passe correspondante */ Tputs (buf->str); } } /*----------------- A N A L Y S E D U C O D E P R E -----------------*/ void CoParse (Buf_string *buf) { if (etat_copre == E_ON) { UnputStr("
    "); /* Les balises boc ne sont pas interprétées ; les caractères sont traduits en html mais pas en latex */ if (etat_passe == E_HTML) TransStrHtml(BufNextLine(buf)); else if (etat_passe == E_LATEX) Tputs(buf->str); } } /*---------------------- A N A L Y S E D U I F ----------------------*/ void IfParse (Buf_string *buf) { if ( etat_if == etat_passe && (etat_passe == E_HTML || etat_passe == E_LATEX) ) { UnputStr(buf->str); } } /*----------- M E M O R I S A T I O N D ' U N E M A C R O -----------*/ int MacroFind (char *cle) { int i; if (cle == NULL || cle[0] == 0) return -1; for (i = 0; i < liste_macro_count; i++) if (strcasecmp (cle, liste_macro[i].cle) == 0) return i; return -1; } void MacroInit () { int i; if (ba_count < 2) Erreur (" argument expected"); i = MacroFind(ba_str[1]); if (i < 0) { if (liste_macro_count >= LISTE_MACRO_MAX) Erreur ("too many macros"); i = liste_macro_count++; } else { BufFree(&liste_macro[i].buf); } strncpy (liste_macro[i].cle, ba_str[1], CLE_MACRO_LEN); BufInit(&liste_macro[i].buf); buf_macro_ptr = &liste_macro[i].buf; } void MacroMemoStr (char *cle, char *str) { int i = MacroFind(cle); if (i < 0) { if (liste_macro_count >= LISTE_MACRO_MAX) Erreur ("too many macros"); i = liste_macro_count++; } else { BufFree(&liste_macro[i].buf); } strncpy (liste_macro[i].cle, cle, CLE_MACRO_LEN); BufInit(&liste_macro[i].buf); BufMemoStr(&liste_macro[i].buf, str, strlen(str)); } void ExpandMacroBa () { if (ba_count < 2) Erreur (" argument expected"); if (ExpandMacroStr(ba_str[1]) < 0) Erreur (" bad macro name", ba_str[1]); } int ExpandMacroStr (char *cle) /* silencieux */ { int i = MacroFind(cle); // printf ("Expand AAA %s BBB cle %d CCC\n", cle, i); if (i < 0) return -1; UnputStr(liste_macro[i].buf.str); return 0; } void AffiMacros () { int i; for (i = 0; i < liste_macro_count; i++) printf ("MACRO %d :\n%s\n\n", i, liste_macro[i].cle, liste_macro[i].buf.str); } /*------------------ M A C R O S P A R D E F A U T ------------------*/ void DefaultMacros () { MacroMemoStr ("title", "No title"); MacroMemoStr ("body-html", "\n\n" "\n" "\n" ); MacroMemoStr ("style-css-html", "\n" "\n" "\n" ); MacroMemoStr ("begin-doc-html", "\n\n" "\n" "\n" "\n" "\n" "\n" "\n" "</lang><expand title><lang html>\n" "\n" "\n" "\n" "\n" "\n" ); MacroMemoStr ("end-doc-html", "\n\n" "\n" "\n" "\n" ); MacroMemoStr ("begin-split-html", "\n\n" "\n" "\n" "\n" "\n" "\n" "\n" "</lang><expand title> : <reft $thecur><lang html>\n" "\n" "\n" "\n" "\n" "\n" ); MacroMemoStr ("end-split-html", "" ); MacroMemoStr ("begin-t1-html", "" ); MacroMemoStr ("end-t1-html", "" ); MacroMemoStr ("begin-t2-html", "" ); MacroMemoStr ("begin-doc-latex", "\n\n" "\\documentclass[11pt]{book}\n" "\\usepackage[english,francais]{babel}\n" "% Pour changer de langue: \\selectlanguage{english} \n" "\\usepackage[latin1]{inputenc}\n" " \\topmargin 0 cm\n" " \\textheight 22.5 cm\n" " \\oddsidemargin 0.5 cm\n" " \\evensidemargin 0 cm\n" " \\textwidth 15 cm\n" " \\parindent 0 cm\n" " \\parskip 2 mm\n" " \\pagestyle{headings}\n" "\\begin{document}\n" "\\def\\labelitemi{$\\triangleright$}\n" "\n" ); MacroMemoStr ("end-doc-latex", "\n\n" "\\end{document}\n" "\n" ); MacroMemoStr ("begin-t1-latex", "\n\n" "%\\bigskip(Emplacement pour table des matières du chapitre)\\bigskip\n" "\n" ); } /*--------------------------- D O C U M E N T ---------------------------*/ void DebutDocHtml () { ExpandMacroStr("begin-doc-html"); } void FinDocAHtml () { // printf ("FinDocAHtml()\n"); UnputStr(""); /* bug fixed 9 april 2009, was */ if (tit_recount > 0) { if (split_html) ExpandMacroStr("end-split-html"); ExpandMacroStr("end-t1-html"); } } void FinDocBHtml () { // printf ("FinDocBHtml()\n"); if (tit_recount > 0 && split_html) FinSplitHtml(); ExpandMacroStr("end-doc-html"); } void DebutDocLatex () { ExpandMacroStr("begin-doc-latex"); } void FinDocLatex () { ExpandMacroStr("end-doc-latex"); if (tit_recount > 0) ExpandMacroStr("end-t1-latex"); } /*----------------------------- T I T R E S -----------------------------*/ void AddTitre (int niv) { int k; char bla[80]; /* Mémorisation du niveau */ tit_tab[tit_count].niv = niv; /* Numérotation */ if (tit_count == 0) { if (niv != 1) Erreur (" expected"); tit_tab[tit_count].t[1] = 1; for (k = 2; k <= 4; k++) tit_tab[tit_count].t[k] = 0; } else { for (k = 1; k < niv; k++) tit_tab[tit_count].t[k] = tit_tab[tit_count-1].t[k]; tit_tab[tit_count].t[niv] = tit_tab[tit_count-1].t[niv]+1; for (k = niv+1; k <= 4; k++) tit_tab[tit_count].t[k] = 0; } /* Mémorisation du numéro */ sprintf (bla, "%d.", tit_tab[tit_count].t[1]); for (k = 2; k <= 4; k++) { if (tit_tab[tit_count].t[k]) sprintf (bla, "%s%d.", bla, tit_tab[tit_count].t[k]); else break; } tit_tab[tit_count].num = strdup(bla); /* Mémorisation du label */ if (ba_count > 1) tit_tab[tit_count].label = strdup(ba_str[1]); else { sprintf (bla, "sec-%d", tit_tab[tit_count].t[1]); for (k = 2; k <= 4; k++) { if (tit_tab[tit_count].t[k]) sprintf (bla, "%s-%d", bla, tit_tab[tit_count].t[k]); else break; } tit_tab[tit_count].label = strdup(bla); } /* Le titre est mémorisé dans TitParse() */ } void DebutTitAHtml () { int n = tit_tab[tit_recount+1].niv; /* ACHTUNG +1 */ UnputStr(""); if (n == 1 && tit_recount+1 > 0) { if (split_html) ExpandMacroStr("end-split-html"); ExpandMacroStr("end-t1-html"); } } void DebutTitBHtml () { /* Ça y est, on change de section */ int n = tit_tab[++tit_recount].niv; /* ACHTUNG ++ */ if (n == 1 && split_html) { if (tit_recount > 0) FinSplitHtml(); DebutSplitHtml(tit_tab[tit_recount].t[1]); } UnputStr(""); if (n == 1 && split_html) ExpandMacroStr("begin-split-html"); } void DebutTitCHtml () { int n = tit_tab[tit_recount].niv; Tprintf( "\n\n\n", tit_tab[tit_recount].label); UnputStr(""); if (n == 1) ExpandMacroStr("begin-t1-html"); else if (n == 2) ExpandMacroStr("begin-t2-html"); } void DebutTitDHtml () { Tprintf( "\n %s ", tit_tab[tit_recount].niv, tit_tab[tit_recount].num); } void FinTitHtml () { Tprintf( "\n\n", tit_tab[tit_recount].niv); } void DebutTitALatex () { int n = tit_tab[++tit_recount].niv; UnputStr(""); if (n == 1 && tit_recount > 0) ExpandMacroStr("end-t1-latex"); } void DebutTitBLatex () { int n = tit_tab[tit_recount].niv; Tprintf( "\n\n\\%s{", n == 1 ? "chapter" : n == 2 ? "section" : n == 3 ? "subsection" : "subsubsection"); } void FinTitLatex () { int n = tit_tab[tit_recount].niv; Tprintf( "}\n\\label{%s}\n\n", tit_tab[tit_recount].label); if (n == 1) ExpandMacroStr("begin-t1-latex"); else if (n == 2) ExpandMacroStr("begin-t2-latex"); } void TitParse (Buf_string *buf) { /* buf contient le titre et yytext contient */ if (etat_passe == E_FIRST) { tit_tab[tit_count].titre = buf->str == NULL ? empty_str : strdup(buf->str); tit_count++; } else { /* On remet la balise finale, qui sera lue en mode INITIAL, et aboutira dans BaParse() sur TOK_E_T[1-4]. Attention, appeler UnputStr dans l'ordre inverse. */ UnputStr(yytext); UnputStr(buf->str); } } /*------------------------- R E F E R E N C E S -------------------------*/ int FindRefBa () { if (ba_count < 2) return -1; return FindRefStr(ba_str[1]); } int FindRefStr (char *s) { int i; for (i = 0; i < tit_count; i++) if (strcasecmp(s, tit_tab[i].label) == 0) return i; return -1; } void RefNumHtml () { int i = FindRefBa(); if (i < 0) Tputs("?? "); else Tprintf("%s", tit_tab[i].num); } void RefNumLatex () { if (ba_count < 2) Tputs("\\ref{undefined-boc-ref}"); else { Tputs("\\ref{"); Tputs(ba_str[1]); Tputs("}"); } } void RefTitHtml () { int i = FindRefBa(); if (i < 0) Tputs("?? "); else UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ } void RefTitLatex () { int i = FindRefBa(); if (i < 0) Tputs(" {\\bf ??} "); else UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ } /*----------------------------- D I V E R S -----------------------------*/ void RecopieHtml () { int i; Tputc('<'); for (i = 0; i < ba_count; i++) { if (ba_tok[i] == TOK_CHAINE) Tputc('"'); Tputs(ba_str[i]); if (ba_tok[i] == TOK_CHAINE) Tputc('"'); if (i < ba_count-1) Tputc(' '); } Tputc('>'); } /*---------------------------- B A L I S E S ----------------------------*/ void A_UrlStr_Html () { int n; if (ba_count != 3) Erreur(" 2 arguments expected"); n = strlen(ba_str[1]); if (n > 0) Tprintf("", ba_str[1]); TransStrHtml(ba_str[2]); if (n > 0) Tputs(" "); } void A_UrlStr_Latex () { if (ba_count != 3) Erreur(" 2 arguments expected"); TransStrLatex(ba_str[2]); } void A_RefStr_Html () { int i; if (ba_count != 3) Erreur(" 2 arguments expected"); i = FindRefStr(ba_str[1]); if (i >= 0) Tprintf("", NameSplitHtml(tit_tab[i].t[1]), tit_tab[i].label); TransStrHtml(ba_str[2]); if (i >= 0) Tputs(" "); } void A_RefStr_Latex () { if (ba_count != 3) Erreur(" 2 arguments expected"); TransStrLatex(ba_str[2]); } void A_RefNT_Html () { int i; if (ba_count != 2) Erreur("<%s> 1 argument expected", ba_str[0]); i = FindRefStr(ba_str[1]); if (i < 0) Tputs("?? "); else { Tprintf("", NameSplitHtml(tit_tab[i].t[1]), tit_tab[i].label); switch (ba_tok[0]) { case TOK_A_REFN : Tprintf("%s", tit_tab[i].num); break; case TOK_A_REFT : UnputStr(""); UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ break; case TOK_A_REFNT : Tprintf("%s ", tit_tab[i].num); UnputStr(""); UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ break; } } } void A_RefNT_Latex () { int i; if (ba_count != 2) Erreur("<%s> 1 argument expected", ba_str[0]); i = FindRefStr(ba_str[1]); if (i < 0) Tputs(" {\\bf ??} "); else { switch (ba_tok[0]) { case TOK_A_REFN : Tprintf("\\ref{%s} ", tit_tab[i].label); break; case TOK_A_REFT : UnputStr(""); UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ break; case TOK_A_REFNT : Tprintf("\\ref{%s} ", tit_tab[i].label); UnputStr(""); UnputStr(tit_tab[i].titre); /* Reprocesser le titre */ break; } } } /*--------------------------- E C H O B A -----------------------------*/ void EchoBaHtml () { int i; for (i = 1; i < ba_count; i++) { TransStrHtml (ba_str[i]); Tputc(' '); } } void EchoBaLatex () { int i; for (i = 1; i < ba_count; i++) { TransStrLatex (ba_str[i]); Tputc(' '); } } /*------------------------------ S P L I T ------------------------------*/ void InitSplitHtml () { int i; /* Suppression de l'extension */ strncpy (split_fbase, file_out, 256); for (i = strlen(split_fbase); i >= 0; i--) if (split_fbase[i] == '.') { split_fbase[i] = 0; break; } } char *NameSplitHtml (int chap) { static char nom[256]; if (chap == 0 || split_html == 0) return file_out; sprintf (nom, "%s-%d.html", split_fbase, chap); return nom; } void DebutSplitHtml (int chap) { split_old_fd = yyout; yyout = fopen (NameSplitHtml(chap), "w"); } void FinSplitHtml () { fclose(yyout); yyout = split_old_fd; } /*----------------- T A B L E D E S M A T I E R E S -----------------*/ void AffiTabmat () { int i; for (i = 0; i < tit_count; i++) { printf (" %-12s %-30s %s\n", tit_tab[i].num, tit_tab[i].label, tit_tab[i].titre); } } void TabMatAHtml () { int i; if (ba_count < 4) Erreur(" 3 arguments expected"); tabmat_categ = ba_tok[1]; switch (tabmat_categ) { case TOK_SHORT : for (i = 0; i < tit_count; i++) if (tit_tab[i].niv == 1) break; tabmat_count = i; break; case TOK_LONG : tabmat_count = 0; break; case TOK_CHAP : if (ba_count < 5) Erreur(" 4 arguments expected"); strncpy (tabmat_label, ba_str[4], TABMAT_LABEL_MAX); break; default : Erreur(" syntax error", ba_str[1]); } Tprintf ("\n

    %s

    \n", ba_str[2], ba_str[3]); if (tit_count == 0) return; tabmat_niv = 0; tabmat_state = 0; UnputStr(""); } void TabMatBHtml () { int i = tabmat_count, j, k; if (tabmat_state == 0) { for (j = tabmat_niv; j < tit_tab[i].niv; j++) Tprintf ("
      \n"); tabmat_niv = tit_tab[i].niv; switch (tit_tab[i].niv) { case 1 : if (tabmat_categ == TOK_SHORT) Tprintf (""); else Tprintf ("

      "); break; case 2 : break; case 3 : break; case 4 : Tprintf (""); break; } Tprintf ("%s ", tit_tab[i].num, NameSplitHtml(tit_tab[i].t[1]), tit_tab[i].label); UnputStr(""); UnputStr(tit_tab[i].titre); tabmat_state = 1; } else { Tprintf (""); switch (tit_tab[i].niv) { case 1 : if (tabmat_categ == TOK_SHORT) Tprintf ("
      \n"); else Tprintf ("

      \n"); break; case 2 : Tprintf ("
      \n"); break; case 3 : Tprintf ("
      \n"); break; case 4 : Tprintf ("

      \n"); break; } switch (tabmat_categ) { case TOK_SHORT : for ( ++i; i < tit_count; i++) if (tit_tab[i].niv == 1) break; break; case TOK_LONG : i++; break; case TOK_CHAP : break; } k = (i < tit_count) ? tit_tab[i].niv : 0; for (j = tabmat_niv; j > k; j--) Tprintf ("

    \n"); if (i < tit_count) UnputStr(""); tabmat_count = i; tabmat_state = 0; } } void TabMatALatex () { if (ba_count < 4) Erreur(" 3 arguments expected"); tabmat_categ = ba_tok[1]; switch (tabmat_categ) { case TOK_SHORT : break; case TOK_LONG : Tprintf ("\n\\newpage\\tableofcontents\\newpage\n\n"); break; case TOK_CHAP : break; default : Erreur(" syntax error", ba_str[1]); } } void TabMatBLatex () { } /*---------------------------- C O D E P R E ----------------------------*/ void CodePreDebHtml () { // char *coulfond = "#d0ffe0"; // // Tprintf ("" // "
    ",coulfond);
    	Tprintf ("
    ",
    	    ba_count == 1 ? "codedef" : ba_str[1]);
        }
        
        void CodePreFinHtml ()
        {
    //	Tputs( "
    \n"); Tputs( "\n"); } void CodePreDebLatex () { Tputs( "\\vspace{-1mm}\\begin{verbatim}"); } void CodePreFinLatex () { Tputs( "\\end{verbatim}\\vspace{-1mm}"); } /*-------------------------- F I L E C R U N --------------------------*/ char *PathBeforeStr (char *fullpath, char *str) { static char res[256]; char *tmp; if (fullpath == NULL || str == NULL) return empty_str; strncpy (res, fullpath, 255); res[255] = 0; tmp = strstr (res, str); if (tmp == NULL) return empty_str; tmp[0] = 0; /* printf ("fullpath = \"%s\" str = \"%s\" res = \"%s\"\n", fullpath, str, res); */ return res; } void FileC_Run_Html() { char *titre; FILE *fd; int lideb = 0, lifin = -1, nli = 0; if (ba_count < 2) Erreur("<%s> argument(s) expected", ba_str[0]); /* Suppression des "../" disgracieux dans le titre */ titre = ba_str[1]; while (strncmp (titre, "../", 3) == 0) titre += 3; if (ba_count > 2) { if (ba_tok[2] == TOK_CHAINE && ba_count == 3) { lideb = atoi(ba_str[2]); } else if (ba_tok[2] == TOK_CHAINE && ba_count == 4 && ba_tok[3] == TOK_CHAINE) { lideb = atoi(ba_str[2]); lifin = atoi(ba_str[3]); } else Erreur("<%s> syntax error", ba_str[0]); } Tprintf ("

    \n"); Tprintf ("\n", ba_str[1], titre); Tprintf ("
    ");
            
            fd = fopen (ba_str[1], "r");
            if (fd == NULL) 
                fprintf (stderr, "ERREUR de lecture du fichier \"%s\"\n", ba_str[1]);
            else {
                char bla[4+256] = "            ";
                while (fgets(bla+4, 256, fd) != NULL) {
                    if (nli >= lideb && (lifin == -1 || nli <= lifin)) 
                        TransStrHtml(bla);
                    nli++;
                }
                fclose(fd);
            }
    
            Tprintf ("

    \n"); } void Run_Html() { if (ba_count != 2) Erreur("<%s> argument expected", ba_str[0]); Tprintf ("", ba_str[1]); Tprintf ("\n", PathBeforeStr(ba_str[1], "hwe/") ); } void FileC_Run_Latex() { FILE *fd; int lideb = 0, lifin = -1, nli = 0; if (ba_count < 2) Erreur("<%s> argument(s) expected", ba_str[0]); if (ba_count > 2) { if (ba_tok[2] == TOK_CHAINE && ba_count == 3) { lideb = atoi(ba_str[2]); } else if (ba_tok[2] == TOK_CHAINE && ba_count == 4 && ba_tok[3] == TOK_CHAINE) { lideb = atoi(ba_str[2]); lifin = atoi(ba_str[3]); } else Erreur("<%s> syntax error", ba_str[0]); } Tprintf ("\n{\\small\n" "\\baselineskip=0.8\\normalbaselineskip\n" "\\begin{verbatim}\n"); fd = fopen (ba_str[1], "r"); if (fd == NULL) fprintf (stderr, "ERREUR de lecture du fichier \"%s\"\n", ba_str[1]); else { char bla[256]; while (fgets(bla, 256, fd) != NULL) { if (nli >= lideb && (lifin == -1 || nli <= lifin)) { int i, j, k, l = 0; Tputs(" "); for (i = 0; bla[i]; i++) if (bla[i] == '\t') { /* Suppression des tabs */ k = 8 - l%8; l += k; for (j = 0; j < k; j++) Tputc(' '); } else { l++; Tputc(bla[i]); } } nli++; } fclose(fd); } Tprintf ("\\end{verbatim}\n" "\\baselineskip=\\normalbaselineskip\n" "\\vspace{-2mm} \n" "}\n\n"); } void Run_Latex() { } /*-------------- I N C L U S I O N D E F I C H I E R S --------------*/ void InclureFichier () { if (ba_count < 2) Erreur(" : file name expected"); if (inc_stack_count >= MAX_INCLUDE_DEPTH) Erreur(" nested too deeply"); inc_stack[inc_stack_count].lineno = yylineno; yylineno = 1; strncpy (inc_stack[inc_stack_count].name, ba_str[1], FILE_STACK_NAME); inc_stack[inc_stack_count++].state = YY_CURRENT_BUFFER; yyin = fopen (ba_str[1], "r"); if (yyin == NULL) Erreur(" : %s", ba_str[1], strerror(errno)); yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE)); } /*----------------------- T E X T E N O R M A L -----------------------*/ void EcritMot () { switch (etat_passe) { case E_HTML : TransStrHtml(yytext); break; case E_LATEX : TransStrLatex(yytext); break; } } void EcritSlashCar () { switch (etat_passe) { case E_HTML : TransCarHtml(yytext[1]); break; case E_LATEX : TransCarLatex(yytext[1]); break; } } void EcritCar () { switch (etat_passe) { case E_HTML : TransCarHtml(yytext[0]); break; case E_LATEX : TransCarLatex(yytext[0]); break; } } /*----------- E C R I T U R E A V E C T R A D U C T I O N -----------*/ void TransStrHtml (char *s) { while (*s) TransCarHtml(*s++); } void TransStrLatex (char *s) { while (*s) TransCarLatex(*s++); } void TransCarHtml (char c) { switch (c) { case 'à' : Tputs( "à"); break; case 'â' : Tputs( "â" ); break; case 'ä' : Tputs( "ä" ); break; case 'é' : Tputs( "é"); break; case 'è' : Tputs( "è"); break; case 'ê' : Tputs( "ê" ); break; case 'ë' : Tputs( "ë" ); break; case 'î' : Tputs( "î" ); break; case 'ï' : Tputs( "ï" ); break; case 'ô' : Tputs( "ô" ); break; case 'ö' : Tputs( "ö" ); break; case 'ù' : Tputs( "ù"); break; case 'û' : Tputs( "û" ); break; case 'ü' : Tputs( "ü" ); break; case 'À' : Tputs( "À"); break; case 'Â' : Tputs( "Â" ); break; case 'Ä' : Tputs( "Ä" ); break; case 'É' : Tputs( "É"); break; case 'È' : Tputs( "È"); break; case 'Ê' : Tputs( "Ê" ); break; case 'Ë' : Tputs( "Ë" ); break; case 'Î' : Tputs( "Î" ); break; case 'Ï' : Tputs( "Ï" ); break; case 'Ô' : Tputs( "Ô" ); break; case 'Ö' : Tputs( "Ö" ); break; case 'Ù' : Tputs( "Ù"); break; case 'Û' : Tputs( "Û" ); break; case 'Ü' : Tputs( "Ü" ); break; case 'ç' : Tputs( "ç"); break; case 'Ç' : Tputs( "Ç"); break; case '<' : Tputs( "<" ); break; case '>' : Tputs( ">" ); break; case '&' : Tputs( "&" ); break; default : Tputc(c); break; } } void TransCarLatex (char c) { switch (c) { case '^' : Tputs( "\\^" ); break; case '$' : Tputs( "\\$" ); break; case '&' : Tputs( "\\&" ); break; case '%' : Tputs( "\\%" ); break; case '_' : Tputs( "\\_" ); break; case '#' : Tputs( "\\#" ); break; case '{' : Tputs( "\\{" ); break; case '}' : Tputs( "\\}" ); break; /* case '\\' : Tputs( "\\symbol{92}"); break; case '/' : Tputs( "\\symbol{47}"); break; case '<' : Tputs( "\\symbol{60}"); break; case '>' : Tputs( "\\symbol{62}"); break; */ case '\\' : Tputs( "$\\backslash$"); break; case '/' : Tputs( "$/$"); break; /* pr même aspect que \ */ case '<' : Tputs( "$<$"); break; case '>' : Tputs( "$>$"); break; case '~' : Tputs( "\\symbol{126}"); break; default : Tputc(c); break; } } /*------------------------------ U T I L E ------------------------------*/ void UnputStr (char *s) { char *tmp; int i; if (s == NULL || s[0] == 0) return; /* Fixed 16/02/2007 */ tmp = strdup(s); // printf ("Unput AAA %s BBB\n", tmp); for (i = strlen(s)-1; i >= 0; i--) unput(tmp[i]); free(tmp); } void Tputc (char c) { fputc (c, yyout); last_car_put = c; } void Tputs (char *s) { int n = strlen(s); if (n > 0) last_car_put = s[n-1]; fputs (s, yyout); } void Tprintf (const char *format, ...) { va_list ap; va_start (ap, format); vfprintf (yyout, format, ap); va_end (ap); last_car_put = '\n'; } /*---------------- P R O G R A M M E P R I N C I P A L ----------------*/ int main (int argc, char **argv) { if (argc < 2) { printf ("USAGE: %s [--index] [--macro]\n", argv[0]); printf (" [--html ] [--latex ]\n"); exit(1); } /* Initialisation générale */ file_in = argv[1]; DefaultMacros(); /* construction table des matières */ printf ("bocal: PREMIERE PASSE ...\n"); InitPasse(E_FIRST); yyin = fopen (file_in, "r"); yylex(); fclose(yyin); argc -=2; argv += 2; while (argc > 0) { if (strcmp (argv[0], "--index") == 0) { printf ("bocal: AFFICHAGE TABLE DES MATIERES ...\n"); AffiTabmat(); argc--; argv++; } else if (strcmp (argv[0], "--macro") == 0) { printf ("bocal: AFFICHAGE DES MACROS ...\n"); AffiMacros(); argc--; argv++; } else if (strcmp (argv[0], "--html") == 0) { printf ("bocal: GENERATION HTML ...\n"); if (argc < 2) BadUsage(" expected"); file_out = argv[1]; InitPasse(E_HTML); yyin = fopen (file_in, "r"); yyout = fopen (file_out, "w"); yylex(); fclose(yyin); fclose(yyout); argc -=2; argv += 2; } else if (strcmp (argv[0], "--latex") == 0) { printf ("bocal: GENERATION LATEX ...\n"); if (argc < 2) BadUsage(" expected"); file_out = argv[1]; InitPasse(E_LATEX); yyin = fopen (file_in, "r"); yyout = fopen (file_out, "w"); yylex(); fclose(yyin); fclose(yyout); argc -=2; argv += 2; } else BadUsage("option unknown"); } printf ("bocal: TERMINE.\n"); exit(0); }