/* * Test every possible word value. * Once we are finished, retest every possible word value. * if the test fails on the following null word, iterate test_nrange * again, appending another word. * This assures the output order of the two tests are in sync. */ void test_wrange(struct testval *p) { struct testval f, l, s; apr_status_t rc; int success = 0; memcpy (&s, p, sizeof(s)); ++s.wl; do { apr_size_t nl = sizeof(s.n), wl = s.wl; rc = apr_conv_ucs2_to_utf8(s.w, &wl, s.n, &nl); s.nl = sizeof(s.n) - nl; if (!wl && rc == APR_SUCCESS) { if (!success) { memcpy(&f, &s, sizeof(s)); success = -1; } else { if (s.nl != l.nl || memcmp(s.n, l.n, s.nl - 1) != 0 || s.n[s.nl - 1] != l.n[l.nl - 1] + 1) { displaynw(&f, &l); memcpy(&f, &s, sizeof(s)); } } memcpy(&l, &s, sizeof(s)); } else { if (success) { displaynw(&f, &l); success = 0; } } } while (++s.w[s.wl - 1]); if (success) { displaynw(&f, &l); success = 0; } do { int wl = s.wl, nl = sizeof(s.n); rc = apr_conv_ucs2_to_utf8(s.w, &wl, s.n, &nl); s.nl = sizeof(s.n) - s.nl; if (rc == APR_INCOMPLETE) { test_wrange(&s); } } while (++s.w[s.wl - 1]); }
/* * Syntax: testucs [w|n] * * If arg is not recognized, run both tests. */ int main(int argc, char **argv) { struct testval s; memset (&s, 0, sizeof(s)); if (argc < 2 || apr_tolower(*argv[1]) != 'w') { printf ("\n\nTesting Narrow Char Ranges\n"); test_nrange(&s); } if (argc < 2 || apr_tolower(*argv[1]) != 'n') { printf ("\n\nTesting Wide Char Ranges\n"); test_wrange(&s); } return 0; }