static int parse_in_direction(cargo_t ctx, void *user, const char *optname, int argc, char **argv) { direction_t *in_dir = (direction_t *)user; char *d = NULL; if (argc < 1) { cargo_set_error(ctx, 0, "%s requires 1 argument", optname); return -1; } d = argv[0]; if (!strcasecmp(d, "left")) { *in_dir = DIR_LEFT; } else if (!strcasecmp(d, "right")) { *in_dir = DIR_RIGHT; } else { cargo_set_error(ctx, 0, "Invalid direction \"%s\", must be \"left\" or \"right\" " "for option %s.", d, optname); return -1; } return 1; }
static int parse_prey_method(cargo_t ctx, void *user, const char *optname, int argc, char **argv) { catcierge_haar_prey_method_t *pm = (catcierge_haar_prey_method_t *)user; char *d = NULL; if (argc < 1) { cargo_set_error(ctx, 0, "Missing either \"adaptive\" or \"normal\" for %s", optname); return -1; } d = argv[0]; if (!strcasecmp(d, "adaptive")) { *pm = PREY_METHOD_ADAPTIVE; } else if (!strcasecmp(d, "normal")) { *pm = PREY_METHOD_NORMAL; } else { cargo_set_error(ctx, 0, "Invalid prey method \"%s\", must be \"adaptive\" " "or \"normal\".", d); return -1; } return 1; }
int even_validation_validate_cb(cargo_t ctx, cargo_validation_flags_t flags, const char *opt, cargo_validation_t *vd, void *value) { even_validation_t *ev = NULL; int v = *((int *)value); // Retrieve our context struct. ev = (even_validation_t *)cargo_validator_get_context(vd); if (v > ev->max) { cargo_set_error(ctx, 0, "Value %d of %s cannot be above %d", v,opt, ev->max); return -1; } if ((v % 2) != 0) { cargo_set_error(ctx, 0, "Value %d of %s must be even", v, opt); return -1; } return 0; // Success! }
static int parse_rect_list_cb(cargo_t ctx, void *user, const char *optname, int argc, char **argv) { int i; assert(ctx); assert(user); rect_t **u = (rect_t **)user; rect_t *rect; if (!(*u = calloc(argc, sizeof(rect_t)))) { return -1; } rect = *u; for (i = 0; i < argc; i++) { if (sscanf(argv[i], "%dx%d", &rect[i].width, &rect[i].height) != 2) { cargo_set_error(ctx, 0, "Error, expected format 2x2 for %s\n", optname); return -1; } } return i; // How many arguments we ate. }
static int parse_command_cb(cargo_t ctx, void *user, char *optname, int argc, char **argv) { cmd_t *cmd = (cmd_t *)user; assert(cmd); *cmd = (cmd_t)str_to_cmd(argv[0]); if (*cmd == INVALID_COMMAND) { cargo_set_error(ctx, 0, "Invalid command \"%s\"\n", argv[0]); return -1; } return 1; }
static int parse_width_height(cargo_t ctx, void *user, const char *optname, int argc, char **argv) { catcierge_haar_matcher_args_t *args = (catcierge_haar_matcher_args_t *)user; int sret = 0; if (argc < 1) { cargo_set_error(ctx, 0, "%s requires 1 argument", optname); return -1; } sret = sscanf(argv[0], "%dx%d", &args->min_width, &args->min_height); if ((sret == EOF) || (sret != 2)) { cargo_set_error(ctx, 0, "Cannot parse %s value \"%s\" expected format: WxH\n", optname, argv[0]); return -1; } return 1; }
static int parse_rect_cb(cargo_t ctx, void *user, const char *optname, int argc, char **argv) { assert(ctx); assert(user); // We expect a rect_t structure to be passed to us. rect_t *u = (rect_t *)user; memset(u, 0, sizeof(rect_t)); if (argc > 0) { if (sscanf(argv[0], "%dx%d", &u->width, &u->height) != 2) { cargo_set_error(ctx, 0, "Error, expected format 2x2 for %s\n", optname); return -1; } return 1; // We ate 1 argument. } return -1; // Error. }