87 #define STR vstring_str
88 #define END vstring_end
89 #define SWAP(type, a, b) { type temp; temp = a; a = b; b = temp; }
91 static unsigned char safe_chars[] =
92 "0123456789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz";
94 #define SAFE_MAX_BASE (sizeof(safe_chars) - 1)
95 #define SAFE_MIN_BASE (2)
100 int padlen,
int padchar)
102 const char *myname =
"safe_ultostr";
111 msg_panic(
"%s: bad base: %d", myname, base);
131 SWAP(
int, start[i], last[-i]);
139 const char *myname =
"safe_strtoul";
140 static unsigned char *char_map = 0;
143 unsigned long div_limit;
144 unsigned long mod_limit;
151 msg_panic(
"%s: bad base: %d", myname, base);
157 char_map = (
unsigned char *)
mymalloc(256);
158 for (char_val = 0; char_val < 256; char_val++)
159 char_map[char_val] = SAFE_MAX_BASE;
161 char_map[safe_chars[char_val]] = char_val;
168 div_limit = ULONG_MAX / base;
169 mod_limit = ULONG_MAX % base;
175 *end = (
char *) start;
183 for (cp = (
unsigned char *) start; (char_val = char_map[*cp]) < base; cp++) {
186 || (sum == div_limit && char_val > mod_limit)) {
190 while (char_map[*++cp] < base)
194 sum = sum * base + char_val;
197 if (cp == (
unsigned char *) start)
214 int main(
int unused_argc,
char **unused_argv)
221 unsigned long ulval2;
223 #ifdef MISSING_STRTOUL
224 #define strtoul strtol
231 if (*junk == 0 || errno != EINVAL)
232 msg_warn(
"input=' ' result=%lu errno=%m", ulval2);
239 if (sscanf(
STR(buf),
"%lu %d%c", &ulval, &base, &ch) != 2 || ch) {
245 if (*junk || (ulval2 == ULONG_MAX && errno == ERANGE))
248 msg_warn(
"%lu != %lu", ulval2, ulval);
int vstring_get_nonl(VSTRING *vp, VSTREAM *fp)
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
#define VSTRING_TERMINATE(vp)
#define VSTRING_ADDCH(vp, ch)
VSTREAM * vstream_printf(const char *fmt,...)
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
unsigned long safe_strtoul(const char *start, char **end, int base)
int vstream_fflush(VSTREAM *stream)
char * safe_ultostr(VSTRING *buf, unsigned long ulval, int base, int padlen, int padchar)
VSTRING * vstring_free(VSTRING *vp)
void * mymalloc(ssize_t len)