diff --git a/scconfig/src/default/deps_default.c b/scconfig/src/default/deps_default.c index 5ae22c65..ad9a2acb 100644 --- a/scconfig/src/default/deps_default.c +++ b/scconfig/src/default/deps_default.c @@ -96,6 +96,9 @@ void deps_default_init(void) dep_add("libs/fs/getwd/*", find_fs_getwd); dep_add("libs/fs/mkdir/*", find_fs_mkdir); dep_add("libs/fs/_mkdir/*", find_fs__mkdir); + dep_add("libs/fs/utime/*", find_fs_utime); + dep_add("libs/fs/_utime/*", find_fs__utime); + dep_add("libs/fs/_utime64/*", find_fs__utime64); dep_add("libs/fs/mkdtemp/*", find_fs_mkdtemp); dep_add("libs/fs/mmap/*", find_fs_mmap); dep_add("libs/fsmount/next_dev/*", find_fsmount_next_dev); diff --git a/scconfig/src/default/find.h b/scconfig/src/default/find.h index eeb69dfa..05013d59 100644 --- a/scconfig/src/default/find.h +++ b/scconfig/src/default/find.h @@ -56,6 +56,9 @@ int find_fs__getcwd(const char *name, int logdepth, int fatal); int find_fs_getwd(const char *name, int logdepth, int fatal); int find_fs_mkdir(const char *name, int logdepth, int fatal); int find_fs__mkdir(const char *name, int logdepth, int fatal); +int find_fs_utime(const char *name, int logdepth, int fatal); +int find_fs__utime(const char *name, int logdepth, int fatal); +int find_fs__utime64(const char *name, int logdepth, int fatal); int find_fs_mkdtemp(const char *name, int logdepth, int fatal); int find_fs_mmap(const char *name, int logdepth, int fatal); int find_fsmount_next_dev(const char *name, int logdepth, int fatal); diff --git a/scconfig/src/default/find_fscalls.c b/scconfig/src/default/find_fscalls.c index ad3824d9..4d68cd4a 100644 --- a/scconfig/src/default/find_fscalls.c +++ b/scconfig/src/default/find_fscalls.c @@ -576,6 +576,83 @@ int find_fs__mkdir(const char *name, int logdepth, int fatal) return try_fail(logdepth, "libs/fs/_mkdir"); } +static int find_utime_impl(const char *name, int logdepth, int fatal, + const char* key, const char* funcname, const char* typename) +{ + char test_c[1024+4096]; + const char *test_c_templ = + NL "void puts_OK();" + NL "int main(int argc, char* argv[])" + NL "{" + NL " struct %s buf;" + NL " buf.actime = buf.modtime = 1610958044;" + NL " if (%s(\"%s\", &buf) == 0)" + NL " puts_OK();" + NL " return 0;" + NL "}" + NL "#include " + NL "void puts_OK()" + NL "{" + NL " puts(\"OK\");" + NL "}" + NL; + + const char* includes[] = + { + /* *NIX */ + "#include \n#include ", + + /* windoz */ + "#include ", + + NULL + }; + const char** inc; + char* tmpf; + + tmpf = tempfile_new(".txt"); + sprintf(test_c, test_c_templ, typename, funcname, tmpf); + + require("cc/cc", logdepth, fatal); + + report("Checking for %s... ", funcname); + logprintf(logdepth, "find_fs_%s: trying to find %s()...\n", funcname, funcname); + logdepth++; + + for (inc=includes; *inc; ++inc) + { + if (try_icl(logdepth, key, test_c, *inc, NULL, NULL)) + { + unlink(tmpf); + free(tmpf); + return 0; + } + } + + unlink(tmpf); + free(tmpf); + + return try_fail(logdepth, key); +} + +int find_fs_utime(const char *name, int logdepth, int fatal) +{ + return find_utime_impl(name, logdepth, fatal, + "libs/fs/utime", "utime", "utimbuf"); +} + +int find_fs__utime(const char *name, int logdepth, int fatal) +{ + return find_utime_impl(name, logdepth, fatal, + "libs/fs/_utime", "_utime", "_utimbuf"); +} + +int find_fs__utime64(const char *name, int logdepth, int fatal) +{ + return find_utime_impl(name, logdepth, fatal, + "libs/fs/_utime64", "_utime64", "__utimbuf64"); +} + int find_fs_mkdtemp(const char *name, int logdepth, int fatal) { char *test_c = diff --git a/src/callback.c b/src/callback.c index 2633c9bf..4ea2acbf 100644 --- a/src/callback.c +++ b/src/callback.c @@ -1049,7 +1049,7 @@ int callback(int event, int mx, int my, KeySym key, { int mult; remove_symbol(2); - link_symbols_to_instances(0); + link_symbols_to_instances(-1); expandlabel("/RST", &mult); expandlabel("/CCC[3:0]", &mult); expandlabel("CCC[AA:BB:DD]", &mult); diff --git a/src/editprop.c b/src/editprop.c index 2c0a4639..9c940796 100644 --- a/src/editprop.c +++ b/src/editprop.c @@ -947,7 +947,7 @@ void update_symbol(const char *result, int x) may be out of sync wrt disk version */ if(copy_cell) { remove_symbols(); - link_symbols_to_instances(0); + link_symbols_to_instances(-1); } /* symbol reference changed? --> sym_number >=0, set prefix to 1st char to use for inst name (from symbol template) */ diff --git a/src/in_memory_undo.c b/src/in_memory_undo.c index 0cd5630f..3bb2ed4a 100644 --- a/src/in_memory_undo.c +++ b/src/in_memory_undo.c @@ -426,7 +426,7 @@ void pop_undo(int redo) my_strdup(222, &xctx->wire[i].prop_ptr, uslot[slot].wptr[i].prop_ptr); } - link_symbols_to_instances(0); + link_symbols_to_instances(-1); set_modify(1); xctx->prep_hash_inst=0; xctx->prep_hash_wires=0; diff --git a/src/save.c b/src/save.c index 6ea0b07b..a888f66f 100644 --- a/src/save.c +++ b/src/save.c @@ -954,12 +954,16 @@ int save_schematic(const char *schname) /* 20171020 added return value */ return 0; } -void link_symbols_to_instances(int from) /* from > 0 : linking symbols from pasted schematic / clipboard */ +/* from == -1 --> link symbols to all instances, from 0 to instances-1 */ +void link_symbols_to_instances(int from) /* from >= 0 : linking symbols from pasted schematic / clipboard */ { - int i; + int cond, i, merge = 1; char *type=NULL; - int cond; + if(from < 0 ) { + from = 0; + merge = 0; + } for(i = from; i < xctx->instances; i++) { dbg(2, "link_symbols_to_instances(): inst=%d\n", i); dbg(2, "link_symbols_to_instances(): matching inst %d name=%s \n",i, xctx->inst[i].name); @@ -967,7 +971,7 @@ void link_symbols_to_instances(int from) /* from > 0 : linking symbols from past xctx->inst[i].ptr = match_symbol(xctx->inst[i].name); } for(i = from; i < xctx->instances; i++) { - if(from) select_element(i,SELECTED,1, 0); /* leave elements selected if a paste/copy from windows is done */ + if(merge) select_element(i,SELECTED,1, 0); /* leave elements selected if a paste/copy from windows is done */ type=xctx->sym[xctx->inst[i].ptr].type; cond= !type || !IS_LABEL_SH_OR_PIN(type); if(cond) xctx->inst[i].flags|=2; /* ordinary symbol */ @@ -1022,7 +1026,7 @@ void load_schematic(int load_symbols, const char *filename, int reset_undo) /* 2 fclose(fd); /* 20150326 moved before load symbols */ set_modify(0); dbg(2, "load_schematic(): loaded file:wire=%d inst=%d\n",xctx->wires , xctx->instances); - if(load_symbols) link_symbols_to_instances(0); + if(load_symbols) link_symbols_to_instances(-1); if(reset_undo) { Tcl_VarEval(interp, "is_xschem_file ", xctx->sch[xctx->currsch], NULL); if(!strcmp(tclresult(), "SYMBOL")) { @@ -1238,7 +1242,7 @@ void pop_undo(int redo) fclose(fd); #endif dbg(2, "pop_undo(): loaded file:wire=%d inst=%d\n",xctx->wires , xctx->instances); - link_symbols_to_instances(0); + link_symbols_to_instances(-1); set_modify(1); xctx->prep_hash_inst=0; xctx->prep_hash_wires=0;