Annotation of embedaddon/lrzsz/lib/xstrtol.c, revision 1.1
1.1 ! misho 1: /* A more useful interface to strtol.
! 2: Copyright (C) 1995, 1996 Free Software Foundation, Inc.
! 3:
! 4: This program is free software; you can redistribute it and/or modify
! 5: it under the terms of the GNU General Public License as published by
! 6: the Free Software Foundation; either version 2, or (at your option)
! 7: any later version.
! 8:
! 9: This program is distributed in the hope that it will be useful,
! 10: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 12: GNU General Public License for more details.
! 13:
! 14: You should have received a copy of the GNU General Public License
! 15: along with this program; if not, write to the Free Software Foundation,
! 16: Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
! 17:
! 18: /* Jim Meyering (meyering@na-net.ornl.gov) */
! 19:
! 20: #ifdef HAVE_CONFIG_H
! 21: #include <config.h>
! 22: #endif
! 23:
! 24: #ifdef STDC_HEADERS
! 25: #include <stdlib.h>
! 26: #endif
! 27:
! 28: #ifdef HAVE_STRING_H
! 29: # include <string.h>
! 30: #else
! 31: # include <strings.h>
! 32: # ifndef strchr
! 33: # define strchr index
! 34: # endif
! 35: #endif
! 36:
! 37: #define NDEBUG
! 38: #include <assert.h>
! 39:
! 40: #include <errno.h>
! 41: #ifndef errno
! 42: extern int errno;
! 43: #endif
! 44:
! 45: #if HAVE_LIMITS_H
! 46: # include <limits.h>
! 47: #endif
! 48:
! 49: #ifndef ULONG_MAX
! 50: # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
! 51: #endif
! 52:
! 53: #ifndef LONG_MAX
! 54: # define LONG_MAX ((long int) (ULONG_MAX >> 1))
! 55: #endif
! 56:
! 57: #include "xstrtol.h"
! 58:
! 59: #define BKM_SCALE(x, scale_factor, error_return) \
! 60: do \
! 61: { \
! 62: if ((x) > (double) __ZLONG_MAX / (scale_factor)) \
! 63: return (error_return); \
! 64: (x) *= (scale_factor); \
! 65: } \
! 66: while (0)
! 67:
! 68: __unsigned long int __strtol ();
! 69:
! 70: /* FIXME: comment. */
! 71:
! 72: strtol_error
! 73: __xstrtol (s, ptr, base, val, valid_suffixes)
! 74: const char *s;
! 75: char **ptr;
! 76: int base;
! 77: __unsigned long int *val;
! 78: const char *valid_suffixes;
! 79: {
! 80: char *t_ptr;
! 81: char **p;
! 82: __unsigned long int tmp;
! 83:
! 84: assert (0 <= base && base <= 36);
! 85:
! 86: p = (ptr ? ptr : &t_ptr);
! 87:
! 88: errno = 0;
! 89: tmp = __strtol (s, p, base);
! 90: if (errno != 0)
! 91: return LONGINT_OVERFLOW;
! 92: if (*p == s)
! 93: return LONGINT_INVALID;
! 94: if (!valid_suffixes)
! 95: {
! 96: if (**p == '\0')
! 97: {
! 98: *val = tmp;
! 99: return LONGINT_OK;
! 100: }
! 101: else
! 102: return LONGINT_INVALID_SUFFIX_CHAR;
! 103: }
! 104:
! 105: if (**p != '\0' && strchr (valid_suffixes, **p))
! 106: {
! 107: switch (**p)
! 108: {
! 109: case 'b':
! 110: BKM_SCALE (tmp, 512, LONGINT_OVERFLOW);
! 111: ++(*p);
! 112: break;
! 113:
! 114: case 'c':
! 115: ++(*p);
! 116: break;
! 117:
! 118: case 'B':
! 119: case 'k':
! 120: BKM_SCALE (tmp, 1024, LONGINT_OVERFLOW);
! 121: ++(*p);
! 122: break;
! 123:
! 124: case 'm':
! 125: BKM_SCALE (tmp, 1024 * 1024, LONGINT_OVERFLOW);
! 126: ++(*p);
! 127: break;
! 128:
! 129: case 'w':
! 130: BKM_SCALE (tmp, 2, LONGINT_OVERFLOW);
! 131: ++(*p);
! 132: break;
! 133:
! 134: default:
! 135: return LONGINT_INVALID_SUFFIX_CHAR;
! 136: break;
! 137: }
! 138: }
! 139:
! 140: *val = tmp;
! 141: return LONGINT_OK;
! 142: }
! 143:
! 144: #ifdef TESTING_XSTRTO
! 145:
! 146: #include <stdio.h>
! 147: #include "error.h"
! 148:
! 149: char *program_name;
! 150:
! 151: int
! 152: main (int argc, char** argv)
! 153: {
! 154: strtol_error s_err;
! 155: int i;
! 156:
! 157: program_name = argv[0];
! 158: for (i=1; i<argc; i++)
! 159: {
! 160: char *p;
! 161: __unsigned long int val;
! 162:
! 163: s_err = __xstrtol (argv[i], &p, 0, &val, "bckmw");
! 164: if (s_err == LONGINT_OK)
! 165: {
! 166: printf ("%s->%lu (%s)\n", argv[i], val, p);
! 167: }
! 168: else
! 169: {
! 170: STRTOL_FATAL_ERROR (argv[i], "arg", s_err);
! 171: }
! 172: }
! 173: exit (0);
! 174: }
! 175: #endif /* TESTING_XSTRTO */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>