Annotation of GNUtools/libg++/libiberty/strtol.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * strtol : convert a string to long.
        !             3:  *
        !             4:  * Andy Wilson, 2-Oct-89.
        !             5:  */
        !             6: 
        !             7: #include <errno.h>
        !             8: #include <ctype.h>
        !             9: #include <stdio.h>
        !            10: #include "ansidecl.h"
        !            11: 
        !            12: /* FIXME: It'd be nice to configure around these, but the include files are too
        !            13:    painful.  These macros should at least be more portable than hardwired hex
        !            14:    constants. */
        !            15: 
        !            16: #define        ULONG_MAX       ((unsigned long)(~0L))          /* 0xFFFFFFFF */
        !            17: #define        LONG_MAX        ((long)(ULONG_MAX >> 1))        /* 0x7FFFFFFF */
        !            18: #define        LONG_MIN        ((long)(~LONG_MAX))             /* 0x80000000 */
        !            19: 
        !            20: extern int errno;
        !            21: 
        !            22: long
        !            23: strtol(s, ptr, base)
        !            24:      CONST char *s; char **ptr; int base;
        !            25: {
        !            26:   extern unsigned long  strtoul();
        !            27:   int minus=0;
        !            28:   unsigned long tmp;
        !            29:   CONST char *start=s, *eptr;
        !            30: 
        !            31:   if (s==NULL)
        !            32:     {
        !            33:       errno = ERANGE;
        !            34:       if (!ptr)
        !            35:        *ptr = (char *)start;
        !            36:       return 0L;
        !            37:     }
        !            38:   while (isspace(*s))
        !            39:        s++;
        !            40:   if (*s == '-') {
        !            41:        s++;
        !            42:        minus = 1;
        !            43:       }
        !            44:   else if (*s == '+')
        !            45:     s++;
        !            46: 
        !            47:   /*
        !            48:    * let strtoul do the hard work.
        !            49:    */
        !            50:   tmp = strtoul(s, &eptr, base);
        !            51:   if (ptr != NULL)
        !            52:     *ptr = (char *)((eptr==s) ? (char *)start : eptr);
        !            53:   if (tmp > (minus ? - (unsigned long) LONG_MIN : (unsigned long) LONG_MAX))
        !            54:     {
        !            55:       errno = ERANGE;
        !            56:       return (minus ? LONG_MIN : LONG_MAX);
        !            57:     }
        !            58:   return (minus ? (long) -tmp : (long) tmp);
        !            59: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.