mirror of https://github.com/flysand7/ciabatta.git
add util file
This commit is contained in:
parent
79f1449be3
commit
4d4449a5d9
|
@ -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"
|
||||
|
|
|
@ -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;
|
28
src/ctype.c
28
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) {
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
|
||||
#if defined(_WIN32)
|
||||
#include <intrin.h>
|
||||
#else
|
||||
#include <x86intrin.h>
|
||||
#endif
|
||||
|
||||
#define fe_masks(excepts) (((fexcept_t)(excepts)) << 7)
|
||||
#define fe_flags(excepts) ((fexcept_t)(excepts))
|
||||
#define fe_excepts(masks) ((int)(masks >> 7))
|
||||
|
|
16
src/string.c
16
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
Loading…
Reference in New Issue