#include #include #include #include #include "pagin.h" #include "permut.h" #include "nadoc.m" PUBLIC PAGIN_V::PAGIN_V() { format = 1; } PUBLIC VIRTUAL PAGIN_V::~PAGIN_V() { } /* Controle le mode de formattage des paragraphe. Retourne la valeur courante. */ PUBLIC VIRTUAL int PAGIN_V::set_format (int _format) { int ret = format; format = _format; return ret; } /* Retourne le mode courant de formattage des paragraphe. */ PUBLIC int PAGIN_V::get_format () { return format; } /* Débute une sous-section (sous liste énuméré) */ PUBLIC VIRTUAL void PAGIN_V::soussection() { } /* Termine une sous-section (sous liste énuméré) */ PUBLIC VIRTUAL void PAGIN_V::finsous() { } PUBLIC PAGIN::PAGIN() { line = 0; page = 1; gauche = 9; lenlin = 60; maxlin = 60; fout = stdout; } PUBLIC PAGIN::~PAGIN() { close(); } /* Ouvre un fichier d'output avec pagination Retourne -1 si erreur */ PUBLIC int PAGIN::openerr ( const char *fname, int quit, int _gauche, // Marge de gauche int _lenlin, // Nombre de caractères par ligne int _linpag) // Nombre de ligne par page { int ret = -1; line = 0; page = 1; gauche = _gauche; lenlin = _lenlin; maxlin = _linpag; format = 1; doclose = 1; if (fname == NULL){ fout = stdout; ret = 0; }else{ fout = fopen_err (fname,"w",quit); if(fout != NULL) ret = 0; } if (ret == 0) fprintf (fout,"\n\n"); return ret; } /* Assigne un fichier déjà ouvert au système de pagination. Retourne -1 si erreur */ PUBLIC int PAGIN::openfile ( FILE *_fout, int _gauche, // Marge de gauche int _lenlin, // Nombre de caractères par ligne int _linpag) // Nombre de ligne par page { line = 0; page = 1; gauche = _gauche; lenlin = _lenlin; maxlin = _linpag; format = 1; doclose = 0; fout = _fout; return 0; } /* Termine output dans un fichier */ PUBLIC void PAGIN::close () { if (doclose && fout != stdout) fclose (fout); } /* Génère un saut de page et ajuste */ PUBLIC void PAGIN::form () { while (line < maxlin+2){ fprintf (fout,"\n"); line++; } fprintf (fout,"%*s%3d\n\f\n\n",maxlin+gauche-3,"",page); line = 0; page++; } /* Affiche une seule ligne en décidant si on saute de page */ PUBLIC void PAGIN::printf ( const char *ctl, ...) { va_list list; va_start (list,ctl); if (line >= maxlin) form (); if (gauche > 0) fprintf (fout,"%*s",gauche,""); vfprintf (fout,ctl,list); va_end (list); line++; } /* Saute une ligne */ PUBLIC void PAGIN::nl () { if (line >= maxlin){ form (); }else{ printf ("\n"); } } /* 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::check (int nbline) { if (line + nbline >= maxlin){ form (); } line += nbline; } /* Génère un paragraphe d'un coup en formattant ou pas */ PUBLIC void PAGIN::format_paragraphe (char *buf) { if (format){ int nblp = ::format_paragraphe (NULL,buf ,gauche,lenlin); check (nblp); ::format_paragraphe (fout,buf,gauche,lenlin); }else{ /* Sortie sans formattage */ int nbl = str_countcar (buf,'\n')+1; str_exptab (buf,4,buf); check (nbl); printf ("%s\n",buf); } } /* Génère le titre d'une section. */ PUBLIC void PAGIN::format_titre ( int niveau, // Niveau de numérotation const char *secnum, // Numérotation de la section char *buf) // Titre de la section { if (niveau >= 4) secnum = ""; int nbl = ::format_titre (NULL,secnum,buf,9,lenlin,-1); check (nbl); printf (""); ::format_titre (fout,secnum,buf,9,lenlin,-1); } /* Génère l'entête d'une spécification. */ PUBLIC void PAGIN::format_spec ( const char *filespec, // Nom du fichier qui contient cette spec const char *buf) // Titre de la spec (clé de classement) { nl(); printf (" %s\n",filespec); printf (" %s\n",buf); nl(); } /* Génère l'entête d'une fonction. */ PUBLIC void PAGIN::format_fct ( const char *fct, // Nom du fichier qui contient cette spec int premiere) // Premiere fois qu'on parle de cette fonction { nl(); if (premiere){ printf (MSG_U(F_FUNCTION,"FUNCTION %s\n"),fct); }else{ printf (MSG_U(F_VARIATION,"Variation %s\n"),fct); } nl(); } /* Génère un label */ PUBLIC void PAGIN::format_ref ( const char *) // Référence à encoder { } /* Retourne le numéro de la page du document */ PUBLIC int PAGIN::getpage() { return page; } /* Génère le titre d'une section. */ PUBLIC void PAGIN_IDX::format_titre ( int niveau, // Niveau de numérotation const char *secnum, // Numérotation de la section char *buf) // Titre de la section { if (niveau >= 4) secnum = ""; int nbl = ::format_titre (NULL,secnum,buf,9,lenlin,-1); check (nbl); printf (""); ::format_titre (fout,secnum,buf,9,lenlin,pout->getpage()); } /* Génère l'entête d'une spécification dans la table des matières. */ PUBLIC void PAGIN_IDX::format_spec ( const char *, // Nom du fichier qui contient cette spec const char *) // Titre de la spec (clé de classement) { } /* Génère l'entête d'une fonction. */ PUBLIC void PAGIN_IDX::format_fct ( const char *, // Nom du fichier qui contient cette spec int ) // Premiere fois qu'on parle de cette fonction { } /* Paginateur controllant la présentation de l'index */ PUBLIC PAGIN_IDX::PAGIN_IDX (PAGIN *_pout) { pout = _pout; }