// ---------------------------------------------------------------- static char* test_slls() { slls_t* plist = slls_from_line(strdup(""), ',', FALSE); mu_assert_lf(plist->length == 0); plist = slls_from_line(strdup("a"), ',', FALSE); mu_assert_lf(plist->length == 1); plist = slls_from_line(strdup("c,d,a,e,b"), ',', FALSE); mu_assert_lf(plist->length == 5); sllse_t* pe = plist->phead; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "c")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "d")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "a")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "e")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "b")); pe = pe->pnext; mu_assert_lf(pe == NULL); slls_sort(plist); mu_assert_lf(plist->length == 5); pe = plist->phead; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "a")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "b")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "c")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "d")); pe = pe->pnext; mu_assert_lf(pe != NULL); mu_assert_lf(streq(pe->value, "e")); pe = pe->pnext; mu_assert_lf(pe == NULL); return NULL; }
static char * test2() { int bflag1 = -4; int bflag2 = -5; int intv1 = -6; int intv2 = -7; int intv3 = -8; double fltv = -9.5; char* string = NULL; slls_t* plist = NULL; string_array_t* parray = NULL; ap_state_t* pstate = ap_alloc(); ap_define_true_flag(pstate, "-t", &bflag1); ap_define_false_flag(pstate, "-f", &bflag2); ap_define_int_value_flag(pstate, "-100", 100, &intv1); ap_define_int_value_flag(pstate, "-200", 200, &intv2); ap_define_int_flag(pstate, "-i", &intv3); ap_define_float_flag(pstate, "-d", &fltv); ap_define_string_flag(pstate, "-s", &string); ap_define_string_list_flag(pstate, "-S", &plist); ap_define_string_array_flag(pstate, "-A", &parray); char* argv[] = { "test-verb", "-t", "-f", "-100", "-200", "-i", "555", "-d", "4.25", "-s", "hello", "-S", mlr_strdup_or_die("a,b,c,d,e"), "-A", mlr_strdup_or_die("x,y,z"), "do", "re", "mi", NULL }; int argc = compute_argc(argv); char* verb = argv[0]; int argi = 1; mu_assert_lf(ap_parse(pstate, verb, &argi, argc, argv) == TRUE); mu_assert_lf(bflag1 == TRUE); mu_assert_lf(bflag2 == FALSE); mu_assert_lf(intv1 == 100); mu_assert_lf(intv2 == 200); mu_assert_lf(intv3 == 555); mu_assert_lf(fltv == 4.25); mu_assert_lf(string != NULL); mu_assert_lf(streq(string, "hello")); mu_assert_lf(plist != NULL); mu_assert_lf(slls_equals(plist, slls_from_line(mlr_strdup_or_die("a,b,c,d,e"), ',', FALSE))); mu_assert_lf(parray != NULL); mu_assert_lf(parray->length == 3); mu_assert_lf(streq(parray->strings[0], "x")); mu_assert_lf(streq(parray->strings[1], "y")); mu_assert_lf(streq(parray->strings[2], "z")); mu_assert_lf(argi == 15); ap_free(pstate); return 0; }
int main(int argc, char** argv) { slls_t* plist = slls_from_line(argv[1], ',', FALSE); printf("len=%d\n", plist->length); for (sllse_t* pe = plist->phead; pe != NULL; pe = pe->pnext) printf("val=%s\n", (char*)pe->value); slls_sort(plist); printf("\n"); printf("len=%d\n", plist->length); for (sllse_t* pe = plist->phead; pe != NULL; pe = pe->pnext) printf("val=%s\n", (char*)pe->value); return 0; }
static char * test2() { int bflag1 = -4; int bflag2 = -5; int intv1 = -6; int intv2 = -7; int intv3 = -8; double dblv = -9.5; char* string = NULL; slls_t* plist = NULL; ap_state_t* pstate = ap_alloc(); ap_define_true_flag(pstate, "-t", &bflag1); ap_define_false_flag(pstate, "-f", &bflag2); ap_define_int_value_flag(pstate, "-100", 100, &intv1); ap_define_int_value_flag(pstate, "-200", 200, &intv2); ap_define_int_flag(pstate, "-i", &intv3); ap_define_double_flag(pstate, "-d", &dblv); ap_define_string_flag(pstate, "-s", &string); ap_define_string_list_flag(pstate, "-S", &plist); char* argv[] = { "test-verb", "-t", "-f", "-100", "-200", "-i", "555", "-d", "4.25", "-s", "hello", "-S", strdup("a,b,c,d,e"), "do", "re", "mi", NULL }; int argc = compute_argc(argv); char* verb = argv[0]; int argi = 1; mu_assert_lf(ap_parse(pstate, verb, &argi, argc, argv) == TRUE); mu_assert_lf(bflag1 == TRUE); mu_assert_lf(bflag2 == FALSE); mu_assert_lf(intv1 == 100); mu_assert_lf(intv2 == 200); mu_assert_lf(intv3 == 555); mu_assert_lf(dblv == 4.25); mu_assert_lf(string != NULL); mu_assert_lf(streq(string, "hello")); mu_assert_lf(plist != NULL); mu_assert_lf(slls_equals(plist, slls_from_line(strdup("a,b,c,d,e"), ',', FALSE))); mu_assert_lf(argi == 13); ap_free(pstate); return 0; }
// ---------------------------------------------------------------- int ap_parse(ap_state_t* pstate, char* verb, int* pargi, int argc, char** argv) { int argi = *pargi; int ok = TRUE; while (argi < argc) { if (argv[argi][0] != '-') { break; } if (streq(argv[argi], "-h") || streq(argv[argi], "--help")) { ok = FALSE; break; } ap_flag_def_t* pdef = ap_find(pstate, argv[argi]); if (pdef == NULL) { ok = FALSE; break; } if ((argc-argi) < pdef->count) { fprintf(stderr, "%s %s: option %s requires an argument.\n", argv[0], verb, argv[argi]); fprintf(stderr, "\n"); ok = FALSE; break; } if (pdef->type == AP_INT_VALUE_FLAG) { *(int *)pdef->pval = pdef->intval; } else if (pdef->type == AP_CHAR_FLAG) { if (!try_sep_from_arg(argv[argi+1], (char *)pdef->pval)) { fprintf(stderr, "%s %s: couldn't parse \"%s\" after \"%s\" as character.\n", argv[0], verb, argv[argi+1], argv[argi]); fprintf(stderr, "\n"); } } else if (pdef->type == AP_INT_FLAG) { if (sscanf(argv[argi+1], "%d", (int *)pdef->pval) != 1) { fprintf(stderr, "%s %s: couldn't parse \"%s\" after \"%s\" as integer.\n", argv[0], verb, argv[argi+1], argv[argi]); fprintf(stderr, "\n"); } } else if (pdef->type == AP_DOUBLE_FLAG) { if (!mlr_try_double_from_string(argv[argi+1], (double *)pdef->pval)) { fprintf(stderr, "%s %s: couldn't parse \"%s\" after \"%s\" as double.\n", argv[0], verb, argv[argi+1], argv[argi]); fprintf(stderr, "\n"); } } else if (pdef->type == AP_STRING_FLAG) { char** pstring = pdef->pval; *pstring = argv[argi+1]; pdef->pval = pstring; } else if (pdef->type == AP_STRING_LIST_FLAG) { slls_t** pplist = pdef->pval; if (*pplist != NULL) slls_free(*pplist); *pplist = slls_from_line(argv[argi+1], ',', FALSE); pdef->pval = pplist; } else { ok = FALSE; fprintf(stderr, "argparse.c: coding error: flag-def type %x not recognized.\n", pdef->type); fprintf(stderr, "\n"); break; } argi += pdef->count; } *pargi = argi; return ok; }