Subversion Repositories Kolibri OS

Rev

Rev 8793 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4.  
  5. int getdigit(char ch, int base)
  6. {
  7.         if (isdigit(ch)) ch-= '0';
  8.         else
  9.     if (isalpha(ch) && ch <= 'Z') ch = 10 + ch - 'A';
  10.         else
  11.     if (isalpha(ch)) ch = 10 + ch - 'a';
  12.         else
  13.     return -1; 
  14.        
  15.         if (ch / base != 0) return -1; 
  16.  
  17.         return ch;
  18. }
  19.  
  20.  
  21. long int strtol (const char* str, char** endptr, int base)
  22. {
  23.     long int res = 0;
  24.         int             sign = 1;
  25.  
  26.         if (base > 36)
  27.         {
  28.                 errno = EINVAL;
  29.                 goto bye;
  30.         }
  31.  
  32.         while (isspace(*str)) str++;
  33.  
  34.         if (*str == '-') { sign = -1; str++; }
  35.                 else
  36.         if (*str == '+') str++;
  37.  
  38.         if (base == 0 || base == 16)
  39.         {
  40.                 if (*str == '0' && (str[1] == 'x' || str[1] == 'X'))
  41.                 {
  42.                         base = 16;
  43.                         str += 2;
  44.                 }
  45.         }
  46.  
  47.         if (base == 0 && *str == '0') base = 8;
  48.  
  49.         if (base == 0) base = 10;
  50.  
  51.  
  52.         int digit;
  53.         while ((digit = getdigit(*str, base)) >= 0)
  54.         {
  55.                 res = base * res + digit;
  56.                 str++;
  57.                 if (res < 0)
  58.                 {
  59.                         errno = ERANGE;
  60.                         if (sign > 0)
  61.                                 res = LONG_MAX;
  62.                         else
  63.                                 res = LONG_MIN;
  64.                 }
  65.         }
  66.  
  67. bye:
  68.         if (endptr)
  69.                 *endptr = (char*)str;
  70.  
  71.         return res * sign;
  72. }
  73.  
  74.