diff --git a/src/ciabatta.c b/src/ciabatta.c index 7605d66..d2eaccf 100644 --- a/src/ciabatta.c +++ b/src/ciabatta.c @@ -37,9 +37,10 @@ #include "intrin.h" +#include "util.c" + // Dependencies #include "decfloat/decfloat.c" -#include "decfloat/decfloat.h" // Platform-independent stuff #include "fmt/gen_fmt.c" @@ -48,8 +49,8 @@ #include "math/gen_math.c" #include "math/ieee754.c" #include "math/round.c" +#include "conv/conversion.c" #include "stdlib/algorithm.c" -#include "stdlib/conversion.c" #include "stdlib/multibyte.c" #include "stdlib/random.c" #include "ctype.c" diff --git a/src/stdlib/conversion.c b/src/conv/conversion.c similarity index 94% rename from src/stdlib/conversion.c rename to src/conv/conversion.c index 8446b6a..6761773 100644 --- a/src/stdlib/conversion.c +++ b/src/conv/conversion.c @@ -1,16 +1,4 @@ -// TODO(bumbread): now that we do static builds perhaps this could be moved -// into the main source file? -// Call me weak if you want but I'm actually too lazy to type -// them out every time, also they take up a lot of horiz space. -typedef long long intll; -typedef long intl; -typedef unsigned long long intull; -typedef unsigned long intul; -typedef unsigned intu; - -#define inrange(start, c, end) ((start) <= (c) && (c) <= (end)) - static bool isbase(int c, int base) { int val = 0; if(isdigit(c)) { @@ -69,7 +57,7 @@ static intull strtoi_generic(const char *restrict nptr, if(is_signed) { ++int_abs_max; } - if(!inrange(0, inbase, 36)) { + if(!IN_RANGE(0, inbase, 36)) { goto finish; } intull base = (intull)inbase; diff --git a/src/ctype.c b/src/ctype.c index 7606619..a6da3bd 100644 --- a/src/ctype.c +++ b/src/ctype.c @@ -1,6 +1,4 @@ -#define in_range(low, v, high) ((low <= v) && (v <= high)) - int isalnum(int c) { return isalpha(c) || isdigit(c); } @@ -14,11 +12,11 @@ int isblank(int c) { } int iscntrl(int c) { - return in_range('\x00', c, '\x1f') || c == '\x7f'; + return IN_RANGE('\x00', c, '\x1f') || c == '\x7f'; } int isdigit(int c) { - return in_range('0', c, '9'); + return IN_RANGE('0', c, '9'); } int isgraph(int c) { @@ -26,32 +24,32 @@ int isgraph(int c) { } int islower(int c) { - return in_range('a', c, 'z'); + return IN_RANGE('a', c, 'z'); } int isprint(int c) { - return in_range(' ', c, '\x7e'); + return IN_RANGE(' ', c, '\x7e'); } int ispunct(int c) { - return in_range('\x21', c, '\x2f') - || in_range('\x3a', c, '\x40') - || in_range('\x5b', c, '\x60') - || in_range('\x7b', c, '\x7e'); + return IN_RANGE('\x21', c, '\x2f') + || IN_RANGE('\x3a', c, '\x40') + || IN_RANGE('\x5b', c, '\x60') + || IN_RANGE('\x7b', c, '\x7e'); } int isspace(int c) { - return in_range('\x09', c, '\x0d') || c == ' '; + return IN_RANGE('\x09', c, '\x0d') || c == ' '; } int isupper(int c) { - return in_range('A', c, 'Z'); + return IN_RANGE('A', c, 'Z'); } int isxdigit(int c) { - return in_range('0', c, '9') - || in_range('a', c, 'f') - || in_range('A', c, 'F'); + return IN_RANGE('0', c, '9') + || IN_RANGE('a', c, 'f') + || IN_RANGE('A', c, 'F'); } int tolower(int c) { diff --git a/src/fenv.c b/src/fenv.c index 3bc7be9..990f4da 100644 --- a/src/fenv.c +++ b/src/fenv.c @@ -1,10 +1,4 @@ -#if defined(_WIN32) - #include -#else - #include -#endif - #define fe_masks(excepts) (((fexcept_t)(excepts)) << 7) #define fe_flags(excepts) ((fexcept_t)(excepts)) #define fe_excepts(masks) ((int)(masks >> 7)) diff --git a/src/string.c b/src/string.c index baf7e89..d4f20f7 100644 --- a/src/string.c +++ b/src/string.c @@ -1,9 +1,7 @@ -typedef unsigned char byte; - void *memcpy(void *restrict s1, const void *restrict s2, size_t n) { - const byte *restrict c2 = s2; - byte *restrict c1 = s1; + const u8 *restrict c2 = s2; + u8 *restrict c1 = s1; while (n--) { *c1++ = *c2++; @@ -12,8 +10,8 @@ void *memcpy(void *restrict s1, const void *restrict s2, size_t n) { } void *memmove(void *s1, const void *s2, size_t n) { - byte* c1 = s1; - const byte* c2 = s2; + u8* c1 = s1; + const u8* c2 = s2; // Note(bumbread): shouldn't this be backwards? if (c1 != c2) { if (c1 < c2) { @@ -61,8 +59,8 @@ char *strncat(char *restrict s1, const char *restrict s2, size_t n) { int memcmp(const void *s1, const void *s2, size_t n) { - const byte *u1 = s1; - const byte *u2 = s2; + const u8 *u1 = s1; + const u8 *u2 = s2; for (; n--; u1++, u2++) { if (*u1 != *u2) return *u1 - *u2; } @@ -70,7 +68,7 @@ int memcmp(const void *s1, const void *s2, size_t n) { } void *memset(void *s, int c, size_t n) { - byte *restrict buf = s; + u8 *restrict buf = s; while (n--) { *buf++ = c; } diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..4ed8555 --- /dev/null +++ b/src/util.c @@ -0,0 +1,48 @@ + +// Some of these more horizontal screen space than I consider healthy, that's +// why I define shorter versions for some of the types. long integers are +// special offenders + +// The other part of this file are the convenience macros that could be used +// mostly anywhere in the ciabatta implementation. + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef int_least8_t li8; +typedef int_least16_t li16; +typedef int_least32_t li32; +typedef int_least64_t li64; + +typedef int_fast8_t fi8; +typedef int_fast16_t fi16; +typedef int_fast32_t fi32; +typedef int_fast64_t fi64; + +typedef long int intl; +typedef long long int intll; +typedef unsigned int intu; +typedef unsigned long int intul; +typedef unsigned long long int intull; + +typedef wchar_t wchar; + +#define COUNTOF(arr) (sizeof (arr) / sizeof ((arr)[0])) +#define IN_RANGE(start, v, end) ((start) <= (v) && (v) <= (end)) + +#define CONCAT(a,b) a ## b +#define STR_(a) #a +#define STR(a) STR_(a) + +#define DOUBLE_BITS(x) ((union {double f; u64 i;}){x}).i +#define DOUBLE_CONS(x) ((union {double f; u64 i;}){x}).f +#define FLOAT_BITS(x) ((union {float f; u32 i;}){x}).i +#define FLOAT_CONS(x) ((union {float f; u32 i;}){x}).f +