#include #include #include #include #include #include #include "pagin.h" #include "permut.h" PUBLIC PAGIN_HTML::PAGIN_HTML() { fout = NULL; basename = NULL; title = NULL; } PUBLIC PAGIN_HTML::~PAGIN_HTML() { close(); free (basename); free (title); } /* Ouvre un fichier d'output avec pagination Retourne -1 si erreur */ PUBLIC int PAGIN_HTML::openerr ( const char *_basename, // Nom de base servant a composer les // noms des différents fichiers html int quit) { basename = strdup_err (_basename,quit); format = PAG_FORMAT_PARA; sequence = 0; return 0; } /* Termine output dans un fichier */ PUBLIC void PAGIN_HTML::close () { if (fout != NULL){ fclose (fout); fout = NULL; } } /* Controle le mode de formattage des paragraphe. Retourne la valeur courante. */ PUBLIC int PAGIN_HTML::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); 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_HTML::form ()
{
	fprintf (fout,"\n");
}
/*
	Traduit une chaine en ISO et ajoute dans un fichier
*/
PUBLIC void PAGIN_HTML::fputs (const char *buf, FILE *fout)
{
	::fputs (buf,fout);
}
/*
	Affiche une seule ligne en décidant si on saute de page
*/
PUBLIC void PAGIN_HTML::printf (
	const char *ctl,
	...)
{
	if (format == PAG_FORMAT_QUOT) fputs ("\t",fout);
	va_list list;
	va_start (list,ctl);
	char buf[5000];
	vsprintf (buf,ctl,list);
	fputs (buf,fout);
	va_end (list);
}
/*
	fprintf avec traduction.
*/
PUBLIC void PAGIN_HTML::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_HTML::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_HTML::check (int) { } /* Génère un paragraphe d'un coup en formattant ou pas. En mode HTML, on ne s'occupe pas de ca. C'est set_format qui fait tout. */ PUBLIC void PAGIN_HTML::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_HTML::format_titre ( int niveau, // Niveau de numérotation const char *secnum, // Numérotation de la section char *buf) // Titre de la section { niveau++; if (niveau == 1){ sequence++; if (sequence == 1) title = strdup_err (buf,1); if (fout != NULL) fclose (fout); char path[MAXSIZ_PATH]; sprintf (path,"%s.%d.html",basename,sequence); fout = fopen_err (path,"w",1); fprintf (fout,"%s\n",title); } fprintf (fout,"\n",secnum); fprintf (fout,"%s\n",niveau,buf,niveau); fprintf (fout,"\n"); } static void pagin_spec2hname ( const char *filespec, const char *, char *cle) { /* #Spécification: spécification / référence hypertexte On compose une référence hypertexte vers une spec comme suit: On utilise simplement la référence source [fichier,ligne] indiquant d'ou provient cette spec. On est assuré d'une clé unique. */ strcpy (cle,filespec); } /* Génère l'entête d'une spécification. */ PUBLIC void PAGIN_HTML::format_spec ( const char *filespec, // Nom du fichier qui contient cette spec const char *buf) // Titre de la spec (clé de classement) { nl(); 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(); } /* Génère l'entête d'une fonction. */ PUBLIC void PAGIN_HTML::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){ fprintf (fout,"\n",fct); fprintf (fout,"%s()\n",fct); fprintf (fout,"\n"); }else{ fprintf (fout,"%s()\n",fct); } nl(); } /* Génère un label */ PUBLIC void PAGIN_HTML::format_ref ( const char *ref) // Référence à encoder { ::fprintf (fout,"",ref); } /* Débute une sous-section (sous liste énuméré) */ PUBLIC void PAGIN_HTML::soussection() { } /* Termine une sous-section (sous liste énuméré) */ PUBLIC void PAGIN_HTML::finsous() { } /* Controle le formattage de la page index */ PUBLIC PAGIN_HTML_IDX::PAGIN_HTML_IDX () { curniv = 0; } PUBLIC PAGIN_HTML_IDX::~PAGIN_HTML_IDX () { fclose (mainfout); } /* Débute une sous-section (sous liste énuméré) */ PUBLIC void PAGIN_HTML_IDX::soussection() { fprintf (fout,"

    \n"); } /* Termine une sous-section (sous liste énuméré) */ PUBLIC void PAGIN_HTML_IDX::finsous() { fprintf (fout,"
\n"); } /* Génère le titre d'une section. */ PUBLIC void PAGIN_HTML_IDX::format_titre ( int niveau, // Niveau de numérotation const char *secnum, // Numérotation de la section char *buf) // Titre de la section { niveau++; char path[MAXSIZ_PATH]; if (niveau == 1){ sequence++; if (sequence == 1){ /* #Spécification: html / index des documents Pour chaque document html produit par nadoc, il y a un fichier "document".index qui est produit. Il est placé dans le même répertoire. Le script Unix suivant permet de fabriquer un document d'introduction à tout les documents html produit par nadoc. # #!/bin/sh INDEX=index.html echo '
' > $INDEX for rep in * do if [ -f $rep/$rep.index ] ; then cat $rep/$rep.index >> $INDEX fi done echo '
' >> $INDEX # */ sprintf (path,"%s.index",basename); FILE *f = fopen_err (path,"w",1); sprintf (path,"%s.i.html",rel_path); fprintf (f,"\n",path); //fprintf (f,"
%s\n",rel_path); fprintf (f,"
  • %s\n",buf); fprintf (f,"\n"); fclose (f); fprintf (fout,"%s\n",buf); } sprintf (path,"%s.i.%d.html",rel_path,sequence); fprintf (mainfout,"\n",path,secnum); fprintf (mainfout,"
  • %s\n",buf); fprintf (mainfout,"\n"); close(); sprintf (path,"%s.i.%d.html",basename,sequence); fout = fopen_err (path,"w",1); } /* #Spécification: html / page index La page index est simplement une série de lien vers les pages du document. Ces liens sont présentés via une série d'énumérations numérotées. */ curniv = niveau; fprintf (fout,"\n",secnum); sprintf (path,"%s.%d.html",rel_path,sequence); fprintf (fout,"\n",path,secnum); fprintf (fout,"
  • %s\n",buf); fprintf (fout,"\n"); } /* Génère l'entête d'une spécification. */ PUBLIC void PAGIN_HTML_IDX::format_spec ( const char *filespec, // Nom du fichier qui contient cette spec const char *buf) // Titre de la spec (clé de classement) { char cle[300]; pagin_spec2hname (filespec,buf,cle); char path[MAXSIZ_PATH]; sprintf (path,"%s.%d.html",rel_path,sequence); fprintf (fout,"\n",path,cle); fprintf (fout,"
    %s\n",buf); fprintf (fout,"
    \n"); } /* Génère l'entête d'une fonction. */ PUBLIC void PAGIN_HTML_IDX::format_fct ( const char *fct, // Nom du fichier qui contient cette spec int premiere) // Premiere fois qu'on parle de cette fonction { if (premiere){ char path[MAXSIZ_PATH]; sprintf (path,"%s.%d.html",rel_path,sequence); fprintf (fout,"\n",path,fct); fprintf (fout,"
    %s()\n",fct); fprintf (fout,"
    \n"); } } /* Ouvre un fichier d'output pour l'index. Retourne -1 si erreur */ PUBLIC int PAGIN_HTML_IDX::openerr ( const char *_basename, // Nom de base servant a composer les // noms des différents fichiers html const char *_rel_path, int quit) { basename = strdup_err (_basename,1); rel_path = strdup_err (_rel_path,1); format = 1; sequence = 0; char path[MAXSIZ_PATH]; sprintf (path,"%s.%d.html",_basename,sequence); mainfout = fopen_err (path,"w",quit); return mainfout != NULL ? 0 : -1; }