From f2cb0d4c179847a49126222e34009b49d195f4cd Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Tue, 28 Oct 2025 19:09:29 +0100 Subject: [PATCH 1/7] changing default name buffer size --- extern/dia2code/src/dia2code.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/dia2code/src/dia2code.h b/extern/dia2code/src/dia2code.h index d2f5f630b..10398991e 100644 --- a/extern/dia2code/src/dia2code.h +++ b/extern/dia2code/src/dia2code.h @@ -60,7 +60,7 @@ #define DBG_GENCODE 6 #define DBG_CORE 8 -#define SMALL_BUFFER 80 +#define SMALL_BUFFER 512 #define BIG_BUFFER 512 #define LARGE_BUFFER 4096 #define HUGE_BUFFER 16384 From f80ac6a14e64bdf993a7eba06838bbc2dc597299 Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Tue, 28 Oct 2025 19:13:01 +0100 Subject: [PATCH 2/7] adding possibility to use template class in other class attributes --- extern/dia2code/src/generate_code_cpp.c | 1117 ++++++++++++++--------- 1 file changed, 669 insertions(+), 448 deletions(-) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index 853cf8b48..8cc24ace7 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -27,118 +27,133 @@ #define SPEC_EXT "h" #define BODY_EXT "cpp" -#define eq !strcmp +#define eq !strcmp #define INCLUDE_STD_HEADER(flag, tag, import) \ - if (!(si->flag) && strstr(name, tag)) { \ - print("#include <" import ">\n"); \ - (si)->flag = 1; \ + if (!(si->flag) && strstr(name, tag)) \ + { \ + print("#include <" import ">\n"); \ + (si)->flag = 1; \ } -static batch *gb; /* The current batch being processed. */ +static batch *gb; /* The current batch being processed. */ /* Utilities. */ -int is_scalar_type(char* name) { - if (strcmp(name,"int") == 0) { +int is_scalar_type(char *name) +{ + if (strcmp(name, "int") == 0) + { return 1; } - if (strcmp(name,"char") == 0) { + if (strcmp(name, "char") == 0) + { return 1; } - if (strcmp(name,"float") == 0) { + if (strcmp(name, "float") == 0) + { return 1; } - if (strcmp(name,"bool") == 0) { + if (strcmp(name, "bool") == 0) + { return 1; } - if (strcmp(name,"unsigned int") == 0) { + if (strcmp(name, "unsigned int") == 0) + { return 1; } - if (strcmp(name,"unsigned char") == 0) { + if (strcmp(name, "unsigned char") == 0) + { return 1; } - if (strcmp(name,"double") == 0) { + if (strcmp(name, "double") == 0) + { return 1; - } - umlclassnode *ref = find_by_name (gb->classlist, name); - if (ref && is_enum_stereo(ref->key->stereotype)) { + } + umlclassnode *ref = find_by_name(gb->classlist, name); + if (ref && is_enum_stereo(ref->key->stereotype)) + { return 1; } return 0; } static void -check_umlattr (umlattribute *u, char *typename) +check_umlattr(umlattribute *u, char *typename) { /* Check settings that don't make sense for C++ generation. */ if (u->visibility == '1') - fprintf (stderr, "%s/%s: ignoring non-visibility\n", typename, u->name); + fprintf(stderr, "%s/%s: ignoring non-visibility\n", typename, u->name); if (u->isstatic) - fprintf (stderr, "%s/%s: ignoring staticness\n", typename, u->name); + fprintf(stderr, "%s/%s: ignoring staticness\n", typename, u->name); } static char * -subst (char *str, char search, char replace) +subst(char *str, char search, char replace) { char *p; - while ((p = strchr (str, search)) != NULL) + while ((p = strchr(str, search)) != NULL) *p = replace; return str; } static char * -nospc (char *str) +nospc(char *str) { - return subst (str, ' ', '_'); + return subst(str, ' ', '_'); } static int -pass_by_reference (umlclass *cl) +pass_by_reference(umlclass *cl) { char *st; if (cl == NULL) return 0; st = cl->stereotype; - if (strlen (st) == 0) + if (strlen(st) == 0) return 1; - if (is_typedef_stereo (st)) { + if (is_typedef_stereo(st)) + { umlattrlist umla = cl->attributes; - umlclassnode *ref = find_by_name (gb->classlist, cl->name); + umlclassnode *ref = find_by_name(gb->classlist, cl->name); if (ref == NULL) return 0; - return pass_by_reference (ref->key); + return pass_by_reference(ref->key); } - return (!is_const_stereo (st) && - !is_enum_stereo (st)); + return (!is_const_stereo(st) && + !is_enum_stereo(st)); } static int -is_oo_class (umlclass *cl) +is_oo_class(umlclass *cl) { char *st; if (cl == NULL) return 0; st = cl->stereotype; - if (strlen (st) == 0) + if (strlen(st) == 0) return 1; - return (!is_const_stereo (st) && - !is_typedef_stereo (st) && - !is_enum_stereo (st) && - !is_struct_stereo (st) && - !eq (st, "CORBAUnion") && - !eq (st, "CORBAException")); + return (!is_const_stereo(st) && + !is_typedef_stereo(st) && + !is_enum_stereo(st) && + !is_struct_stereo(st) && + !eq(st, "CORBAUnion") && + !eq(st, "CORBAException")); } static int -has_oo_class (declaration *d) +has_oo_class(declaration *d) { - while (d != NULL) { - if (d->decl_kind == dk_module) { - if (has_oo_class (d->u.this_module->contents)) + while (d != NULL) + { + if (d->decl_kind == dk_module) + { + if (has_oo_class(d->u.this_module->contents)) return 1; - } else { /* dk_class */ - if (is_oo_class (d->u.this_class->key)) + } + else + { /* dk_class */ + if (is_oo_class(d->u.this_class->key)) return 1; } d = d->next; @@ -147,398 +162,476 @@ has_oo_class (declaration *d) } static char * -cppname (char *name) +cppname(char *name) { static char buf[SMALL_BUFFER]; - if (use_corba) { - if (eq (name, "boolean") || - eq (name, "char") || - eq (name, "octet") || - eq (name, "short") || - eq (name, "long") || - eq (name, "float") || - eq (name, "double") || - eq (name, "string") || - eq (name, "any")) { - sprintf (buf, "CORBA::%s", strtoupperfirst (name)); - } else if (eq (name, "long long")) { - sprintf (buf, "CORBA::LongLong"); - } else if (eq (name, "unsigned short")) { - sprintf (buf, "CORBA::UShort"); - } else if (eq (name, "unsigned long")) { - sprintf (buf, "CORBA::ULong"); - } else if (eq (name, "unsigned long long")) { - sprintf (buf, "CORBA::ULongLong"); - } else { - strcpy (buf, name); + if (use_corba) + { + if (eq(name, "boolean") || + eq(name, "char") || + eq(name, "octet") || + eq(name, "short") || + eq(name, "long") || + eq(name, "float") || + eq(name, "double") || + eq(name, "string") || + eq(name, "any")) + { + sprintf(buf, "CORBA::%s", strtoupperfirst(name)); + } + else if (eq(name, "long long")) + { + sprintf(buf, "CORBA::LongLong"); + } + else if (eq(name, "unsigned short")) + { + sprintf(buf, "CORBA::UShort"); + } + else if (eq(name, "unsigned long")) + { + sprintf(buf, "CORBA::ULong"); + } + else if (eq(name, "unsigned long long")) + { + sprintf(buf, "CORBA::ULongLong"); + } + else + { + strcpy(buf, name); } - } else { - strcpy (buf, name); + } + else + { + strcpy(buf, name); } return buf; } - static char * -fqname (umlclassnode *node, int use_ref_type) +fqname(umlclassnode *node, int use_ref_type) { static char buf[BIG_BUFFER]; buf[0] = '\0'; if (node == NULL) return buf; - if (node->key->package != NULL) { - umlpackagelist pkglist = make_package_list (node->key->package); - while (pkglist != NULL) { - strcat (buf, pkglist->key->name); - strcat (buf, "::"); + if (node->key->package != NULL) + { + umlpackagelist pkglist = make_package_list(node->key->package); + while (pkglist != NULL) + { + strcat(buf, pkglist->key->name); + strcat(buf, "::"); pkglist = pkglist->next; } } - strcat (buf, node->key->name); + strcat(buf, node->key->name); if (use_ref_type) - strcat (buf, "*"); + strcat(buf, "*"); return buf; } static void -check_visibility (int *curr_vis, int new_vis) +check_visibility(int *curr_vis, int new_vis) { if (*curr_vis == new_vis) return; indentlevel--; - switch (new_vis) { - case '0': - print ("public:\n"); + switch (new_vis) + { + case '0': + print("public:\n"); break; - case '1': - print ("private:\n"); + case '1': + print("private:\n"); break; - case '2': - print ("protected:\n"); + case '2': + print("protected:\n"); break; } *curr_vis = new_vis; indentlevel++; } -static void -add_setter_getter(umlclassnode *node, char* typename,char* varname) +static void +add_setter_getter(umlclassnode *node, char *typename, char *varname) { int foundGetter = 0; int foundSetter = 0; - char* tmp = strtoupperfirst(varname); + char *tmp = strtoupperfirst(varname); char getter[0x100]; - strcpy(getter,"get"); - strcat(getter,tmp); + strcpy(getter, "get"); + strcat(getter, tmp); char setter[0x100]; - strcpy(setter,"set"); - strcat(setter,tmp); + strcpy(setter, "set"); + strcat(setter, tmp); free(tmp); emit("//%s / %s\n", getter, setter); - if (node->key->operations != NULL) { + if (node->key->operations != NULL) + { umloplist umlo = node->key->operations; - while (umlo != NULL) { - if (strcmp(umlo->key.attr.name,getter) == 0) { + while (umlo != NULL) + { + if (strcmp(umlo->key.attr.name, getter) == 0) + { foundGetter = 1; - } - if (strcmp(umlo->key.attr.name,setter) == 0) { + } + if (strcmp(umlo->key.attr.name, setter) == 0) + { foundSetter = 1; - } + } umlo = umlo->next; } } - if (!foundGetter) { - print (""); - if (is_scalar_type(typename) || typename[strlen(typename)-1] == '&') { - emit ("%s %s() const;\n", typename, getter); + if (!foundGetter) + { + print(""); + if (is_scalar_type(typename) || typename[strlen(typename) - 1] == '&') + { + emit("%s %s() const;\n", typename, getter); } - else { - emit ("const %s& %s() const;\n", typename, getter); + else + { + emit("const %s& %s() const;\n", typename, getter); } } - if (!foundSetter && strstr(typename,"const ") != typename) { - print (""); - if (is_scalar_type(typename)) { - emit ("void %s(%s %s);\n", setter, typename, varname); + if (!foundSetter && strstr(typename, "const ") != typename) + { + print(""); + if (is_scalar_type(typename)) + { + emit("void %s(%s %s);\n", setter, typename, varname); } - else { - emit ("void %s(const %s& %s);\n", setter, typename, varname); + else + { + emit("void %s(const %s& %s);\n", setter, typename, varname); } } - } static void -gen_class (umlclassnode *node) +gen_class(umlclassnode *node) { char *name = node->key->name; char *stype = node->key->stereotype; int is_valuetype = 0; - if (strlen (stype) > 0) { - print ("// %s\n", stype); - is_valuetype = eq (stype, "CORBAValue"); + if (strlen(stype) > 0) + { + print("// %s\n", stype); + is_valuetype = eq(stype, "CORBAValue"); } print("/// class %s - %s\n", name, node->key->comment); - if (node->key->templates != NULL) { + if (node->key->templates != NULL) + { umltemplatelist template = node->key->templates; - if (is_valuetype) { - fprintf (stderr, "CORBAValue %s: template ignored\n", name); - } else { - print ("template <"); - while (template != NULL) { - print ("%s %s", template->key.type, template->key.name); + if (is_valuetype) + { + fprintf(stderr, "CORBAValue %s: template ignored\n", name); + } + else + { + print("template <"); + while (template != NULL) + { + print("%s %s", template->key.type, template->key.name); template = template->next; if (template != NULL) - emit (", "); + emit(", "); } - emit (">\n"); + emit(">\n"); } } - print ("class %s", name); - if (node->parents != NULL) { + print("class %s", name); + if (node->parents != NULL) + { umlclasslist parent = node->parents; - emit (" : "); - while (parent != NULL) { - emit ("public %s", fqname (parent, 0)); + emit(" : "); + while (parent != NULL) + { + emit("public %s", fqname(parent, 0)); parent = parent->next; if (parent != NULL) - emit (", "); + emit(", "); } - } else if (is_valuetype) { - emit (" : CORBA::ValueBase"); } - emit (" {\n"); + else if (is_valuetype) + { + emit(" : CORBA::ValueBase"); + } + emit(" {\n"); indentlevel++; - if (node->associations != NULL) { + if (node->associations != NULL) + { umlassoclist assoc = node->associations; - print ("// Associations\n"); - while (assoc != NULL) { + print("// Associations\n"); + while (assoc != NULL) + { umlclassnode *ref; if (assoc->name[0] != '\0') { - ref = find_by_name (gb->classlist, assoc->key->name); - print (""); + ref = find_by_name(gb->classlist, assoc->key->name); + print(""); if (ref != NULL) if (assoc->composite) - emit("%s", fqname (ref, !assoc->composite)); + emit("%s", fqname(ref, !assoc->composite)); else - emit ("const %s", fqname (ref, !assoc->composite)); + emit("const %s", fqname(ref, !assoc->composite)); else - emit ("%s", cppname (assoc->key->name)); - emit (" %s;\n", assoc->name); + emit("%s", cppname(assoc->key->name)); + emit(" %s;\n", assoc->name); } assoc = assoc->next; } } - if (node->key->attributes != NULL) { + if (node->key->attributes != NULL) + { umlattrlist umla = node->key->attributes; - if (is_valuetype) { - print ("// Public state members\n"); + if (is_valuetype) + { + print("// Public state members\n"); indentlevel--; - print ("public:\n"); + print("public:\n"); indentlevel++; - while (umla != NULL) { + while (umla != NULL) + { char *member = umla->key.name; umlclassnode *ref; - if (umla->key.visibility != '0') { + if (umla->key.visibility != '0') + { umla = umla->next; continue; } - print (""); - if (umla->key.isstatic) { - fprintf (stderr, "CORBAValue %s/%s: static not supported\n", - name, member); + print(""); + if (umla->key.isstatic) + { + fprintf(stderr, "CORBAValue %s/%s: static not supported\n", + name, member); } - ref = find_by_name (gb->classlist, umla->key.type); + ref = find_by_name(gb->classlist, umla->key.type); if (ref != NULL) - eboth ("%s", fqname (ref, 1)); + eboth("%s", fqname(ref, 1)); else - eboth ("%s", cppname (umla->key.type)); - emit (" %s () { return _%s; }\n", member, member); - print ("void %s (", member); - if (ref != NULL) { - int by_ref = pass_by_reference (ref->key); + eboth("%s", cppname(umla->key.type)); + emit(" %s () { return _%s; }\n", member, member); + print("void %s (", member); + if (ref != NULL) + { + int by_ref = pass_by_reference(ref->key); if (by_ref) - emit ("const "); - emit ("%s", fqname (ref, 1)); + emit("const "); + emit("%s", fqname(ref, 1)); if (by_ref) - emit ("&"); - } else { - emit ("%s", cppname (umla->key.type)); + emit("&"); + } + else + { + emit("%s", cppname(umla->key.type)); } - emit (" value_) { _%s = value_; }\n"); + emit(" value_) { _%s = value_; }\n"); umla = umla->next; } - } else { + } + else + { int tmpv = -1; - print ("// Attributes\n"); - while (umla != NULL) { - check_visibility (&tmpv, umla->key.visibility); - if (strlen(umla->key.comment)) { + print("// Attributes\n"); + while (umla != NULL) + { + check_visibility(&tmpv, umla->key.visibility); + if (strlen(umla->key.comment)) + { print("/// %s\n", umla->key.comment); } - print (""); - if (umla->key.isstatic) { - emit ("static "); + print(""); + if (umla->key.isstatic) + { + emit("static "); } - emit ("%s %s", umla->key.type, umla->key.name); - if (strlen (umla->key.value) > 0) - print (" = %s", umla->key.value); - emit (";\n"); + emit("%s %s", umla->key.type, umla->key.name); + if (strlen(umla->key.value) > 0) + print(" = %s", umla->key.value); + emit(";\n"); umla = umla->next; } } } - if (node->key->operations != NULL) { + if (node->key->operations != NULL) + { umloplist umlo = node->key->operations; int tmpv = -1; - print ("// Operations\n"); - if (is_valuetype) { + print("// Operations\n"); + if (is_valuetype) + { indentlevel--; - print ("public:\n"); + print("public:\n"); indentlevel++; } - while (umlo != NULL) { + while (umlo != NULL) + { umlattrlist tmpa = umlo->key.parameters; - if (is_valuetype) { + if (is_valuetype) + { if (umlo->key.attr.visibility != '0') - fprintf (stderr, "CORBAValue %s/%s: must be public\n", - name, umlo->key.attr.name); - } else { - check_visibility (&tmpv, umlo->key.attr.visibility); + fprintf(stderr, "CORBAValue %s/%s: must be public\n", + name, umlo->key.attr.name); + } + else + { + check_visibility(&tmpv, umlo->key.attr.visibility); } /* print comments on operation */ - if (strlen(umlo->key.attr.comment)) { + if (strlen(umlo->key.attr.comment)) + { print("/// %s\n", umlo->key.attr.comment); tmpa = umlo->key.parameters; - while (tmpa != NULL) { - print("/// @param %s\t\t(%s) %s\n", - tmpa->key.name, - kind_str(tmpa->key.kind), - tmpa->key.comment); - tmpa = tmpa->next; + while (tmpa != NULL) + { + print("/// @param %s\t\t(%s) %s\n", + tmpa->key.name, + kind_str(tmpa->key.kind), + tmpa->key.comment); + tmpa = tmpa->next; } } /* print operation */ - print (""); - if (umlo->key.attr.inheritance_type == '1') { - emit ("virtual "); + print(""); + if (umlo->key.attr.inheritance_type == '1') + { + emit("virtual "); } - else if (umlo->key.attr.isabstract || is_valuetype) { - emit ("virtual "); + else if (umlo->key.attr.isabstract || is_valuetype) + { + emit("virtual "); umlo->key.attr.value[0] = '0'; } - if (umlo->key.attr.isstatic) { + if (umlo->key.attr.isstatic) + { if (is_valuetype) - fprintf (stderr, "CORBAValue %s/%s: static not supported\n", - name, umlo->key.attr.name); + fprintf(stderr, "CORBAValue %s/%s: static not supported\n", + name, umlo->key.attr.name); else - emit ("static "); + emit("static "); } - if (strlen (umlo->key.attr.type) > 0) { - emit ("%s ", cppname (umlo->key.attr.type)); + if (strlen(umlo->key.attr.type) > 0) + { + emit("%s ", cppname(umlo->key.attr.type)); } - emit ("%s (", umlo->key.attr.name); + emit("%s (", umlo->key.attr.name); tmpa = umlo->key.parameters; - while (tmpa != NULL) { - emit ("%s %s", tmpa->key.type, tmpa->key.name); - if (tmpa->key.value[0] != 0) { + while (tmpa != NULL) + { + emit("%s %s", tmpa->key.type, tmpa->key.name); + if (tmpa->key.value[0] != 0) + { if (is_valuetype) - fprintf (stderr, "CORBAValue %s/%s: param default " - "not supported\n", name, umlo->key.attr.name); + fprintf(stderr, "CORBAValue %s/%s: param default " + "not supported\n", + name, umlo->key.attr.name); else - emit (" = %s", tmpa->key.value); + emit(" = %s", tmpa->key.value); } tmpa = tmpa->next; - if (tmpa != NULL) { - emit (", "); + if (tmpa != NULL) + { + emit(", "); } } - emit (")"); - if (umlo->key.attr.isconstant) { - emit (" const"); + emit(")"); + if (umlo->key.attr.isconstant) + { + emit(" const"); } - if (umlo->key.attr.value[0]) { + if (umlo->key.attr.value[0]) + { // virtual if ((umlo->key.attr.isabstract || is_valuetype) && umlo->key.attr.name[0] != '~') - emit (" = %s", umlo->key.attr.value); + emit(" = %s", umlo->key.attr.value); } - emit (";\n"); + emit(";\n"); umlo = umlo->next; } } - print ("// Setters and Getters\n"); - if (node->associations != NULL) { + print("// Setters and Getters\n"); + if (node->associations != NULL) + { umlassoclist assoc = node->associations; - while (assoc != NULL) { + while (assoc != NULL) + { umlclassnode *ref; if (assoc->name[0] != '\0') { - add_setter_getter(node,assoc->key->name,assoc->name); + add_setter_getter(node, assoc->key->name, assoc->name); } assoc = assoc->next; } } - if (node->key->attributes != NULL) { + if (node->key->attributes != NULL) + { umlattrlist umla = node->key->attributes; - if (!is_valuetype) { - while (umla != NULL) { - if (umla->key.visibility != '2') { + if (!is_valuetype) + { + while (umla != NULL) + { + if (umla->key.visibility != '2') + { umla = umla->next; continue; } - if (umla->key.isstatic) { + if (umla->key.isstatic) + { umla = umla->next; continue; } - add_setter_getter(node,umla->key.type,umla->key.name); - + add_setter_getter(node, umla->key.type, umla->key.name); + umla = umla->next; } } } - - - if (node->key->attributes != NULL && is_valuetype) { + + if (node->key->attributes != NULL && is_valuetype) + { umlattrlist umla = node->key->attributes; - emit ("\n"); + emit("\n"); indentlevel--; - print ("private: // State member implementation\n"); + print("private: // State member implementation\n"); indentlevel++; - while (umla != NULL) { - umlclassnode *ref = find_by_name (gb->classlist, umla->key.type); - print (""); - if (ref != NULL) { - emit ("%s", fqname (ref, is_oo_class (ref->key))); + while (umla != NULL) + { + umlclassnode *ref = find_by_name(gb->classlist, umla->key.type); + print(""); + if (ref != NULL) + { + emit("%s", fqname(ref, is_oo_class(ref->key))); /* * FIXME: Find a better way to decide whether to use * a pointer. - */ - } else - emit ("%s", cppname (umla->key.type)); - emit (" _%s;\n", umla->key.name); + */ + } + else + emit("%s", cppname(umla->key.type)); + emit(" _%s;\n", umla->key.name); umla = umla->next; } } indentlevel--; - print ("};\n\n"); + print("};\n\n"); } static void -gen_decl (declaration *d) +gen_decl(declaration *d) { char *name; char *stype; @@ -548,31 +641,35 @@ gen_decl (declaration *d) if (d == NULL) return; - if (d->decl_kind == dk_module) { + if (d->decl_kind == dk_module) + { #ifdef NO_NAMESPACE_SINGLE_FILE - char* nsname = d->u.this_module->pkg->name; + char *nsname = d->u.this_module->pkg->name; d = d->u.this_module->contents; - while (d != NULL) { - if (d->decl_kind == dk_module) { + while (d != NULL) + { + if (d->decl_kind == dk_module) + { name = d->u.this_module->pkg->name; - fprintf (stderr, "%s::%s: Nested namespaces are not supported\n", nsname, name); + fprintf(stderr, "%s::%s: Nested namespaces are not supported\n", nsname, name); continue; } name = d->u.this_class->key->name; - print ("#include \"%s/%s.%s\"\n", nsname, name, file_ext); + print("#include \"%s/%s.%s\"\n", nsname, name, file_ext); d = d->next; } #else name = d->u.this_module->pkg->name; - print ("namespace %s {\n\n", name); + print("namespace %s {\n\n", name); indentlevel++; d = d->u.this_module->contents; - while (d != NULL) { - gen_decl (d); + while (d != NULL) + { + gen_decl(d); d = d->next; } indentlevel--; - print ("};\n\n", name); + print("};\n\n", name); #endif return; } @@ -582,85 +679,98 @@ gen_decl (declaration *d) name = node->key->name; umla = node->key->attributes; - if (strlen (stype) == 0) { - gen_class (node); + if (strlen(stype) == 0) + { + gen_class(node); return; } - if (eq (stype, "CORBANative")) { - print ("// CORBANative: %s \n\n", name); - - } else if (is_const_stereo (stype)) { - if (umla == NULL) { - fprintf (stderr, "Error: first attribute not set at %s\n", name); - exit (1); + if (eq(stype, "CORBANative")) + { + print("// CORBANative: %s \n\n", name); + } + else if (is_const_stereo(stype)) + { + if (umla == NULL) + { + fprintf(stderr, "Error: first attribute not set at %s\n", name); + exit(1); } - if (strlen (umla->key.name) > 0) - fprintf (stderr, "Warning: ignoring attribute name at %s\n", name); + if (strlen(umla->key.name) > 0) + fprintf(stderr, "Warning: ignoring attribute name at %s\n", name); - print ("const %s %s = %s;\n\n", cppname (umla->key.type), name, - umla->key.value); - - } else if (is_enum_stereo (stype)) { - print ("enum %s {\n", name); + print("const %s %s = %s;\n\n", cppname(umla->key.type), name, + umla->key.value); + } + else if (is_enum_stereo(stype)) + { + print("enum %s {\n", name); indentlevel++; - while (umla != NULL) { + while (umla != NULL) + { char *literal = umla->key.name; - check_umlattr (¨a->key, name); - if (strlen (umla->key.type) > 0) - fprintf (stderr, "%s/%s: ignoring type\n", name, literal); - print ("%s", literal); - if (strlen (umla->key.value) > 0) - print (" = %s", umla->key.value); + check_umlattr(¨a->key, name); + if (strlen(umla->key.type) > 0) + fprintf(stderr, "%s/%s: ignoring type\n", name, literal); + print("%s", literal); + if (strlen(umla->key.value) > 0) + print(" = %s", umla->key.value); if (umla->next) - emit (","); - emit ("\n"); + emit(","); + emit("\n"); umla = umla->next; } indentlevel--; - print ("};\n\n"); - - } else if (is_struct_stereo (stype)) { - print ("struct %s {\n", name); + print("};\n\n"); + } + else if (is_struct_stereo(stype)) + { + print("struct %s {\n", name); indentlevel++; - while (umla != NULL) { - check_umlattr (¨a->key, name); - print ("%s %s", cppname (umla->key.type), umla->key.name); - if (strlen (umla->key.value) > 0) - print (" = %s", umla->key.value); - emit (";\n"); + while (umla != NULL) + { + check_umlattr(¨a->key, name); + print("%s %s", cppname(umla->key.type), umla->key.name); + if (strlen(umla->key.value) > 0) + print(" = %s", umla->key.value); + emit(";\n"); umla = umla->next; } indentlevel--; - print ("};\n\n"); - - } else if (eq (stype, "CORBAException")) { - fprintf (stderr, "%s: CORBAException not yet implemented\n", name); - - } else if (eq (stype, "CORBAUnion")) { + print("};\n\n"); + } + else if (eq(stype, "CORBAException")) + { + fprintf(stderr, "%s: CORBAException not yet implemented\n", name); + } + else if (eq(stype, "CORBAUnion")) + { umlattrnode *sw = umla; - if (sw == NULL) { - fprintf (stderr, "Error: attributes not set at union %s\n", name); - exit (1); + if (sw == NULL) + { + fprintf(stderr, "Error: attributes not set at union %s\n", name); + exit(1); } - fprintf (stderr, "%s: CORBAUnion not yet fully implemented\n", name); - print ("class %s { // CORBAUnion\n", name); - print ("public:\n", name); + fprintf(stderr, "%s: CORBAUnion not yet fully implemented\n", name); + print("class %s { // CORBAUnion\n", name); + print("public:\n", name); indentlevel++; - print ("%s _d(); // body TBD\n\n", umla->key.type); + print("%s _d(); // body TBD\n\n", umla->key.type); umla = umla->next; - while (umla != NULL) { - check_umlattr (¨a->key, name); - print ("%s %s (); // body TBD\n", - cppname (umla->key.type), umla->key.name); - print ("void %s (%s _value); // body TBD\n\n", umla->key.name, - cppname (umla->key.type)); + while (umla != NULL) + { + check_umlattr(¨a->key, name); + print("%s %s (); // body TBD\n", + cppname(umla->key.type), umla->key.name); + print("void %s (%s _value); // body TBD\n\n", umla->key.name, + cppname(umla->key.type)); umla = umla->next; } indentlevel--; - print ("};\n\n"); - - } else if (is_typedef_stereo (stype)) { + print("};\n\n"); + } + else if (is_typedef_stereo(stype)) + { /* Conventions for CORBATypedef: The first (and only) attribute contains the following: Name: Empty - the name is taken from the class. @@ -669,50 +779,59 @@ gen_decl (declaration *d) These dimensions are given in square brackets, e.g. [3][10] */ - if (umla == NULL) { - fprintf (stderr, "Error: first attribute (impl type) not set " - "at typedef %s\n", name); - exit (1); + if (umla == NULL) + { + fprintf(stderr, "Error: first attribute (impl type) not set " + "at typedef %s\n", + name); + exit(1); } - if (strlen (umla->key.name) > 0) { - fprintf (stderr, "Warning: typedef %s: ignoring name field " - "in implementation type attribute\n", name); + if (strlen(umla->key.name) > 0) + { + fprintf(stderr, "Warning: typedef %s: ignoring name field " + "in implementation type attribute\n", + name); } - print ("typedef %s %s%s;\n\n", cppname (umla->key.type), name, - umla->key.value); - } else { - gen_class (node); + print("typedef %s %s%s;\n\n", cppname(umla->key.type), name, + umla->key.value); + } + else + { + gen_class(node); } } -struct stdlib_includes { - int string; - int stdint; - int stdlib; - int vector; - int memory; - int limits; - int map; - int unordered_map; - int set; - int list; - int unordered_set; - int stack; - int queue; - int deque; - int pair; - int tuple; - int function; - int array; - int thread; - int mutex; - int random; - int sfmlGraphics; - int jsoncpp; +struct stdlib_includes +{ + int string; + int stdint; + int stdlib; + int vector; + int memory; + int limits; + int map; + int unordered_map; + int set; + int list; + int unordered_set; + int stack; + int queue; + int deque; + int pair; + int tuple; + int function; + int array; + int thread; + int mutex; + int random; + int sfmlGraphics; + int jsoncpp; }; -void print_include_stdlib(struct stdlib_includes* si, char* name) { - if ( name[0]!= '\0' ) { +void print_include_stdlib(struct stdlib_includes *si, char *name) +{ + if (name[0] != '\0') + { INCLUDE_STD_HEADER(stdint, "int8_t", "cstdint") INCLUDE_STD_HEADER(stdint, "uint8_t", "cstdint") INCLUDE_STD_HEADER(stdint, "int16_t", "cstdint") @@ -769,75 +888,88 @@ void print_include_stdlib(struct stdlib_includes* si, char* name) { } } -void -gen_namespace(batch *b, declaration *nsd) { - char * nsname = nsd->u.this_module->pkg->name; - declaration* d = nsd->u.this_module->contents; - while (d != NULL) { // For each class in namespace +void gen_namespace(batch *b, declaration *nsd) +{ + char *nsname = nsd->u.this_module->pkg->name; + + declaration *d = nsd->u.this_module->contents; + while (d != NULL) + { // For each class in namespace char *name, *tmpname; char filename[BIG_BUFFER]; + umlclassnode *node; - if (d->decl_kind == dk_module) { + if (d->decl_kind == dk_module) + { name = d->u.this_module->pkg->name; fprintf(stderr, "%s::%s: Nested namespaces are not supported\n", nsname, name); continue; - } else { /* dk_class */ + } + else + { /* dk_class */ name = d->u.this_class->key->name; } - + ///////////////////////////////////// // Header file - + #ifdef ENABLE_FILE_UPDATE_ON_CHANGE sprintf(filename, "%s/%s.%s~", nsname, name, file_ext); #else sprintf(filename, "%s/%s.%s", nsname, name, file_ext); - printf("Create '%s'\n",filename); + printf("Create '%s'\n", filename); #endif #if VERBOSE_LEVEL >= 1 printf("\ngen_namespace(): generate file '%s'\n", filename); #endif spec = open_outfile(filename, b); - if (spec == NULL) { + if (spec == NULL) + { d = d->next; continue; } - + node = d->u.this_class; print("// Generated by dia2code\n"); - char * tmpnsname = strtoupper(nsname); + char *tmpnsname = strtoupper(nsname); tmpname = strtoupper(name); print("#ifndef %s__%s__H\n", tmpnsname, tmpname); print("#define %s__%s__H\n\n", tmpnsname, tmpname); // Find STL classes - if (d->decl_kind != dk_module) { + if (d->decl_kind != dk_module) + { struct stdlib_includes si; - memset(&si, 0, sizeof (struct stdlib_includes)); + memset(&si, 0, sizeof(struct stdlib_includes)); // Parents - if (d->u.this_class->parents != NULL) { + if (d->u.this_class->parents != NULL) + { umlclasslist parent = d->u.this_class->parents; - while (parent != NULL) { - print_include_stdlib(&si, fqname (parent, 0)); + print("// parent classes : %s\n", parent); + while (parent != NULL) + { + print_include_stdlib(&si, fqname(parent, 0)); parent = parent->next; } } - // Attributes umlattrlist umla = d->u.this_class->key->attributes; - while (umla != NULL) { + while (umla != NULL) + { print_include_stdlib(&si, umla->key.type); print_include_stdlib(&si, umla->key.value); umla = umla->next; } // Methods umloplist umlo = d->u.this_class->key->operations; - while (umlo != NULL) { + while (umlo != NULL) + { print_include_stdlib(&si, umlo->key.attr.type); umlattrlist tmpa = umlo->key.parameters; - while (tmpa != NULL) { + while (tmpa != NULL) + { print_include_stdlib(&si, tmpa->key.type); print_include_stdlib(&si, tmpa->key.value); tmpa = tmpa->next; @@ -845,40 +977,99 @@ gen_namespace(batch *b, declaration *nsd) { umlo = umlo->next; } - print("\n"); } - includes = NULL; determine_referenced_classes(d, b); - if (includes) { + if (includes) + { namelist incfile = includes; - char* curnsname = NULL; - while (incfile != NULL) { + char *curnsname = NULL; + while (incfile != NULL) + { + umltemplatelist templates = NULL; + umlassocnode *associations = d->u.this_class->associations; + umlclassnode *dependencies = d->u.this_class->dependencies; - if (!incfile->package) { - if (curnsname) { + while (associations != NULL) + { + umlclass *association = associations->key; + if(eq(association->name,incfile->name)){ + if(association->templates !=NULL){ + templates=association->templates; + } + + } + + associations = associations->next; + } + while (dependencies != NULL && templates != NULL) + { + umlclass *dependendy = dependencies->key; + if(strcmp(dependendy->name,incfile->name)==1){ + if(dependendy->templates !=NULL){ + templates=dependendy->templates; + } + } + dependencies = dependencies->next; + } + templates=templates; // if I don't do this, the variable is optimized out FIXME + if (!incfile->package) + { + templates=templates; // if I don't do this, the variable is optimized out FIXME + if (curnsname) + { curnsname = NULL; indentlevel--; print("};\n"); } + print("// Forward declaration\n"); + if(templates!=NULL){ + print("template <"); + while (templates != NULL) + { + print("%s %s", templates->key.type, templates->key.name); + templates = templates->next; + if (templates != NULL) + emit(", "); + } + emit(">\n"); + } print("class %s;\n", incfile->name); - } else { - if (curnsname == NULL || strcmp(curnsname, incfile->package)) { - if (curnsname) { + } + else + { + if (curnsname == NULL || strcmp(curnsname, incfile->package)) + { + if (curnsname) + { indentlevel--; print("};\n"); } curnsname = incfile->package; print("namespace %s {\n", incfile->package); + indentlevel++; } + print("// Forward declaration\n"); + if(templates!=NULL){ + print("template <"); + while (templates != NULL) + { + print("%s %s", templates->key.type, templates->key.name); + templates = templates->next; + if (templates != NULL) + emit(", "); + } + emit(">\n"); + } print("class %s;\n", incfile->name); } incfile = incfile->next; } - if (curnsname) { + if (curnsname) + { indentlevel--; print("}\n\n"); } @@ -888,28 +1079,41 @@ gen_namespace(batch *b, declaration *nsd) { determine_includes(d, b); if (use_corba) print("#include \n\n"); - if (includes) { + if (includes) + { namelist incfile = includes; - while (incfile != NULL) { - if (incfile->package) { - if (!strcmp(incfile->package, nsname)) { - if (strcmp(incfile->name, name)) { + while (incfile != NULL) + { + if (incfile->package) + { + if (!strcmp(incfile->package, nsname)) + { + if (strcmp(incfile->name, name)) + { print("#include \"%s.%s\"\n", incfile->name, file_ext); } - } else { - if (strcmp(incfile->package,"sf") != 0) { + } + else + { + if (strcmp(incfile->package, "sf") != 0) + { // Don't #include from sfml (handled by print_include_stdlib()) char nsnsname[80]; strcpy(nsnsname, incfile->package); subst(nsnsname, ':', '/'); - if (strncmp(nsnsname, "boost", 5) == 0) { + if (strncmp(nsnsname, "boost", 5) == 0) + { print("#include <%s/%s.%s>\n", nsnsname, incfile->name, "hpp"); - } else { - print("#include \"%s/%s.%s\"\n", nsname, incfile->name, file_ext); + } + else + { + print("#include \"%s/%s.%s\"\n", nsnsname, incfile->name, file_ext); } } } - } else { + } + else + { print("#include \"%s.%s\"\n", incfile->name, file_ext); } incfile = incfile->next; @@ -933,20 +1137,22 @@ gen_namespace(batch *b, declaration *nsd) { ///////////////////////////////////// // Source file - + sprintf(filename, "%s/%s.cpp", nsname, name); char newfilename[1024]; - sprintf (newfilename, "%s/%s", b->outdir, filename); + sprintf(newfilename, "%s/%s", b->outdir, filename); int exists = 0; - FILE* sourceFile = fopen(newfilename,"r"); - if (sourceFile) { + FILE *sourceFile = fopen(newfilename, "r"); + if (sourceFile) + { exists = 1; fclose(sourceFile); } - + ///////////////////////////////////// // Source file (generate new) - if (!exists) { + if (!exists) + { /*printf("Create '%s'\n",newfilename); spec = open_outfile(filename, b); if (spec == NULL) { @@ -957,16 +1163,15 @@ gen_namespace(batch *b, declaration *nsd) { } ///////////////////////////////////// // Source file (update existing) - else { - + else + { } - + d = d->next; } } -void -generate_code_cpp (batch *b) +void generate_code_cpp(batch *b) { declaration *d; umlclasslist tmplist = b->classlist; @@ -982,110 +1187,126 @@ generate_code_cpp (batch *b) */ /* open license file */ - if (b->license != NULL) { - licensefile = fopen (b->license, "r"); - if (!licensefile) { - fprintf (stderr, "Can't open the license file.\n"); - exit (1); + if (b->license != NULL) + { + licensefile = fopen(b->license, "r"); + if (!licensefile) + { + fprintf(stderr, "Can't open the license file.\n"); + exit(1); } } - while (tmplist != NULL) { - if (! (is_present (b->classes, tmplist->key->name) ^ b->mask)) { - push (tmplist, b); + while (tmplist != NULL) + { + if (!(is_present(b->classes, tmplist->key->name) ^ b->mask)) + { + push(tmplist, b); } tmplist = tmplist->next; } /* Generate a file for each outer declaration. */ d = decls; - while (d != NULL) { + while (d != NULL) + { char *name, *tmpname; char filename[BIG_BUFFER]; - if (d->decl_kind == dk_module) { + if (d->decl_kind == dk_module) + { name = d->u.this_module->pkg->name; - if (b->namespaces && !is_present(b->namespaces,name)) { + if (b->namespaces && !is_present(b->namespaces, name)) + { d = d->next; continue; } #ifdef NO_NAMESPACE_SINGLE_FILE #if VERBOSE_LEVEL >= 1 - printf("generate_code_cpp(): call gen_namespace for file '%s'\n",name); + printf("generate_code_cpp(): call gen_namespace for file '%s'\n", name); #endif - gen_namespace(b,d); + gen_namespace(b, d); #endif - } else { /* dk_class */ + } + else + { /* dk_class */ name = d->u.this_class->key->name; /* Do not generate headers for classes without a namespace (unsupported) */ - if (b->namespaces) { + if (b->namespaces) + { d = d->next; - continue; + continue; } #if VERBOSE_LEVEL >= 1 - printf("generate_code_cpp(): file '%s'",name); + printf("generate_code_cpp(): file '%s'", name); #endif } #ifdef ENABLE_FILE_UPDATE_ON_CHANGE - sprintf (filename, "%s.%s~", name, file_ext); + sprintf(filename, "%s.%s~", name, file_ext); #else - sprintf (filename, "%s.%s", name, file_ext); - printf("Create '%s'\n",filename); + sprintf(filename, "%s.%s", name, file_ext); + printf("Create '%s'\n", filename); #endif - - spec = open_outfile (filename, b); - if (spec == NULL) { + + spec = open_outfile(filename, b); + if (spec == NULL) + { d = d->next; continue; } print("// Generated by dia2code\n"); tmpname = strtoupper(name); - if (d->decl_kind == dk_module) { + if (d->decl_kind == dk_module) + { print("#ifndef __%s__H\n", tmpname); print("#define __%s__H\n\n", tmpname); } - else { + else + { print("#ifndef %s__H\n", tmpname); print("#define %s__H\n\n", tmpname); } /* add license to the header */ - if (b->license != NULL) { + if (b->license != NULL) + { char lc; - rewind (licensefile); - while ((lc = fgetc (licensefile)) != EOF) - print ("%c", lc); + rewind(licensefile); + while ((lc = fgetc(licensefile)) != EOF) + print("%c", lc); } #ifndef NO_NAMESPACE_SINGLE_FILE includes = NULL; - determine_includes (d, b); + determine_includes(d, b); if (use_corba) - print ("#include \n\n"); - if (includes) { + print("#include \n\n"); + if (includes) + { namelist incfile = includes; - while (incfile != NULL) { - if (!eq (incfile->name, name)) { - print ("#include \"%s.%s\"\n", incfile->name, file_ext); + while (incfile != NULL) + { + if (!eq(incfile->name, name)) + { + print("#include \"%s.%s\"\n", incfile->name, file_ext); } incfile = incfile->next; } - print ("\n"); + print("\n"); } #endif - gen_decl (d); + gen_decl(d); - indentlevel = 0; /* just for safety (should be 0 already) */ + indentlevel = 0; /* just for safety (should be 0 already) */ print("#endif\n"); - fclose (spec); + fclose(spec); #ifdef ENABLE_FILE_UPDATE_ON_CHANGE - update_file_if_changed(b,filename); + update_file_if_changed(b, filename); #endif - + d = d->next; } } - From 32592a0dd476e14499f9e185e3a30d345611d47d Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Wed, 29 Oct 2025 11:47:09 +0100 Subject: [PATCH 3/7] adding template class inheritance support + got rid of useless code comments --- extern/dia2code/src/generate_code_cpp.c | 59 ++++++++++++++++++------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index 8cc24ace7..e4a296ab2 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -947,7 +947,6 @@ void gen_namespace(batch *b, declaration *nsd) if (d->u.this_class->parents != NULL) { umlclasslist parent = d->u.this_class->parents; - print("// parent classes : %s\n", parent); while (parent != NULL) { print_include_stdlib(&si, fqname(parent, 0)); @@ -990,34 +989,60 @@ void gen_namespace(batch *b, declaration *nsd) { umltemplatelist templates = NULL; umlassocnode *associations = d->u.this_class->associations; - umlclassnode *dependencies = d->u.this_class->dependencies; - while (associations != NULL) { umlclass *association = associations->key; - if(eq(association->name,incfile->name)){ - if(association->templates !=NULL){ - templates=association->templates; + if (eq(association->name, incfile->name)) + { + if (association->templates != NULL) + { + templates = association->templates; } - } - + if (templates != NULL) + { + break; + } associations = associations->next; } - while (dependencies != NULL && templates != NULL) + umlclassnode *dependencies = d->u.this_class->dependencies; + while (d->u.this_class->dependencies != NULL) { umlclass *dependendy = dependencies->key; - if(strcmp(dependendy->name,incfile->name)==1){ - if(dependendy->templates !=NULL){ - templates=dependendy->templates; + if (eq(dependendy->name, incfile->name)) + { + if (dependendy->templates != NULL) + { + templates = dependendy->templates; } } + if (templates != NULL) + { + break; + } dependencies = dependencies->next; } - templates=templates; // if I don't do this, the variable is optimized out FIXME + umlclassnode *parents = d->u.this_class->parents; + while (parents != NULL) + { + umlclass *parent = parents->key; + if (eq(parent->name, incfile->name)) + { + if (parent->templates != NULL) + { + templates = parent->templates; + } + } + if (templates != NULL) + { + break; + } + parents = parents->next; + } + templates = templates; // if I don't do this, the variable is optimized out FIXME if (!incfile->package) { - templates=templates; // if I don't do this, the variable is optimized out FIXME + templates = templates; // if I don't do this, the variable is optimized out FIXME if (curnsname) { curnsname = NULL; @@ -1025,7 +1050,8 @@ void gen_namespace(batch *b, declaration *nsd) print("};\n"); } print("// Forward declaration\n"); - if(templates!=NULL){ + if (templates != NULL) + { print("template <"); while (templates != NULL) { @@ -1053,7 +1079,8 @@ void gen_namespace(batch *b, declaration *nsd) indentlevel++; } print("// Forward declaration\n"); - if(templates!=NULL){ + if (templates != NULL) + { print("template <"); while (templates != NULL) { From 0abb5bf9d3b60099ff18df2ecae1c08ea726ac0f Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Wed, 29 Oct 2025 12:20:39 +0100 Subject: [PATCH 4/7] fixing template class inheritance support --- extern/dia2code/src/generate_code_cpp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index e4a296ab2..abe000003 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -354,6 +354,21 @@ gen_class(umlclassnode *node) while (parent != NULL) { emit("public %s", fqname(parent, 0)); + umltemplatelist templates = parent->key->templates; + if(templates!= NULL) + { + emit("<"); + while (templates != NULL) + { + umltemplate template = templates->key; + emit("%s", template.name); + if(templates->next != NULL) + { + emit(","); + } + templates = templates->next; + } + } parent = parent->next; if (parent != NULL) emit(", "); From 3269ca1491f234630afa05c8d78a0bf258ccf345 Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Wed, 29 Oct 2025 13:20:23 +0100 Subject: [PATCH 5/7] fixing segfault in dia2code during client header generation --- extern/dia2code/src/generate_code_cpp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index abe000003..9e2227e74 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -1021,7 +1021,7 @@ void gen_namespace(batch *b, declaration *nsd) associations = associations->next; } umlclassnode *dependencies = d->u.this_class->dependencies; - while (d->u.this_class->dependencies != NULL) + while (dependencies != NULL) { umlclass *dependendy = dependencies->key; if (eq(dependendy->name, incfile->name)) From 9395a59d2006881bfdab9601288c544c617aaca7 Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Wed, 29 Oct 2025 21:49:47 +0100 Subject: [PATCH 6/7] fix template default value --- extern/dia2code/src/generate_code_cpp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index 9e2227e74..2fe613546 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -1070,7 +1070,7 @@ void gen_namespace(batch *b, declaration *nsd) print("template <"); while (templates != NULL) { - print("%s %s", templates->key.type, templates->key.name); + print("%s %s", templates->key.type, templates->key.name, strtok(templates->key.name,"=")); templates = templates->next; if (templates != NULL) emit(", "); @@ -1099,10 +1099,11 @@ void gen_namespace(batch *b, declaration *nsd) print("template <"); while (templates != NULL) { - print("%s %s", templates->key.type, templates->key.name); + print("%s %s", templates->key.type, strtok(templates->key.name,"=")); templates = templates->next; - if (templates != NULL) + if (templates != NULL){ emit(", "); + } } emit(">\n"); } From 5d490c1341e3ae4ed0d54863c90a2b537189cc14 Mon Sep 17 00:00:00 2001 From: MatthieuGomes Date: Wed, 29 Oct 2025 22:38:08 +0100 Subject: [PATCH 7/7] fix close "<>" for inherited template class --- extern/dia2code/src/generate_code_cpp.c | 1 + 1 file changed, 1 insertion(+) diff --git a/extern/dia2code/src/generate_code_cpp.c b/extern/dia2code/src/generate_code_cpp.c index 2fe613546..c2a5db0b8 100644 --- a/extern/dia2code/src/generate_code_cpp.c +++ b/extern/dia2code/src/generate_code_cpp.c @@ -368,6 +368,7 @@ gen_class(umlclassnode *node) } templates = templates->next; } + emit(">"); } parent = parent->next; if (parent != NULL)