2022-10-15 14:02:24 +02:00
|
|
|
#include <ctype.h>
|
2022-10-02 18:10:53 +02:00
|
|
|
#include <luna.h>
|
2022-10-27 17:42:00 +02:00
|
|
|
#include <luna/syscall.h>
|
2022-10-01 20:59:22 +02:00
|
|
|
#include <stdlib.h>
|
2022-10-02 17:02:15 +02:00
|
|
|
#include <sys/syscall.h>
|
2022-10-30 19:43:37 +01:00
|
|
|
#include <sys/wait.h>
|
2022-10-02 17:02:15 +02:00
|
|
|
#include <unistd.h>
|
|
|
|
|
2022-10-23 12:28:25 +02:00
|
|
|
template <typename T> static T string_to_integer_type(const char* str)
|
2022-10-15 14:02:24 +02:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2022-10-01 20:59:22 +02:00
|
|
|
extern "C"
|
|
|
|
{
|
2022-10-15 09:52:37 +02:00
|
|
|
__lc_noreturn void abort()
|
2022-10-01 20:59:22 +02:00
|
|
|
{
|
2022-10-15 14:02:10 +02:00
|
|
|
_Exit(-1);
|
2022-10-01 20:59:22 +02:00
|
|
|
}
|
2022-10-12 11:30:21 +02:00
|
|
|
|
2022-10-15 14:02:24 +02:00
|
|
|
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)
|
2022-10-01 20:59:22 +02:00
|
|
|
{
|
2022-10-15 14:02:24 +02:00
|
|
|
return string_to_integer_type<long long>(str);
|
2022-10-01 20:59:22 +02:00
|
|
|
}
|
2022-10-12 11:30:21 +02:00
|
|
|
|
2022-10-22 12:12:52 +02:00
|
|
|
unsigned long strtoul(const char* str, char** endptr, int base)
|
2022-10-21 18:32:46 +02:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2022-10-01 20:59:22 +02:00
|
|
|
char* getenv(const char*)
|
|
|
|
{
|
2022-10-21 18:37:18 +02:00
|
|
|
return NULL; // FIXME: Not implemented :)
|
2022-10-01 20:59:22 +02:00
|
|
|
}
|
2022-10-15 14:02:10 +02:00
|
|
|
|
|
|
|
__lc_noreturn void _Exit(int status)
|
|
|
|
{
|
2022-10-27 17:42:00 +02:00
|
|
|
__lc_fast_syscall1(SYS_exit, status);
|
2022-10-15 14:02:10 +02:00
|
|
|
__lc_unreachable();
|
|
|
|
}
|
2022-10-23 11:10:26 +02:00
|
|
|
|
|
|
|
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-30 19:43:37 +01:00
|
|
|
int system(const char* command)
|
|
|
|
{
|
|
|
|
pid_t child = fork();
|
|
|
|
if (child < 0) return -1;
|
|
|
|
if (child == 0)
|
|
|
|
{
|
|
|
|
char* argv[] = {const_cast<char*>("/bin/sh"), const_cast<char*>("-c"), const_cast<char*>(command),
|
|
|
|
nullptr}; // FIXME: This is very verbose.
|
|
|
|
execv(argv[0], argv);
|
|
|
|
exit(127);
|
|
|
|
}
|
|
|
|
int status;
|
|
|
|
waitpid(child, &status, 0);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
2022-10-23 11:19:08 +02:00
|
|
|
void qsort(void*, size_t, size_t, int (*)(const void*, const void*))
|
|
|
|
{
|
|
|
|
NOT_IMPLEMENTED("qsort");
|
|
|
|
}
|
2022-10-29 09:39:12 +02:00
|
|
|
|
2022-10-30 20:02:03 +01:00
|
|
|
void* bsearch(const void*, const void*, size_t, size_t, int (*)(const void*, const void*))
|
|
|
|
{
|
|
|
|
NOT_IMPLEMENTED("bsearch");
|
|
|
|
}
|
|
|
|
|
2022-10-29 09:39:12 +02:00
|
|
|
size_t mbstowcs(wchar_t*, const char*, size_t)
|
|
|
|
{
|
|
|
|
NOT_IMPLEMENTED("mbstowcs");
|
|
|
|
}
|
|
|
|
|
|
|
|
char* mktemp(char*)
|
|
|
|
{
|
|
|
|
NOT_IMPLEMENTED("mktemp");
|
|
|
|
}
|
2022-10-01 20:59:22 +02:00
|
|
|
}
|