#include #include #include "etc.h" /* Formatte une chaine en paragraphe Les blancs sont éliminés au début et à la fin Retourne le nombre de ligne produit. */ export int format_paragraphe ( FILE *fout, /* fichier de sortie ou NULL */ /* Si NULL, sert à compter les lignes */ const char *para, /* Texte à formatter avec ou sans \n */ /* Les \n et les \t sont ignorées */ int marge, /* Marge de gauche */ int maxlen) /* Largeur maximum du paragraphe */ { int nbline=0; char *pt = str_skip(para); char line[300]; char *ptlin = line; while (*pt != '\0'){ char carac = *pt; if (carac <= ' '){ *ptlin++ = ' '; pt = str_skip (pt); }else if (carac > ' '){ char *lastpt = pt; char *endlin = ptlin; while (*pt > ' ') *ptlin++ = *pt++; if (ptlin - line > maxlen){ if (endlin > line){ *endlin = '\0'; pt = lastpt; }else{ /* #Spécification: formattage / mots trop long Lorsqu'un mot est plus long que la longueur maximum d'une ligne, le mot est brisé arbitrairement en deux et un trait d'union est placé. Ce mot est surement un erreur (ou une série de ****). Au moins, la pagination ne sera pas brisé. */ pt = lastpt + maxlen; ptlin = line + maxlen; *ptlin++ = '-'; *ptlin = '\0'; } if (fout != NULL) fprintf (fout,"%*s%s\n",marge,"",line); ptlin = line; nbline++; } } } if (ptlin > line){ *ptlin = '\0'; if (fout != NULL) fprintf (fout,"%*s%s\n",marge,"",line); nbline++; } return nbline; } /* Affiche un titre sur 1 ou plusieurs lignes si requis Le titre commence par une série de chiffre et de point suivit d'espace Retourne Nombre de ligne générées. */ export int format_titre ( FILE *fout, /* ou NULL */ const char *section, /* X.Y.Z ... */ const char *titre, /* Texte du titre */ int marge, int maxlen, int nopage) /* Affiche no de page au bout si index */ /* Si == -1 , affiche pas */ { int nbline = 0; const char *pt; titre = str_skip(titre); pt = titre; if (fout != NULL) fprintf (fout,"%-*s",marge,section); while (*pt != '\0'){ char *debpt = (char*)pt; pt = str_skip(pt); pt = str_skipword(pt); if (pt - titre > maxlen){ if (fout != NULL){ char carac = *debpt; *debpt = '\0'; if (nbline!=0) fprintf (fout,"%*s",marge,""); fprintf (fout,"%-*s",maxlen,titre); if (nopage != -1 && nbline == 0){ fprintf (fout," %3d",nopage); } fprintf (fout,"\n"); *debpt = carac; } nbline++; titre = str_skip(debpt+1); } } if (fout != NULL){ if (nbline != 0) fprintf (fout,"%*s",marge,""); fprintf (fout,"%-*s",maxlen,titre); if (nopage != -1 && nbline == 0){ fprintf (fout," %3d",nopage); } fprintf (fout,"\n"); } return nbline+1; } #ifdef TEST void main(void) { static char *txt = "allo comment ca va le monde et toi et puis après" "comment va ton cousin le petit gros d'en face" " et l'autre nono"; int nbline = format_paragraphe (stdout,txt,10,30); printf ("nbline = %d\n",nbline); nbline = format_titre (stdout,"10.2",txt,10,30,10); printf ("nbline = %d\n",nbline); nbline = format_titre (stdout,"10.2",txt,10,30,-1); printf ("nbline = %d\n",nbline); nbline = format_titre (stdout,"10.2","titre simple",10,30,20); printf ("nbline = %d\n",nbline); } #endif