home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / gnu / libg++-2.5.3-src.lha / src / amiga / libg++-2.5.3 / libg++-2.5.3-amiga / libiberty / strtol.c < prev    next >
C/C++ Source or Header  |  1993-10-15  |  1KB  |  60 lines

  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. }
  60.