/* 22/07/88 : Jacques Gelinas Analyse une ligne de parametre (argc,argv) et ellimine les switch "-x" et inscrit leur parametre dans argp Une switch commence par - ou + argp.signe contient 0 pour - 1 pour + argp.ptr pointe vers "" si pas de parametre et vers NULL si la switch n'est pas presente Le premier parametre qui n'est pas une switch stoppe la recherche switch Donc les switchs sont toujours avant le premier parametre Si une erreur est detectee 0 est retournee Si le premier argument est "?" et qu'il n'y a pas d'autre argument, 0 est retourne */ #include #include #include #include #include "etc.h" #include #include "etc.m" /* Analyse une ligne de commande et classifie les options Retourne le nombre de paramètre qui reste dans argv[] Retourne 0 si un erreur se produit. Attention argv[0] n'est jamais affecte. Dans un cas normale retourne toujours >= 1. Les options commence par un -. Les options doivent absoluement preceder le premier element de argv[] qui n'en est pas une. -a -v -xt toto -p : -p n'est pas une option Ne tient pas compte des majuscules et minuscules pour classer les options. Un option peut apparaitre plusieurs fois si sa lettre est suivit d'un * dans swlst. */ export int anlparm_multi ( int argc, /* Nombre d'element dans argv[] */ char *argv[], /* Contient le paramètres avec options */ /* Contiendra les paramètres sans option */ ARGP_MULTI argp_multi[26], /* Contiendra l'argument de chaque option */ const char *swlst) /* liste des switch permise */ { char lst[26]; unsigned char optcnt[26]; int newargc; int car,lettre; int i; int erreur; int fin; for (i=0; i<26; i++){ argp_multi[i].ptr = NULL; argp_multi[i].ptrs = NULL; argp_multi[i].signes = NULL; argp_multi[i].nbptr = 0; lst[i] = 0; } while (*swlst != '\0'){ int index = (*swlst&0x1f)-1; assert (isalpha(*swlst)); lst[index] = 1; optcnt[index] = 1; swlst++; if (*swlst == '*'){ swlst++; optcnt[index] = 255; } } erreur = 0; if (argc == 2 && (strcmp(argv[1],"?")==0 || strcmp(argv[1],"-?")==0)) return (0); newargc = 1; fin = 0; /* bidule qui stop les conversions apres le premier */ /* parametre valide */ for (i=1; inbptr; if (nbptr == 0){ arg->ptr = txt; arg->signe = signe; } arg->ptrs = (char **) realloc_err(arg->ptrs ,(nbptr+1)*sizeof(char*),1); arg->signes = (int *) realloc_err(arg->signes ,(nbptr+1)*sizeof(int),1); arg->ptrs[nbptr] = txt; arg->signes[nbptr] = signe; nbptr++; arg->nbptr = nbptr; if (nbptr > 1 && optcnt[lettre] != 255){ fprintf (stderr,MSG_U(E_MULTIPLE ,"Utilisation multiple de l'option %c\n") ,lettre+'A'); erreur = 1; } }else{ erreur = 1; fprintf (stderr,MSG_U(E_OPTION,"Option %c invalide\n") ,lettre+'A'); } }else{ fin = 1; argv[newargc] = argv[i]; newargc++; } } if (erreur) newargc = 0; return newargc; } /* Analyse une ligne de commande et classifie les options Retourne le nombre de paramètre qui reste dans argv[] Retourne 0 si un erreur se produit. Attention argv[0] n'est jamais affecte. Dans un cas normale retourne toujours >= 1. Les options commence par un -. Les options doivent absoluement preceder le premier element de argv[] qui n'en est pas une. -a -v -xt toto -p : -p n'est pas une option Ne tient pas compte des majuscules et minuscules pour classer les options. */ export int anlparm ( int argc, /* Nombre d'element dans argv[] */ char *argv[], /* Contient le paramètres avec options */ /* Contiendra les paramètres sans option */ ARGP argp[], /* Contiendra l'argument de chaque option */ const char *swlst) /* liste des switch permise */ { ARGP_MULTI argpm[26]; argc = anlparm_multi (argc,argv,argpm,swlst); if (argc > 0){ int i; for (i=0; i<26; i++){ argp[i].ptr = argpm[i].ptr; argp[i].signe = argpm[i].signe; } } return argc; } #ifdef TEST #include main (argc,argv) int argc; char *argv[]; { ARGP argp[26]; int i; argc = anlparm (argc,argv,argp,"abcd"); if (argc == 0){ printf ("erreur detectee\n"); }else{ for (i=0; i<26; i++){ printf ("%c-",i+'A'); if (argp[i].ptr != NULL){ printf ("[%c] '%s'\n",argp[i].signe ? '+' : '-',argp[i].ptr); }else{ printf ("...\n"); } if (i==13) consio_keywait(); } printf ("PARM : "); for (i=0; i