스트링이 표현하는 숫자가 unsigned long으로 표현할 수 없을 정도로 크다면 이 함수는 ULONG_MAX를 리턴하고 errno를 ERANGE로 설정한다.
이번에는 strtoul의 기능을 구현한 Strtoul 코드를 살펴보자. 포인터 없이 구현하는 최선의 방법이기도 하다.
strtoul.c
60 unsigned long Strtoul(char const s[static 1], unsigned base) {
61 if (base > 36u) { /* 밑인지 검사한다. */
62 errno = EINVAL; /* 규격을 확장한다. */
63 return ULONG_MAX;
64 }
65 size_t i = strspn(s, " \f\n\r\t\v"); /* 공백은 건너뛴다. */
66 bool switchsign = false; /* 부호를 검사한다. */
67 switch (s[i]) {
68 case '-' : switchsign = true;
69 case '+' : ++i;
70 }
71 if (!base || base == 16) { /* 밑을 조정한다. */
72 size_t adj = find_prefix(s, i, "0x");
73 if (!base) base = (unsigned[]){ 10, 8, 16, }[adj];
74 i += adj;
75 }
76 /* 본격적인 변환 작업을 수행한다. */
77 unsigned long ret = Strtoul_inner(s, i, base);
78 return (switchsign) ? -ret : ret;
79 }