From 06cee6370de707c439575111825154f90999c2bc Mon Sep 17 00:00:00 2001 From: Alexander Nicholi Date: Fri, 19 Feb 2021 16:30:38 -0500 Subject: [PATCH] get everything building with Cosmo --- .vscode/c_cpp_properties.json | 3 ++ arr/Makefile | 9 ++++ arr/src/arr.c | 1 - chkmath/Makefile | 9 ++++ clarg/Makefile | 9 ++++ clarg/include/uni/clarg.h | 2 +- decl/Makefile | 9 ++++ decl/include/uni/decl.h | 8 ++- decl/include/uni/types/float.h | 18 ++----- decl/include/uni/types/int.h | 71 +++++++++++++++++++------ decl/include/uni/types/options.h | 3 ++ endian/Makefile | 9 ++++ err/Makefile | 9 ++++ err/include/uni/err.h | 4 ++ err/src/err.c | 11 +--- futils/Makefile | 9 ++++ futils/src/futils.c | 13 ++--- himem/Makefile | 17 +++--- himem/src/memory.c | 5 -- log/Makefile | 9 ++++ log/src/log.c | 25 ++++++--- mt19937/Makefile | 9 ++++ str/Makefile | 9 ++++ str/src/str.c | 91 +++++++++++++++++++++++++++++++- table/Makefile | 9 ++++ text/Makefile | 9 ++++ text/include/uni/ascii.h | 12 ++--- 27 files changed, 318 insertions(+), 74 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 6c05aac..09beb7a 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -28,6 +28,9 @@ "CFG_LILENDIAN", "__VSCODE_INTELLISENSE__" ], + "forcedInclude": [ + "${workspaceFolder}/common/build/cosmo/cosmopolitan.h" + ], "compilerPath": "/usr/bin/gcc", "cStandard": "c89", "cppStandard": "c++11", diff --git a/arr/Makefile b/arr/Makefile index 3a81324..b09e6e0 100644 --- a/arr/Makefile +++ b/arr/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_arr @@ -54,5 +57,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/arr/src/arr.c b/arr/src/arr.c index 146b430..ca8b65b 100644 --- a/arr/src/arr.c +++ b/arr/src/arr.c @@ -7,7 +7,6 @@ #include "arr.h" -#include #include #include diff --git a/chkmath/Makefile b/chkmath/Makefile index 518df9e..d60abcd 100644 --- a/chkmath/Makefile +++ b/chkmath/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_chkmath @@ -50,5 +53,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/clarg/Makefile b/clarg/Makefile index 72a69d5..0aaf9b8 100644 --- a/clarg/Makefile +++ b/clarg/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_clarg @@ -52,5 +55,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/clarg/include/uni/clarg.h b/clarg/include/uni/clarg.h index b3159f7..d661260 100644 --- a/clarg/include/uni/clarg.h +++ b/clarg/include/uni/clarg.h @@ -20,7 +20,7 @@ enum /* uni_clarg_tmpl_flags */ enum /* uni_clarg_tmpl_masks */ { UNI_CLARG_TMPL_MASK_TAKESVAL = 1 << UNI_CLARG_TMPL_FLAG_TAKESVAL, - UNI_CLARG_TMPL_MASK_VALREQD = 1 << UNI_CLARG_TMPL_FLAG_VALREQD + UNI_CLARG_TMPL_MASK_VALREQD = 1 << UNI_CLARG_TMPL_FLAG_VALREQD }; struct uni_clarg_tmpl; diff --git a/decl/Makefile b/decl/Makefile index a0233ec..1a001a1 100644 --- a/decl/Makefile +++ b/decl/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_decl @@ -58,5 +61,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/decl/include/uni/decl.h b/decl/include/uni/decl.h index 94b312f..cdde650 100644 --- a/decl/include/uni/decl.h +++ b/decl/include/uni/decl.h @@ -8,11 +8,13 @@ #ifndef INC_API__UNI_DECL_H #define INC_API__UNI_DECL_H -#ifdef __cplusplus +#if !defined( UNI_C_API ) +#if defined( __cplusplus ) #define UNI_C_API extern "C" #else #define UNI_C_API #endif +#endif /* !defined( UNI_C_API ) */ #if !defined( UNI_DEPRECATED ) #if !defined( UNI_NODEPREC ) @@ -30,8 +32,12 @@ #endif /* !defined( UNI_NODEPREC ) */ #endif /* !defined( UNI_DEPRECATED ) */ +#if !defined( UNI_PACKED ) #define UNI_PACKED __attribute__( ( packed ) ) +#endif /* !defined( UNI_PACKED ) */ +#if !defined( UNI_ALIGN ) #define UNI_ALIGN( _x ) __attribute__( ( aligned( _x ) ) ) +#endif /* !defined( UNI_ALIGN ) */ #endif /* INC_API__UNI_DECL_H */ diff --git a/decl/include/uni/types/float.h b/decl/include/uni/types/float.h index 8f963a7..e93d250 100644 --- a/decl/include/uni/types/float.h +++ b/decl/include/uni/types/float.h @@ -25,21 +25,13 @@ #endif /* !defined( UNI_NODEPREC ) */ #endif /* defined( UNI_DEPRECATED ) */ -/* VS Code complains that __fp16 is undefined... */ -#if defined( __clang__ ) && !defined( __VSCODE_INTELLISENSE__ ) -#if( defined( __arm__ ) || defined( __aarch64__ ) ) -typedef _Float16 f16; -#else -/* this is unsupported outside ARM because of ABIs */ -typedef __fp16 f16; -#endif -#else -typedef float f16; -#endif +typedef float f16 UNI_DEPRECATED; typedef float f32; typedef double f64; -typedef long double f80 UNI_DEPRECATED; -typedef long double fbig; +typedef __float80 f80; +typedef __float128 f128; + +typedef __float128 fbig UNI_DEPRECATED; #endif /* INC_API__UNI_TYPES_FLOAT_H */ diff --git a/decl/include/uni/types/int.h b/decl/include/uni/types/int.h index 8032911..8e0ed2e 100644 --- a/decl/include/uni/types/int.h +++ b/decl/include/uni/types/int.h @@ -8,36 +8,73 @@ #ifndef INC_API__UNI_TYPES_INT_H #define INC_API__UNI_TYPES_INT_H -#if defined( NULL ) -#undef NULL -#endif /* defined( NULL ) */ - -#define NULL 0 +/* XXX: Copied from */ +#if !defined( UNI_DEPRECATED ) +#if !defined( UNI_NODEPREC ) +#if defined( __GNUC__ ) || defined( __clang__ ) +#define UNI_DEPRECATED __attribute__( ( deprecated ) ) +#elif defined( _MSC_VER ) +#define UNI_DEPRECATED __declspec( deprecated ) +#else +#pragma message( \ + "WARNING: You need to implement UNI_DEPRECATED for this compiler" ) +#define UNI_DEPRECATED +#endif +#else +#define UNI_DEPRECATED +#endif /* !defined( UNI_NODEPREC ) */ +#endif /* !defined( UNI_DEPRECATED ) */ enum { SIZEOF_CHAR = 1, - SIZEOF_PTR = 8, - S8_MIN = -128, - S8_MAX = 127, - S16_MIN = -32768, - S16_MAX = 32767, + SIZEOF_PTR = 8, + S8_MIN = -128, + S8_MAX = 127, + S16_MIN = -32768, + S16_MAX = 32767, + U8_MAX = 255, + U16_MAX = 65535 +}; + +enum +{ S32_MIN = -2147483648, S32_MAX = 2147483647, - S64_MIN = -9223372036854775808, - S64_MAX = 9223372036854775807, - U8_MAX = 255, - U16_MAX = 65535, - U32_MAX = 4294967295, - U64_MAX = 18446744073709551615, +}; + +enum +{ + U32_MAX = 4294967295U +}; + +enum +{ + U64_MAX = 18446744073709551615UL, PTRI_MAX = U64_MAX }; +enum +{ + S64_MIN = -9223372036854775808LL, + S64_MAX = 9223372036854775807LL, + OFFS_MIN = S64_MIN, + OFFS_MAX = S64_MAX +}; + +#define U128_MAX ( ( ( U64_MAX + 1 ) * ( U64_MAX + 1 ) ) - 1 ) +#define S128_MIN ( ( ( S64_MIN * -1 ) * ( S64_MIN * -1 ) ) * -1 ) +#define S128_MAX ( ( ( S64_MAX + 1 ) * ( S64_MAX + 1 ) ) - 1 ) + #if defined( __clang__ ) || defined( __GNUC__ ) +#define UNI_HAVE_S128( ) 1 +typedef __int128_t s128; typedef __INT64_TYPE__ s64; typedef __INT32_TYPE__ s32; typedef __INT16_TYPE__ s16; typedef __INT8_TYPE__ s8; +#define UNI_HAVE_U128( ) 1 +typedef __uint128_t u128; typedef __UINT64_TYPE__ u64; typedef __UINT32_TYPE__ u32; typedef __UINT16_TYPE__ u16; @@ -46,10 +83,12 @@ typedef __UINTPTR_TYPE__ ptri; typedef __INTPTR_TYPE__ offs; #elif defined( __TINYC__ ) #include +#define UNI_HAVE_S128( ) 0 typedef int64_t s64; typedef int32_t s32; typedef int16_t s16; typedef int8_t s8; +#define UNI_HAVE_U128( ) 0 typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; diff --git a/decl/include/uni/types/options.h b/decl/include/uni/types/options.h index 87d3a73..6df05b4 100644 --- a/decl/include/uni/types/options.h +++ b/decl/include/uni/types/options.h @@ -23,10 +23,13 @@ UNI_DECL_OPT( s16 ); UNI_DECL_OPT( s32 ); UNI_DECL_OPT( s64 ); UNI_DECL_OPT( ptri ); +UNI_DECL_OPT( offs ); UNI_DECL_OPT( f16 ); UNI_DECL_OPT( f32 ); UNI_DECL_OPT( f64 ); +UNI_DECL_OPT( f80 ); +UNI_DECL_OPT( f128 ); UNI_DECL_OPT( fbig ); UNI_DECL_OPT_S( point2 ); diff --git a/endian/Makefile b/endian/Makefile index b14c150..e0ef42c 100644 --- a/endian/Makefile +++ b/endian/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_endian @@ -50,5 +53,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/err/Makefile b/err/Makefile index 61b76c8..3ed4796 100644 --- a/err/Makefile +++ b/err/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_err @@ -51,5 +54,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/err/include/uni/err.h b/err/include/uni/err.h index ce37c4b..0b46f91 100644 --- a/err/include/uni/err.h +++ b/err/include/uni/err.h @@ -28,6 +28,10 @@ enum /* err */ : uni_assert_fail( #cnd, __FILE__, __LINE__, __func__ ) ) #endif /* defined(NDEBUG) */ +#if !defined( ASSERT ) +#define ASSERT( cnd ) UNI_DEPRECATED UNI_ASSERT( cnd ) +#endif /* !defined( ASSERT ) */ + #if 0 #define ASSERT_RET( cnd ) \ do \ diff --git a/err/src/err.c b/err/src/err.c index 8f8d019..dd0c9e3 100644 --- a/err/src/err.c +++ b/err/src/err.c @@ -9,19 +9,12 @@ #include -void abort( void ); - -void uni_die( void ) -{ - abort( ); -} - -void __assert_fail(const char *, const char *, int); +void uni_die( void ) { abort( ); } void uni_assert_fail( const char * expr, const char * file, unsigned line, const char * func ) { - __assert_fail(expr, file, line); + __assert_fail( expr, file, line ); } diff --git a/futils/Makefile b/futils/Makefile index f480892..f0c23a8 100644 --- a/futils/Makefile +++ b/futils/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_futils @@ -52,5 +55,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/futils/src/futils.c b/futils/src/futils.c index e207a11..440b797 100644 --- a/futils/src/futils.c +++ b/futils/src/futils.c @@ -7,11 +7,6 @@ #include -#ifndef CFG_GBA -#include -#include -#include -#endif #include #include #include @@ -63,8 +58,8 @@ int uni_buffile( const char * fname, u8 * ret, ptri ret_sz ) FILE * f; ptri readsz; - ASSERT( fname != NULL ); - ASSERT( ret != NULL ); + UNI_ASSERT( fname != NULL ); + UNI_ASSERT( ret != NULL ); f = fopen( fname, "rb" ); if( !f ) @@ -91,8 +86,8 @@ int uni_loadfile( const char * fname, u8 ** ret, ptri * ret_sz ) ptri data_sz; FILE * f; - ASSERT( ret != NULL ); - ASSERT( ret_sz != NULL ); + UNI_ASSERT( ret != NULL ); + UNI_ASSERT( ret_sz != NULL ); f = fname == NULL ? stdin : fopen( fname, "rb" ); diff --git a/himem/Makefile b/himem/Makefile index 7ff4ac4..5387e53 100644 --- a/himem/Makefile +++ b/himem/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_himem @@ -38,19 +41,15 @@ FWORKS := # sources SFILES.GBA := \ - src/gbabios.s \ src/memcpy.s \ src/memset.s -CFILES.GBA := \ - src/gbahimem.c +CFILES.GBA := CFILES := \ src/memory.c CPPFILES := PUBHFILES := \ include/uni/memory.h -PRVHFILES := \ - src/gbabios.h \ - src/gbahimem.h +PRVHFILES := # test suite sources TES_CFILES := @@ -58,5 +57,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/himem/src/memory.c b/himem/src/memory.c index 5321077..b1a8972 100644 --- a/himem/src/memory.c +++ b/himem/src/memory.c @@ -9,11 +9,6 @@ #include #include -void *memset(void *, u32, ptri); -void *memcpy(void *, const void *, ptri); -void *malloc(ptri); -void *realloc(void *, ptri); - void * uni_alloc( ptri sz ) { void * ret; diff --git a/log/Makefile b/log/Makefile index b53e7b9..e276fe9 100644 --- a/log/Makefile +++ b/log/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_log @@ -51,5 +54,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/log/src/log.c b/log/src/log.c index 91e1ba2..02297bd 100644 --- a/log/src/log.c +++ b/log/src/log.c @@ -7,12 +7,27 @@ #include -#include -#ifndef CFG_GBA -#include - #include +#define ASSERT_RETNEG1( cnd ) \ + do \ + { \ + if( cnd ) \ + { \ + } \ + else \ + { \ + uni_perror( \ + "Assertion failed in file \"%s\" on line \"%u\", in " \ + "function \"%s\".\nExpression: %s", \ + __FILE__, \ + __LINE__, \ + __func__, \ + #cnd ); \ + return -1; \ + } \ + } while( 0 ) + int uni_print( const char * fmt, ... ) { va_list args; @@ -54,5 +69,3 @@ int uni_perror( const char * fmt, ... ) return 0; } - -#endif diff --git a/mt19937/Makefile b/mt19937/Makefile index 5f17af8..2467dcb 100644 --- a/mt19937/Makefile +++ b/mt19937/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := mt19937 @@ -53,5 +56,11 @@ TES_PRVHFILES := NO_TES := 1 +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/str/Makefile b/str/Makefile index c4342c4..c9c0494 100644 --- a/str/Makefile +++ b/str/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_str @@ -58,5 +61,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/str/src/str.c b/str/src/str.c index a13ebbe..79a8453 100644 --- a/str/src/str.c +++ b/str/src/str.c @@ -7,12 +7,101 @@ #include "str.h" -#include #include #include #include "utf8.h" +#if defined( __STDC_HOSTED__ ) && defined( __SSE2__ ) +#define p_strlen( STR ) \ + ( __builtin_constant_p( STR ) ? __builtin_strlen( STR ) : ( { \ + size_t LeN; \ + const char * StR = ( STR ); \ + asm( "call\tstrlen" \ + : "=a"( LeN ) \ + : "D"( StR ), "m"( *(char( * )[0x7fffffff])StR ) \ + : "rcx", "rdx", "xmm3", "xmm4", "cc" ); \ + LeN; \ + } ) ) + +#define p_memmove( DEST, SRC, SIZE ) \ + p_memcpy( "MemMove", ( DEST ), ( SRC ), ( SIZE ) ) + +#define p_memcpy( FN, DEST, SRC, SIZE ) \ + ( { \ + void * DeSt = ( DEST ); \ + const void * SrC = ( SRC ); \ + size_t SiZe = ( SIZE ); \ + asm( "call\t" FN \ + : "=m"( *( char( * )[SiZe] )( DeSt ) ) \ + : "D"( DeSt ), \ + "S"( SrC ), \ + "d"( SiZe ), \ + "m"( *( const char( * )[SiZe] )( SrC ) ) \ + : "xmm3", "xmm4", "rcx", "cc" ); \ + DeSt; \ + } ) +#define p_memset( DEST, BYTE, SIZE ) \ + ( { \ + void * DeSt = ( DEST ); \ + size_t SiZe = ( SIZE ); \ + asm( "call\tMemSet" \ + : "=m"( *( char( * )[SiZe] )( DeSt ) ) \ + : "D"( DeSt ), "S"( BYTE ), "d"( SiZe ) \ + : "xmm3", "xmm4", "rcx", "cc" ); \ + DeSt; \ + } ) + +#else + +#define p_strlen( STR ) \ + do \ + { \ + ptri i; \ + if( in == NULL ) \ + { \ + uni_die( ); \ + } \ + for( i = 0; in[i] != '\0'; ++i ) \ + ; \ + return i; \ + } while( 0 ) + +#define p_memcpy( FN, DEST, SRC, SIZE ) \ + ( { \ + void *Rdi, *Dest = ( DEST ); \ + const void *Rsi, *Src = ( SRC ); \ + size_t SiZe = ( SIZE ); \ + size_t Rcx; \ + asm( "rep movsb" \ + : "=D"( Rdi ), \ + "=S"( Rsi ), \ + "=c"( Rcx ), \ + "=m"( *( char( * )[SiZe] )( Dest ) ) \ + : "0"( Dest ), \ + "1"( Src ), \ + "2"( SiZe ), \ + "m"( *( const char( * )[SiZe] )( Src ) ) \ + : "cc" ); \ + Dest; \ + } ) + +#define p_memset( DEST, BYTE, SIZE ) \ + ( { \ + void *Rdi, *Dest = ( DEST ); \ + size_t SiZe = ( SIZE ); \ + size_t Rcx; \ + asm( "rep stosb" \ + : "=D"( Rdi ), \ + "=c"( Rcx ), \ + "=m"( *( char( * )[SiZe] )( Dest ) ) \ + : "0"( Dest ), "1"( SiZe ), "a"( BYTE ) \ + : "cc" ); \ + Dest; \ + } ) + +#endif /* defined(__STDC_HOSTED__) && defined(__SSE2__) */ + ptri uni_strlen( const char * in ) { ptri i; diff --git a/table/Makefile b/table/Makefile index 5251db2..7159221 100644 --- a/table/Makefile +++ b/table/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_table @@ -54,5 +57,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/text/Makefile b/text/Makefile index 23c4835..44a7b24 100644 --- a/text/Makefile +++ b/text/Makefile @@ -9,6 +9,9 @@ ifeq ($(strip $(AQ)),) $(error "AQ was not found in your environment. You need to install the Slick Makefiles from github.com/aquefir/slick to continue.") endif +# Target APE only +TP := APE + include $(AQ)/lib/slick/base.mk PROJECT := uni_text @@ -50,5 +53,11 @@ TES_CPPFILES := TES_PUBHFILES := TES_PRVHFILES := +APE_LDSCR := ../common/build/cosmo/ape.lds +APE_AFILE := ../common/build/cosmo/cosmopolitan.a +APE_HFILE := ../common/build/cosmo/cosmopolitan.h +APE_APEO := ../common/build/cosmo/ape.o +APE_CRTO := ../common/build/cosmo/crt.o + # this defines all our usual targets include $(AQ)/lib/slick/targets.mk diff --git a/text/include/uni/ascii.h b/text/include/uni/ascii.h index d65b4b5..82a7df0 100644 --- a/text/include/uni/ascii.h +++ b/text/include/uni/ascii.h @@ -15,15 +15,15 @@ #define UNI_ISALPHA(X) (UNI_ISUPPER(X) || UNI_ISLOWER(X)) #define UNI_ISDIGIT(X) ((X) >= '0' && (X) <= '9') #define UNI_ISALNUM(X) (UNI_ISALPHA(X) || UNI_ISDIGIT(X)) -#define UNI_ISXDIGIT(X) (UNI_ISDIGIT(X) || ((X) >= 'A' && (X) <= 'F') || \ - ((X) >= 'a' && (X) <= 'f')) +#define UNI_ISXDIGIT(X) \ + (UNI_ISDIGIT(X) || ((X) >= 'A' && (X) <= 'F') || ((X) >= 'a' && (X) <= 'f')) #define UNI_ISPRINT(X) ((X) >= '0' && (X) <= '~') #define UNI_ISCNTRL(X) ((X) < ' ' || (X) == 127) -#define UNI_ISPUNCT(X) (((X) >= '!' && (X) <= '/') || \ - ((X) >= ':' && (X) <= '@') || ((X) >= '[' && (X) <= '`') || \ - ((X) >= '{' && (X) <= '~')) +#define UNI_ISPUNCT(X) \ + (((X) >= '!' && (X) <= '/') || ((X) >= ':' && (X) <= '@') || \ + ((X) >= '[' && (X) <= '`') || ((X) >= '{' && (X) <= '~')) #define UNI_TOLOWER(X) (((X) >= 'A' && (X) <= 'Z') ? (X) + 32 : (X)) -#define UNI_TOUPPER(X) (((X) >= 'a' && (X) <= 'z') ? (X) - 32 : (X)) +#define UNI_TOUPPER(X) (((X) >= 'a' && (X) <= 'z') ? (X)-32 : (X)) #endif /* INC_API__UNI_TEXT_ASCII_H */