From ce19a52a3422332d55d8c0f601f30c2e67c14f09 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin (Intel)" Date: Fri, 14 Dec 2018 00:27:59 -0800 Subject: Define and use offsetin() instead of offsetof() New macro which defines the offset on an object rather than a type. This macro, as far as I know, ought to be fully portable, unlike the fallback version of offsetof(). Signed-off-by: H. Peter Anvin (Intel) --- include/compiler.h | 7 +++++++ nasmlib/strlist.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/compiler.h b/include/compiler.h index 4ce60ccc..7beeb8fe 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -180,6 +180,13 @@ typedef enum bool { false, true } bool; # define offsetof(t,m) ((size_t)&(((t *)0)->m)) #endif +/* This is like offsetof(), but takes an object rather than a type. + Ironically enough this is actually guaranteed to be portable, + as far as I know... */ +#ifndef offsetin +# define offsetin(p,m) ((const char *)&((p).m) - (const char *)&(p)) +#endif + /* The container_of construct: if p is a pointer to member m of container class c, then return a pointer to the container of which *p is a member. */ diff --git a/nasmlib/strlist.c b/nasmlib/strlist.c index 506ad50e..a0687cce 100644 --- a/nasmlib/strlist.c +++ b/nasmlib/strlist.c @@ -108,7 +108,7 @@ strlist_vprintf(struct strlist *list, const char *fmt, va_list ap) if (!list) return NULL; - e = nasm_vaxprintf(offsetof(struct strlist_entry, str), fmt, ap); + e = nasm_vaxprintf(offsetin(*e, str), fmt, ap); e->size = nasm_aprintf_size(); if (list->uniq) { -- cgit v1.2.1