Annotation of GNUtools/libg++/libiberty/strtol.c, revision 1.1.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.