From 6d192023de54ef6f2eed80ae7f5dcac2744b1523 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Mon, 13 Mar 2023 11:11:43 +0100 Subject: [PATCH] fix web hierarchy navigation error when returning to web schematic after descending into a local symbol --- src/actions.c | 24 ++++++++++++++---------- src/save.c | 11 ++++++----- src/spice_netlist.c | 10 ---------- src/tedax_netlist.c | 10 ---------- src/verilog_netlist.c | 10 ---------- src/vhdl_netlist.c | 10 ---------- src/xschem.tcl | 1 + 7 files changed, 21 insertions(+), 55 deletions(-) diff --git a/src/actions.c b/src/actions.c index db14f768..722a554a 100644 --- a/src/actions.c +++ b/src/actions.c @@ -1224,6 +1224,19 @@ void get_sch_from_sym(char *filename, xSymbol *sym) else my_strncpy(filename, add_ext(abs_sym_path(sym->name, ""), ".sch"), PATH_MAX); } } + + + /* if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || + * strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { + */ + if(web_url) { + char sympath[PATH_MAX]; + /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ + tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); + /* build local file name of downloaded object and load it */ + my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); + my_strncpy(filename, sympath, PATH_MAX); + } my_free(_ALLOC_ID_, &str_tmp); dbg(1, "get_sch_from_sym(): sym->name=%s, filename=%s\n", sym->name, filename); } @@ -1343,18 +1356,9 @@ int descend_schematic(int instnumber) unselect_all(1); get_sch_from_sym(filename, xctx->inst[n].ptr+ xctx->sym); - remove_symbols(); dbg(1, "descend_schematic(): filename=%s\n", filename); /* we are descending from a parent schematic downloaded from the web */ - if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || - strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { - char sympath[PATH_MAX]; - /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ - tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); - /* build local file name of downloaded object and load it */ - my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); - my_strncpy(filename, sympath, S(filename)); - } + remove_symbols(); load_schematic(1, filename, 1); if(xctx->hilight_nets) { diff --git a/src/save.c b/src/save.c index c414caa6..78142289 100644 --- a/src/save.c +++ b/src/save.c @@ -2430,7 +2430,7 @@ void load_schematic(int load_symbols, const char *fname, int reset_undo) /* 2015 /* build local file name of downloaded object */ my_snprintf(name, S(name), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(fname, 0)); /* build current_dirname by stripping off last filename from url */ - my_snprintf(msg, S(msg), "regsub {/\\.$} [get_directory {%s}] {}", fname); + my_snprintf(msg, S(msg), "get_directory {%s}", fname); my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname)); /* local file name */ my_strncpy(xctx->sch[xctx->currsch], name, S(xctx->sch[xctx->currsch])); @@ -2443,8 +2443,9 @@ void load_schematic(int load_symbols, const char *fname, int reset_undo) /* 2015 /* ... but not local file from web download --> reset current_dirname */ char sympath[PATH_MAX]; my_snprintf(sympath, S(sympath), "%s/xschem_web", tclgetvar("XSCHEM_TMP_DIR")); - if(strstr(fname, sympath) != fname) { - my_snprintf(msg, S(msg), "regsub {/\\.$} [get_directory {%s}] {}", fname); + /* fname does not begin with $XSCHEM_TMP_DIR/xschem_web and fname does not exist */ + if(strstr(fname, sympath) != fname && stat(fname, &buf)) { + my_snprintf(msg, S(msg), "get_directory {%s}", fname); my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname)); } /* local file name */ @@ -2454,7 +2455,7 @@ void load_schematic(int load_symbols, const char *fname, int reset_undo) /* 2015 /* local file specified and not coming from web url */ } else { /* if name is /some/path/. remove /. at end */ - my_snprintf(msg, S(msg), "regsub {/\\.$} [get_directory {%s}] {}", fname); + my_snprintf(msg, S(msg), "get_directory {%s}", fname); my_strncpy(xctx->current_dirname, tcleval(msg), S(xctx->current_dirname)); /* local file name */ my_strncpy(xctx->sch[xctx->currsch], fname, S(xctx->sch[xctx->currsch])); @@ -2503,7 +2504,7 @@ void load_schematic(int load_symbols, const char *fname, int reset_undo) /* 2015 } } dbg(1, "load_schematic(): %s, returning\n", xctx->sch[xctx->currsch]); - } else { + } else { /* fname == NULL or empty */ /* if(reset_undo) xctx->time_last_modify = time(NULL); */ /* no file given, set mtime to current time */ if(reset_undo) xctx->time_last_modify = 0; /* no file given, set mtime to 0 (undefined) */ clear_drawing(); diff --git a/src/spice_netlist.c b/src/spice_netlist.c index b65083fc..04b8318d 100644 --- a/src/spice_netlist.c +++ b/src/spice_netlist.c @@ -529,16 +529,6 @@ void spice_block_netlist(FILE *fd, int i) spice_stop=0; get_sch_from_sym(filename, xctx->sym + i); - if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || - strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { - char sympath[PATH_MAX]; - /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ - tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); - /* build local file name of downloaded object and load it */ - my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); - my_strncpy(filename, sympath, S(filename)); - } - if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", tclgetvar("netlist_dir"), skip_dir(xctx->sym[i].name), getpid()); diff --git a/src/tedax_netlist.c b/src/tedax_netlist.c index 2cbc3ea4..961dc902 100644 --- a/src/tedax_netlist.c +++ b/src/tedax_netlist.c @@ -85,16 +85,6 @@ static void tedax_block_netlist(FILE *fd, int i) tedax_stop=0; get_sch_from_sym(filename, xctx->sym + i); - if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || - strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { - char sympath[PATH_MAX]; - /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ - tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); - /* build local file name of downloaded object and load it */ - my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); - my_strncpy(filename, sympath, S(filename)); - } - fprintf(fd, "\n# expanding symbol: %s # of pins=%d\n", xctx->sym[i].name,xctx->sym[i].rects[PINLAYER] ); fprintf(fd, "## sym_path: %s\n", abs_sym_path(xctx->sym[i].name, "")); diff --git a/src/verilog_netlist.c b/src/verilog_netlist.c index 46edf9ba..17613831 100644 --- a/src/verilog_netlist.c +++ b/src/verilog_netlist.c @@ -437,16 +437,6 @@ void verilog_block_netlist(FILE *fd, int i) verilog_stop=0; get_sch_from_sym(filename, xctx->sym + i); - if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || - strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { - char sympath[PATH_MAX]; - /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ - tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); - /* build local file name of downloaded object and load it */ - my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); - my_strncpy(filename, sympath, S(filename)); - } - if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", tclgetvar("netlist_dir"), skip_dir(xctx->sym[i].name), getpid()); diff --git a/src/vhdl_netlist.c b/src/vhdl_netlist.c index dce93603..91e03356 100644 --- a/src/vhdl_netlist.c +++ b/src/vhdl_netlist.c @@ -529,16 +529,6 @@ void vhdl_block_netlist(FILE *fd, int i) vhdl_stop=0; get_sch_from_sym(filename, xctx->sym + i); - if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname || - strstr(xctx->current_dirname, "https://") == xctx->current_dirname) { - char sympath[PATH_MAX]; - /* download item into ${XSCHEM_TMP_DIR}/xschem_web */ - tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL); - /* build local file name of downloaded object and load it */ - my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0)); - my_strncpy(filename, sympath, S(filename)); - } - if(split_f) { my_snprintf(netl_filename, S(netl_filename), "%s/.%s_%d", tclgetvar("netlist_dir"), skip_dir(xctx->sym[i].name), getpid()); diff --git a/src/xschem.tcl b/src/xschem.tcl index 2477115f..4baeafff 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -4506,6 +4506,7 @@ proc get_directory {f} { } else { set r [regsub {/[^/]*$} $f {}] } + regsub {/\.$} $r {} r return $r }