From 6bd747a57a85f4db503aa46c8dca2672456616af Mon Sep 17 00:00:00 2001 From: Avril Date: Thu, 15 Jul 2021 15:03:25 +0100 Subject: [PATCH] Replace `Nx()` (temp value-assigning) macros with `Nv()` to avoid conflict with `TRACEx()` and for more clarity. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (merge from `strings`) Fortune for naka's current commit: Curse − 凶 --- include/macros.h | 32 ++++++++++++++ src/display.c | 112 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 140 insertions(+), 4 deletions(-) diff --git a/include/macros.h b/include/macros.h index 309c068..77a0b72 100644 --- a/include/macros.h +++ b/include/macros.h @@ -44,6 +44,31 @@ #define restrict __restrict__ #endif +// Function conventions + +#define _cconv__mixin _mixin +#define _cconv__pure _pure +#define _cconv__readonly _readonly +#define _cconv__cold _cold +#define _cconv__dead _dead +#define _cconv__unused _dead +#define _cconv__hot _hot +#define _cconv__entry __attribute__((constructor)) +#define _cconv__exit __attribute__((destructor)) + +// Allocates +#define _cconv__alloc __attribute__((malloc)) +// Infallible alloc +#define _cconv__ialloc __attribute__((malloc)) __attribute__((returns_nonnull)) +#define _cconv__nonnull __attribute__((returns_nonnull)) + +#define _callcv(name) _cconv__ ## name +#define _callconv(name) _callcv(name) + +#define _callat_entry _callcv(entry) +#define _callat_exit _callcv(exit) +#define _callat(when) _callat_ ## when + // Argument attribute // Used like: `int *pOUT output, const int *pIN input` @@ -110,6 +135,8 @@ _mixin void _drain_val(void* x, ...) { IGNORE(x); } // This compiles to no-op on // Allocation macros #define box(t) aligned_alloc(_Alignof(t), sizeof(t)) +#define box_value(v) ({ let _box = box(var(v)); *_box = (v); _box; }) +#define unbox_value(v) ({ let _v = (v); let _res = *_v; free(_v); _res; }) #define stackalloc(t) __builtin_alloca_with_align(sizeof(t), _Alignof(t)) // Function macros @@ -236,4 +263,9 @@ static_assert_eq(bswap(bswap(128lu)), 128, "bswap128 (lu) failed (3)"); #define VERSION_REV(ver) _AS_u32(_AS_u32(ver) & 0xffu) _Static_assert( (VERSION_COMP(VERSION(1,2,3,4), VER_COMP_MIN) >> VER_COMP_MIN) == 2u, "invalid native version spec"); +// Misc. + +#define PTR_ASSIGN(ptr, val) ( (ptr) ? (*(ptr) = (val), (ptr)) : (ptr) ) +#define PTR_ASSIGNv(ptr, val) ({ let _ptr = (ptr); let _val = (val); PTR_ASSIGN(_ptr, _val); }) + #endif /* _MACROS_H */ diff --git a/src/display.c b/src/display.c index eba9cca..5096d7a 100644 --- a/src/display.c +++ b/src/display.c @@ -11,8 +11,101 @@ #define FLAGSET(f, flag) (( (f) & (flag) ) == (flag)) #define DFLAGSET(f, flagname) FLAGSET(f, DISPF_SHOW_ ## flagname) -//TODO: This probably won't work. Write wrappers for strncpy(), strncat() that return number of bytes written isntead of useless pointer that we already have. -static usize _display_get_fmt(dispflags_t flags, bool matched, usize _len, char str[pOUT _len]) +#define CMP(x,cmp,y) ( (x) cmp (y) ? (x) : (y) ) +#define CMPv(x,cmp,y) ({ let _x = (x); let _y = (y); CMP(_x, cmp, _y); }) +#define MIN(x, y) CMP((x), <, (y)) +#define MINv(x, y) CMPv((x), <, (y)) +#define MAX(x, y) CMP((x), >, (y)) +#define MAXv(x, y) CMPv((x), >, (y)) + +// Returns number of bytes written to `dest`. Otherwise same as `strncpy()`. +static usize strncpy_n(char*pOUT dest, const char* restrict src, usize n) +{ + usize i; + for(i=0;imatched; @@ -49,9 +148,14 @@ static void _display_normal(FILE* output, dispin_t*pIN input, dispflags_t flags) #endif INFO("Mapped region slice for %lu, pre-transform (at %p): " SLICE_FORMAT ", len: %lu", i+1, base, SLICE_FORMAT_ARGS(&cslice), cslice.len); - //Honour `flags` + // --- get format string from `flags` --- char fmt[200]; //TODO: Find the realistic max for this. - fmt[_display_get_fmt(flags, matched, 100, fmt)] = 0; + usize fmtw = _display_get_fmt(flags, matched, sizeof(fmt)-1, fmt); + assert(fmtw+1 < sizeof(fmt)); + fmt[fmtw+1] = 0; + // --- + TRACE("Format string get: `%s' (%lu)", fmt, fmtw); + fprintf(output, fmt, i+1, pos.start, pos.end, pos.end-pos.start); }