2 * Helper application to test internal library error reporting.
3 * Copyright © 2023 Nick Bowler
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
25 #include "cdecl-internal.h"
30 static char *fmt_char(int c, char *buf)
35 case '\a': escape = 'a'; break;
36 case '\b': escape = 'b'; break;
37 case '\t': escape = 't'; break;
38 case '\n': escape = 'n'; break;
39 case '\v': escape = 'v'; break;
40 case '\f': escape = 'f'; break;
41 case '\r': escape = 'r'; break;
42 case '\\': escape = '\\'; break;
43 case '\'': escape = '\''; break;
47 sprintf(buf, "'\\%c'", escape);
48 else if (isprint((unsigned char)c))
49 sprintf(buf, "'%c'", c);
51 sprintf(buf, "'\\%.3o'", c & 0777u);
56 static void check_fixed_string(size_t len)
58 const struct cdecl_error *err;
63 work1 = calloc(2, len);
68 memset(work1, 'X', len - 1);
69 memset(work2, 'X', len - 1);
71 tap_diag("cdecl__err w/ %lu-byte string", (unsigned long)len);
72 cdecl__err(1234, work1, "");
73 memset(work1, 0, len);
74 err = cdecl_get_error();
76 if (!tap_result(err->code == 1234, "returned error code")) {
77 tap_diag("Failed, unexpected result");
78 tap_diag(" Received: %u", err->code);
79 tap_diag(" Expected: 1234");
82 errlen = strlen(err->str);
83 if (!tap_result(errlen == len-1, "returned string length")) {
84 tap_diag("Failed, unexpected result");
85 tap_diag(" Received: %lu", (unsigned long)errlen);
86 tap_diag(" Expected: %lu", (unsigned long)len);
89 if (!tap_result(!memcmp(err->str, work2, len), "returned string")) {
93 n = strspn(err->str, "X");
97 tap_diag("Failed, first incorrect character at offset %lu",
99 tap_diag(" Received: %s", fmt_char(err->str[n], buf));
100 tap_diag(" Expected: %s", fmt_char(work2[n], buf));
106 static void check_enomem()
108 const char expmsg[] = "failed to allocate memory";
109 const struct cdecl_error *err;
111 tap_diag("cdecl__errmsg(CDECL__ENOMEM)");
112 cdecl__errmsg(CDECL__ENOMEM);
113 err = cdecl_get_error();
115 if (!tap_result(err->code == CDECL_ENOMEM, "returned error code")) {
116 tap_diag("Failed, unexpected result");
117 tap_diag(" Received: %u", err->code);
118 tap_diag(" Expected: %d", CDECL_ENOMEM);
121 if (!tap_result(!strcmp(err->str, "failed to allocate memory"),
126 for (i = 0; i < sizeof expmsg; i++) {
127 if (err->str[i] != expmsg[i])
131 tap_diag("Failed, first incorrect character at offset %u", i);
132 tap_diag(" Received: %.*s", (int)sizeof expmsg, err->str);
133 tap_diag(" Expected: %s", expmsg);
141 check_fixed_string(50);
142 check_fixed_string(500);
143 check_fixed_string(5000);