Luna/libs/libc/src/stdlib.cpp

134 lines
2.7 KiB
C++
Raw Normal View History

#include <ctype.h>
#include <luna.h>
#include <luna/syscall.h>
#include <stdlib.h>
#include <sys/syscall.h>
#include <unistd.h>
template <typename T> static T string_to_integer_type(const char* str)
{
bool neg = false;
T val = 0;
switch (*str)
{
case '-':
neg = true;
str++;
break;
case '+': str++; break;
default: break;
}
while (isdigit(*str)) { val = (10 * val) + (*str++ - '0'); }
return (neg ? -val : val);
}
2022-10-23 12:26:48 +02:00
template <typename Arg, typename Struct> static inline Struct common_div(Arg a, Arg b)
{
Struct result;
result.quot = a / b;
result.rem = a % b;
if (a >= 0 && result.rem < 0)
{
result.quot++;
result.rem -= b;
}
return result;
}
extern "C"
{
__lc_noreturn void abort()
{
_Exit(-1);
}
int atoi(const char* str)
{
return string_to_integer_type<int>(str);
}
long atol(const char* str)
{
return string_to_integer_type<long>(str);
}
long long atoll(const char* str)
{
return string_to_integer_type<long long>(str);
}
unsigned long strtoul(const char* str, char** endptr, int base)
{
if (base != 0 && base != 10) NOT_IMPLEMENTED("strtoul with base not in (0,10)");
if (endptr) NOT_IMPLEMENTED("strtoul with non-null endptr");
return string_to_integer_type<unsigned long>(str);
}
2022-10-23 12:26:48 +02:00
long strtol(const char* str, char** endptr, int base)
{
if (base != 0 && base != 10) NOT_IMPLEMENTED("strtol with base not in (0,10)");
if (endptr) NOT_IMPLEMENTED("strtol with non-null endptr");
return string_to_integer_type<long>(str);
}
char* getenv(const char*)
{
2022-10-21 18:37:18 +02:00
return NULL; // FIXME: Not implemented :)
}
__lc_noreturn void _Exit(int status)
{
__lc_fast_syscall1(SYS_exit, status);
__lc_unreachable();
}
int abs(int val)
{
return __builtin_abs(val);
}
long labs(long val)
{
return __builtin_labs(val);
}
long long llabs(long long val)
{
return __builtin_llabs(val);
}
2022-10-23 11:19:08 +02:00
2022-10-23 12:26:48 +02:00
div_t div(int a, int b)
{
return common_div<int, div_t>(a, b);
}
ldiv_t ldiv(long a, long b)
{
return common_div<long, ldiv_t>(a, b);
}
lldiv_t lldiv(long long a, long long b)
{
return common_div<long long, lldiv_t>(a, b);
}
2022-10-23 11:19:08 +02:00
void qsort(void*, size_t, size_t, int (*)(const void*, const void*))
{
NOT_IMPLEMENTED("qsort");
}
size_t mbstowcs(wchar_t*, const char*, size_t)
{
NOT_IMPLEMENTED("mbstowcs");
}
char* mktemp(char*)
{
NOT_IMPLEMENTED("mktemp");
}
}