github.com/afumu/libc@v0.0.6/musl/src/stdlib/strtol.c (about)

     1  #include "stdio_impl.h"
     2  #include "intscan.h"
     3  #include "shgetc.h"
     4  #include <inttypes.h>
     5  #include <limits.h>
     6  #include <ctype.h>
     7  
     8  static unsigned long long strtox(const char *s, char **p, int base, unsigned long long lim)
     9  {
    10  	FILE f;
    11  	sh_fromstring(&f, s);
    12  	shlim(&f, 0);
    13  	unsigned long long y = __intscan(&f, base, 1, lim);
    14  	if (p) {
    15  		size_t cnt = shcnt(&f);
    16  		*p = (char *)s + cnt;
    17  	}
    18  	return y;
    19  }
    20  
    21  unsigned long long strtoull(const char *restrict s, char **restrict p, int base)
    22  {
    23  	return strtox(s, p, base, ULLONG_MAX);
    24  }
    25  
    26  long long strtoll(const char *restrict s, char **restrict p, int base)
    27  {
    28  	return strtox(s, p, base, LLONG_MIN);
    29  }
    30  
    31  unsigned long strtoul(const char *restrict s, char **restrict p, int base)
    32  {
    33  	return strtox(s, p, base, ULONG_MAX);
    34  }
    35  
    36  long strtol(const char *restrict s, char **restrict p, int base)
    37  {
    38  	return strtox(s, p, base, 0UL+LONG_MIN);
    39  }
    40  
    41  intmax_t strtoimax(const char *restrict s, char **restrict p, int base)
    42  {
    43  	return strtoll(s, p, base);
    44  }
    45  
    46  uintmax_t strtoumax(const char *restrict s, char **restrict p, int base)
    47  {
    48  	return strtoull(s, p, base);
    49  }
    50  
    51  weak_alias(strtol, __strtol_internal);
    52  weak_alias(strtoul, __strtoul_internal);
    53  weak_alias(strtoll, __strtoll_internal);
    54  weak_alias(strtoull, __strtoull_internal);
    55  weak_alias(strtoimax, __strtoimax_internal);
    56  weak_alias(strtoumax, __strtoumax_internal);