better handling of web_urls: if already cached do not download again

This commit is contained in:
stefan schippers 2023-05-18 11:03:32 +02:00
parent 1a9fddba99
commit e0bde2cb1c
5 changed files with 47 additions and 35 deletions

View File

@ -1574,15 +1574,16 @@ void get_sch_from_sym(char *filename, xSymbol *sym, int inst)
}
if(sch) my_free(_ALLOC_ID_, &sch);
/* 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 */
/* build local cached filename of web_url */
my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(filename, 0));
if(stat(sympath, &buf)) { /* not found, download */
/* download item into ${XSCHEM_TMP_DIR}/xschem_web */
tclvareval("try_download_url {", xctx->current_dirname, "} {", filename, "}", NULL);
}
/* load it */
my_strncpy(filename, sympath, PATH_MAX);
}
my_free(_ALLOC_ID_, &str_tmp);

View File

@ -579,6 +579,20 @@ static int bus_search(const char*s)
return bus;
}
#ifndef __unix__
static int win_regexec(const char *options, const char *pattern, char *name)
{
if (options!=NULL)
tclvareval("regexp {", options,"} {", pattern, "} {", name, "}", NULL);
else
tclvareval("regexp {", pattern, "} {", name, "}", NULL);
int ret = atoi(tclresult());
if (ret > 0)
return 1;
return 0;
}
#endif
/* sel: -1 --> unselect
* 1 --> select
* 0 --> highlight
@ -649,7 +663,8 @@ int search(const char *tok, const char *val, int sub, int sel)
if( (!sub && !regexec(&re, str,0 , NULL, 0) ) || /* 20071120 regex instead of strcmp */
(sub && !strcmp(str, val) && !bus) || (sub && strstr(str,val) && bus))
#else
if( !sub && (strstr(str,val) ) ||
if( (!sub && win_regexec(NULL, val, str)) ||
(sub && !strcmp(str, val) && !bus) || (sub && strstr(str,val) && bus))
#endif
{
@ -683,7 +698,9 @@ int search(const char *tok, const char *val, int sub, int sel)
if( (!regexec(&re, str,0 , NULL, 0) && !sub ) || /* 20071120 regex instead of strcmp */
( !strcmp(str, val) && sub ) )
#else
if (!strcmp(str, val) && sub)
if( (win_regexec(NULL, val, str) && !sub ) || /* 20071120 regex instead of strcmp */
( !strcmp(str, val) && sub ) )
#endif
{
if(!sel) {
@ -712,7 +729,8 @@ int search(const char *tok, const char *val, int sub, int sel)
if( (!regexec(&re, str,0 , NULL, 0) && !sub ) ||
( !strcmp(str, val) && sub ))
#else
if ((!strcmp(str, val) && sub))
if( (win_regexec(NULL, val, str) && !sub ) ||
( !strcmp(str, val) && sub ))
#endif
{
if(sel==1) {
@ -738,7 +756,8 @@ int search(const char *tok, const char *val, int sub, int sel)
if( (!regexec(&re, str,0 , NULL, 0) && !sub ) ||
( !strcmp(str, val) && sub ))
#else
if ((!strcmp(str, val) && sub))
if( (win_regexec(NULL, val, str) && !sub ) ||
( !strcmp(str, val) && sub ))
#endif
{
if(sel==1) {

View File

@ -3194,8 +3194,11 @@ int load_sym_def(const char *name, FILE *embed_fd)
/* not found: try web URL */
if( strstr(xctx->current_dirname, "http://") == xctx->current_dirname ||
strstr(xctx->current_dirname, "https://") == xctx->current_dirname) {
tclvareval("try_download_url {", xctx->current_dirname, "} {", name, "}", NULL);
my_snprintf(sympath, S(sympath), "%s/xschem_web/%s", tclgetvar("XSCHEM_TMP_DIR"), get_cell_w_ext(name, 0));
if((lcc[level].fd=fopen(sympath,fopen_read_mode))==NULL) {
/* not already cached in .../xschem_web/ so download */
tclvareval("try_download_url {", xctx->current_dirname, "} {", name, "}", NULL);
}
lcc[level].fd=fopen(sympath,fopen_read_mode);
}
}
@ -4101,24 +4104,22 @@ void descend_symbol(void)
load_schematic(1, name_embedded, 1, 1);
} else {
char *sympath = NULL;
my_strdup2(_ALLOC_ID_, &sympath, name);
my_strdup2(_ALLOC_ID_, &sympath, abs_sym_path(tcl_hook2(sympath), ""));
unselect_all(1);
remove_symbols(); /* must follow save (if) embedded */
dbg(1, "name=%s, sympath=%s\n", name, sympath);
if( stat(sympath, &buf) && /* file does not exists ... */
/* ... and we are in a schematic downloaded from web ... */
if( /* ... we are in a schematic downloaded from web ... */
(strstr(xctx->current_dirname, "http://") == xctx->current_dirname ||
strstr(xctx->current_dirname, "https://") == xctx->current_dirname)) {
/* symbols have already been downloaded while loading parent schematic: set local file path */
my_mstrcat(_ALLOC_ID_, &sympath, tclgetvar("XSCHEM_TMP_DIR"),
"/xschem_web/", get_cell_w_ext(name, 0), NULL);
load_schematic(1, sympath, 1, 1);
} else {
dbg(1, "descend_symbol(): sympath=%s\n", sympath);
load_schematic(1, sympath, 1, 1);
"/xschem_web/", get_cell_w_ext(tcl_hook2(name), 0), NULL);
}
if(stat(sympath, &buf)) { /* not found */
dbg(1, "descend_symbol: not found: %s\n", sympath);
my_strdup2(_ALLOC_ID_, &sympath, abs_sym_path(tcl_hook2(name), ""));
}
dbg(1, "descend_symbol(): name=%s, sympath=%s, dirname=%s\n", name, sympath, xctx->current_dirname);
load_schematic(1, sympath, 1, 1);
my_free(_ALLOC_ID_, &sympath);
}
zoom_full(1, 0, 1, 0.97);

View File

@ -3611,12 +3611,7 @@ proc property_search {} {
button .dialog.but.cancel -text Cancel -command { set search_found 1; destroy .dialog }
# Window doesn't support regular expression, has to be exact match for now
if {$OS == "Windows"} {
set search_exact 1
checkbutton .dialog.but.sub -text Exact_search -variable search_exact -state disable
} else {
checkbutton .dialog.but.sub -text Exact_search -variable search_exact
}
checkbutton .dialog.but.sub -text Exact_search -variable search_exact
radiobutton .dialog.but.nosel -text {Highlight} -variable search_select -value 0
radiobutton .dialog.but.sel -text {Select} -variable search_select -value 1
# 20171211 added unselect
@ -6440,12 +6435,8 @@ if {$OS == "Windows"} {
# Remove temporary location for web objects
if {[file exists ${XSCHEM_TMP_DIR}/xschem_web] } {
foreach file [glob -nocomplain ${XSCHEM_TMP_DIR}/xschem_web/* ${XSCHEM_TMP_DIR}/xschem_web/.*] {
# skip /${XSCHEM_TMP_DIR}/xschem_web/.. and /${XSCHEM_TMP_DIR}/xschem_web/.
if {[regexp {/\.\.$} $file] || [regexp {/\.$} $file] } {continue}
file delete $file
}
file delete ${XSCHEM_TMP_DIR}/xschem_web
# -force deletes also if not empty
file delete -force ${XSCHEM_TMP_DIR}/xschem_web
}
# used in C code

View File

@ -23,7 +23,7 @@ L 4 30 -0 40 -0 {}
B 5 37.5 -2.5 42.5 2.5 {name=y dir=out }
B 5 -42.5 -2.5 -37.5 2.5 {name=a dir=in }
A 4 25 -0 5 180 360 {}
T {$arg1 $rout } -47.5 24 0 0 0.3 0.3 {}
T {$arg1 $rout} -47.5 24 0 0 0.3 0.3 {}
T {@name} 25 -22 0 0 0.2 0.2 {}
T {y} 7.5 -6.5 0 1 0.2 0.2 {}
T {a} -17.5 -6.5 0 0 0.2 0.2 {}
@ -45,7 +45,7 @@ L 4 -20 -20 -20 20 {}
L 4 -20 20 20 0 {}
B 5 37.5 -2.5 42.5 2.5 {name=y dir=out }
B 5 -42.5 -2.5 -37.5 2.5 {name=a dir=in }
T {$arg1 $rout } -47.5 24 0 0 0.3 0.3 {}
T {$arg1 $rout} -47.5 24 0 0 0.3 0.3 {}
T {@name} 25 -22 0 0 0.2 0.2 {}
T {y} 7.5 -6.5 0 1 0.2 0.2 {}
T {a} -17.5 -6.5 0 0 0.2 0.2 {}