Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * strntoumax.c
  3.  *
  4.  * The strntoumax() function and associated
  5.  */
  6.  
  7. #include <stddef.h>
  8. #include <stdint.h>
  9. #include <ctype.h>
  10. #include <inttypes.h>
  11.  
  12. static inline int digitval(int ch)
  13. {
  14.         if (ch >= '0' && ch <= '9') {
  15.                 return ch - '0';
  16.         } else if (ch >= 'A' && ch <= 'Z') {
  17.                 return ch - 'A' + 10;
  18.         } else if (ch >= 'a' && ch <= 'z') {
  19.                 return ch - 'a' + 10;
  20.         } else {
  21.                 return -1;
  22.         }
  23. }
  24.  
  25. uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n)
  26. {
  27.         int minus = 0;
  28.         uintmax_t v = 0;
  29.         int d;
  30.  
  31.         while (n && isspace((unsigned char)*nptr)) {
  32.                 nptr++;
  33.                 n--;
  34.         }
  35.  
  36.         /* Single optional + or - */
  37.         if (n) {
  38.                 char c = *nptr;
  39.                 if (c == '-' || c == '+') {
  40.                         minus = (c == '-');
  41.                         nptr++;
  42.                         n--;
  43.                 }
  44.         }
  45.  
  46.         if (base == 0) {
  47.                 if (n >= 2 && nptr[0] == '0' &&
  48.                     (nptr[1] == 'x' || nptr[1] == 'X')) {
  49.                         n -= 2;
  50.                         nptr += 2;
  51.                         base = 16;
  52.                 } else if (n >= 1 && nptr[0] == '0') {
  53.                         n--;
  54.                         nptr++;
  55.                         base = 8;
  56.                 } else {
  57.                         base = 10;
  58.                 }
  59.         } else if (base == 16) {
  60.                 if (n >= 2 && nptr[0] == '0' &&
  61.                     (nptr[1] == 'x' || nptr[1] == 'X')) {
  62.                         n -= 2;
  63.                         nptr += 2;
  64.                 }
  65.         }
  66.  
  67.         while (n && (d = digitval(*nptr)) >= 0 && d < base) {
  68.                 v = v * base + d;
  69.                 n--;
  70.                 nptr++;
  71.         }
  72.  
  73.         if (endptr)
  74.                 *endptr = (char *)nptr;
  75.  
  76.         return minus ? -v : v;
  77. }
  78.