From ef2e059c5900a0612bd35773f066f5fb2f75e605 Mon Sep 17 00:00:00 2001 From: Stefan Frederik Date: Sun, 21 Aug 2022 10:22:56 +0200 Subject: [PATCH] instance names (refdes) are hashed as uppercase, so collision check will be case insensitive, if enabled --- scconfig/src/default/lib_uniqinc.c | 2 +- scconfig/src/gui/Makefile.plugin | 3 + scconfig/src/gui/find_sdl2.c | 95 ++++++++++++++++++++++++++++++ scconfig/src/gui/find_sdl2.h | 2 + scconfig/src/gui/find_x.c | 37 ++++++++++++ scconfig/src/gui/find_x.h | 1 + scconfig/src/gui/gui.c | 3 + src/token.c | 38 +++++++++--- 8 files changed, 171 insertions(+), 10 deletions(-) diff --git a/scconfig/src/default/lib_uniqinc.c b/scconfig/src/default/lib_uniqinc.c index c66aaf1c..255c5032 100644 --- a/scconfig/src/default/lib_uniqinc.c +++ b/scconfig/src/default/lib_uniqinc.c @@ -207,7 +207,7 @@ char *uniq_inc_str(const char *includes, const char *isep, const char *osep, int /* assemble the output */ - if (0>=eren) + if (eren <= 0) uniq_inc_assemble_normal(ret, numelem, arr, osep, oseplen); else uniq_inc_assemble_groups(ret, numelem, arr, osep, oseplen, eren, eres); diff --git a/scconfig/src/gui/Makefile.plugin b/scconfig/src/gui/Makefile.plugin index f9c07e0a..9113dc38 100644 --- a/scconfig/src/gui/Makefile.plugin +++ b/scconfig/src/gui/Makefile.plugin @@ -37,6 +37,9 @@ $(BIN)/gui/find_misc.o: $(SRC)/gui/find_misc.c $(BIN)/gui/find_gl.o: $(SRC)/gui/find_gl.c $(CC) $(CFLAGS) -c $(SRC)/gui/find_gl.c -o $(BIN)/gui/find_gl.o +$(BIN)/gui/find_sdl2.o: $(SRC)/gui/find_sdl2.c + $(CC) $(CFLAGS) -c $(SRC)/gui/find_sdl2.c -o $(BIN)/gui/find_sdl2.o + $(BIN)/gui/find_cairo.o: $(SRC)/gui/find_cairo.c $(CC) $(CFLAGS) -c $(SRC)/gui/find_cairo.c -o $(BIN)/gui/find_cairo.o diff --git a/scconfig/src/gui/find_sdl2.c b/scconfig/src/gui/find_sdl2.c index 860c199f..cb2e6a65 100644 --- a/scconfig/src/gui/find_sdl2.c +++ b/scconfig/src/gui/find_sdl2.c @@ -84,3 +84,98 @@ int find_sdl2(const char *name, int logdepth, int fatal) return try_fail(logdepth, node); } + +int find_sdl2_gfx(const char *name, int logdepth, int fatal) +{ + const char *test_c = + NL "#include " + NL "#include " + NL "int main()" + NL "{" + NL " aalineColor(NULL, 1, 2, 3, 4, 100);" + NL " return 0;" + NL "}" + NL; + char *cflags, *ldflags; + const char *ocf, *olf; + const char *node = "libs/gui/sdl2_gfx"; + int succ; + + if (require("cc/cc", logdepth, fatal)) + return 1; + + report("Checking for sdl2_gfx... "); + logprintf(logdepth, "find_sdl2_gfx:\n"); + logdepth++; + + if (run_pkg_config(logdepth, "SDL2_gfx", &cflags, &ldflags) == 0) + if (try_icl_norun(logdepth, node, test_c, NULL, cflags, ldflags) != 0) + return 0; + + /* extend SDL2's cflags and ldflags */ + if (require("libs/gui/sdl2/cflags", logdepth, fatal)) + return try_fail(logdepth, node); + if (require("libs/gui/sdl2/ldflags", logdepth, fatal)) + return try_fail(logdepth, node); + + ocf = get("libs/gui/sdl2/cflags"); + olf = get("libs/gui/sdl2/ldflags"); + + cflags = (char *)ocf; + ldflags = str_concat(" ", "-lSDL2_gfx", olf, NULL); + succ = try_icl_norun(logdepth, node, test_c, NULL, cflags, ldflags); + free(ldflags); + + if (succ != 0) + return 0; + + return try_fail(logdepth, node); +} + +int find_sdl2_ttf(const char *name, int logdepth, int fatal) +{ + const char *test_c = + NL "#include " + NL "#include " + NL "int main()" + NL "{" + NL " if (TTF_Init() == 0)" + NL " puts(\"OK\");" + NL " return 0;" + NL "}" + NL; + char *cflags, *ldflags; + const char *ocf, *olf; + const char *node = "libs/gui/sdl2_ttf"; + int succ; + + if (require("cc/cc", logdepth, fatal)) + return 1; + + report("Checking for sdl2_ttf... "); + logprintf(logdepth, "find_sdl2_ttf:\n"); + logdepth++; + + if (run_pkg_config(logdepth, "SDL2_ttf", &cflags, &ldflags) == 0) + if (try_icl(logdepth, node, test_c, NULL, cflags, ldflags) != 0) + return 0; + + /* extend SDL2's cflags and ldflags */ + if (require("libs/gui/sdl2/cflags", logdepth, fatal)) + return try_fail(logdepth, node); + if (require("libs/gui/sdl2/ldflags", logdepth, fatal)) + return try_fail(logdepth, node); + + ocf = get("libs/gui/sdl2/cflags"); + olf = get("libs/gui/sdl2/ldflags"); + + cflags = (char *)ocf; + ldflags = str_concat(" ", "-lSDL2_ttf", olf, NULL); + succ = try_icl(logdepth, node, test_c, NULL, cflags, ldflags); + free(ldflags); + + if (succ != 0) + return 0; + + return try_fail(logdepth, node); +} diff --git a/scconfig/src/gui/find_sdl2.h b/scconfig/src/gui/find_sdl2.h index 08e90af1..fe597c1f 100644 --- a/scconfig/src/gui/find_sdl2.h +++ b/scconfig/src/gui/find_sdl2.h @@ -1,2 +1,4 @@ int find_sdl2(const char *name, int logdepth, int fatal); +int find_sdl2_gfx(const char *name, int logdepth, int fatal); +int find_sdl2_ttf(const char *name, int logdepth, int fatal); diff --git a/scconfig/src/gui/find_x.c b/scconfig/src/gui/find_x.c index ba50150c..759573dd 100644 --- a/scconfig/src/gui/find_x.c +++ b/scconfig/src/gui/find_x.c @@ -320,3 +320,40 @@ int find_xpm(const char *name, int logdepth, int fatal) } return try_fail(logdepth, node); } + +int find_keysymtoucs4(const char *name, int logdepth, int fatal) +{ + const char *test_c = + NL "#include " + NL "#include " + NL "extern unsigned int KeySymToUcs4(KeySym keysym);" + NL "int main()" + NL "{" + NL " if (KeySymToUcs4(32) == 32)" + NL " puts(\"OK\");" + NL " return 0;" + NL "}" + NL; + const char *node = "libs/gui/keysymtoucs4"; + const char *xincludes, *xcflags, *xldflags; + + if (require("cc/cc", logdepth, fatal)) + return 1; + + if (require("libs/gui/xopendisplay/*", logdepth, fatal)) + return 1; + + xincludes = get("libs/gui/xopendisplay/includes"); + xcflags = get("libs/gui/xopendisplay/cflags"); + xldflags = get("libs/gui/xopendisplay/ldflags"); + + report("Checking for KeySymToUcs4... "); + logprintf(logdepth, "find_KeySymToUcs4:\n"); + logdepth++; + + /* This should be standard X11 call, but not published so better test */ + if (try_icl_with_deps(logdepth, node, test_c, NULL, NULL, NULL, xincludes, xcflags, xldflags, 1) != 0) + return 0; + + return try_fail(logdepth, node); +} diff --git a/scconfig/src/gui/find_x.h b/scconfig/src/gui/find_x.h index e47c8946..653fe734 100644 --- a/scconfig/src/gui/find_x.h +++ b/scconfig/src/gui/find_x.h @@ -5,4 +5,5 @@ int find_xcb(const char *name, int logdepth, int fatal); int find_xcb_render(const char *name, int logdepth, int fatal); int find_xgetxcbconnection(const char *name, int logdepth, int fatal); int find_xpm(const char *name, int logdepth, int fatal); +int find_keysymtoucs4(const char *name, int logdepth, int fatal); diff --git a/scconfig/src/gui/gui.c b/scconfig/src/gui/gui.c index 300c371a..6f8669ac 100644 --- a/scconfig/src/gui/gui.c +++ b/scconfig/src/gui/gui.c @@ -23,6 +23,7 @@ void deps_gui_init() dep_add("libs/gui/xcb_render/*", find_xcb_render); dep_add("libs/gui/xgetxcbconnection/*", find_xgetxcbconnection); dep_add("libs/gui/xpm/*", find_xpm); + dep_add("libs/gui/keysymtoucs4/*", find_keysymtoucs4); dep_add("libs/gui/gtk2/*", find_gtk2); dep_add("libs/gui/gtk2gl/*", find_gtk2gl); dep_add("libs/gui/gtk2/key_prefix", find_gtk2_key_prefix); @@ -49,4 +50,6 @@ void deps_gui_init() dep_add("libs/gui/wgl/*", find_gui_wgl); dep_add("libs/gui/glfw/*", find_glfw); dep_add("libs/gui/sdl2/*", find_sdl2); + dep_add("libs/gui/sdl2_gfx/*", find_sdl2_gfx); + dep_add("libs/gui/sdl2_ttf/*", find_sdl2_ttf); } diff --git a/src/token.c b/src/token.c index 3388a51a..432dc195 100644 --- a/src/token.c +++ b/src/token.c @@ -65,8 +65,9 @@ static Inst_hashentry *inst_hash_lookup(char *token, int value, int what, size_t entry=(Inst_hashentry *) my_malloc(425, s); *preventry=entry; entry->next=NULL; + entry->token = NULL; + my_strdup(1248, &entry->token, token); entry->hash=hashcode; - entry->token = xctx->inst[value].instname; /* do not strdup, store pointer */ entry->value = value; } return NULL; /* token was not in hash */ @@ -74,6 +75,7 @@ static Inst_hashentry *inst_hash_lookup(char *token, int value, int what, size_t if( entry->hash==hashcode && !strcmp(token,entry->token) ) { /* found a matching token */ if(what == XDELETE) { /* remove token from the hash table ... */ saveptr=entry->next; + my_free(1249, &entry->token); my_free(969, &entry); *preventry=saveptr; return NULL; @@ -112,11 +114,15 @@ static void inst_hash_free(void) /* remove the whole hash table */ void hash_all_names(int n) { int i; + char*upinst = NULL; inst_hash_free(); for(i=0; iinstances; i++) { + my_strdup(1254, &upinst, xctx->inst[i].instname); + strtoupper(upinst); /* if(i == n) continue; */ - inst_hash_lookup(xctx->inst[i].instname, i, XINSERT, strlen(xctx->inst[i].instname)); + inst_hash_lookup(upinst, i, XINSERT, strlen(upinst)); } + my_free(1255, &upinst); } const char *tcl_hook2(char **res) @@ -155,6 +161,7 @@ void check_unique_names(int rename) char *tmp = NULL; Inst_hashentry *entry; int big = xctx->wires> 2000 || xctx->instances > 2000; + char *upinst = NULL; /* int save_draw; */ if(xctx->hilight_nets) { @@ -175,8 +182,10 @@ void check_unique_names(int rename) first = 1; for(i=0;iinstances;i++) { if(xctx->inst[i].instname && xctx->inst[i].instname[0]) { - if( (entry = inst_hash_lookup(xctx->inst[i].instname, i, XINSERT_NOREPLACE, - strlen(xctx->inst[i].instname)) ) && entry->value != i) { + my_strdup(1246, &upinst, xctx->inst[i].instname); + strtoupper(upinst); + if( (entry = inst_hash_lookup(upinst, i, XINSERT_NOREPLACE, + strlen(upinst)) ) && entry->value != i) { xctx->inst[i].color = -PINLAYER; xctx->hilight_nets=1; if(rename == 1) { @@ -194,13 +203,16 @@ void check_unique_names(int rename) if( (xctx->inst[i].color != -10000) && rename) { my_strdup(511, &tmp, xctx->inst[i].prop_ptr); new_prop_string(i, tmp, newpropcnt++, 0); - inst_hash_lookup(xctx->inst[i].instname, i, XINSERT, strlen(xctx->inst[i].instname)); + my_strdup(1259, &upinst, xctx->inst[i].instname); + strtoupper(upinst); + inst_hash_lookup(upinst, i, XINSERT, strlen(upinst)); symbol_bbox(i, &xctx->inst[i].x1, &xctx->inst[i].y1, &xctx->inst[i].x2, &xctx->inst[i].y2); bbox(ADD, xctx->inst[i].x1, xctx->inst[i].y1, xctx->inst[i].x2, xctx->inst[i].y2); my_free(972, &tmp); } } } /* for(i...) */ + my_free(1247, &upinst); if(rename == 1 && xctx->hilight_nets) { bbox(SET,0.0,0.0,0.0,0.0); draw(); @@ -635,6 +647,8 @@ void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) int n; char *old_name_base = NULL; Inst_hashentry *entry; + char *up_old_name = NULL; + char *up_new_name = NULL; dbg(1, "new_prop_string(): i=%d, old_prop=%s, fast=%d\n", i, old_prop, fast); if(!fast) { /* on 1st invocation of new_prop_string */ @@ -647,6 +661,8 @@ void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) return; } old_name_len = my_strdup(444, &old_name,get_tok_value(old_prop,"name",0) ); /* added old_name_len */ + my_strdup(1256, &up_old_name, old_name); + strtoupper(up_old_name); if(old_name==NULL) { @@ -656,12 +672,12 @@ void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) } xctx->prefix=old_name[0]; /* don't change old_prop if name does not conflict. */ - if(dis_uniq_names || (entry = inst_hash_lookup(old_name, i, XLOOKUP, old_name_len))==NULL || + if(dis_uniq_names || (entry = inst_hash_lookup(up_old_name, i, XLOOKUP, old_name_len))==NULL || entry->value == i) { my_strdup(447, &xctx->inst[i].prop_ptr, old_prop); my_strdup2(90, &xctx->inst[i].instname, old_name); - inst_hash_lookup(old_name, i, XINSERT, old_name_len); + inst_hash_lookup(up_old_name, i, XINSERT, old_name_len); my_free(985, &old_name); return; } @@ -677,7 +693,9 @@ void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) } else { /* goes here if weird name set for example to name=[3:0] or name=12 */ new_name_len = my_snprintf(new_name, old_name_len + 40, "%c%d%s", xctx->prefix,q, tmp); } - if((entry = inst_hash_lookup(new_name, i, XLOOKUP, new_name_len)) == NULL || entry->value == i) + my_strdup(1258, &up_new_name, new_name); + strtoupper(up_new_name); + if((entry = inst_hash_lookup(up_new_name, i, XLOOKUP, new_name_len)) == NULL || entry->value == i) { last[(int)xctx->prefix]=q+1; break; @@ -688,10 +706,12 @@ void new_prop_string(int i, const char *old_prop, int fast, int dis_uniq_names) if(strcmp(tmp2, old_prop) ) { my_strdup(449, &xctx->inst[i].prop_ptr, tmp2); my_strdup2(235, &xctx->inst[i].instname, new_name); - inst_hash_lookup(new_name, i, XINSERT, new_name_len); /* reinsert in hash */ + inst_hash_lookup(up_new_name, i, XINSERT, new_name_len); /* reinsert in hash */ } my_free(987, &old_name); + my_free(1257, &up_old_name); my_free(988, &new_name); + my_free(1260, &up_new_name); }