1 #define STRERROR_OVERRIDE_IMPL 1
2 #include "strerror_override.h"
5 * Override strerror() to get consistent output across platforms.
11 const char *errno_str;
13 /* clang-format off */
14 #define STRINGIFY(x) #x
15 #define ENTRY(x) {x, &STRINGIFY(undef_ ## x)[6]}
61 // Enabled during tests
62 static int _json_c_strerror_enable = 0;
63 extern char *getenv(const char *name); // Avoid including stdlib.h
65 #define PREFIX "ERRNO="
66 static char errno_buf[128] = PREFIX;
67 char *_json_c_strerror(int errno_in)
73 if (!_json_c_strerror_enable)
74 _json_c_strerror_enable = (getenv("_JSON_C_STRERROR_ENABLE") == NULL) ? -1 : 1;
75 if (_json_c_strerror_enable == -1)
76 return strerror(errno_in);
78 // Avoid standard functions, so we don't need to include any
79 // headers, or guess at signatures.
81 for (ii = 0; errno_list[ii].errno_str != (char *)0; ii++)
83 const char *errno_str = errno_list[ii].errno_str;
84 if (errno_list[ii].errno_value != errno_in)
87 for (start_idx = sizeof(PREFIX) - 1, jj = 0; errno_str[jj] != '\0';
90 errno_buf[start_idx] = errno_str[jj];
92 errno_buf[start_idx] = '\0';
96 // It's not one of the known errno values, return the numeric value.
97 for (ii = 0; errno_in >= 10; errno_in /= 10, ii++)
99 digbuf[ii] = "0123456789"[(errno_in % 10)];
101 digbuf[ii] = "0123456789"[(errno_in % 10)];
103 // Reverse the digits
104 for (start_idx = sizeof(PREFIX) - 1; ii >= 0; ii--, start_idx++)
106 errno_buf[start_idx] = digbuf[ii];
108 errno_buf[start_idx] = '\0';