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