END_TEST START_TEST(array_request_parse_token_test) { int left; int right; /* test for bad parameters */ fail_unless(array_request_parse_token(NULL, &left, &right) == 0, "unhandled bad parameter (NULL str)"); fail_unless(array_request_parse_token((char *)"1-2", NULL, &right) == 0, "unhandled bad parameter (NULL left)"); fail_unless(array_request_parse_token((char *)"1-2", &left, NULL) == 0, "unhandled bad parameter (NULL right)"); fail_unless(array_request_parse_token(strdup("--"), &left, &right) == 0, "bad range fail"); fail_unless(left == -1, "start set incorrectly with bad range"); fail_unless(right == -1, "end set incorrectly with bad range"); fail_unless(array_request_parse_token(strdup("10"), &left, &right) == 1, "single number fail"); fail_unless(left == 10, "start set bad"); fail_unless(right == 10, "end set bad"); fail_unless(array_request_parse_token(strdup("0-10"), &left, &right) == 11, "range fail"); fail_unless(left == 0, "start set bad"); fail_unless(right == 10, "end set bad"); fail_unless(array_request_parse_token(strdup("1a"), &left, &right) == 0, "bad num fail"); fail_unless(left == -1, "start set incorrectly with bad num"); fail_unless(right == -1, "end set incorrectly with bad num"); fail_unless(array_request_parse_token(strdup("a-5"), &left, &right) == 0, "bad range fail"); fail_unless(left == -1, "start set incorrectly with bad range"); fail_unless(right == -1, "end set incorrectly with bad range"); }
static int parse_array_request(char *request, tlist_head *tl) { char *temp_str; int num_tokens; char **tokens; int i; int j; int num_elements; int start; int end; int num_bad_tokens; int searching; array_request_node *rn; array_request_node *rn2; temp_str = strdup(request); num_tokens = array_request_token_count(request); num_bad_tokens = 0; tokens = (char**)malloc(sizeof(char*) * num_tokens); j = num_tokens - 1; /* start from back and scan backwards setting pointers to tokens and changing ',' to '\0' */ for (i = strlen(temp_str) - 1; i >= 0; i--) { if (temp_str[i] == ',') { tokens[j--] = &temp_str[i+1]; temp_str[i] = '\0'; } else if (i == 0) { tokens[0] = temp_str; } } for (i = 0; i < num_tokens; i++) { num_elements = array_request_parse_token(tokens[i], &start, &end); if (num_elements == 0) { num_bad_tokens++; } else { rn = (array_request_node*)malloc(sizeof(array_request_node)); rn->start = start; rn->end = end; CLEAR_LINK(rn->request_tokens_link); rn2 = GET_NEXT(*tl); searching = TRUE; while (searching) { if (rn2 == NULL) { append_link(tl, &rn->request_tokens_link, (void*)rn); searching = FALSE; } else if (rn->start < rn2->start) { insert_link(&rn2->request_tokens_link, &rn->request_tokens_link, (void*)rn, LINK_INSET_BEFORE); searching = FALSE; } else { rn2 = GET_NEXT(rn2->request_tokens_link); } } rn2 = GET_PRIOR(rn->request_tokens_link); if (rn2 != NULL && rn2->end >= rn->start) { num_bad_tokens++; } rn2 = GET_NEXT(rn->request_tokens_link); if (rn2 != NULL && rn2->start <= rn->end) { num_bad_tokens++; } } } free(tokens); free(temp_str); return num_bad_tokens; }