int main(int argc, char **argv) { PLOptState *opt; PLOptStatus ostat; opt = PL_CreateLongOptState(argc, argv, "a:b:c", optArray); while (PL_OPT_OK == (ostat = PL_GetNextOpt(opt))) { if (opt->option == 0 && opt->longOptIndex < 0) printf("Positional parameter: \"%s\"\n", opt->value); else printf("%s option: %x (\'%c\', index %d), argument: \"%s\"\n", (ostat == PL_OPT_BAD) ? "BAD" : "GOOD", opt->longOption, opt->option ? opt->option : ' ', opt->longOptIndex, opt->value); } printf("last result was %s\n", (ostat == PL_OPT_BAD) ? "BAD" : "EOL"); PL_DestroyOptState(opt); return 0; }
SECStatus SECU_ParseCommandLine(int argc, char **argv, char *progName, const secuCommand *cmd) { PRBool found; PLOptState *optstate; PLOptStatus status; char *optstring; PLLongOpt *longopts = NULL; int i, j; int lcmd = 0, lopt = 0; PR_ASSERT(HasNoDuplicates(cmd->commands, cmd->numCommands)); PR_ASSERT(HasNoDuplicates(cmd->options, cmd->numOptions)); optstring = (char *)PORT_Alloc(cmd->numCommands + 2 * cmd->numOptions + 1); if (optstring == NULL) return SECFailure; j = 0; for (i = 0; i < cmd->numCommands; i++) { if (cmd->commands[i].flag) /* single character option ? */ optstring[j++] = cmd->commands[i].flag; if (cmd->commands[i].longform) lcmd++; } for (i = 0; i < cmd->numOptions; i++) { if (cmd->options[i].flag) { optstring[j++] = cmd->options[i].flag; if (cmd->options[i].needsArg) optstring[j++] = ':'; } if (cmd->options[i].longform) lopt++; } optstring[j] = '\0'; if (lcmd + lopt > 0) { longopts = PORT_NewArray(PLLongOpt, lcmd + lopt + 1); if (!longopts) { PORT_Free(optstring); return SECFailure; } j = 0; for (i = 0; j < lcmd && i < cmd->numCommands; i++) { if (cmd->commands[i].longform) { longopts[j].longOptName = cmd->commands[i].longform; longopts[j].longOption = 0; longopts[j++].valueRequired = cmd->commands[i].needsArg; } } lopt += lcmd; for (i = 0; j < lopt && i < cmd->numOptions; i++) { if (cmd->options[i].longform) { longopts[j].longOptName = cmd->options[i].longform; longopts[j].longOption = 0; longopts[j++].valueRequired = cmd->options[i].needsArg; } } longopts[j].longOptName = NULL; } optstate = PL_CreateLongOptState(argc, argv, optstring, longopts); if (!optstate) { PORT_Free(optstring); PORT_Free(longopts); return SECFailure; } /* Parse command line arguments */ while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) { const char *optstatelong; char option = optstate->option; /* positional parameter, single-char option or long opt? */ if (optstate->longOptIndex == -1) { /* not a long opt */ if (option == '\0') continue; /* it's a positional parameter */ optstatelong = ""; } else { /* long opt */ if (option == '\0') option = '\377'; /* force unequal with all flags */ optstatelong = longopts[optstate->longOptIndex].longOptName; } found = PR_FALSE; for (i = 0; i < cmd->numCommands; i++) { if (cmd->commands[i].flag == option || cmd->commands[i].longform == optstatelong) { cmd->commands[i].activated = PR_TRUE; if (optstate->value) { cmd->commands[i].arg = (char *)optstate->value; } found = PR_TRUE; break; } } if (found) continue; for (i = 0; i < cmd->numOptions; i++) { if (cmd->options[i].flag == option || cmd->options[i].longform == optstatelong) { cmd->options[i].activated = PR_TRUE; if (optstate->value) { cmd->options[i].arg = (char *)optstate->value; } else if (cmd->options[i].needsArg) { status = PL_OPT_BAD; goto loser; } found = PR_TRUE; break; } } if (!found) { status = PL_OPT_BAD; break; } } loser: PL_DestroyOptState(optstate); PORT_Free(optstring); if (longopts) PORT_Free(longopts); if (status == PL_OPT_BAD) return SECFailure; return SECSuccess; }
/* ** Create the state in which to parse the tokens. ** ** argc the sum of the number of options and their values ** argv the options and their values ** options vector of single character options w/ | w/o ': */ PR_IMPLEMENT(PLOptState*) PL_CreateOptState( PRIntn argc, char **argv, const char *options) { return PL_CreateLongOptState( argc, argv, options, NULL); } /* PL_CreateOptState */