#include #include #include #include "proto.h" /* #Spécification: classes / format du fichier d'extraction Pour chaque classe, proto extrait dans un fichier ascii l'information permettant de construire l'arbre de dérivation. proto inscrit une ligne pour chaque dérivation. Pour une classe dérivée de plusieurs classe de base, il y aura autant de ligne générées. Chaque ligne a le format suivant: classe classe_de_base private/protected/public [virtual] Le programme clsform produira un rapport (fichier .nac) présentant l'arbre de dérivation. */ static FILE *fout = NULL; # /* Analyse une déclaration de classe */ void clsanal_declare ( int is_export, /* Mot clé export devant class */ TOKEN *nom, /* Nom de la classe */ TOKEN *spc) /* : ou { */ { int mode = is_export ? MODE_EXPORT : MODE_ORDIN; const char *nomcls = token_txt(nom); protof_nomfct (MODE_INDEX|mode,nomcls); if (spc->type != TOK_OPNBRACE){ /* C'est une classe dérivée */ /* Accumule l'information de dérivation */ int nivpub = 0; /* Private par défaut */ int is_virt = 0; /* Dérivation non virtuelle par défaut */ while(1){ if (token_get(spc)==-1){ break; }else{ TOK_TYPE type = spc->type;; outsrc_prttoken (spc); if (type == TOK_OPNBRACE){ break; }else if (type == TOK_KEYWORD){ KEYWORD key = spc->type2.keyword; if (key == KEY_PUBLIC){ nivpub = 2; }else if (key == KEY_PROTECTED){ nivpub = 1; }else if (key == KEY_PRIVATE){ nivpub = 0; }else if (key == KEY_VIRTUAL){ is_virt = 1; } }else if (type == TOK_ID){ if (fout != NULL){ static char *tbniv[]={ "private", "protected", "public" }; static char *tbvirt[]={ "-", "virtual" }; fprintf (fout,"%s %s %s %s\n",nomcls,token_txt(spc) ,tbniv[nivpub],tbvirt[is_virt]); } nivpub = 0; is_virt = 0; } } } }else if (fout != NULL){ /* Classe de base */ fprintf (fout,"%s %s %s %s\n",nomcls,"-","-","-"); } /* On saute la déclaration jusqu'au ; */ cproto_waitptv (spc); } /* Ouvre le fichier pour recueillir information sur les classes. si fname == "" ou fname == NULL, ouvre stdout. Termine si erreur. */ void clsanal_open (const char *fname, int append) { clsanal_close (); if (fname != NULL && fname[0] != '\0'){ fout = fopen_err (fname,append ? "a" : "w",1); }else{ fout = stdout; } } /* Ferme le fichier de collecte de la hiérarchie des classes. */ void clsanal_close (void) { if (fout != NULL){ if (fout != stdout) fclose (fout); fout = NULL; } } /* Analyse la déclaration d'un enum pour fichier .nar */ void enumanal_declare ( int is_export, /* Mot clé export devant class */ TOKEN *nom) /* Nom de la classe */ { int mode = is_export ? MODE_EXPORT : MODE_ORDIN; TOKEN tok; protof_nomfct (MODE_INDEX|mode,token_txt(nom)); while(1){ if (token_get(&tok)==-1){ break; }else{ TOK_TYPE type = tok.type;; outsrc_prttoken (&tok); if (type == TOK_CLSBRACE){ break; }else if (type == TOK_ID){ protof_nomfct (MODE_INDEX|mode,token_txt(&tok)); } } } /* On saute la déclaration jusqu'au ; */ cproto_waitptv (&tok); }