Skip to content

C stdlib

Usually, functions available in C standard library should not be defined by the SDK. Instead, they should be included using GCC's headers, and implemented by the libc or wrapped and implemented in the SDK.

The following functions should not be defined by the SDK. Their presence creates conflicts due to incompatibility with C library, so they should be removed or disabled, and replaced with wrappers.

Memory management functions must be wrapped and redirected to FreeRTOS. The necessary linker flags are already added for all families (in base.py), and a FreeRTOS implementation of the wrappers are provided in malloc.c in the common core. If the family doesn't use FreeRTOS, a separate implementation must be added.

Additionally, if the printf library is used in the chip family code, all other vendor-defined printf-like functions should be replaced with it.

Function prototypes taken from devdocs.io.

// stdlib.h / Dynamic memory management
void *calloc(size_t num, size_t size);
void *malloc(size_t size);
void *realloc(void *ptr, size_t new_size);
void free(void *ptr);
// stdlib.h / Conversions to numeric formats
double atof(const char *str);
int atoi(const char *str);
long atol(const char *str);
long long atoll(const char *str);
double strtod(const char *str, char **str_end);
float strtof(const char *str, char **str_end);
long strtol(const char *str, char **str_end, int base);
long double strtold(const char *str, char **str_end);
long long strtoll(const char *str, char **str_end, int base);
unsigned long strtoul(const char *str, char **str_end, int base);
unsigned long long strtoull(const char *str, char **str_end, int base);
// stdlib.h / Random numbers
int rand();

// string.h / Character classification
int isalnum(int ch);
int isalpha(int ch);
int islower(int ch);
int isupper(int ch);
int isdigit(int ch);
int isxdigit(int ch);
int iscntrl(int ch);
int isgraph(int ch);
int isspace(int ch);
int isblank(int ch);
int isprint(int ch);
int ispunct(int ch);
int tolower(int ch);
int toupper(int ch);
// string.h / String manipulation
char *strcat(char *dest, const char *src);
char *strcpy(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t count);
char *strncpy(char *dest, const char *src, size_t count);
size_t strxfrm(char *dest, const char *src, size_t count);
// string.h / String examination
char *strchr(const char *str, int ch);
int strcmp(const char *lhs, const char *rhs);
size_t strcspn(const char *dest, const char *src);
size_t strlen(const char *str);
int strncmp(const char *lhs, const char *rhs, size_t count);
char *strpbrk(const char *dest, const char *breakset);
char *strrchr(const char *str, int ch);
size_t strspn(const char *dest, const char *src);
char *strstr(const char *str, const char *substr);
char *strtok(char *str, const char *delim);
// string.h / Character array manipulation
void *memchr(const void *ptr, int ch, size_t count);
int memcmp(const void *lhs, const void *rhs, size_t count);
void *memcpy(void *dest, const void *src, size_t count);
void *memmove(void *dest, const void *src, size_t count);
void *memset(void *dest, int ch, size_t count);

// stdio.h / Unformatted input/output
int putc(int ch, FILE *stream);
int putchar(int ch);
int puts(const char *str);

// stdio.h / Formatted input/output
int printf(const char *format, ...);
int sprintf(char *buffer, const char *format, ...);
int snprintf(char *buffer, size_t bufsz, const char *format, ...);
int vprintf(const char *format, va_list vlist);
int vsprintf(char *buffer, const char *format, va_list vlist);
int vsnprintf(char *buffer, size_t bufsz, const char *format, va_list vlist);

// POSIX/BSD (from www.die.net)
size_t strlcat(char *dst, const char *src, size_t size);
size_t strlcpy(char *dst, const char *src, size_t size);
size_t strnlen(const char *s, size_t maxlen);
char *strsep(char **stringp, const char *delim);

// Non-stdlib
_calloc_r
_free_r
_malloc_r
_realloc_r
atoui
atoul
atoull
strnicmp
zalloc

// Additional forbidden macros
#define max(a, b)
#define min(a, b)
typedef bool boolean;