feat: implemented errno, strtol. Started ustar. Reformatted headers and
code. Added some self-tests. Started prepwork for vfs.
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* everything of stdlib is implemented in this file except for:
|
||||
* - qsort
|
||||
@@ -76,3 +78,57 @@ char *itoa(int value, char *buffer, int base) {
|
||||
// reverse the string and return it
|
||||
return reverse(buffer, 0, i - 1);
|
||||
}
|
||||
|
||||
long strtol(const char *nptr, char **endptr, int base) {
|
||||
if (base > 36) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
char sign = '+';
|
||||
long n = 0;
|
||||
long i;
|
||||
const char *c = nptr;
|
||||
while (*c == ' ') {
|
||||
c++;
|
||||
}
|
||||
if (*c == '+') {
|
||||
c++;
|
||||
} else if (*c == '-') {
|
||||
sign = '-';
|
||||
c++;
|
||||
}
|
||||
while (*c != '\0') {
|
||||
n *= base;
|
||||
if (*c >= '0' && *c <= '9') {
|
||||
i = *c - '0';
|
||||
} else if (*c >= 'a' && *c <= 'z') {
|
||||
i = *c - 'a' + 10;
|
||||
} else if (*c >= 'A' && *c <= 'Z') {
|
||||
i = *c - 'A' + 10;
|
||||
} else {
|
||||
errno = EINVAL;
|
||||
n = -1;
|
||||
goto _set_endptr;
|
||||
}
|
||||
if (i >= base) {
|
||||
errno = EINVAL;
|
||||
n = -1;
|
||||
goto _set_endptr;
|
||||
}
|
||||
if (i > (LONG_MAX - n)) {
|
||||
errno = ERANGE;
|
||||
n = sign == '-' ? LONG_MIN : LONG_MAX;
|
||||
goto _set_endptr;
|
||||
}
|
||||
n += i;
|
||||
c++;
|
||||
}
|
||||
if (sign == '-') {
|
||||
n *= -1;
|
||||
}
|
||||
_set_endptr:
|
||||
if (endptr != NULL) {
|
||||
*endptr = c;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user