-static void test_hex(void) {
- unsigned n;
- static const unsigned char h[] = { 0x00, 0xFF, 0x80, 0x7F };
- uint8_t *u;
- size_t ul;
-
- fprintf(stderr, "test_hex\n");
-
- for(n = 0; n <= UCHAR_MAX; ++n) {
- if(!isxdigit(n))
- insist(unhexdigitq(n) == -1);
- }
- insist(unhexdigitq('0') == 0);
- insist(unhexdigitq('1') == 1);
- insist(unhexdigitq('2') == 2);
- insist(unhexdigitq('3') == 3);
- insist(unhexdigitq('4') == 4);
- insist(unhexdigitq('5') == 5);
- insist(unhexdigitq('6') == 6);
- insist(unhexdigitq('7') == 7);
- insist(unhexdigitq('8') == 8);
- insist(unhexdigitq('9') == 9);
- insist(unhexdigitq('a') == 10);
- insist(unhexdigitq('b') == 11);
- insist(unhexdigitq('c') == 12);
- insist(unhexdigitq('d') == 13);
- insist(unhexdigitq('e') == 14);
- insist(unhexdigitq('f') == 15);
- insist(unhexdigitq('A') == 10);
- insist(unhexdigitq('B') == 11);
- insist(unhexdigitq('C') == 12);
- insist(unhexdigitq('D') == 13);
- insist(unhexdigitq('E') == 14);
- insist(unhexdigitq('F') == 15);
- check_string(hex(h, sizeof h), "00ff807f");
- check_string(hex(0, 0), "");
- u = unhex("00ff807f", &ul);
- insist(ul == 4);
- insist(memcmp(u, h, 4) == 0);
- u = unhex("00FF807F", &ul);
- insist(ul == 4);
- insist(memcmp(u, h, 4) == 0);
- u = unhex("", &ul);
- insist(ul == 0);
- fprintf(stderr, "2 ERROR reports expected {\n");
- insist(unhex("F", 0) == 0);
- insist(unhex("az", 0) == 0);
- fprintf(stderr, "}\n");
-}
-
-static void test_casefold(void) {
- uint32_t c, l;
- const char *input, *canon_folded, *compat_folded, *canon_expected, *compat_expected;
-
- fprintf(stderr, "test_casefold\n");
-
- /* This isn't a very exhaustive test. Unlike for normalization, there don't
- * seem to be any public test vectors for these algorithms. */
-
- for(c = 1; c < 256; ++c) {
- input = utf32_to_utf8(&c, 1, 0);
- canon_folded = utf8_casefold_canon(input, strlen(input), 0);
- compat_folded = utf8_casefold_compat(input, strlen(input), 0);
- switch(c) {
- default:
- if((c >= 'A' && c <= 'Z')
- || (c >= 0xC0 && c <= 0xDE && c != 0xD7))
- l = c ^ 0x20;
- else
- l = c;
- break;
- case 0xB5: /* MICRO SIGN */
- l = 0x3BC; /* GREEK SMALL LETTER MU */
- break;
- case 0xDF: /* LATIN SMALL LETTER SHARP S */
- insist(!strcmp(canon_folded, "ss"));
- insist(!strcmp(compat_folded, "ss"));
- l = 0;
- break;
- }
- if(l) {
- uint32_t *d;
- /* Case-folded data is now normalized */
- d = utf32_decompose_canon(&l, 1, 0);
- canon_expected = utf32_to_utf8(d, utf32_len(d), 0);
- if(strcmp(canon_folded, canon_expected)) {
- fprintf(stderr, "%s:%d: canon-casefolding %#lx got '%s', expected '%s'\n",
- __FILE__, __LINE__, (unsigned long)c,
- format(canon_folded), format(canon_expected));
- count_error();
- }
- ++tests;
- d = utf32_decompose_compat(&l, 1, 0);
- compat_expected = utf32_to_utf8(d, utf32_len(d), 0);
- if(strcmp(compat_folded, compat_expected)) {
- fprintf(stderr, "%s:%d: compat-casefolding %#lx got '%s', expected '%s'\n",
- __FILE__, __LINE__, (unsigned long)c,
- format(compat_folded), format(compat_expected));
- count_error();
- }
- ++tests;
- }
- }
- check_string(casefold(""), "");
-}
-
-/** @brief Less-than comparison function for integer heap */
-static inline int int_lt(int a, int b) { return a < b; }
-
-/** @struct iheap
- * @brief A heap with @c int elements */
-HEAP_TYPE(iheap, int, int_lt);
-HEAP_DEFINE(iheap, int, int_lt);
-
-/** @brief Tests for @ref heap.h */
-static void test_heap(void) {
- struct iheap h[1];