Mail-SpamAssassin
view release on metacpan or search on metacpan
spamc/getopt.c view on Meta::CPAN
if(!dash && (argv[spamc_optind][0] != '-')) {
return(EOF);
}
if(!dash && (argv[spamc_optind][0] == '-') && !argv[spamc_optind][1]) {
/* used to specify stdin */
return(EOF);
}
if((argv[spamc_optind][0] == '-') && (argv[spamc_optind][1] == '-')
&& !argv[spamc_optind][2]) {
/* used to specify end of args */
return(EOF);
}
if((argv[spamc_optind][0] == '-') && argv[spamc_optind][1] &&
(argv[spamc_optind][1] != '-')) {
/* short option */
optchr = 1;
if(argv[spamc_optind][optchr] == ':')
return(optiserr(argc, argv, spamc_optind++, optstring, optchr, OPTERRCOLON));
cp = strchr(optstring, argv[spamc_optind++][optchr]);
if(cp == NULL)
return(optiserr(argc, argv, spamc_optind-1, optstring, optchr, OPTERRNF));
if(cp[1] == ':') {
/* requires an argument */
if(!argv[spamc_optind] || (argv[spamc_optind][0] == '-') ||
(spamc_optind >= argc)) {
return(optiserr(argc, argv, spamc_optind-1, optstring, optchr, OPTERRARG));
}
spamc_optarg = argv[spamc_optind++];
return(*cp);
} else {
dash = 0;
return(*cp);
}
}
if((argv[spamc_optind][0] == '-') && (argv[spamc_optind][1] == '-') &&
argv[spamc_optind][2]) {
/* long option */
optchr = 2;
longopt = argv[spamc_optind++];
if(longopt[2] == ':')
return(longoptiserr(argc, argv, spamc_optind, OPTERRCOLON));
longoptlen = strlen(longopt) - 2;
if((bp = strchr(longopt, '='))) {
opt = strdup(bp+1);
if (opt == NULL) {
fprintf(stderr, "%s: %s\n", argv[0], strerror(errno));
exit(1);
}
longoptlen -= strlen(bp);
}
for(i=0; ; i++) {
/* changed to longopts[i].name[0] == 0 - bug 7148 */
if((longopts[i].name == NULL) || (longopts[i].name[0] == 0)) {
free(opt);
return(longoptiserr(argc, argv, spamc_optind-1, OPTERRNF));
}
if(((strncmp(longopt+2, longopts[i].name, longoptlen)) == 0) && (strlen(longopts[i].name) == longoptlen)) {
*longindex = i;
if(longopts[i].has_arg == required_argument) {
if(((spamc_optind >= argc) || (!argv[spamc_optind]) || (argv[spamc_optind][0] == '-')) &&
(opt == NULL)) {
free(opt);
return(longoptiserr(argc, argv, spamc_optind-1, OPTERRARG));
}
if(opt != NULL) {
spamc_optarg = opt;
} else {
spamc_optarg = argv[spamc_optind++];
}
} else if(longopts[i].has_arg == optional_argument) {
if(((spamc_optind < argc) && (argv[spamc_optind]) && (argv[spamc_optind][0] != '-')) ||
(opt != NULL)) {
if(opt != NULL) {
spamc_optarg = opt;
} else {
spamc_optarg = argv[spamc_optind++];
}
}
}
if(longopts[i].flag == NULL) {
return(longopts[i].val);
} else {
*longopts[i].flag = longopts[i].val;
return(0);
}
}
}
}
return(0); /* should never reach here */
}
#ifdef TESTGETOPT
int
main (int argc, char **argv)
{
int c, l;
extern char *spamc_optarg;
extern int spamc_optind;
int aflg = 0;
int bflg = 0;
int errflg = 0;
char *ofile = NULL;
struct option longopts[] = {
{ "test", required_argument, 0, 't' },
};
while ((c = spamc_getopt(argc, argv, "abo:")) != EOF)
switch (c) {
case 'a':
if (bflg)
errflg++;
else
aflg++;
break;
case 'b':
if (aflg)
errflg++;
else
bflg++;
( run in 2.141 seconds using v1.01-cache-2.11-cpan-d8267643d1d )