#include #include #include #include #include #include #include "pagin.h" #include "permut.h" #include "nadoc.m" PUBLIC PAGIN_SGML::PAGIN_SGML() { fout = NULL; sgml_aware = false; } PUBLIC PAGIN_SGML::~PAGIN_SGML() { close(); } /* Ouvre un fichier d'output avec pagination Retourne -1 si erreur */ PUBLIC int PAGIN_SGML::openerr ( const char *fname, const char *title, const char *author, int quit) { if (fname == NULL){ fout = stdout; }else{ fout = fopen_err (fname,"w",quit); } format = PAG_FORMAT_PARA; if (title == NULL) title = fname; if (author == NULL){ author = getenv ("USER"); if (author == NULL) author = "------------------"; } ::fprintf (fout,"\n" "
\n" "%s\n" "%s\n" ,title,author); return 0; } /* Termine output dans un fichier */ PUBLIC void PAGIN_SGML::close () { if (fout != NULL){ ::fprintf (fout,"
\n"); if (fout != stdout) fclose (fout); fout = NULL; } } /* Controle le mode de formattage des paragraphe. Retourne la valeur courante. */ PUBLIC int PAGIN_SGML::set_format (int _format) { int ret = format; if (_format != format){ char *cmd = ""; if (format == PAG_FORMAT_NONE){ cmd = "\n"; }else if (format == PAG_FORMAT_QUOT){ cmd = "\n"; } ::fprintf (fout,"%s",cmd); PAGIN_V::set_format (_format); cmd = ""; if (format == PAG_FORMAT_NONE){ cmd = "\n"; }else if (format == PAG_FORMAT_QUOT){ cmd = "\n"; } ::fprintf (fout,"%s",cmd); } return ret; } /* Génère un saut de page et ajuste */ PUBLIC void PAGIN_SGML::form () { } static void paging_fputc (char car, FILE *fout, bool sgml_aware) { if (car == '&'){ ::fputs ("&",fout); }else if (car == '$'){ ::fputs ("$",fout); }else if (car == '#'){ ::fputs ("#",fout); }else if (car == '%'){ ::fputs ("%",fout); }else if (car == '~'){ ::fputs ("˜",fout); }else if (car == '"'){ ::fputs ("&dquot;",fout); }else if (!sgml_aware){ if (car == '<'){ ::fputs ("<",fout); }else if (car == '>'){ ::fputs (">",fout); }else{ fputc (car,fout); } }else{ fputc (car,fout); } } static void paging_url ( const char *file, const char *entry, FILE *fout) { ::fprintf (fout,"" ,file,entry,entry); } PUBLIC void PAGIN_SGML::fputs (const char *buf, FILE *fout) { if (format != PAG_FORMAT_PARA){ while (*buf != '\0') paging_fputc (*buf++,fout,sgml_aware); }else{ crosstbl_filter (buf,fout,paging_fputc,paging_url,sgml_aware); } } PUBLIC void PAGIN_SGML::printf ( const char *ctl, ...) { if (format == PAG_FORMAT_QUOT) fputs ("\t",fout); va_list list; va_start (list,ctl); char buf[5000]; vsnprintf (buf,sizeof(buf)-1,ctl,list); fputs (buf,fout); va_end (list); } /* fprintf avec traduction. */ PUBLIC void PAGIN_SGML::fprintf ( FILE *f, const char *ctl, ...) { va_list list; va_start (list,ctl); char buf[5000]; vsprintf (buf,ctl,list); va_end (list); fputs (buf,f); } /* Saute une ligne */ PUBLIC void PAGIN_SGML::nl () { //fputs ("

\n",fout); } /* Vérifie s'il y a au moins N lignes disponible jusqu'à la fin de la page Si pas assez, génère un saut de page. Le nombre de lignes est automatiquement ajouté. L'appelant devra affiché lui-même sans utiliser les fonctions de pagin. Le compte sera faussé sinon */ PUBLIC void PAGIN_SGML::check (int) { } /* Génère un paragraphe d'un coup en formattant ou pas. En mode SGML, on ne s'occupe pas de ca. C'est set_format qui fait tout. */ PUBLIC void PAGIN_SGML::format_paragraphe (char *buf) { if (format) ::fputs ("

\n",fout); fputs (buf,fout); fputs ("\n",fout); } /* Génère le titre d'une section. */ PUBLIC void PAGIN_SGML::format_titre ( int niveau, // Niveau de numérotation const char *secnum, // Numérotation de la section char *buf) // Titre de la section { int old_format = format; format = PAG_FORMAT_QUOT; if (niveau == 0){ ::fputs ("",fout); printf ("%s\n",buf); ::fputs ("

\n",fout); }else{ ::fprintf (fout,"",niveau); printf ("%s\n",buf); ::fputs ("

\n",fout); } format = old_format; } /* Génère l'entête d'une spécification. */ PUBLIC void PAGIN_SGML::format_spec ( const char *filespec, // Nom du fichier qui contient cette spec const char *buf) // Titre de la spec (clé de classement) { nl(); ::fputs ("

\n",fout); printf ("%s (%s)\n\n",buf,filespec); #if 0 char cle[300]; pagin_spec2hname (filespec,buf,cle); fprintf (fout,"\n",cle); fprintf (fout," %s
\n",filespec); fprintf (fout," %s\n",buf); fprintf (fout,"
\n"); nl(); #endif } /* Génère l'entête d'une fonction. */ PUBLIC void PAGIN_SGML::format_fct ( const char *fct, // Nom du fichier qui contient cette spec int premiere) // Premiere fois qu'on parle de cette fonction { ::fputs ("

\n",fout); if (premiere){ ::fprintf (fout,"

\n",fct,fct); }else{ ::fprintf (fout,"

\n",fct,fct); } nl(); } /* Génère un label */ PUBLIC void PAGIN_SGML::format_ref ( const char *ref) // Référence à encoder { ::fprintf (fout,"