⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 streams.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/************** streams.c* $Id: streams.c,v 1.3 2005/05/30 20:28:35 sjborley Exp $************/#include <config.h>#include <ngspice.h>#include <wordlist.h>#include <bool.h>#include "variable.h"#include "terminal.h"#include "quote.h"#include "streams.h"bool cp_debug = FALSE;char cp_gt = '>';char cp_lt = '<';char cp_amp = '&';FILE *cp_in;FILE *cp_out;FILE *cp_err;/* These are the fps that cp_ioreset resets the cp_* to.  They are * changed by the source routines.  */FILE *cp_curin = NULL;FILE *cp_curout = NULL;FILE *cp_curerr = NULL;/* static functions */static bool fileexists(char *name);static boolfileexists(char *name){#ifdef HAVE_ACCESS    if (access(name, 0) == 0)        return (TRUE);#endif    return (FALSE);}/* This routine sets the cp_{in,out,err} pointers and takes the io * directions out of the command line.  */wordlist *cp_redirect(wordlist *wl){    bool gotinput = FALSE, gotoutput = FALSE, goterror = FALSE;    bool app = FALSE, erralso = FALSE;    wordlist *w, *bt, *nw;    char *s,*copyword;    FILE *tmpfp;    w = wl->wl_next;    /* Don't consider empty commands. */    while (w) {        if (*w->wl_word == cp_lt) {            bt = w;            if (gotinput) {                fprintf(cp_err,                 "Error: ambiguous input redirect.\n");                goto error;            }            gotinput = TRUE;            w = w->wl_next;            if (w == NULL) {                fprintf(cp_err,                 "Error: missing name for input.\n");                return (NULL);            }            if (*w->wl_word == cp_lt) {                /* Do reasonable stuff here... */            } else {                /*tmpfp = fopen(cp_unquote(w->wl_word), "r"); DG very bad: memory leak the string allocated by cp_unquote is lost*/                copyword=cp_unquote(w->wl_word);/*DG*/                tmpfp = fopen(copyword, "r");                 tfree(copyword);                  if (!tmpfp) {                    perror(w->wl_word);                    goto error;                } else                    cp_in = tmpfp;            }#ifdef CPDEBUG            if (cp_debug)                fprintf(cp_err, "Input file is %s...\n",                    w->wl_word);#endif            bt->wl_prev->wl_next = w->wl_next;            if (w->wl_next)                w->wl_next->wl_prev = bt->wl_prev;            nw = w->wl_next;            w->wl_next = NULL;            w = nw;            wl_free(bt);        } else if (*w->wl_word == cp_gt) {            bt = w;            if (gotoutput) {                fprintf(cp_err,                 "Error: ambiguous output redirect.\n");                goto error;            }            gotoutput = TRUE;            w = w->wl_next;            if (w == NULL) {                fprintf(cp_err,                 "Error: missing name for output.\n");                return (NULL);            }            if (*w->wl_word == cp_gt) {                app = TRUE;                w = w->wl_next;                if (w == NULL) {                    fprintf(cp_err,                     "Error: missing name for output.\n");                    return (NULL);                }            }            if (*w->wl_word == cp_amp) {                erralso = TRUE;                if (goterror) {                    fprintf(cp_err,                 "Error: ambiguous error redirect.\n");                    return (NULL);                }                goterror = TRUE;                w = w->wl_next;                if (w == NULL) {                    fprintf(cp_err,                     "Error: missing name for output.\n");                    return (NULL);                }            }            s = cp_unquote(w->wl_word);            if (cp_noclobber && fileexists(s)) {                fprintf(stderr, "Error: %s: file exists\n", s);                goto error;            }            if (app)                tmpfp = fopen(s, "a");            else                tmpfp = fopen(s, "w+");            tfree(s);/*DG cp_unquote memory leak*/            if (!tmpfp) {                perror(w->wl_word);                goto error;            } else {                cp_out = tmpfp;                out_isatty = FALSE;            }#ifdef CPDEBUG            if (cp_debug)                fprintf(cp_err, "Output file is %s... %s\n",                    w->wl_word, app ? "(append)" : "");#endif            bt->wl_prev->wl_next = w->wl_next;            if (w->wl_next)                w->wl_next->wl_prev = bt->wl_prev;            w = w->wl_next;            if (w)                w->wl_prev->wl_next = NULL;            wl_free(bt);            if (erralso)                cp_err = cp_out;        } else            w = w->wl_next;    }    return (wl);error:  wl_free(wl);    return (NULL);}/* Reset the cp_* FILE pointers to the standard ones.  This is tricky, * since if we are sourcing a command file, and io has been redirected * from inside the file, we have to reset it back to what it was for * the source, not for the top level.  That way if you type "foo > * bar" where foo is a script, and it has redirections of its own * inside of it, none of the output from foo will get sent to * stdout...  */voidcp_ioreset(void){    if (cp_in != cp_curin) {        if (cp_in)            fclose(cp_in);        cp_in = cp_curin;    }    if (cp_out != cp_curout) {        if (cp_out)            fclose(cp_out);        cp_out = cp_curout;    }    if (cp_err != cp_curerr) {        if (cp_err)            fclose(cp_err);        cp_err = cp_curerr;    }    /*** Minor bug here... */    out_isatty = TRUE;    return;}/* Do this only right before an exec, since we lose the old std*'s. */voidfixdescriptors(void){    if (cp_in != stdin)        dup2(fileno(cp_in), fileno(stdin));    if (cp_out != stdout)        dup2(fileno(cp_out), fileno(stdout));    if (cp_err != stderr)        dup2(fileno(cp_err), fileno(stderr));    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -