19 changed files with 290 additions and 107 deletions
-
7src/frontend/Makefile.am
-
2src/frontend/breakp2.c
-
1src/frontend/com_compose.c
-
1src/frontend/com_display.c
-
10src/frontend/com_setscale.c
-
4src/frontend/com_strcmp.c
-
3src/frontend/newcoms.c
-
3src/frontend/postcoms.c
-
1src/frontend/resource.c
-
211src/frontend/streams.c
-
2src/frontend/terminal.h
-
5src/frontend/variable.c
-
4src/frontend/variable.h
-
4src/parser/Makefile.am
-
57src/parser/input.c
-
3src/parser/input.h
-
45src/parser/lexical.c
-
13src/parser/var2.c
-
21src/parser/var2.h
@ -0,0 +1,211 @@ |
|||||
|
#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 bool |
||||
|
fileexists(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; |
||||
|
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"); |
||||
|
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+"); |
||||
|
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... */ |
||||
|
|
||||
|
void |
||||
|
cp_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. */ |
||||
|
|
||||
|
void |
||||
|
fixdescriptors(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; |
||||
|
} |
||||
@ -1,13 +0,0 @@ |
|||||
/********** |
|
||||
Copyright 1990 Regents of the University of California. All rights reserved. |
|
||||
Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group |
|
||||
**********/ |
|
||||
|
|
||||
/* |
|
||||
* Do variable substitution. |
|
||||
*/ |
|
||||
|
|
||||
#include "ngspice.h" |
|
||||
#include "cpdefs.h" |
|
||||
#include "var2.h" |
|
||||
|
|
||||
@ -1,21 +0,0 @@ |
|||||
/************* |
|
||||
* Header file for var2.c |
|
||||
* 1999 E. Rouat |
|
||||
************/ |
|
||||
|
|
||||
#ifndef VAR2_H_INCLUDED |
|
||||
#define VAR2_H_INCLUDED |
|
||||
|
|
||||
|
|
||||
wordlist * cp_variablesubst(wordlist *wlist); |
|
||||
wordlist * vareval(char *string); |
|
||||
void cp_vprint(void); |
|
||||
void com_set(wordlist *wl); |
|
||||
void com_unset(wordlist *wl); |
|
||||
void com_shift(wordlist *wl); |
|
||||
bool cp_getvar(char *name, int type, char *retval); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
#endif |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue