From 5765321487ff9ddb0310130cbd7de3eef38a84ed Mon Sep 17 00:00:00 2001 From: falsycat Date: Thu, 31 Dec 2020 00:00:00 +0000 Subject: [PATCH] Fixes warnings in generated codes. --- c/pack.h | 20 ++++++++++---------- c/unpack.h | 20 ++++++++++---------- transpile_c.c | 34 +++++++++++++++++++++++++--------- 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/c/pack.h b/c/pack.h index df2b314..79b72c0 100644 --- a/c/pack.h +++ b/c/pack.h @@ -6,21 +6,21 @@ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ # define pack_Nbit_(N) \ - static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \ + static inline void biner_pack_l##N(const void* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ - *c = (*v >> s*8) & 0xff; \ + *c = *((uint8_t*) v + s); \ } \ - static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \ + static inline void biner_pack_b##N(const void* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ biner_pack_l##N(v, c, N/8-s-1); \ } #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define pack_Nbit_(N) \ - static inline void biner_pack_b##N(const int##N##_t* v, uint8_t* c, size_t s) { \ + static inline void biner_pack_b##N(const void* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ - *c = (*v >> s*8) & 0xff; \ + *c = *((uint8_t*) v + s); \ } \ - static inline void biner_pack_l##N(const int##N##_t* v, uint8_t* c, size_t s) { \ + static inline void biner_pack_l##N(const void* v, uint8_t* c, size_t s) { \ assert(s < N/8); \ biner_pack_b##N(v, c, N/8-s-1); \ } @@ -28,9 +28,9 @@ # error "byte order unknown" #endif -pack_Nbit_(8); -pack_Nbit_(16); -pack_Nbit_(32); -pack_Nbit_(64); +pack_Nbit_(8) +pack_Nbit_(16) +pack_Nbit_(32) +pack_Nbit_(64) #undef pack_Nbit_ diff --git a/c/unpack.h b/c/unpack.h index 41d16e9..96ed1fb 100644 --- a/c/unpack.h +++ b/c/unpack.h @@ -6,21 +6,21 @@ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ # define unpack_Nbit_(N) \ - static inline void biner_unpack_l##N(int##N##_t* v, uint8_t c, size_t s) { \ + static inline void biner_unpack_l##N(void* v, uint8_t c, size_t s) { \ assert(s < N/8); \ - *v = (*v & ~((uint##N##_t) 0xff << (s*8))) | (c << (s*8)); \ + *((uint8_t*) v + s) = c; \ } \ - static inline void biner_unpack_b##N(int##N##_t* v, uint8_t c, size_t s) { \ + static inline void biner_unpack_b##N(void* v, uint8_t c, size_t s) { \ assert(s < N/8); \ biner_unpack_l##N(v, c, N/8-s-1); \ } #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ # define unpack_Nbit_(N) \ - static inline void biner_unpack_b##N(int##N##_t* v, uint8_t c, size_t s) { \ + static inline void biner_unpack_b##N(void* v, uint8_t c, size_t s) { \ assert(s < N/8); \ - *v = (*v & ~((uint##N_t) 0xff << (s*8))) | (c << (s*8)); \ + *((uint8_t*) v + s) = c; \ } \ - static inline void biner_unpack_l##N(int##N##_t* v, uint8_t c, size_t s) { \ + static inline void biner_unpack_l##N(void* v, uint8_t c, size_t s) { \ assert(s < N/8); \ biner_unpack_b##N(v, c, N/8-s-1); \ } @@ -28,9 +28,9 @@ # error "byte order unknown" #endif -unpack_Nbit_(8); -unpack_Nbit_(16); -unpack_Nbit_(32); -unpack_Nbit_(64); +unpack_Nbit_(8) +unpack_Nbit_(16) +unpack_Nbit_(32) +unpack_Nbit_(64) #undef unpack_Nbit_ diff --git a/transpile_c.c b/transpile_c.c index 042f071..65c84c4 100644 --- a/transpile_c.c +++ b/transpile_c.c @@ -244,7 +244,7 @@ static void print_enum_member_validation_code_( assert(m != NULL); fprintf(p->dst, "return true"); - while ((uintptr_t*) m != (uintptr_t*) p->zone) { + while ((uintptr_t) m != (uintptr_t) p->zone) { fprintf(p->dst, " && v == %s", p->zone+m->name); m = (const biner_tree_enum_member_t*) (p->zone+m->prev); } @@ -307,18 +307,34 @@ static void print_struct_member_context_struct_( fprintf(p->dst, "size_t count_max; "); fprintf(p->dst, "size_t byte; "); - fprintf(p->dst, "union { "); - while ((uintptr_t*) m != (uintptr_t*) p->zone) { + bool require_subctx = false; + const biner_tree_struct_member_t* itr = m; + while ((uintptr_t) itr != (uintptr_t) p->zone) { const biner_tree_struct_member_type_t* t = - (const biner_tree_struct_member_type_t*) (p->zone+m->type); + (const biner_tree_struct_member_type_t*) (p->zone+itr->type); if (t->name == BINER_TREE_STRUCT_MEMBER_TYPE_NAME_USER_DECL) { - const biner_tree_decl_t* d = (const biner_tree_decl_t*) (p->zone+t->decl); - print_fixed_decl_name_(p, (const char*) (p->zone+d->name)); - fprintf(p->dst, "%s %s; ", suffix, p->zone+m->name); + require_subctx = true; } - m = (const biner_tree_struct_member_t*) (p->zone+m->prev); + itr = (const biner_tree_struct_member_t*) (p->zone+itr->prev); + } + + if (require_subctx) { + fprintf(p->dst, "union { "); + + itr = m; + while ((uintptr_t) itr != (uintptr_t) p->zone) { + const biner_tree_struct_member_type_t* t = + (const biner_tree_struct_member_type_t*) (p->zone+itr->type); + if (t->name == BINER_TREE_STRUCT_MEMBER_TYPE_NAME_USER_DECL) { + const biner_tree_decl_t* d = (const biner_tree_decl_t*) (p->zone+t->decl); + print_fixed_decl_name_(p, (const char*) (p->zone+d->name)); + fprintf(p->dst, "%s %s; ", suffix, p->zone+itr->name); + } + itr = (const biner_tree_struct_member_t*) (p->zone+itr->prev); + } + + fprintf(p->dst, "} subctx; "); } - fprintf(p->dst, "} subctx; "); } static void print_struct_member_pack_code_each_(