From 0ed789f5b05c8e12f7bc2c71caeb23628c701291 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Sep 2025 14:47:48 +0200 Subject: [PATCH 07/23] C11 anonymous unions [ecpg] --- src/interfaces/ecpg/preproc/descriptor.c | 2 +- src/interfaces/ecpg/preproc/ecpg.header | 60 ++++++++++++------------ src/interfaces/ecpg/preproc/ecpg.trailer | 4 +- src/interfaces/ecpg/preproc/type.c | 46 +++++++++--------- src/interfaces/ecpg/preproc/type.h | 2 +- src/interfaces/ecpg/preproc/variable.c | 42 ++++++++--------- 6 files changed, 78 insertions(+), 78 deletions(-) diff --git a/src/interfaces/ecpg/preproc/descriptor.c b/src/interfaces/ecpg/preproc/descriptor.c index e8c7016bdc1..2f682880fd2 100644 --- a/src/interfaces/ecpg/preproc/descriptor.c +++ b/src/interfaces/ecpg/preproc/descriptor.c @@ -357,7 +357,7 @@ sqlda_variable(const char *name) p->type->type_name = NULL; p->type->size = NULL; p->type->struct_sizeof = NULL; - p->type->u.element = NULL; + p->type->element = NULL; p->type->counter = 0; p->brace_level = 0; p->next = NULL; diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header index dde69a39695..37487853a70 100644 --- a/src/interfaces/ecpg/preproc/ecpg.header +++ b/src/interfaces/ecpg/preproc/ecpg.header @@ -150,14 +150,14 @@ create_questionmarks(const char *name, bool array) * parameter is an error anywhere else so we don't have to worry here. */ - if (p->type->type == ECPGt_struct || (array && p->type->type == ECPGt_array && p->type->u.element->type == ECPGt_struct)) + if (p->type->type == ECPGt_struct || (array && p->type->type == ECPGt_array && p->type->element->type == ECPGt_struct)) { struct ECPGstruct_member *m; if (p->type->type == ECPGt_struct) - m = p->type->u.members; + m = p->type->members; else - m = p->type->u.element->u.members; + m = p->type->element->members; for (count = 0; m != NULL; m = m->next, count++); } @@ -236,12 +236,12 @@ adjust_outofscope_cursor_vars(struct cursor *cur) && atoi(ptr->variable->type->size) > 1) { newvar = new_variable(cat_str(4, "(", - ecpg_type_name(ptr->variable->type->u.element->type), + ecpg_type_name(ptr->variable->type->element->type), " *)(ECPGget_var(", var_text), - ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, + ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->element->type, "1", - ptr->variable->type->u.element->counter), + ptr->variable->type->element->counter), ptr->variable->type->size), 0); } @@ -272,7 +272,7 @@ adjust_outofscope_cursor_vars(struct cursor *cur) " *)(ECPGget_var(", var_text, ")"), - ECPGmake_struct_type(ptr->variable->type->u.members, + ECPGmake_struct_type(ptr->variable->type->members, ptr->variable->type->type, ptr->variable->type->type_name, ptr->variable->type->struct_sizeof), @@ -281,29 +281,29 @@ adjust_outofscope_cursor_vars(struct cursor *cur) } else if (ptr->variable->type->type == ECPGt_array) { - if (ptr->variable->type->u.element->type == ECPGt_struct - || ptr->variable->type->u.element->type == ECPGt_union) + if (ptr->variable->type->element->type == ECPGt_struct + || ptr->variable->type->element->type == ECPGt_union) { newvar = new_variable(cat_str(5, "(*(", - ptr->variable->type->u.element->type_name, + ptr->variable->type->element->type_name, " *)(ECPGget_var(", var_text, ")"), - ECPGmake_struct_type(ptr->variable->type->u.element->u.members, - ptr->variable->type->u.element->type, - ptr->variable->type->u.element->type_name, - ptr->variable->type->u.element->struct_sizeof), + ECPGmake_struct_type(ptr->variable->type->element->members, + ptr->variable->type->element->type, + ptr->variable->type->element->type_name, + ptr->variable->type->element->struct_sizeof), 0); } else { newvar = new_variable(cat_str(4, "(", - ecpg_type_name(ptr->variable->type->u.element->type), + ecpg_type_name(ptr->variable->type->element->type), " *)(ECPGget_var(", var_text), - ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->u.element->type, - ptr->variable->type->u.element->size, - ptr->variable->type->u.element->counter), + ECPGmake_array_type(ECPGmake_simple_type(ptr->variable->type->element->type, + ptr->variable->type->element->size, + ptr->variable->type->element->counter), ptr->variable->type->size), 0); var_ptr = true; @@ -358,7 +358,7 @@ adjust_outofscope_cursor_vars(struct cursor *cur) " *)(ECPGget_var(", var_text, ")"), - ECPGmake_struct_type(ptr->indicator->type->u.members, + ECPGmake_struct_type(ptr->indicator->type->members, ptr->indicator->type->type, ptr->indicator->type->type_name, ptr->indicator->type->struct_sizeof), @@ -367,29 +367,29 @@ adjust_outofscope_cursor_vars(struct cursor *cur) } else if (ptr->indicator->type->type == ECPGt_array) { - if (ptr->indicator->type->u.element->type == ECPGt_struct - || ptr->indicator->type->u.element->type == ECPGt_union) + if (ptr->indicator->type->element->type == ECPGt_struct + || ptr->indicator->type->element->type == ECPGt_union) { newind = new_variable(cat_str(5, "(*(", - ptr->indicator->type->u.element->type_name, + ptr->indicator->type->element->type_name, " *)(ECPGget_var(", var_text, ")"), - ECPGmake_struct_type(ptr->indicator->type->u.element->u.members, - ptr->indicator->type->u.element->type, - ptr->indicator->type->u.element->type_name, - ptr->indicator->type->u.element->struct_sizeof), + ECPGmake_struct_type(ptr->indicator->type->element->members, + ptr->indicator->type->element->type, + ptr->indicator->type->element->type_name, + ptr->indicator->type->element->struct_sizeof), 0); } else { newind = new_variable(cat_str(4, "(", - ecpg_type_name(ptr->indicator->type->u.element->type), + ecpg_type_name(ptr->indicator->type->element->type), " *)(ECPGget_var(", var_text), - ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->u.element->type, - ptr->indicator->type->u.element->size, - ptr->indicator->type->u.element->counter), + ECPGmake_array_type(ECPGmake_simple_type(ptr->indicator->type->element->type, + ptr->indicator->type->element->size, + ptr->indicator->type->element->counter), ptr->indicator->type->size), 0); var_ptr = true; diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 6f94b832a03..5064cba8091 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -255,7 +255,7 @@ user_name: RoleId /* if array see what's inside */ if (type == ECPGt_array) - type = argsinsert->variable->type->u.element->type; + type = argsinsert->variable->type->element->type; /* handle varchars */ if (type == ECPGt_varchar) @@ -278,7 +278,7 @@ char_variable: cvariable { /* if array see what's inside */ if (type == ECPGt_array) - type = p->type->u.element->type; + type = p->type->element->type; switch (type) { diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index 9f6dacd2aea..87d7735b227 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -22,7 +22,7 @@ ECPGstruct_member_dup(struct ECPGstruct_member *rm) { case ECPGt_struct: case ECPGt_union: - type = ECPGmake_struct_type(rm->type->u.members, rm->type->type, rm->type->type_name, rm->type->struct_sizeof); + type = ECPGmake_struct_type(rm->type->members, rm->type->type, rm->type->type_name, rm->type->struct_sizeof); break; case ECPGt_array: @@ -30,10 +30,10 @@ ECPGstruct_member_dup(struct ECPGstruct_member *rm) * if this array does contain a struct again, we have to * create the struct too */ - if (rm->type->u.element->type == ECPGt_struct || rm->type->u.element->type == ECPGt_union) - type = ECPGmake_struct_type(rm->type->u.element->u.members, rm->type->u.element->type, rm->type->u.element->type_name, rm->type->u.element->struct_sizeof); + if (rm->type->element->type == ECPGt_struct || rm->type->element->type == ECPGt_union) + type = ECPGmake_struct_type(rm->type->element->members, rm->type->element->type, rm->type->element->type_name, rm->type->element->struct_sizeof); else - type = ECPGmake_array_type(ECPGmake_simple_type(rm->type->u.element->type, rm->type->u.element->size, rm->type->u.element->counter), rm->type->size); + type = ECPGmake_array_type(ECPGmake_simple_type(rm->type->element->type, rm->type->element->size, rm->type->element->counter), rm->type->size); break; default: type = ECPGmake_simple_type(rm->type->type, rm->type->size, rm->type->counter); @@ -76,7 +76,7 @@ ECPGmake_simple_type(enum ECPGttype type, const char *size, int counter) ne->type = type; ne->type_name = NULL; ne->size = mm_strdup(size); - ne->u.element = NULL; + ne->element = NULL; ne->struct_sizeof = NULL; ne->counter = counter; /* only needed for varchar and bytea */ @@ -88,7 +88,7 @@ ECPGmake_array_type(struct ECPGtype *type, const char *size) { struct ECPGtype *ne = ECPGmake_simple_type(ECPGt_array, size, 0); - ne->u.element = type; + ne->element = type; return ne; } @@ -100,7 +100,7 @@ ECPGmake_struct_type(struct ECPGstruct_member *rm, enum ECPGttype type, struct ECPGtype *ne = ECPGmake_simple_type(type, "1", 0); ne->type_name = mm_strdup(type_name); - ne->u.members = ECPGstruct_member_dup(rm); + ne->members = ECPGstruct_member_dup(rm); ne->struct_sizeof = mm_strdup(struct_sizeof); return ne; @@ -262,7 +262,7 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype *type, const int brac case ECPGt_array: if (indicator_set && ind_type->type != ECPGt_array) mmfatal(INDICATOR_NOT_ARRAY, "indicator for array/pointer has to be array/pointer"); - switch (type->u.element->type) + switch (type->element->type) { case ECPGt_array: mmerror(PARSE_ERROR, ET_ERROR, "nested arrays are not supported (except strings)"); /* array of array */ @@ -272,18 +272,18 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype *type, const int brac ECPGdump_a_struct(o, name, ind_name, type->size, - type->u.element, - (ind_type == NULL) ? NULL : ((ind_type->type == ECPGt_NO_INDICATOR) ? ind_type : ind_type->u.element), + type->element, + (ind_type == NULL) ? NULL : ((ind_type->type == ECPGt_NO_INDICATOR) ? ind_type : ind_type->element), prefix, ind_prefix); break; default: - if (!IS_SIMPLE_TYPE(type->u.element->type)) + if (!IS_SIMPLE_TYPE(type->element->type)) base_yyerror("internal error: unknown datatype, please report this to <" PACKAGE_BUGREPORT ">"); ECPGdump_a_simple(o, name, - type->u.element->type, - type->u.element->size, type->size, struct_sizeof ? struct_sizeof : NULL, - prefix, type->u.element->counter); + type->element->type, + type->element->size, type->size, struct_sizeof ? struct_sizeof : NULL, + prefix, type->element->counter); if (ind_type != NULL) { @@ -296,8 +296,8 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype *type, const int brac } else { - ECPGdump_a_simple(o, ind_name, ind_type->u.element->type, - ind_type->u.element->size, ind_type->size, NULL, ind_prefix, 0); + ECPGdump_a_simple(o, ind_name, ind_type->element->type, + ind_type->element->size, ind_type->size, NULL, ind_prefix, 0); } } } @@ -583,10 +583,10 @@ ECPGdump_a_struct(FILE *o, const char *name, const char *ind_name, char *arrsize sprintf(ind_pbuf, "%s%s->", ind_prefix ? ind_prefix : "", ind_name); ind_prefix = ind_pbuf; - ind_p = ind_type->u.members; + ind_p = ind_type->members; } - for (p = type->u.members; p; p = p->next) + for (p = type->members; p; p = p->next) { ECPGdump_a_type(o, p->name, p->type, -1, (ind_p != NULL) ? ind_p->name : NULL, @@ -636,7 +636,7 @@ ECPGfree_type(struct ECPGtype *type) switch (type->type) { case ECPGt_array: - switch (type->u.element->type) + switch (type->element->type) { case ECPGt_array: base_yyerror("internal error: found multidimensional array\n"); @@ -644,18 +644,18 @@ ECPGfree_type(struct ECPGtype *type) case ECPGt_struct: case ECPGt_union: /* Array of structs. */ - ECPGfree_type(type->u.element); + ECPGfree_type(type->element); break; default: - if (!IS_SIMPLE_TYPE(type->u.element->type)) + if (!IS_SIMPLE_TYPE(type->element->type)) base_yyerror("internal error: unknown datatype, please report this to <" PACKAGE_BUGREPORT ">"); - ECPGfree_type(type->u.element); + ECPGfree_type(type->element); } break; case ECPGt_struct: case ECPGt_union: - ECPGfree_struct_member(type->u.members); + ECPGfree_struct_member(type->members); break; default: mmerror(PARSE_ERROR, ET_ERROR, "unrecognized variable type code %d", type->type); diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h index 3d99e1703de..776dd32e5d6 100644 --- a/src/interfaces/ecpg/preproc/type.h +++ b/src/interfaces/ecpg/preproc/type.h @@ -28,7 +28,7 @@ struct ECPGtype struct ECPGtype *element; /* For an array this is the type of the * element */ struct ECPGstruct_member *members; /* A pointer to a list of members. */ - } u; + }; int counter; }; diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index 2c67e33e92e..84605e36d0c 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -44,10 +44,10 @@ find_struct_member(const char *name, char *str, struct ECPGstruct_member *member switch (members->type->type) { case ECPGt_array: - return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(members->type->u.element->type, members->type->u.element->size, members->type->u.element->counter), members->type->size), brace_level); + return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(members->type->element->type, members->type->element->size, members->type->element->counter), members->type->size), brace_level); case ECPGt_struct: case ECPGt_union: - return new_variable(name, ECPGmake_struct_type(members->type->u.members, members->type->type, members->type->type_name, members->type->struct_sizeof), brace_level); + return new_variable(name, ECPGmake_struct_type(members->type->members, members->type->type, members->type->type_name, members->type->struct_sizeof), brace_level); default: return new_variable(name, ECPGmake_simple_type(members->type->type, members->type->size, members->type->counter), brace_level); } @@ -88,28 +88,28 @@ find_struct_member(const char *name, char *str, struct ECPGstruct_member *member if (members->type->type != ECPGt_array) mmfatal(PARSE_ERROR, "incorrectly formed variable \"%s\"", name); - switch (members->type->u.element->type) + switch (members->type->element->type) { case ECPGt_array: - return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(members->type->u.element->u.element->type, members->type->u.element->u.element->size, members->type->u.element->u.element->counter), members->type->u.element->size), brace_level); + return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(members->type->element->element->type, members->type->element->element->size, members->type->element->element->counter), members->type->element->size), brace_level); case ECPGt_struct: case ECPGt_union: - return new_variable(name, ECPGmake_struct_type(members->type->u.element->u.members, members->type->u.element->type, members->type->u.element->type_name, members->type->u.element->struct_sizeof), brace_level); + return new_variable(name, ECPGmake_struct_type(members->type->element->members, members->type->element->type, members->type->element->type_name, members->type->element->struct_sizeof), brace_level); default: - return new_variable(name, ECPGmake_simple_type(members->type->u.element->type, members->type->u.element->size, members->type->u.element->counter), brace_level); + return new_variable(name, ECPGmake_simple_type(members->type->element->type, members->type->element->size, members->type->element->counter), brace_level); } break; case '-': if (members->type->type == ECPGt_array) - return find_struct_member(name, ++end, members->type->u.element->u.members, brace_level); + return find_struct_member(name, ++end, members->type->element->members, brace_level); else - return find_struct_member(name, ++end, members->type->u.members, brace_level); + return find_struct_member(name, ++end, members->type->members, brace_level); break; case '.': if (members->type->type == ECPGt_array) - return find_struct_member(name, end, members->type->u.element->u.members, brace_level); + return find_struct_member(name, end, members->type->element->members, brace_level); else - return find_struct_member(name, end, members->type->u.members, brace_level); + return find_struct_member(name, end, members->type->members, brace_level); break; default: mmfatal(PARSE_ERROR, "incorrectly formed variable \"%s\"", name); @@ -137,13 +137,13 @@ find_struct(const char *name, char *next, char *end) if (p->type->type != ECPGt_array) mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer", name); - if (p->type->u.element->type != ECPGt_struct && p->type->u.element->type != ECPGt_union) + if (p->type->element->type != ECPGt_struct && p->type->element->type != ECPGt_union) mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer to a structure or a union", name); /* restore the name, we will need it later */ *next = c; - return find_struct_member(name, ++end, p->type->u.element->u.members, p->brace_level); + return find_struct_member(name, ++end, p->type->element->members, p->brace_level); } else { @@ -155,20 +155,20 @@ find_struct(const char *name, char *next, char *end) /* restore the name, we will need it later */ *next = c; - return find_struct_member(name, end, p->type->u.members, p->brace_level); + return find_struct_member(name, end, p->type->members, p->brace_level); } else { if (p->type->type != ECPGt_array) mmfatal(PARSE_ERROR, "variable \"%s\" is not an array", name); - if (p->type->u.element->type != ECPGt_struct && p->type->u.element->type != ECPGt_union) + if (p->type->element->type != ECPGt_struct && p->type->element->type != ECPGt_union) mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer to a structure or a union", name); /* restore the name, we will need it later */ *next = c; - return find_struct_member(name, end, p->type->u.element->u.members, p->brace_level); + return find_struct_member(name, end, p->type->element->members, p->brace_level); } } } @@ -236,15 +236,15 @@ find_variable(const char *name) if (p->type->type != ECPGt_array) mmfatal(PARSE_ERROR, "variable \"%s\" is not a pointer", name); *next = c; - switch (p->type->u.element->type) + switch (p->type->element->type) { case ECPGt_array: - return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(p->type->u.element->u.element->type, p->type->u.element->u.element->size, p->type->u.element->u.element->counter), p->type->u.element->size), p->brace_level); + return new_variable(name, ECPGmake_array_type(ECPGmake_simple_type(p->type->element->element->type, p->type->element->element->size, p->type->element->element->counter), p->type->element->size), p->brace_level); case ECPGt_struct: case ECPGt_union: - return new_variable(name, ECPGmake_struct_type(p->type->u.element->u.members, p->type->u.element->type, p->type->u.element->type_name, p->type->u.element->struct_sizeof), p->brace_level); + return new_variable(name, ECPGmake_struct_type(p->type->element->members, p->type->element->type, p->type->element->type_name, p->type->element->struct_sizeof), p->brace_level); default: - return new_variable(name, ECPGmake_simple_type(p->type->u.element->type, p->type->u.element->size, p->type->u.element->counter), p->brace_level); + return new_variable(name, ECPGmake_simple_type(p->type->element->type, p->type->element->size, p->type->element->counter), p->brace_level); } } } @@ -506,12 +506,12 @@ check_indicator(struct ECPGtype *var) case ECPGt_struct: case ECPGt_union: - for (p = var->u.members; p; p = p->next) + for (p = var->members; p; p = p->next) check_indicator(p->type); break; case ECPGt_array: - check_indicator(var->u.element); + check_indicator(var->element); break; default: mmerror(PARSE_ERROR, ET_ERROR, "indicator variable must have an integer type"); -- 2.51.0