main.c do not spawn a child closing std file descriptors if -b option is given, just start xschem without interactive tcl shell, handle error condition in setup_tcp_gaw

This commit is contained in:
Stefan Frederik 2021-12-05 15:31:26 +01:00
parent e449543805
commit de1db1e87a
7 changed files with 28 additions and 11 deletions

View File

@ -178,7 +178,7 @@ char initial_netlist_name[PATH_MAX]={0};
char bus_char[3] = {0, 0, 0}; char bus_char[3] = {0, 0, 0};
int yyparse_error = 0; int yyparse_error = 0;
char *xschem_executable=NULL; char *xschem_executable=NULL;
Tcl_Interp *interp; Tcl_Interp *interp = NULL;
double *character[256]; /* array or per-char coordinates of xschem internal vector font */ double *character[256]; /* array or per-char coordinates of xschem internal vector font */
int do_netlist=0; /* set by process_options if user wants netllist from cmdline */ int do_netlist=0; /* set by process_options if user wants netllist from cmdline */
int do_simulation=0; int do_simulation=0;

View File

@ -271,7 +271,8 @@ void create_plot_cmd(void)
} }
fprintf(fd, "*ngspice plot file\n.control\n"); fprintf(fd, "*ngspice plot file\n.control\n");
} }
if(viewer == GAW) tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n"); if(viewer == GAW) tcleval("setup_tcp_gaw");
if(tclresult()[0] == '0') return;
idx = 1; idx = 1;
first = 1; first = 1;
for(i=0;i<HASHSIZE;i++) /* set ngspice colors */ for(i=0;i<HASHSIZE;i++) /* set ngspice colors */
@ -915,7 +916,8 @@ static void send_net_to_gaw(int simtype, const char *node)
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
xctx->xcolor_array[c].blue>>8); xctx->xcolor_array[c].blue>>8);
expanded_tok = expandlabel(tok, &tok_mult); expanded_tok = expandlabel(tok, &tok_mult);
tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n"); tcleval("setup_tcp_gaw");
if(tclresult()[0] == '0') return;
for(k=1; k<=tok_mult; k++) { for(k=1; k<=tok_mult; k++) {
my_strdup(246, &t, find_nth(expanded_tok, ',', k)); my_strdup(246, &t, find_nth(expanded_tok, ',', k));
my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1); my_strdup2(254, &p, xctx->sch_path[xctx->currsch]+1);
@ -1018,7 +1020,8 @@ static void send_current_to_gaw(int simtype, const char *node)
sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8, sprintf(color_str, "%02x%02x%02x", xctx->xcolor_array[c].red>>8, xctx->xcolor_array[c].green>>8,
xctx->xcolor_array[c].blue>>8); xctx->xcolor_array[c].blue>>8);
expanded_tok = expandlabel(tok, &tok_mult); expanded_tok = expandlabel(tok, &tok_mult);
tcleval("if { ![info exists gaw_fd] } { setup_tcp_gaw }\n"); tcleval("setup_tcp_gaw");
if(tclresult()[0] == '0') return;
for(k=1; k<=tok_mult; k++) { for(k=1; k<=tok_mult; k++) {
my_strdup(1179, &t, find_nth(expanded_tok, ',', k)); my_strdup(1179, &t, find_nth(expanded_tok, ',', k));
my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1); my_strdup2(1180, &p, xctx->sch_path[xctx->currsch]+1);

View File

@ -85,8 +85,9 @@ int main(int argc, char **argv)
if(debug_var>=1 && !has_x) if(debug_var>=1 && !has_x)
fprintf(errfp, "main(): no DISPLAY set, assuming no X available\n"); fprintf(errfp, "main(): no DISPLAY set, assuming no X available\n");
/* detach from console (fork a child and close std file descriptors) */
#if 0
/* detach from console (fork a child and close std file descriptors) */
if(detach) { if(detach) {
#ifdef __unix__ #ifdef __unix__
pid_t pid = fork(); pid_t pid = fork();
@ -109,9 +110,20 @@ int main(int argc, char **argv)
} }
#endif #endif
} }
#endif
if(has_x) Tk_Main(1, argv, Tcl_AppInit); /* if detach is 1 no interactive command shell is created ...
else Tcl_Main(1, argv, Tcl_AppInit); * using detach if no windowing exists (has_x == 0) is non sense so do nothing
*/
if(detach && has_x) {
Tcl_FindExecutable(argv[0]); /* tcl stores executable name for its internal usage */
interp = Tcl_CreateInterp(); /* create the tcl interpreter */
Tcl_AppInit(interp); /* execute our init function */
Tk_MainLoop(); /* ok, now all done go into the event loop */
} else { /* ... else start tcl or tk main loop and enter interactive mode (tcl shell) */
if(has_x) Tk_Main(1, argv, Tcl_AppInit);
else Tcl_Main(1, argv, Tcl_AppInit);
}
return 0; return 0;
} }

View File

@ -886,7 +886,7 @@ int ps_draw(int what)
if(what & 1) { /* prolog */ if(what & 1) { /* prolog */
if(!lastdir[0]) my_strncpy(lastdir, pwd_dir, S(lastdir)); if(!lastdir[0]) my_strncpy(lastdir, pwd_dir, S(lastdir));
if(!xctx->plotfile[0]) { if(has_x && !xctx->plotfile[0]) {
tclvareval("tk_getSaveFile -title {Select destination file} -initialfile {", tclvareval("tk_getSaveFile -title {Select destination file} -initialfile {",
get_cell(xctx->sch[xctx->currsch], 0) , ".pdf} -initialdir {", lastdir, "}", NULL); get_cell(xctx->sch[xctx->currsch], 0) , ".pdf} -initialdir {", lastdir, "}", NULL);
r = tclresult(); r = tclresult();

View File

@ -563,7 +563,7 @@ void svg_draw(void)
struct hilight_hashentry *entry; struct hilight_hashentry *entry;
if(!lastdir[0]) my_strncpy(lastdir, pwd_dir, S(lastdir)); if(!lastdir[0]) my_strncpy(lastdir, pwd_dir, S(lastdir));
if(!xctx->plotfile[0]) { if(has_x && !xctx->plotfile[0]) {
tclvareval("tk_getSaveFile -title {Select destination file} -initialfile {", tclvareval("tk_getSaveFile -title {Select destination file} -initialfile {",
get_cell(xctx->sch[xctx->currsch], 0) , ".svg} -initialdir {", lastdir, "}", NULL); get_cell(xctx->sch[xctx->currsch], 0) , ".svg} -initialdir {", lastdir, "}", NULL);
r = tclresult(); r = tclresult();

View File

@ -1288,7 +1288,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
/* set error and exit handlers */ /* set error and exit handlers */
XSetErrorHandler(err); XSetErrorHandler(err);
interp=inter; if(!interp) interp=inter;
Tcl_Init(interp); Tcl_Init(interp);
if(has_x) { if(has_x) {
Tk_Init(interp); Tk_Init(interp);

View File

@ -987,6 +987,7 @@ proc gaw_echoline {} {
proc setup_tcp_gaw {} { proc setup_tcp_gaw {} {
global gaw_fd gaw_tcp_address netlist_dir has_x global gaw_fd gaw_tcp_address netlist_dir has_x
if { [info exists gaw_fd] } { return 1; }
simuldir simuldir
set s [file tail [file rootname [xschem get schname 0]]] set s [file tail [file rootname [xschem get schname 0]]]
@ -1000,11 +1001,12 @@ proc setup_tcp_gaw {} {
"If you recently closed gaw the port may be in a TIME_WAIT state for a minute or so ." \ "If you recently closed gaw the port may be in a TIME_WAIT state for a minute or so ." \
"Close gaw, Wait a minute or two, then send waves to gaw again."] "Close gaw, Wait a minute or two, then send waves to gaw again."]
} }
return return 0
} }
chan configure $gaw_fd -blocking 1 -buffering line -encoding binary -translation binary chan configure $gaw_fd -blocking 1 -buffering line -encoding binary -translation binary
fileevent $gaw_fd readable gaw_echoline fileevent $gaw_fd readable gaw_echoline
puts $gaw_fd "table_set $s.raw" puts $gaw_fd "table_set $s.raw"
return 1
} }
proc gaw_cmd {cmd} { proc gaw_cmd {cmd} {