static int fuzzer_trigger(unsigned int chance) { switch(method) { case FOFF: return 0; case FRANDOM: if ((rk_random() % chance) != 1) return 0; return 1; case FLINEAR: if (fnum == fcur++) return 1; return 0; case FLINEAR_SIZE: return 0; } return 0; }
static int arg_match_long(struct getargs *args, size_t num_args, char *argv, int argc, char **rargv, int *goptind) { size_t i; char *goptarg = NULL; int negate = 0; int partial_match = 0; struct getargs *partial = NULL; struct getargs *current = NULL; size_t argv_len; char *p; size_t p_len; argv_len = strlen(argv); p = strchr (argv, '='); if (p != NULL) argv_len = p - argv; for (i = 0; i < num_args; ++i) { if(args[i].long_name) { size_t len = strlen(args[i].long_name); p = argv; p_len = argv_len; negate = 0; for (;;) { if (strncmp (args[i].long_name, p, p_len) == 0) { if(p_len == len) current = &args[i]; else { ++partial_match; partial = &args[i]; } goptarg = p + p_len; } else if (ISFLAG(args[i]) && strncmp (p, "no-", 3) == 0) { negate = !negate; p += 3; p_len -= 3; continue; } break; } if (current) break; } } if (current == NULL) { if (partial_match == 1) current = partial; else return ARG_ERR_NO_MATCH; } if(*goptarg == '\0' && !ISFLAG(*current) && current->type != arg_collect && current->type != arg_counter) return ARG_ERR_NO_MATCH; switch(current->type){ case arg_integer: { int tmp; if(sscanf(goptarg + 1, "%d", &tmp) != 1) return ARG_ERR_BAD_ARG; *(int*)current->value = tmp; return 0; } case arg_string: { *(char**)current->value = goptarg + 1; return 0; } case arg_strings: { return add_string((getarg_strings*)current->value, goptarg + 1); } case arg_flag: case arg_negative_flag: { int *flag = current->value; if(*goptarg == '\0' || strcmp(goptarg + 1, "yes") == 0 || strcmp(goptarg + 1, "true") == 0){ *flag = !negate; return 0; } else if (*goptarg && strcmp(goptarg + 1, "maybe") == 0) { *flag = rk_random() & 1; } else { *flag = negate; return 0; } return ARG_ERR_BAD_ARG; } case arg_counter : { int val; if (*goptarg == '\0') val = 1; else if(sscanf(goptarg + 1, "%d", &val) != 1) return ARG_ERR_BAD_ARG; *(int *)current->value += val; return 0; } case arg_double: { double tmp; if(sscanf(goptarg + 1, "%lf", &tmp) != 1) return ARG_ERR_BAD_ARG; *(double*)current->value = tmp; return 0; } case arg_collect:{ struct getarg_collect_info *c = current->value; int o = (int)(argv - rargv[*goptind]); return (*c->func)(FALSE, argc, rargv, goptind, &o, c->data); } default: abort (); UNREACHABLE(return 0); } }