#include #include #include #include #include #include "permut.h" #include "clsinfo.h" #include "nadoc.m" #define CLSFORM_VERSION 1 #define CLSFORM_RELEASE 3 static void showver() { fprintf (stderr,"clsform %d.%d (linuxconf-tools %d.%d)\n" ,CLSFORM_VERSION,CLSFORM_RELEASE ,TOOLS_VERSION,TOOLS_RELEASE); } static void near usage(void) { showver(); fprintf (stderr,"%s\n",MSG_B(I_CLSFORM ,"clsform [options] fichier_proto ...\n" "\n" " Formatte la hierarchie des classes extraite\n" " par proto (option -q).\n" "\n" " -cC Extrait la liste des fonctions membres de la classe C\n" " incluant les fonctions membres des classes de base.\n" " -c+C extrait les fonction interne de la classe.\n" " -fF Lit le fichier F contenant des prototypes de fonction\n" " membres. Ce fichier est généralement produit avec l'option\n" " -c+d de la commande proto.\n" " L'option -f peut être répétée plusieurs fois.\n" " -g Produit du sgml.\n" " -oF Produit le résultat dans le fichier F.\n" " -t Produit l'arbre des classes.\n" ,"clsform [options] class_file ...\n" "\n" " Format the class hierarchy extracted by proto.\n" " (See the -q option)\n" "\n" " -g Produce sgml output.\n")); } /* Génère le code de déclaration d'une classe. Ne fait rien si c'est déjà fait. */ PUBLIC void CLSFORM::gentest0 ( CLS_INFO *info, FILE *fout) { if (info->nbprint == 0){ char buffer[500]; int premder = 1; const char *nom = info->nom; char *pt = buffer + sprintf(buffer,"class %s",nom); int nbder = ders.getnb(); int i; for (i=0; iinfo == info && ptder->base->nom[0] != '-'){ CLS_INFO *base = ptder->base; gentest0 (base,fout); *pt++ = premder ? ':' : ','; premder = 0; pt += sprintf (pt,"%s %s",ptder->opt,base->nom); } } info->nbprint++; fprintf (fout,"%s{\npublic:\n",buffer); fprintf (fout,"\tchar data_%s[%d];\n",nom,i); if (premder){ fprintf (fout,"\tchar *nomcls;\n\tvoid printbase();\n"); } fprintf (fout,"\t%s();\n\tvirtual void print();\n};\n",nom); fprintf (fout,"%s::%s(){\n\tnomcls=\"%s\";\n}\n",nom,nom,nom); if (premder){ fprintf (fout,"void %s::printbase(){\n\tprint();\n}\n",nom); } fprintf (fout,"void %s::print(){\n",nom); fprintf (fout,"\tprintf (\"%s %s\\n\",nomcls);\n",nom,nom); fprintf (fout,"}\n"); } } /* Génère un fichier permettant de tester des cas de dérivation extrait de programme réel. */ PUBLIC int CLSFORM::gentest (FILE *fout) { infos.getitem(0)->nbprint = 1; int nbinfo = infos.getnb(); for (int i=1; inbprint = 0; } for (int i=1; inom,ptinfo->nom); fprintf (fout,"\tv_%s.printbase();\n",ptinfo->nom); } fprintf (fout,"\treturn 0;\n}\n"); return 0; } int main (int argc, char *argv[]) { etc_loadmsg(); int ret = -1; ARGP_MULTI argp[26]; argc = anlparm_multi(argc,argv,argp,"cf*ghotv"); if (argp['v'-'a'].ptr != NULL){ showver(); }else if (argc < 2){ usage(); }else{ OUTPUT_STYLE style = OUTPUT_TEXT; if (argp['g'-'a'].ptr != NULL) style = OUTPUT_SGML; if (argp['h'-'a'].ptr != NULL) style = OUTPUT_HTML; CLSFORM ccls; ret = 0; for (int i=1; inbptr; i++){ char *ptr = arg->ptrs[i]; lst.parse (ptr); } bool vue_interne = false; if (cls[0] == '+'){ vue_interne = true; cls++; } ccls.flatfunc (cls,lst,vue_interne,style,fout); } } } } return ret; }