diff options
Diffstat (limited to 'libreport/src/lib/xatonum.c')
-rw-r--r-- | libreport/src/lib/xatonum.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libreport/src/lib/xatonum.c b/libreport/src/lib/xatonum.c new file mode 100644 index 00000000..b6b90a98 --- /dev/null +++ b/libreport/src/lib/xatonum.c @@ -0,0 +1,50 @@ +/* + * Utility routines. + * + * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org> + * + * Licensed under GPLv2, see file LICENSE in this tarball for details. + */ +#include "libreport.h" + +unsigned xatou(const char *numstr) +{ + unsigned long r; + int old_errno; + char *e; + + if (*numstr < '0' || *numstr > '9') + goto inval; + + old_errno = errno; + errno = 0; + r = strtoul(numstr, &e, 10); + if (errno || numstr == e || *e != '\0' || r > UINT_MAX) + goto inval; /* error / no digits / illegal trailing chars */ + errno = old_errno; /* Ok. So restore errno. */ + return r; + +inval: + error_msg_and_die("invalid number '%s'", numstr); +} + +int xatoi_positive(const char *numstr) +{ + unsigned r = xatou(numstr); + if (r > (unsigned)INT_MAX) + error_msg_and_die("invalid number '%s'", numstr); + return r; +} + +int xatoi(const char *numstr) +{ + unsigned r; + + if (*numstr != '-') + return xatoi_positive(numstr); + + r = xatou(numstr + 1); + if (r > (unsigned)INT_MAX + 1) + error_msg_and_die("invalid number '%s'", numstr); + return - (int)r; +} |