* parser/cshpar.c: Separated out com_chdir(), com_echo(),

com_rehash() and com_shell() and moved them into frontend
	directory.

	* frontend/com_chdir.c, frontend/com_echo.c, frontend/com_rehash.c,
	frontend/com_shell.c: Their new homes.
This commit is contained in:
arno 2000-07-07 14:06:33 +00:00
parent 14acefd969
commit 1f3603d5d9
5 changed files with 168 additions and 343 deletions

58
src/frontend/com_chdir.c Normal file
View File

@ -0,0 +1,58 @@
#include <config.h>
#include <ngspice.h>
#include <wordlist.h>
#include "quote.h"
#include "streams.h"
void
com_chdir(wordlist *wl)
{
char *s;
struct passwd *pw;
extern struct passwd *getpwuid(uid_t);
char localbuf[257];
int copied = 0;
s = NULL;
if (wl == NULL) {
s = getenv("HOME");
#ifdef HAVE_PWD_H
if (s == NULL) {
pw = getpwuid(getuid());
if (pw == NULL) {
fprintf(cp_err, "Can't get your password entry\n");
return;
}
s = pw->pw_dir;
}
#endif
} else {
s = cp_unquote(wl->wl_word);
copied = 1;
}
if (*s && chdir(s) == -1)
perror(s);
if (copied)
tfree(s);
#ifdef HAVE_GETCWD
s = getcwd(localbuf, sizeof(localbuf));
if (s)
printf("Current directory: %s\n", s);
else
fprintf(cp_err, "Can't get current working directory.\n");
#endif
return;
}

28
src/frontend/com_echo.c Normal file
View File

@ -0,0 +1,28 @@
#include <config.h>
#include <ngspice.h>
#include <wordlist.h>
#include <bool.h>
#include "quote.h"
#include "streams.h"
void
com_echo(wordlist *wlist)
{
bool nl = TRUE;
if (wlist && eq(wlist->wl_word, "-n")) {
wlist = wlist->wl_next;
nl = FALSE;
}
while (wlist) {
fputs(cp_unquote(wlist->wl_word), cp_out);
if (wlist->wl_next)
fputs(" ", cp_out);
wlist = wlist->wl_next;
}
if (nl)
fputs("\n", cp_out);
}

24
src/frontend/com_rehash.c Normal file
View File

@ -0,0 +1,24 @@
#include <config.h>
#include <ngspice.h>
#include <wordlist.h>
#include <cpextern.h>
void
com_rehash(wordlist *wl)
{
char *s;
if (!cp_dounixcom) {
fprintf(cp_err, "Error: unixcom not set.\n");
return;
}
s = getenv("PATH");
if (s)
cp_rehash(s, TRUE);
else
fprintf(cp_err, "Error: no PATH in environment.\n");
return;
}

58
src/frontend/com_shell.c Normal file
View File

@ -0,0 +1,58 @@
#include <config.h>
#include <ngspice.h>
#include <wordlist.h>
#include <cpextern.h>
/* Fork a shell. */
void
com_shell(wordlist *wl)
{
char *com, *shell = NULL;
shell = getenv("SHELL");
if (shell == NULL)
shell = "/bin/csh";
cp_ccon(FALSE);
#ifdef HAVE_VFORK_H
/* XXX Needs to switch process groups. Also, worry about suspend */
/* Only bother for efficiency */
pid = vfork();
if (pid == 0) {
fixdescriptors();
if (wl == NULL) {
execl(shell, shell, 0);
_exit(99);
} else {
com = wl_flatten(wl);
execl("/bin/sh", "sh", "-c", com, 0);
}
} else {
/* XXX Better have all these signals */
svint = signal(SIGINT, SIG_DFL);
svquit = signal(SIGQUIT, SIG_DFL);
svtstp = signal(SIGTSTP, SIG_DFL);
/* XXX Sig on proc group */
do {
r = wait((union wait *) NULL);
} while ((r != pid) && pid != -1);
signal(SIGINT, (SIGNAL_FUNCTION) svint);
signal(SIGQUIT, (SIGNAL_FUNCTION) svquit);
signal(SIGTSTP, (SIGNAL_FUNCTION) svtstp);
}
#else
/* Easier to forget about changing the io descriptors. */
if (wl) {
com = wl_flatten(wl);
system(com);
} else
system(shell);
#endif
return;
}

View File

@ -54,26 +54,9 @@ Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group
*/
static bool fileexists(char *name);
void fixdescriptors(void);
static void pwlist(wordlist *wlist, char *name);
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;
wordlist *
cp_parse(char *string)
@ -131,329 +114,3 @@ pwlist(wordlist *wlist, char *name)
return;
}
/* This has to go somewhere... */
void
com_echo(wordlist *wlist)
{
bool nl = TRUE;
if (wlist && eq(wlist->wl_word, "-n")) {
wlist = wlist->wl_next;
nl = FALSE;
}
while (wlist) {
fputs(cp_unquote(wlist->wl_word), cp_out);
if (wlist->wl_next)
fputs(" ", cp_out);
wlist = wlist->wl_next;
}
if (nl)
fputs("\n", cp_out);
}
/* 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;
}
static bool
fileexists(char *name)
{
#ifdef HAVE_ACCESS
if (access(name, 0) == 0)
return (TRUE);
#endif
return (FALSE);
}
/* Fork a shell. */
void
com_shell(wordlist *wl)
{
char *com, *shell = NULL;
shell = getenv("SHELL");
if (shell == NULL)
shell = "/bin/csh";
cp_ccon(FALSE);
#ifdef HAVE_VFORK_H
/* XXX Needs to switch process groups. Also, worry about suspend */
/* Only bother for efficiency */
pid = vfork();
if (pid == 0) {
fixdescriptors();
if (wl == NULL) {
execl(shell, shell, 0);
_exit(99);
} else {
com = wl_flatten(wl);
execl("/bin/sh", "sh", "-c", com, 0);
}
} else {
/* XXX Better have all these signals */
svint = signal(SIGINT, SIG_DFL);
svquit = signal(SIGQUIT, SIG_DFL);
svtstp = signal(SIGTSTP, SIG_DFL);
/* XXX Sig on proc group */
do {
r = wait((union wait *) NULL);
} while ((r != pid) && pid != -1);
signal(SIGINT, (SIGNAL_FUNCTION) svint);
signal(SIGQUIT, (SIGNAL_FUNCTION) svquit);
signal(SIGTSTP, (SIGNAL_FUNCTION) svtstp);
}
#else
/* Easier to forget about changing the io descriptors. */
if (wl) {
com = wl_flatten(wl);
system(com);
} else
system(shell);
#endif
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;
}
void
com_rehash(wordlist *wl)
{
char *s;
if (!cp_dounixcom) {
fprintf(cp_err, "Error: unixcom not set.\n");
return;
}
s = getenv("PATH");
if (s)
cp_rehash(s, TRUE);
else
fprintf(cp_err, "Error: no PATH in environment.\n");
return;
}
void
com_chdir(wordlist *wl)
{
char *s;
struct passwd *pw;
extern struct passwd *getpwuid(uid_t);
char localbuf[257];
int copied = 0;
s = NULL;
if (wl == NULL) {
s = getenv("HOME");
#ifdef HAVE_PWD_H
if (s == NULL) {
pw = getpwuid(getuid());
if (pw == NULL) {
fprintf(cp_err, "Can't get your password entry\n");
return;
}
s = pw->pw_dir;
}
#endif
} else {
s = cp_unquote(wl->wl_word);
copied = 1;
}
if (*s && chdir(s) == -1)
perror(s);
if (copied)
tfree(s);
#ifdef HAVE_GETCWD
s = getcwd(localbuf, sizeof(localbuf));
if (s)
printf("Current directory: %s\n", s);
else
fprintf(cp_err, "Can't get current working directory.\n");
#endif
return;
}