|
29 | 29 | #ifdef HAVE_ERRNO_H
|
30 | 30 | #include <errno.h> /* for the ENOENT definitions in str_errors */
|
31 | 31 | #endif
|
| 32 | +#ifdef HAVE_LIMITS_H |
| 33 | +#include <limits.h> |
| 34 | +#endif |
32 | 35 |
|
33 | 36 | #include "ne_string.h"
|
34 | 37 | #include "ne_utils.h"
|
@@ -783,6 +786,58 @@ static int strparam(void)
|
783 | 786 | return OK;
|
784 | 787 | }
|
785 | 788 |
|
| 789 | +static int strhextoul(void) |
| 790 | +{ |
| 791 | + static const struct { |
| 792 | + const char *input; |
| 793 | + unsigned long expect; |
| 794 | + int error; /* errno */ |
| 795 | + const char *endp; |
| 796 | + } *t, ts[] = { |
| 797 | + { "0x0", ULONG_MAX, EINVAL }, |
| 798 | + { "0X1", ULONG_MAX, EINVAL }, |
| 799 | + { "+1", ULONG_MAX, EINVAL }, |
| 800 | + { "-0", ULONG_MAX, EINVAL }, |
| 801 | + { "+0x1", ULONG_MAX, EINVAL }, |
| 802 | + { "+0X1", ULONG_MAX, EINVAL }, |
| 803 | + { "", ULONG_MAX, EINVAL }, |
| 804 | + { "1", 1, 0, "" }, |
| 805 | + { " 10", ULONG_MAX, EINVAL, " 10" }, |
| 806 | + { "0000010 ", 16, 0, " " }, |
| 807 | + { "4242", 16962, 0 }, |
| 808 | + { "4242zZZz", 16962, 0, "zZZz" }, |
| 809 | + { "cAfEBeEf", 3405692655 }, |
| 810 | +#if SIZEOF_LONG == 8 |
| 811 | + { "10000000000000000", ULONG_MAX, ERANGE }, |
| 812 | + { "100000000", 0x100000000, 0 }, |
| 813 | +#elif SIZEOF_LONG == 4 |
| 814 | + { "100000000", ULONG_MAX, ERANGE }, |
| 815 | +#endif |
| 816 | + { NULL } |
| 817 | + }; |
| 818 | + unsigned n; |
| 819 | + |
| 820 | + for (n = 0; ts[n].input; n++) { |
| 821 | + unsigned long actual; |
| 822 | + const char *endp = "(unset)", **endpp; |
| 823 | + int errnum; |
| 824 | + |
| 825 | + t = ts + n; |
| 826 | + |
| 827 | + endpp = t->endp ? &endp : NULL; |
| 828 | + errno = ENOENT; |
| 829 | + actual = ne_strhextoul(t->input, endpp); |
| 830 | + errnum = errno; |
| 831 | + ONV(errnum != t->error, |
| 832 | + ("got errno %d not %d for [%s]", errnum, t->error, t->input)); |
| 833 | + ONV(actual != t->expect, |
| 834 | + ("got %lu not %lu for [%s]", actual, t->expect, t->input)); |
| 835 | + if (endpp) ONCMP(*endpp, t->endp); |
| 836 | + } |
| 837 | + |
| 838 | + return OK; |
| 839 | +} |
| 840 | + |
786 | 841 | ne_test tests[] = {
|
787 | 842 | T(simple),
|
788 | 843 | T(buf_concat),
|
@@ -816,6 +871,7 @@ ne_test tests[] = {
|
816 | 871 | T(strhash_sha_512),
|
817 | 872 | T(strhash_sha_512_256),
|
818 | 873 | T(strparam),
|
| 874 | + T(strhextoul), |
819 | 875 | T(NULL)
|
820 | 876 | };
|
821 | 877 |
|
0 commit comments