Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions lib/libc/minimal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ zephyr_system_include_directories(include)
zephyr_library()
zephyr_library_sources(
source/stdlib/atoi.c
source/stdlib/strtol.c
source/stdlib/strtoul.c
source/stdlib/strtoi.c
source/stdlib/malloc.c
source/stdlib/bsearch.c
source/stdlib/exit.c
Expand Down
2 changes: 2 additions & 0 deletions lib/libc/minimal/include/stdlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ extern "C" {

unsigned long int strtoul(const char *str, char **endptr, int base);
long int strtol(const char *str, char **endptr, int base);
unsigned long long int strtoull(const char *str, char **endptr, int base);
long long int strtoll(const char *str, char **endptr, int base);
int atoi(const char *s);

void *malloc(size_t size);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,29 @@
#include <stdlib.h>

/*
* Convert a string to a long integer.
* @brief Convert a string to a long long integer, bounded by limit.
*
* This is not a standard library function, only a helper to support different
* target types.
*
* Ignores `locale' stuff. Assumes that the upper and lower case
* alphabets and digits are each contiguous.
*
* @param nptr Pointer to the beginning of the string to convert
* @param endptr Pointer to store the first invalid character. May be null
* @param base Base of the conversion process
* @param issigned Defines if the target type will be signed or not
* @param limit Maximal positive value of the target type
*
* @retval A converted value, as unsigned long long.
*/
long strtol(const char *nptr, char **endptr, register int base)
static unsigned long long strtoi(const char *nptr, char **endptr,
register int base, int issigned, unsigned long long limit)
{
register const char *s = nptr;
register unsigned long acc;
register unsigned long long acc;
register int c;
register unsigned long cutoff;
register unsigned long long cutoff;
register int neg = 0, any, cutlim;

/*
Expand Down Expand Up @@ -92,8 +104,8 @@ long strtol(const char *nptr, char **endptr, register int base)
* Set any if any `digits' consumed; make it negative to indicate
* overflow.
*/
cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX;
cutlim = cutoff % (unsigned long)base;
cutoff = neg && issigned ? (unsigned long long)(limit + 1) : limit;
cutlim = cutoff % (unsigned long long)base;
cutoff /= (unsigned long)base;
for (acc = 0, any = 0;; c = *s++) {
if (isdigit(c)) {
Expand All @@ -116,7 +128,7 @@ long strtol(const char *nptr, char **endptr, register int base)
}

if (any < 0) {
acc = neg ? LONG_MIN : LONG_MAX;
acc = neg && issigned ? -limit - 1LL : limit;
errno = ERANGE;
} else if (neg) {
acc = -acc;
Expand All @@ -127,3 +139,28 @@ long strtol(const char *nptr, char **endptr, register int base)
}
return acc;
}

/* Convert a string to an unsigned long integer. */
unsigned long strtoul(const char *nptr, char **endptr, register int base)
{
return (unsigned long)strtoi(nptr, endptr, base, 0, ULONG_MAX);
}

/* Convert a string to a long integer. */
long strtol(const char *nptr, char **endptr, register int base)
{
return (long)strtoi(nptr, endptr, base, 1, LONG_MAX);
}

/* Convert a string to an unsigned long long integer. */
unsigned long long strtoull(const char *nptr, char **endptr, register int base)
{
return (unsigned long long)strtoi(nptr, endptr, base, 0, ULLONG_MAX);
}

/* Convert a string to a long long integer. */
long long strtoll(const char *nptr, char **endptr, register int base)
{
return (long long)strtoi(nptr, endptr, base, 1, LLONG_MAX);
}

107 changes: 0 additions & 107 deletions lib/libc/minimal/source/stdlib/strtoul.c

This file was deleted.

6 changes: 0 additions & 6 deletions samples/net/sockets/civetweb/src/libc_extensions.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,6 @@ double atof(const char *str)
return (double)atoi(str);
}

long long int strtoll(const char *str, char **endptr, int base)
{
/* XXX good enough for civetweb uses */
return (long long int)strtol(str, endptr, base);
}

time_t time(time_t *t)
{
return 0;
Expand Down
3 changes: 1 addition & 2 deletions samples/net/sockets/civetweb/src/libc_extensions.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <zephyr.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <net/socket.h>

Expand All @@ -26,10 +27,8 @@ size_t strspn(const char *s1, const char *s2);
int iscntrl(int c);

double atof(const char *str);
long long int strtoll(const char *str, char **endptr, int base);
int sscanf(const char *s, const char *format, ...);
char *strerror(int err);
unsigned long long int strtoull(const char *str, char **endptr, int base);

time_t time(time_t *t);
struct tm *gmtime(const time_t *ptime);
Expand Down