Embedded Artistry libc
C Standard Library Support for Bare-metal Systems
strtoul.c File Reference
#include <ctype.h>
#include <limits.h>
#include <stdlib.h>
Include dependency graph for strtoul.c:

Go to the source code of this file.

Functions

unsigned long strtoul (char *nptr, char **endptr, int base) const
 

Function Documentation

◆ strtoul()

unsigned long strtoul ( char*  nptr,
char**  endptr,
int  base 
) const

Definition at line 78 of file strtoul.c.

81 {
82  register const char* s = nptr;
83  register unsigned long acc;
84  register int c;
85  register unsigned long cutoff;
86  register int neg = 0, any, cutlim;
87 
88  /*
89  * See strtol for comments as to the logic used.
90  */
91  do
92  {
93  c = *s++;
94  } while(isspace(c));
95  if(c == '-')
96  {
97  neg = 1;
98  c = *s++;
99  }
100  else if(c == '+')
101  {
102  c = *s++;
103  }
104  if((base == 0 || base == 16) && c == '0' && (*s == 'x' || *s == 'X'))
105  {
106  c = s[1];
107  s += 2;
108  base = 16;
109  }
110  else if((base == 0 || base == 2) && c == '0' && (*s == 'b' || *s == 'B'))
111  {
112  c = s[1];
113  s += 2;
114  base = 2;
115  }
116  if(base == 0)
117  {
118  {
119  base = c == '0' ? 8 : 10;
120  }
121  }
122  cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
123  cutlim = (int)((unsigned long)ULONG_MAX % (unsigned long)base);
124  for(acc = 0, any = 0;; c = *s++)
125  {
126  if(isdigit(c))
127  {
128  c -= '0';
129  }
130  else if(isalpha(c))
131  {
132  c -= isupper(c) ? 'A' - 10 : 'a' - 10;
133  }
134  else
135  {
136  break;
137  }
138  if(c >= base)
139  {
140  break;
141  }
142  if(any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
143  {
144  any = -1;
145  }
146  else
147  {
148  any = 1;
149  acc *= (unsigned long)base;
150  acc += (unsigned long)c;
151  }
152  }
153  if(any < 0)
154  {
155  acc = ULONG_MAX;
156  // errno = ERANGE;
157  }
158  else if(neg)
159  {
160  acc = -acc;
161  }
162  if(endptr != 0)
163  {
164  *endptr = (char*)(uintptr_t)(any ? s - 1 : nptr);
165  }
166  return (acc);
167 }
int isupper(int ch)
Checks if the given character is an uppercase character.
Definition: isupper.c:5
int isalpha(int ch)
Checks if the given character is an alphabetic character.
Definition: isalpha.c:5
int isspace(int ch)
Checks if the given character is a whitespace character.
Definition: isspace.c:5
#define ULONG_MAX
Definition: limits.h:61
int isdigit(int ch)
Checks if the given character is a numeric character.
Definition: isdigit.c:5

References isalpha(), isdigit(), isspace(), isupper(), and ULONG_MAX.