home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / dlibsrc / strtol.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-19  |  1.8 KB  |  101 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. /*
  6.  * note:  For strict ANSI conformance, these functions need overflow
  7.  *      checking and should set errno.
  8.  */
  9.  
  10. static char numstr[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  11.  
  12. long strtol(number, nptr, base)
  13.     register char *number;
  14.     char **nptr;
  15.     int base;
  16.     {
  17.     char digits[38];
  18.     register long n = 0, neg = 0, lbase = ((long) base);
  19.     register char *p;
  20.  
  21.     strcpy(digits, numstr);
  22.     while(isspace(*number))
  23.         ++number;
  24.     if(*number == '-')
  25.         {
  26.         neg = 1;
  27.         ++number;
  28.         }
  29.     else if(*number == '+')
  30.         ++number;
  31.     if(lbase == 0)
  32.         {
  33.         if(*number == '0')
  34.             {
  35.             ++number;
  36.             if(toupper(*number) == 'X')
  37.                 {
  38.                 ++number;
  39.                 lbase = 16;
  40.                 }
  41.             else
  42.                 lbase = 8;
  43.             }
  44.         }
  45.     else if((lbase == 16)
  46.          && (number[0] == '0')
  47.          && (toupper(number[1]) == 'X'))
  48.             number += 2;
  49.     digits[base] = '\0';
  50.     while(p = strchr(digits, toupper(*number)))
  51.         {
  52.         ++number;
  53.         n = (n * lbase) + ((long) (p - digits));
  54.         }
  55.     if(nptr)
  56.         *nptr = number;
  57.     return(neg ? -n : n);
  58.     }
  59.  
  60. unsigned long strtoul(number, nptr, base)
  61.     register char *number;
  62.     char **nptr;
  63.     int base;
  64.     {
  65.     char digits[38];
  66.     register unsigned long n = 0;
  67.     register long lbase = ((long) base);
  68.     register char *p;
  69.  
  70.     strcpy(digits, numstr);
  71.     while(isspace(*number))
  72.         ++number;
  73.     if(lbase == 0)
  74.         {
  75.         if(*number == '0')
  76.             {
  77.             ++number;
  78.             if(toupper(*number) == 'X')
  79.                 {
  80.                 ++number;
  81.                 lbase = 16;
  82.                 }
  83.             else
  84.                 lbase = 8;
  85.             }
  86.         }
  87.     else if((lbase == 16)
  88.          && (number[0] == '0')
  89.          && (toupper(number[1]) == 'X'))
  90.             number += 2;
  91.     digits[base] = '\0';
  92.     while(p = strchr(digits, toupper(*number)))
  93.         {
  94.         n = (n * lbase) + ((long) (p - digits));
  95.         ++number;
  96.         }
  97.     if(nptr)
  98.         *nptr = number;
  99.     return(n);
  100.     }
  101.