mirror of https://github.com/flysand7/ciabatta.git
I have no idea but something for linux
This commit is contained in:
parent
328e9f6c35
commit
d70de47c01
|
@ -1,4 +1,5 @@
|
||||||
bin
|
bin
|
||||||
|
a.out
|
||||||
*.exe
|
*.exe
|
||||||
*.lib
|
*.lib
|
||||||
*.obj
|
*.obj
|
||||||
|
|
25
Makefile
25
Makefile
|
@ -18,36 +18,45 @@ endif
|
||||||
|
|
||||||
# If we're compiling under windows we'll link to these libraries
|
# If we're compiling under windows we'll link to these libraries
|
||||||
ifeq ($(PLATFORM),win)
|
ifeq ($(PLATFORM),win)
|
||||||
LIBS := -lDbghelp -lkernel32 -luser32 -lshell32
|
LIBS := -lDbghelp -lkernel32 -luser32 -lshell32
|
||||||
|
MKDIR_P_FLAG :=
|
||||||
|
NUL_FILE := NUL
|
||||||
|
else
|
||||||
|
LIBS := -lrt -lpthread -ldl
|
||||||
|
MKDIR_P_FLAG := '-p'
|
||||||
|
NUL_FILE := /dev/null
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Compiler flags
|
# Compiler flags
|
||||||
ifeq ($(CC), clang)
|
ifeq ($(CC), clang)
|
||||||
CFLAGS=$(GNUFLAGS) -Werror -Wall -msse2 $(IFLAGS)
|
CFLAGS=$(GNUFLAGS) -Wall -msse2 -mfma $(IFLAGS)
|
||||||
else
|
else
|
||||||
echo BAD CC
|
echo BAD CC
|
||||||
exit 1
|
exit 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Figure out what we want to compile at the end
|
# Figure out what we want to compile at the end
|
||||||
SRC_FILES := $(wildcard $(SRC_DIR)/code/*.c) $(wildcard $(SRC_DIR)/$(PLATFORM)/*.c)
|
SRC_FILES := \
|
||||||
|
$(wildcard $(SRC_DIR)/code/*.c) \
|
||||||
|
$(wildcard $(SRC_DIR)/code/**/*.c) \
|
||||||
|
$(wildcard $(SRC_DIR)/$(PLATFORM)/*.c) \
|
||||||
|
$(wildcard $(SRC_DIR)/$(PLATFORM)/**/*.c)
|
||||||
OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.obj,$(SRC_FILES))
|
OBJ_FILES := $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.obj,$(SRC_FILES))
|
||||||
|
|
||||||
$(OBJ_DIR)/%.obj: $(SRC_DIR)/%.c
|
$(OBJ_DIR)/%.obj: $(SRC_DIR)/%.c
|
||||||
|
@-mkdir $(MKDIR_P_FLAG) "$(dir $@)" 2> $(NUL_FILE)
|
||||||
$(CC) $(CFLAGS) -c -o $@ $<
|
$(CC) $(CFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
ciabatta.lib: $(OBJ_FILES)
|
ciabatta.lib: $(OBJ_FILES)
|
||||||
llvm-ar rc $@ $^
|
llvm-ar rc $@ $^
|
||||||
|
|
||||||
test: ciabatta.lib
|
test: ciabatta.lib
|
||||||
clang test/test_$(test).c ciabatta.lib -std=c11 $(LIBS) -nostdlib -Iinc
|
clang -g test/test_$(test).c ciabatta.lib -std=c11 $(LIBS) -nostdlib -Iinc
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rd/s/q bin || true
|
rd/s/q bin || true
|
||||||
rm -Rf bin || true
|
rm -Rf bin || true
|
||||||
mkdir bin
|
rm -f ciabatta.lib || true
|
||||||
mkdir bin/code
|
del ciabatta.lib || true
|
||||||
mkdir bin/win
|
|
||||||
mkdir bin/linux
|
|
||||||
|
|
||||||
.PHONY: ciabatta.lib test
|
.PHONY: ciabatta.lib test
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <fenv.h>
|
#include <fenv.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
static double LN2 = 0.693147180559945309417232121458176;
|
static double LN2 = 0.693147180559945309417232121458176;
|
||||||
static double HALF_PI = 1.570796326794896619231321691639751;
|
static double HALF_PI = 1.570796326794896619231321691639751;
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
#define asdouble(x) ((union {double f; uint64_t i;}){x}).f
|
#define asdouble(x) ((union {double f; uint64_t i;}){x}).f
|
||||||
|
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
#define just_do_it(t) __attribute__((unused)) volatile t
|
#define just_do_it(v) do{__attribute__((unused)) volatile double t = v;}while(0)
|
||||||
#else
|
#else
|
||||||
#define just_do_it(t) volatile t
|
#define just_do_it(v) do{volatile double t = v;}while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
double nearbyint(double x) {
|
double nearbyint(double x) {
|
||||||
|
@ -53,9 +53,9 @@ double nextafter(double x, double y) {
|
||||||
}
|
}
|
||||||
e = ux.i >> 52 & 0x7ff;
|
e = ux.i >> 52 & 0x7ff;
|
||||||
/* raise overflow if ux.f is infinite and x is finite */
|
/* raise overflow if ux.f is infinite and x is finite */
|
||||||
if (e == 0x7ff) just_do_it(float) _x = x+x;
|
if (e == 0x7ff) just_do_it(x+x);
|
||||||
/* raise underflow if ux.f is subnormal or zero */
|
/* raise underflow if ux.f is subnormal or zero */
|
||||||
if (e == 0) just_do_it(float) _x = x*x + ux.f*ux.f;
|
if (e == 0) just_do_it(x*x + ux.f*ux.f);
|
||||||
return ux.f;
|
return ux.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,9 +78,9 @@ float nextafterf(float x, float y) {
|
||||||
}
|
}
|
||||||
e = ux.i & 0x7f800000;
|
e = ux.i & 0x7f800000;
|
||||||
/* raise overflow if ux.f is infinite and x is finite */
|
/* raise overflow if ux.f is infinite and x is finite */
|
||||||
if (e == 0x7f800000) just_do_it(float) _x = x+x;
|
if (e == 0x7f800000) just_do_it(x+x);
|
||||||
/* raise underflow if ux.f is subnormal or zero */
|
/* raise underflow if ux.f is subnormal or zero */
|
||||||
if (e == 0) just_do_it(float) _x = x*x + ux.f*ux.f;
|
if (e == 0) just_do_it(x*x + ux.f*ux.f);
|
||||||
return ux.f;
|
return ux.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,9 +109,9 @@ float nexttowardf(float x, long double y) {
|
||||||
}
|
}
|
||||||
e = ux.i & 0x7f800000;
|
e = ux.i & 0x7f800000;
|
||||||
/* raise overflow if ux.f is infinite and x is finite */
|
/* raise overflow if ux.f is infinite and x is finite */
|
||||||
if (e == 0x7f800000) just_do_it(float) _x = x+x;
|
if (e == 0x7f800000) just_do_it(x+x);
|
||||||
/* raise underflow if ux.f is subnormal or zero */
|
/* raise underflow if ux.f is subnormal or zero */
|
||||||
if (e == 0) just_do_it(float) _x = x*x + ux.f*ux.f;
|
if (e == 0) just_do_it(x*x + ux.f*ux.f);
|
||||||
return ux.f;
|
return ux.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ double round(double x) {
|
||||||
if (u.i >> 63) x = -x;
|
if (u.i >> 63) x = -x;
|
||||||
if (e < 0x3ff-1) {
|
if (e < 0x3ff-1) {
|
||||||
/* raise inexact if x!=0 */
|
/* raise inexact if x!=0 */
|
||||||
just_do_it(float) _x = x + toint;
|
just_do_it(x + toint);
|
||||||
return 0*u.f;
|
return 0*u.f;
|
||||||
}
|
}
|
||||||
y = x + toint - toint - x;
|
y = x + toint - toint - x;
|
||||||
|
@ -229,7 +229,7 @@ float roundf(float x) {
|
||||||
if (e >= 0x7f+23) return x;
|
if (e >= 0x7f+23) return x;
|
||||||
if (u.i >> 31) x = -x;
|
if (u.i >> 31) x = -x;
|
||||||
if (e < 0x7f-1) {
|
if (e < 0x7f-1) {
|
||||||
just_do_it(float) _x = x + toint;
|
just_do_it(x + toint);
|
||||||
return 0*u.f;
|
return 0*u.f;
|
||||||
}
|
}
|
||||||
y = x + toint - toint - x;
|
y = x + toint - toint - x;
|
||||||
|
@ -283,7 +283,7 @@ double ceil(double x) {
|
||||||
y = x + toint - toint - x;
|
y = x + toint - toint - x;
|
||||||
/* special case because of non-nearest rounding modes */
|
/* special case because of non-nearest rounding modes */
|
||||||
if (e <= 0x3ff-1) {
|
if (e <= 0x3ff-1) {
|
||||||
just_do_it(double) _x = y;
|
just_do_it(y);
|
||||||
return u.i >> 63 ? -0.0 : 1;
|
return u.i >> 63 ? -0.0 : 1;
|
||||||
}
|
}
|
||||||
if (y < 0)
|
if (y < 0)
|
||||||
|
@ -302,12 +302,12 @@ float ceilf(float x) {
|
||||||
m = 0x007fffff >> e;
|
m = 0x007fffff >> e;
|
||||||
if ((u.i & m) == 0)
|
if ((u.i & m) == 0)
|
||||||
return x;
|
return x;
|
||||||
just_do_it(float) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
if (u.i >> 31 == 0)
|
if (u.i >> 31 == 0)
|
||||||
u.i += m;
|
u.i += m;
|
||||||
u.i &= ~m;
|
u.i &= ~m;
|
||||||
} else {
|
} else {
|
||||||
just_do_it(float) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
if (u.i >> 31)
|
if (u.i >> 31)
|
||||||
u.f = -0.0;
|
u.f = -0.0;
|
||||||
else if (u.i << 1)
|
else if (u.i << 1)
|
||||||
|
@ -334,7 +334,7 @@ double floor(double x) {
|
||||||
y = x + toint - toint - x;
|
y = x + toint - toint - x;
|
||||||
/* special case because of non-nearest rounding modes */
|
/* special case because of non-nearest rounding modes */
|
||||||
if (e <= 0x3ff-1) {
|
if (e <= 0x3ff-1) {
|
||||||
just_do_it(double) _x = (y);
|
just_do_it(y);
|
||||||
return u.i >> 63 ? -1 : 0;
|
return u.i >> 63 ? -1 : 0;
|
||||||
}
|
}
|
||||||
if (y > 0)
|
if (y > 0)
|
||||||
|
@ -353,12 +353,12 @@ float floorf(float x) {
|
||||||
m = 0x007fffff >> e;
|
m = 0x007fffff >> e;
|
||||||
if ((u.i & m) == 0)
|
if ((u.i & m) == 0)
|
||||||
return x;
|
return x;
|
||||||
just_do_it(float) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
if (u.i >> 31)
|
if (u.i >> 31)
|
||||||
u.i += m;
|
u.i += m;
|
||||||
u.i &= ~m;
|
u.i &= ~m;
|
||||||
} else {
|
} else {
|
||||||
just_do_it(float) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
if (u.i >> 31 == 0)
|
if (u.i >> 31 == 0)
|
||||||
u.i = 0;
|
u.i = 0;
|
||||||
else if (u.i << 1)
|
else if (u.i << 1)
|
||||||
|
@ -383,7 +383,7 @@ double trunc(double x) {
|
||||||
m = -1ULL >> e;
|
m = -1ULL >> e;
|
||||||
if ((u.i & m) == 0)
|
if ((u.i & m) == 0)
|
||||||
return x;
|
return x;
|
||||||
just_do_it(double) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
u.i &= ~m;
|
u.i &= ~m;
|
||||||
return u.f;
|
return u.f;
|
||||||
}
|
}
|
||||||
|
@ -400,7 +400,7 @@ float truncf(float x) {
|
||||||
m = -1U >> e;
|
m = -1U >> e;
|
||||||
if ((u.i & m) == 0)
|
if ((u.i & m) == 0)
|
||||||
return x;
|
return x;
|
||||||
just_do_it(float) _x = (x + 0x1p120f);
|
just_do_it(x + 0x1p120f);
|
||||||
u.i &= ~m;
|
u.i &= ~m;
|
||||||
return u.f;
|
return u.f;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ static intull strtoi_generic(const char *restrict nptr,
|
||||||
errno = ERANGE;
|
errno = ERANGE;
|
||||||
value = int_max;
|
value = int_max;
|
||||||
goto finish;
|
goto finish;
|
||||||
finish:
|
finish:;
|
||||||
// If no conversion is performed we return the value of 0 and *endptr
|
// If no conversion is performed we return the value of 0 and *endptr
|
||||||
// is set to the nptr.
|
// is set to the nptr.
|
||||||
bool conv_performed = (digits_read > 0);
|
bool conv_performed = (digits_read > 0);
|
||||||
|
|
|
@ -6,18 +6,18 @@ int mblen(const char *s, size_t n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n) {
|
int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n) {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t mbstowcs(wchar_t *restrict pwcs, const char *restrict s, size_t n) {
|
size_t mbstowcs(wchar_t *restrict pwcs, const char *restrict s, size_t n) {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wctomb(char *s, wchar_t wchar) {
|
int wctomb(char *s, wchar_t wchar) {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t wcstombs(char *restrict s, const wchar_t *restrict pwcs, size_t n) {
|
size_t wcstombs(char *restrict s, const wchar_t *restrict pwcs, size_t n) {
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
@ -14,17 +15,23 @@ static void (*atqexit_funcs[ATQEXIT_FUNC_COUNT])(void);
|
||||||
static int atexit_func_count;
|
static int atexit_func_count;
|
||||||
static int atqexit_func_count;
|
static int atqexit_func_count;
|
||||||
|
|
||||||
|
static char **get_command_args(int *argcp);
|
||||||
|
|
||||||
|
// TODO: Instead of using static arrays, allocate this memory dynamically
|
||||||
|
static char cmdline[4096];
|
||||||
|
static char *cmdargs[1024];
|
||||||
extern int main(int argc, char** argv);
|
extern int main(int argc, char** argv);
|
||||||
|
|
||||||
|
|
||||||
void _start() {
|
void _start() {
|
||||||
|
|
||||||
srand(0);
|
srand(0);
|
||||||
setlocale(LC_ALL, "C");
|
setlocale(LC_ALL, "C");
|
||||||
|
|
||||||
int argc = 0;
|
int argc;
|
||||||
char *argv[1] = {NULL};
|
char **argv = get_command_args(&argc);
|
||||||
int code = main(argc, argv);
|
int exit_code = main(argc, argv);
|
||||||
_exit(code);
|
|
||||||
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
_Noreturn void quick_exit(int status) {
|
_Noreturn void quick_exit(int status) {
|
||||||
|
@ -66,3 +73,18 @@ int at_quick_exit(void (*func)(void)) {
|
||||||
atqexit_funcs[atqexit_func_count++] = func;
|
atqexit_funcs[atqexit_func_count++] = func;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char **get_command_args(int *argcp) {
|
||||||
|
int fd = open("/proc/self/cmdline", O_RDONLY);
|
||||||
|
ssize_t size = read(fd, cmdline, sizeof cmdline);
|
||||||
|
ssize_t i = 0;
|
||||||
|
ssize_t cmd_idx = 0;
|
||||||
|
while(i != size) {
|
||||||
|
cmdargs[cmd_idx] = &cmdline[i];
|
||||||
|
while(cmdline[i] != 0) {
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
return cmdargs;
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#include <stdio.h>
|
// #include <stdio.h>
|
||||||
#include <errno.h>
|
// #include <errno.h>
|
||||||
#include <stdlib.h>
|
// #include <stdlib.h>
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
for (int i = 0; i < argv; i++) {
|
for (int i = 0; i < argc; i++) {
|
||||||
printf("[%d] = %s\n", i, argv[i]);
|
// printf("[%d] = %s\n", i, argv[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue