diff --git a/src/main.c b/src/main.c index 5e9ce382b..0b045e7fd 100644 --- a/src/main.c +++ b/src/main.c @@ -10,6 +10,9 @@ #include "ngspice.h" +#include +#include + #ifdef HAVE_LIBIBERTY_H /* asprintf */ #include #undef AND /* obsolete macro in ansidecl.h */ @@ -21,13 +24,6 @@ extern long int random (void); extern void srandom (unsigned int seed); #endif -#include -#include -#include - -#ifdef HAVE_PWD_H -#include -#endif #ifdef HAVE_GNUREADLINE /* Added GNU Readline Support 11/3/97 -- Andrew Veliath */ /* from spice3f4 patch to ng-spice. jmr */ @@ -42,12 +38,6 @@ extern VFunction *rl_event_hook; /* missing from editline/readline.h */ extern int rl_catch_signals; /* missing from editline/readline.h */ #endif /* HAVE_BSDEDITLINE */ -#ifndef HAVE_GETRUSAGE -#ifdef HAVE_FTIME -#include -#endif -#endif - #include "iferrmsg.h" #include "ftedefs.h" #include "devdefs.h" @@ -61,7 +51,7 @@ extern int rl_catch_signals; /* missing from editline/readline.h */ #endif #include "frontend/resource.h" #include "frontend/variable.h" -#include "frontend/display.h" /* added by SDB to pick up Input() fcn */ +#include "frontend/display.h" /* added by SDB to pick up Input() fcn */ #include "frontend/signal_handler.h" /* saj xspice headers */ @@ -74,7 +64,7 @@ extern int rl_catch_signals; /* missing from editline/readline.h */ #ifdef CIDER #include "numenum.h" #include "maths/misc/accuracy.h" -#endif +#endif #if defined(HAVE_GNUREADLINE) || defined(HAVE_BSDEDITLINE) @@ -82,7 +72,7 @@ char history_file[512] = {'\0'}; static char *application_name; #endif /* HAVE_GNUREADLINE || HAVE_BSDEDITLINE */ -/* Undefine this next line for dubug tracing */ +/* Undefine this next line for debug tracing */ /* #define TRACE */ /* Main options */ @@ -98,7 +88,7 @@ char *ft_rawfile = "rawspice.raw"; extern void winmessage(char* new_msg); /* display a message box (defined in winmain.c)*/ extern void SetSource( char * Name); /* display the source file name in the source window */ bool oflag = FALSE; /* Output over redefined I/O functions */ -FILE *flogp = NULL; /* log file ('-o logfile' command line option) */ +FILE *flogp = NULL; /* log file ('-o logfile' command line option) */ #endif /* HAS_WINDOWS */ /* Frontend and circuit options */ @@ -115,7 +105,7 @@ char *cp_program; /* program name 'ngspice' */ /* Globals definitions for Machine Accuracy Limits * (needed by CIDER) - */ + */ double BMin; /* lower limit for B(x) */ double BMax; /* upper limit for B(x) */ double ExpLim; /* limit for exponential */ @@ -125,19 +115,19 @@ double Acc, MuLim, MutLim; #ifdef CIDER /* Global debug flags from CIDER, soon they will become * spice variables :) - */ + */ BOOLEAN ONEacDebug = FALSE; BOOLEAN ONEdcDebug = TRUE; BOOLEAN ONEtranDebug = TRUE; BOOLEAN ONEjacDebug = FALSE; - + BOOLEAN TWOacDebug = FALSE; BOOLEAN TWOdcDebug = TRUE; BOOLEAN TWOtranDebug = TRUE; -BOOLEAN TWOjacDebug = FALSE; - +BOOLEAN TWOjacDebug = FALSE; + /* CIDER Global Variable Declarations */ - + int BandGapNarrowing; int TempDepMobility, ConcDepMobility, FieldDepMobility, TransDepMobility; int SurfaceMobility, MatchingMobility, MobDeriv; @@ -145,14 +135,14 @@ int CCScattering; int Srh, Auger, ConcDepLifetime, AvalancheGen; int FreezeOut = FALSE; int OneCarrier; - + int MaxIterations = 100; int AcAnalysisMethod = DIRECT; - + double Temp, RelTemp, Vt; double RefPsi;/* potential at Infinity */ double EpsNorm, VNorm, NNorm, LNorm, TNorm, JNorm, GNorm, ENorm; - + /* end cider globals */ #endif /* CIDER */ @@ -201,7 +191,7 @@ struct comm *cp_coms = spcp_coms; extern int OUTpBeginPlot(), OUTpData(), OUTwBeginPlot(), OUTwReference(); extern int OUTwData(), OUTwEnd(), OUTendPlot(), OUTbeginDomain(); extern int OUTendDomain(), OUTstopnow(), OUTerror(), OUTattributes(); - + IFfrontEnd nutmeginfo = { IFnewUid, IFdelUid, @@ -288,7 +278,7 @@ if_setparam(char *ckt, char *name, char *param, struct variable *val) bool if_tranparams(struct circ *ckt, double *start, double *stop, double *step) { - return (FALSE); + return (FALSE); } /* -------------------------------------------------------------------------- */ @@ -339,7 +329,7 @@ struct dvec *EVTfindvec(char *node){ #ifndef HAS_WINDOWS /* dummy of MS Windows message function */ -void winmessage(char* new_msg) { +void winmessage(char* new_msg) { return; } #endif @@ -365,15 +355,15 @@ SIMinit(IFfrontEnd *frontEnd, IFsimulator **simulator) SIMinfo.numDevices = DEVmaxnum = num_devices(); SIMinfo.devices = devices_ptr(); SIMinfo.numAnalyses = spice_num_analysis(); - SIMinfo.analyses = (IFanalysis **)spice_analysis_ptr(); /* va: we recast, because we use - * only the public part + SIMinfo.analyses = (IFanalysis **)spice_analysis_ptr(); /* va: we recast, because we use + * only the public part */ - + #ifdef CIDER /* Evaluates limits of machine accuracy for CIDER */ evalAccLimits(); -#endif /* CIDER */ - +#endif /* CIDER */ + #endif /* SIMULATOR */ SPfrontEnd = frontEnd; @@ -420,18 +410,18 @@ prompt(void) if (cp_interactive == FALSE) return NULL; /* NULL means no prompt */ - + s = get_alt_prompt(); if(s==NULL) s = cp_promptstring; if(s==NULL) s = "->"; - + while (*s) { - switch (strip(*s)) { + switch (strip(*s)) { case '!': #ifdef HAVE_BSDEDITLINE - { + { /* SJB In the present version of editline (v2.9) it seems that where_history() is broken. This is a hack that works round this problem. @@ -441,19 +431,19 @@ prompt(void) HIST_ENTRY * he = current_history(); if(he!=NULL) where = *(int*)(he->data); p += sprintf(p, "%d", where + 1); - } + } #else - p += sprintf(p, "%d", where_history() + 1); + p += sprintf(p, "%d", where_history() + 1); #endif /* HAVE_BSDEDITLINE*/ - break; + break; case '\\': - if (*(s + 1)) - p += sprintf(p, "%c", strip(*++s)); - default: - *p = strip(*s); ++p; - break; - } - s++; + if (*(s + 1)) + p += sprintf(p, "%c", strip(*++s)); + default: + *p = strip(*s); ++p; + break; + } + s++; } *p = 0; return pbuf; @@ -465,7 +455,7 @@ prompt(void) /* Process device events in Readline's hook since there is no where else to do it now - AV */ static int -rl_event_func() +rl_event_func() /* called by GNU readline periodically to know what to do about keypresses */ { static REQUEST reqst = { checkup_option, 0 }; @@ -479,7 +469,7 @@ rl_event_func() /* Process device events in Editline's hook. similar to the readline function above but returns void */ static void -rl_event_func() +rl_event_func() /* called by GNU readline periodically to know what to do about keypresses */ { static REQUEST reqst = { checkup_option, 0 }; @@ -498,28 +488,28 @@ app_rl_readlines() #if defined(HAVE_GNUREADLINE) || defined(HAVE_BSDEDITLINE) /* GNU Readline Support -- Andrew Veliath */ char *line, *expanded_line; - + /* --- set up readline params --- */ strcpy(history_file, getenv("HOME")); strcat(history_file, "/."); strcat(history_file, application_name); strcat(history_file, "_history"); - + using_history(); read_history(history_file); - + rl_readline_name = application_name; rl_instream = cp_in; rl_outstream = cp_out; rl_event_hook = rl_event_func; rl_catch_signals = 0; /* disable signal handling */ - + /* sjb - what to do for editline? - This variable is not supported by editline. */ -#if defined(HAVE_GNUREADLINE) + This variable is not supported by editline. */ +#if defined(HAVE_GNUREADLINE) rl_catch_sigwinch = 1; /* allow readline to respond to resized windows */ -#endif - +#endif + /* note that we want some mechanism to detect ctrl-D and expand it to exit */ while (1) { history_set_pos(history_length); @@ -543,7 +533,7 @@ app_rl_readlines() if (line) free(line); } /* History gets written in ../fte/misccoms.c com_quit */ - + #else while (cp_evloop((char *) NULL) == 1) ; #endif /* defined(HAVE_GNUREADLINE) || defined(HAVE_BSDEDITLINE) */ @@ -564,7 +554,7 @@ show_help(void) " -n, --no-spiceinit don't load the local or user's config file\n" " -o, --output=FILE set the outputfile\n" " -q, --completion activate command completion\n" - " -r, --rawfile=FILE set the rawfile output\n" + " -r, --rawfile=FILE set the rawfile output\n" " -s, --server run spice as a server process\n" " -t, --term=TERM set the terminal type\n" " -h, --help display this help and exit\n" @@ -595,7 +585,7 @@ append_to_stream(FILE *dest, FILE *source) int i; while ((i = fread(buf, 1, BSIZE_SP, source)) > 0) - fwrite(buf, i, 1, dest); + fwrite(buf, i, 1, dest); } #endif /* SIMULATOR */ @@ -613,28 +603,28 @@ read_initialisation_file(char * dir, char * name) #endif /* not HAVE_ASPRINTF */ char * path; bool result = FALSE; - + /* check name */ if(name==NULL || name[0]=='\0') return FALSE; /* Fail; name needed */ - + /* contruct the full path */ if(dir == NULL || dir[0]=='\0') { - path = name; + path = name; } else { #ifdef HAVE_ASPRINTF - asprintf(&path, "%s" DIR_PATHSEP "%s", dir,name); - if(path==NULL) return FALSE; /* memory allocation error */ + asprintf(&path, "%s" DIR_PATHSEP "%s", dir,name); + if(path==NULL) return FALSE; /* memory allocation error */ #else /* ~ HAVE_ASPRINTF */ - path=(char*)tmalloc(2 + strlen(dir)+strlen(name)); - if(path==NULL) return FALSE; /* memory allocation error */ - sprintf(path,"%s" DIR_PATHSEP "%s",dir,name); + path=(char*)tmalloc(2 + strlen(dir)+strlen(name)); + if(path==NULL) return FALSE; /* memory allocation error */ + sprintf(path,"%s" DIR_PATHSEP "%s",dir,name); #endif /* HAVE_ASPRINTF */ } /* now access the file */ #ifdef HAVE_UNISTD_H - if (access(path, R_OK) == 0) { + if (access(path, R_OK) == 0) { #else if ((fp = fopen(path, "r")) != NULL) { (void) fclose(fp); @@ -642,10 +632,10 @@ read_initialisation_file(char * dir, char * name) inp_source(path); #ifdef TRACE printf("Init file: '%s'\n",path); -#endif /* TRACE */ +#endif /* TRACE */ result = TRUE; /* loaded okay */ } - + /* if dir was not NULL and not empty then we allocated memory above */ if(dir!=NULL && dir[0] !='\0') #ifdef HAVE_ASPRINTF @@ -653,7 +643,7 @@ read_initialisation_file(char * dir, char * name) #else tfree(path); #endif /* HAVE_ASPRINTF */ - + return result; } @@ -670,14 +660,14 @@ main(int argc, char **argv) int c; int err; bool gotone = FALSE; - char* copystring;/*DG*/ + char* copystring; char addctrlsect = TRUE; /* PN: for autorun */ #ifdef SIMULATOR int error2; - - + + #else /* ~ SIMULATOR */ bool gdata = TRUE; #endif /* ~ SIMULATOR */ @@ -783,85 +773,85 @@ main(int argc, char **argv) switch (c) { case 'h': /* Help */ - show_help(); - sp_shutdown (EXIT_NORMAL); - break; + show_help(); + sp_shutdown (EXIT_NORMAL); + break; case 'v': /* Version info */ - show_version(); - sp_shutdown (EXIT_NORMAL); - break; + show_version(); + sp_shutdown (EXIT_NORMAL); + break; case 'b': /* Batch mode */ - ft_batchmode = TRUE; - addctrlsect = FALSE; - cp_vset("addcontrol",VT_BOOL,&addctrlsect); - break; + ft_batchmode = TRUE; + addctrlsect = FALSE; + cp_vset("addcontrol",VT_BOOL,&addctrlsect); + break; case 'a': /* Add control section for autorun */ - if (!ft_batchmode) { - addctrlsect = TRUE; - cp_vset("addcontrol",VT_BOOL, &addctrlsect); - } - break; + if (!ft_batchmode) { + addctrlsect = TRUE; + cp_vset("addcontrol",VT_BOOL, &addctrlsect); + } + break; case 'c': /* Circuit file */ - if (optarg) { - if (!(circuit_file = fopen(optarg, "r"))) { - perror(optarg); - sp_shutdown(EXIT_BAD); - } - istty = FALSE; - } - break; + if (optarg) { + if (!(circuit_file = fopen(optarg, "r"))) { + perror(optarg); + sp_shutdown(EXIT_BAD); + } + istty = FALSE; + } + break; case 'i': /* Interactive mode */ - iflag = TRUE; - break; + iflag = TRUE; + break; case 'n': /* Don't read initialisation file */ - readinit = FALSE; - break; + readinit = FALSE; + break; case 'o': /* Output file */ - if (optarg) { - /* turn off buffering for stdout */ - setbuf(stdout, NULL); + if (optarg) { + /* turn off buffering for stdout */ + setbuf(stdout, NULL); #ifdef PARALLEL_ARCH sprintf (buf, "%s%03d", optarg, ARCHme); #else sprintf (buf, "%s", optarg); #endif orflag = TRUE; - } - break; + } + break; case 'q': /* Command completion */ - qflag = TRUE; - break; + qflag = TRUE; + break; case 'r': /* The raw file */ - if (optarg) { - cp_vset("rawfile", VT_STRING, optarg); - } - rflag = TRUE; - break; + if (optarg) { + cp_vset("rawfile", VT_STRING, optarg); + } + rflag = TRUE; + break; case 's': /* Server mode */ - ft_servermode = TRUE; - break; + ft_servermode = TRUE; + break; case 't': - if (optarg) { - cp_vset("term", VT_STRING, optarg); - } - break; + if (optarg) { + cp_vset("term", VT_STRING, optarg); + } + break; case '?': - break; + break; default: - printf ("?? getopt returned character code 0%o ??\n", c); + printf ("?? getopt returned character code 0%o ??\n", c); } } /* --- End of command line option processing (While(1)-loop) --- */ @@ -875,10 +865,10 @@ main(int argc, char **argv) /* Open the log file */ #ifdef HAS_WINDOWS /* flogp used by winmain's putc which writes to file 'buf' */ - if (!(flogp = fopen(buf, "w"))) { + if (!(flogp = fopen(buf, "w"))) { #else /* Connect stdout to file buf and log stdout */ - if (!(freopen (buf, "w", stdout))) { + if (!(freopen (buf, "w", stdout))) { #endif perror (buf); sp_shutdown (EXIT_BAD); @@ -893,22 +883,23 @@ main(int argc, char **argv) if_getparam = nutif_getparam; if (optind == argc) { - /* No raw file */ - gdata = FALSE; + /* No raw file */ + gdata = FALSE; } #endif - - if ((!iflag && !istty) || ft_servermode) + if ((!iflag && !istty) || ft_servermode) /* (batch and file) or server operation */ ft_batchmode = TRUE; - /* set command completion */ - if ((iflag && !istty) || qflag) - cp_nocc = FALSE; + + if ((iflag && !istty) || qflag) /* (interactive and file) or command completion */ + cp_nocc = TRUE; /* set command completion */ else - cp_nocc = TRUE; - if (ft_servermode) + cp_nocc = FALSE; + + if (ft_servermode) /* in server no init file */ readinit = FALSE; - if (!istty || ft_batchmode) + + if (!istty || ft_batchmode) /* file or batch - no more output */ out_moremode = FALSE; /* Get information on memory status upon startup. @@ -916,7 +907,7 @@ main(int argc, char **argv) fcn is in resource.c */ init_rlimits( ); - /* Have to initialize cp now. + /* Have to initialize cp now. fcn is in cpitf.c*/ ft_cpinit(); @@ -926,7 +917,7 @@ main(int argc, char **argv) if (!ft_batchmode) goto bot; } - + /* Set up signal handling */ if (!ft_batchmode) { /* Set up interrupt handler */ @@ -957,14 +948,14 @@ main(int argc, char **argv) /* load user's initialisation file */ if (readinit) { bool good; - + /* Try accessing the initialisation file in the current directory */ good = read_initialisation_file("",INITSTR); - + /* if that fail try the alternate name */ if(good == FALSE) good = read_initialisation_file("",ALT_INITSTR); - + /* if that failed try in the user's home directory if their HOME environment variable is set */ if(good == FALSE) { @@ -1004,7 +995,6 @@ bot: if (SETJMP(jbuf, 1) == 1) goto evl; - cp_interactive = FALSE; err = 0; @@ -1012,7 +1002,7 @@ bot: if (!ft_servermode && !ft_nutmeg) { /* Concatenate all non-option arguments into a temporary file and load that file into the spice core. - + The original routine took a special path if there was only one non-option argument. In that case, it didn't create the temporary file but used the original file instead. The @@ -1023,7 +1013,7 @@ bot: char *tpf = NULL; /* temporary file */ char *dname = NULL; /* directory of input file*/ bool has_smk = FALSE; -#endif +#endif tempfile = tmpfile(); /* tmpfile() returns NULL, if in MS Windows as non admin user then we add a tempfile in the local directory */ @@ -1034,10 +1024,10 @@ bot: if (tempfile == NULL) { fprintf(stderr, "Could not open a temporary file to save and use optional arguments."); sp_shutdown(EXIT_BAD); - } + } has_smk = TRUE; - } -#endif + } +#endif if (optind == argc && !istty) { append_to_stream(tempfile, stdin); @@ -1074,7 +1064,7 @@ bot: /* Copy the input file name for adding another file search path */ inp_spsource(tempfile, FALSE, dname); tfree(dname); -#else +#else inp_spsource(tempfile, FALSE, NULL); #endif gotone = TRUE; @@ -1083,8 +1073,8 @@ bot: if (tempfile && has_smk) { if (remove(tpf)) perror("Could not delete temp file"); - } -#endif + } +#endif if (ft_batchmode && err) { sp_shutdown(EXIT_BAD); } @@ -1135,7 +1125,7 @@ evl: "no simulations run\n"); sp_shutdown(EXIT_BAD); } - } /* --- if (ft_batchmode) --- */ + } /* --- if (ft_batchmode) --- */ else { cp_interactive = TRUE; app_rl_readlines(); /* enter the command processing loop */ @@ -1144,12 +1134,12 @@ evl: #else /* ~ SIMULATOR */ if (ft_nutmeg && gdata) { - while (optind < argc) { - ft_loadfile(argv[optind++]); - gotone = TRUE; - } - if (!gotone) - ft_loadfile(ft_rawfile); + while (optind < argc) { + ft_loadfile(argv[optind++]); + gotone = TRUE; + } + if (!gotone) + ft_loadfile(ft_rawfile); } evl: