#include #include #include #include #include "etc.h" #include "etc.m" /* Lit le contenu d'un fichier d'arguments dans argv Retourne le nombre d'argument lue Les arguments sont alloués avec strdup(). Devront être libérés Retourne nombre d'argument lue, -1 si erreur, 0 si fichier vide Interprète les guillemet "". */ export int anlparm_readfile ( const char *filnam, /* fichier à lire */ char *argv[], /* vecteur à remplir */ int maxargc, /* Nombre maximum d'entrée dans argv */ int find) /* == 0 : cherche uniquement ce fichier */ /* != 0 : cherche les répertoires ancêtres */ /* si ne trouve pas, et ensuite */ /* utilise la variable path */ { int argc = 0; FILE *fin = NULL; if (find){ /* Il faut localiser le fichier d'abord plutot que de tenter un fopen à cause de la recherche NOVELL */ char fname[MAXSIZ_PATH]; if (file_findancp (filnam,fname)!=-1 || file_findpath(filnam,fname)!=-1){ fin = fopen_share (fname,"r"); } }else{ fin = fopen_share (filnam,"r"); } if (fin == NULL){ fprintf (stderr,MSG_U(E_OPENARGFILE,"Ne peut accéder au fichier %s\n") ,filnam); }else{ char buf[300]; while (fgets(buf,sizeof(buf)-1,fin)!=NULL){ int ret = str_str2tb (buf,argv+argc,maxargc-argc,'"'); if (ret == -1){ fprintf (stderr,MSG_U(E_TOOMANUARGS ,"Trop d'arguments dans le fichier %s\n") ,filnam); break; } argc += ret; } fclose (fin); } return (argc); } /* Fait expansion d'une ligne de commande avec fichier-indirection et classifie les options en appelant anlparm(). Retourne le nombre de paramètre produit dans argve[]. Retourne 0 si erreur. Balaye le contenu de argv[] et fait l'expansion dans argve[]. Appelle ensuite anlparm(). Attention : Pour faire l'expansion de fichier-commande, des tampons de lecture sont alloues dynamiquement. Tous les elements de argve[] sont alloue via strdup. L'appelant a la responsabilite de les libérer. */ export int anlparm_indir ( int argc, /* Nombre d'element dans argv[] */ char *argv[], /* Contient le paramètres avec options */ char *argve[], /* Contiendra les paramètres sans option */ int maxargc, /* Nombre maximum d'item dans argve */ ARGP argp[], /* Contiendra l'argument de chaque option */ const char *swlst) /* liste des switch permise */ { int i; int argce = 1; argve[0] = strdup_err(argv[0],1); for (i=1; i