/* * 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; }
/* * Test every possible byte value. * If the test passes or fails at this byte value we are done. * Otherwise iterate test_nrange again, appending another byte. */ void test_nrange(struct testval *p) { struct testval f, l, s; apr_status_t rc; int success = 0; memcpy (&s, p, sizeof(s)); ++s.nl; do { apr_size_t nl = s.nl, wl = sizeof(s.w) / 2; rc = apr_conv_utf8_to_ucs2(s.n, &nl, s.w, &wl); s.wl = (sizeof(s.w) / 2) - wl; if (!nl && rc == APR_SUCCESS) { if (!success) { memcpy(&f, &s, sizeof(s)); success = -1; } else { if (s.wl != l.wl || memcmp(s.w, l.w, (s.wl - 1) * 2) != 0 || s.w[s.wl - 1] != l.w[l.wl - 1] + 1) { displaynw(&f, &l); memcpy(&f, &s, sizeof(s)); } } memcpy(&l, &s, sizeof(s)); } else { if (success) { displaynw(&f, &l); success = 0; } if (rc == APR_INCOMPLETE) { test_nrange(&s); } } } while (++s.n[s.nl - 1]); if (success) { displaynw(&f, &l); success = 0; } }