* frontend/Makefile.am: Updates for new files.

* frontend/breakp2.c, frontend/newcoms.c, frontend/postcoms.c,
	frontend/resource.c, frontend/terminal.h, frontend/variable.c,
	frontend/variable.h, frontend/com_compose.c,
	frontend/com_display.c, frontend/com_setscale.c,
	frontend/com_strcmp.c: Include files update.

	* parser/var2.c, parser/var2.h: Empty files, removed.

	* parser/Makefile.am: Updates for removed files.

	* parser/lexical.c: Small adjustments

	* parser/input.c, parser/input.h: Input, output and error streams
	handled in the frontend.  Moved to the frontend directory.

	* frontend/streams.c: Its new home.
This commit is contained in:
arno 2000-07-07 14:09:06 +00:00
parent 8d342f4295
commit f85551ea17
19 changed files with 292 additions and 109 deletions

View File

@ -15,10 +15,12 @@ libfte_a_SOURCES = \
com_asciiplot.h \
com_cdump.c \
com_cdump.h \
com_chdir.c \
com_compose.c \
com_compose.h \
com_display.c \
com_display.h \
com_echo.c \
com_ghelp.c \
com_ghelp.h \
com_hardcopy.c \
@ -31,9 +33,11 @@ libfte_a_SOURCES = \
com_let.h \
com_plot.c \
com_plot.h \
com_rehash.c \
com_set.c \
com_setscale.c \
com_setscale.h \
com_shell.c \
com_shift.c \
com_strcmp.c \
com_strcmp.h \
@ -48,7 +52,10 @@ libfte_a_SOURCES = \
hcomp.h \
init.c \
init.h \
quote.c \
quote.h \
streams.h \
streams.c \
terminal.c \
terminal.h \
variable.c \

View File

@ -12,6 +12,8 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
#include "ftedefs.h"
#include "dvec.h"
#include "ftedebug.h"
#include "quote.h"
#include "breakp2.h"

View File

@ -9,6 +9,7 @@
#include <fteext.h>
#include <cpextern.h>
#include "quote.h"
#include "com_compose.h"
#include "completion.h"

View File

@ -5,6 +5,7 @@
#include <cpextern.h>
#include "com_display.h"
#include "quote.h"
#include "variable.h"
#include "plotting/plotting.h"
#include "plotting/pvec.h"

View File

@ -1,15 +1,17 @@
#include <ngspice.h>
#include <bool.h>
#include <dvec.h>
#include <cpextern.h>
#include "vectors.h"
#include "com_setscale.h"
#include "quote.h"
#include "streams.h"
#include "vectors.h"
#include "plotting/plotting.h"
#include "plotting/pvec.h"
/* Set the default scale to the named vector. If no vector named,
* find and print the default scale.
*/
* find and print the default scale. */
void
com_setscale(wordlist *wl)
{

View File

@ -1,7 +1,11 @@
#include <config.h>
#include <ngspice.h>
#include <bool.h>
#include <wordlist.h>
#include "com_strcmp.h"
#include "quote.h"
#include "variable.h"

View File

@ -11,8 +11,9 @@ Copyright 1992 Regents of the University of California. All rights reserved.
#include "ftedefs.h"
#include "fteparse.h"
#include "dvec.h"
#include "newcoms.h"
#include "newcoms.h"
#include "quote.h"
/*
* reshape v(1) vxx#branch [10]

View File

@ -14,8 +14,9 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
#include <sim.h>
#include <plot.h>
#include "postcoms.h"
#include "completion.h"
#include "postcoms.h"
#include "quote.h"
#include "variable.h"
/* static declarations */

View File

@ -13,6 +13,7 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
#include "ftedefs.h"
#include "circuits.h"
#include "quote.h"
#include "resource.h"
#include "variable.h"

211
src/frontend/streams.c Normal file
View File

@ -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;
}

View File

@ -1,6 +1,8 @@
#ifndef _TERMINAL_H
#define _TERMINAL_H
extern bool out_isatty;
void out_init(void);
void outbufputc(void);
void promptreturn(void);

View File

@ -17,9 +17,10 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
#include <inpdefs.h>
#include "circuits.h"
#include "variable.h"
#include "streams.h"
#include "com_history.h"
#include "quote.h"
#include "streams.h"
#include "variable.h"
bool cp_noglob = TRUE;

View File

@ -38,6 +38,10 @@ struct xxx {
extern struct variable *variables;
extern bool cp_noglob;
extern bool cp_nonomatch;
extern bool cp_noclobber;
extern bool cp_ignoreeof;
// extern struct variable *variables;
wordlist * cp_varwl(struct variable *var);

View File

@ -17,13 +17,9 @@ libparser_a_SOURCES = \
lexical.h \
numparse.c \
numparse.h \
quote.c \
quote.h \
std.c \
unixcom.c \
unixcom.h \
var2.c \
var2.h \
wlist.c \
wlist.h

View File

@ -6,28 +6,55 @@ Author: 1988 Jeffrey M. Hsu
/*
* Stand-alone input routine.
*/
#include <config.h>
#include <ngspice.h>
#include <errno.h>
#include "ngspice.h"
#include "fteinput.h"
#include "input.h"
#include "cpextern.h"
extern int inchar(FILE *fp);
void
Input(REQUEST *request, RESPONSE *response)
/* A special 'getc' so that we can deal with ^D properly. There is no way for
* stdio to know if we have typed a ^D after some other characters, so
* don't use buffering at all
*/
int
inchar(FILE *fp)
{
switch (request->option) {
case char_option:
response->reply.ch = inchar(request->fp);
response->option = request->option;
break;
default:
/* just ignore, since we don't want a million error messages */
response->option = error_option;
break;
}
return;
char c;
int i;
if (cp_interactive && !cp_nocc) {
do {
i = read((int) fileno(fp), &c, 1);
} while (i == -1 && errno == EINTR);
if (i == 0 || c == '\004')
return (EOF);
else if (i == -1) {
perror("read");
return (EOF);
} else
return ((int) c);
} else
c = getc(fp);
return ((int) c);
}
extern void Input(REQUEST *req, RESPONSE *resp);
int
input(FILE *fp)
{
REQUEST request;
RESPONSE response;
request.option = char_option;
request.fp = fp;
Input(&request, &response);
return(response.reply.ch);
}

View File

@ -7,7 +7,8 @@
#define INPUT_H_INCLUDED
void Input(REQUEST *request, RESPONSE *response);
int inchar(FILE *fp);
int input(FILE *fp);
#endif

View File

@ -57,8 +57,6 @@ char cp_hash = '#';
static int numeofs = 0;
extern void Input();
#define ESCAPE '\033'
/* Return a list of words, with backslash quoting and '' quoting done.
@ -314,46 +312,3 @@ prompt(void)
(void) fflush(cp_out);
return;
}
/* A special 'getc' so that we can deal with ^D properly. There is no way for
* stdio to know if we have typed a ^D after some other characters, so
* don't use buffering at all
*/
int
inchar(FILE *fp)
{
char c;
int i;
if (cp_interactive && !cp_nocc) {
do {
i = read((int) fileno(fp), &c, 1);
} while (i == -1 && errno == EINTR);
if (i == 0 || c == '\004')
return (EOF);
else if (i == -1) {
perror("read");
return (EOF);
} else
return ((int) c);
} else
c = getc(fp);
return ((int) c);
}
int
input(FILE *fp)
{
REQUEST request;
RESPONSE response;
request.option = char_option;
request.fp = fp;
Input(&request, &response);
return(response.reply.ch);
}

View File

@ -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"

View File

@ -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