#include "test.h" #include "multiset.h" BEGIN_TEST SHOW(multiset *m = NULL); SHOW(multiset_insert(&m, 5)); SHOW(multiset_insert(&m, 3)); SHOW(multiset_insert(&m, 7)); SHOW(multiset_insert(&m, 3)); SHOW(multiset_insert(&m, 5)); TEST(m->value == 5); TEST(m->count == 2); TEST(m->left->value == 3); TEST(m->left->count == 2); TEST(m->right->value == 7); TEST(m->right->count == 1); END_TEST
/* * Parse the given string and fill the passed multisets with, * respectively, "normal" and "internal" prestates. Note that the * latter is filled only if the FIRST prestate is "internal" and in * such case the former has just one member - "internal". * Returns the passed url without the prestate part. */ static void f_parse_prestates( INT32 args ) { struct pike_string *url; struct multiset *prestate; struct multiset *internal; struct svalue ind; char *tmp; int prestate_end = -1; int done_first = 0, i; int last_start; ind.type = T_STRING; get_all_args("Caudium.parse_prestates", args, "%S%M%M", &url, &prestate, &internal); if (url->len < 5 || url->str[1] != '(') { /* must have at least '/(#)/ */ pop_n_elems(args-1); /* Leave URL on the stack == return it */ return; } tmp = &url->str[3]; while (tmp && *tmp) { if (*tmp == '/' && *(tmp - 1) == ')') { prestate_end = tmp - url->str; break; } tmp++; } if (prestate_end < 0) { pop_n_elems(args-1); /* Leave URL on the stack == return it */ return; /* not a prestate */ } /* * Determine which prestate we should fill. */ last_start = 2; for(i = 2; i <= prestate_end; i++) { if (url->str[i] == ',' || url->str[i] == ')') { int len = i - last_start; switch(done_first) { case 0: if (!MEMCMP(&url->str[last_start], "internal", len)) { done_first = -1; ind.u.string = make_shared_string("internal"); } else { done_first = 1; ind.u.string = make_shared_binary_string(&url->str[last_start], len); } multiset_insert(prestate, &ind); break; case -1: /* internal */ ind.u.string = make_shared_binary_string(&url->str[last_start], len); multiset_insert(internal, &ind); break; default: /* prestate */ ind.u.string = make_shared_binary_string(&url->str[last_start], len); multiset_insert(prestate, &ind); break; } free_svalue(&ind); last_start = i + 1; } } pop_n_elems(args); push_string(make_shared_string(url->str + prestate_end)); }