/* Agit comme printf, mais on pourra un jour redirige */ #include #include #include #include #include #include "assert.h" #include "proto.h" #include "proto.m" PROTOF_INFO protof_tb[10]; int protof_nbfile=0; static int defmode; /* Initialise le controleur de fichier résultat */ void protof_init (void) { protof_nbfile = 0; protof_tb[0].fout = stdout; protof_tb[0].modeout = MODE_ORDIN; } /* Ouvre un fichier d'output selon le mode courant Retourne 0 si ok, -1 si erreur */ int protof_open ( const char *nomf, const char *mode) { int ok = 0; PROTOF_INFO *inf = &protof_tb[protof_nbfile]; inf->fname = strdup(nomf); protof_loadfile (inf,nomf,defmode); inf->fout = vfopen_err (nomf,mode,0); inf->modeout = defmode; if (inf->fout == NULL){ ok = -1; inf->fout = stdout; }else{ setvbuf (inf->fout,NULL,_IOFBF,5000); protof_nbfile++; } return ok; } /* Ferme tous les fichiers de résultat */ void protof_close () { int i; PROTOF_INFO *inf = protof_tb; for (i=0; ifout); free (inf->fname); protof_free(inf); } protof_nbfile = 0; protof_tb[0].fout = stdout; protof_tb[0].modeout = defmode; } /* Ferme un fichier de résultat */ void protof_closeone (const char *fname) { int i; int find=0; for (i=0; imodeout; int curcom = curmode & (MODE_COMMENT|MODE_INDEX); if ((puresel & curmode)!=0 && curcom == selcom){ FILE *fout = inf->fout; if (inf->condflg){ fprintf (fout,"/* %s */\n",condline); inf->condflg = 0; } va_list tmplist; va_copy (tmplist,list); nbcar = vfprintf (fout,ctl,tmplist); va_end (tmplist); } } } return nbcar; } int protof (int mode,char *ctl,...) { int nbcar; va_list list; va_start (list,ctl); nbcar = protof_vprint (mode,ctl,list); va_end (list); return (nbcar); } /* Cet output ne se fera que si au moins un appel a protof est faite avant que protof_endcondit ne soit fait */ int protof_condit (char *ctl,...) { int i; PROTOF_INFO *inf = protof_tb; va_list list; va_start (list,ctl); condline_len = vsprintf (condline,ctl,list); va_end (list); for (i=0; i<10; i++,inf++) inf->condflg = 1; return condline_len; } #if defined(MSDOS) || defined(OS2) #define NAR_SUP 5 #define NAR_FCTLINE "%c!%s! %s%s\n" #define NAR_SRCLINE "%c!%s %s! %s\n" #else #define NAR_SUP 5 /* pas de \r dans texte unix, ajoute manuellement */ #define NAR_FCTLINE "%c!%s! %s%s\r\n" #define NAR_SRCLINE "%c!%s %s! %s\r\n" #endif /* Génère le nom de la fonction entre commentaire et info dans nar. Le nom sera precede du nom du fichier Le nom du fichier a ete obtenu par protof_condit */ void protof_nomfct (int mode,const char *nom) { int i; int nbf = protof_nbfile; PROTOF_INFO *inf = protof_tb; int puresel = mode & ~(MODE_COMMENT|MODE_INDEX); /* Type de fonction */ int selcom = mode & (MODE_COMMENT|MODE_INDEX); /* Genere NAP ou NAR */ if (nbf == 0) nbf=1; for (i=0; imodeout; int curcom = curmode & MODE_COMMENT; int curidx = curmode & MODE_INDEX; if ((puresel & curmode)!=0){ FILE *fout = inf->fout; inf->condflg = 0; if(curcom == selcom){ fprintf (fout,"\n/*~%s! %s */\n",nom,condline); }else if(curidx & selcom){ fprintf (fout,NAR_FCTLINE ,strlen(nom)+condline_len+prefix_nar_len+NAR_SUP+' ',nom ,prefix_nar,condline); } } } } /* Enregistre le préfixe a placer devant le nom du source dans le .nar Ce mécanisme solutionne le problème des exportations à deux niveaux. */ void protof_prefixnar (const char *prefix) { strcpy (prefix_nar,prefix); path_stripsep (prefix_nar,prefix_nar); prefix_nar_len = strlen(prefix_nar); if (prefix_nar_len > 0){ strcat (prefix_nar,"/"); prefix_nar_len ++; } } /* Génère l'entête pour un fichier source dans chacun des fichier output */ void protof_entete ( const char *nomsrc, const char *datestr, const char *timestr) { int i; int nbf = protof_nbfile; PROTOF_INFO *inf = protof_tb; if (nbf == 0) nbf=1; strcpy (condline,nomsrc); condline_len = strlen(condline); for (i=0; imodeout; FILE *fout = inf->fout; if (curmode & MODE_COMMENT){ fprintf (fout,"/*~%s %s! %s */\n" ,datestr,timestr,nomsrc); }else if (curmode & MODE_INDEX){ fprintf (fout,NAR_SRCLINE ,strlen(datestr)+1+strlen(timestr)+strlen(nomsrc)+NAR_SUP+' ' ,datestr,timestr,nomsrc); }else{ fprintf (fout,"/* %s %s %s */\n",nomsrc,datestr,timestr); } } } /* Annule la ligne conditionnelle */ void protof_endcondit (void) { int i; PROTOF_INFO *inf = protof_tb; for (i=0; i<10; i++, inf++) inf->condflg = 0; }