summaryrefslogtreecommitdiff
path: root/contrib/tcsh/ma.setp.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcsh/ma.setp.c')
-rw-r--r--contrib/tcsh/ma.setp.c618
1 files changed, 0 insertions, 618 deletions
diff --git a/contrib/tcsh/ma.setp.c b/contrib/tcsh/ma.setp.c
deleted file mode 100644
index d515d0f5c1e3..000000000000
--- a/contrib/tcsh/ma.setp.c
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright (c) 1990 Carnegie Mellon University
- * All Rights Reserved.
- *
- * Permission to use, copy, modify and distribute this software and its
- * documentation is hereby granted, provided that both the copyright
- * notice and this permission notice appear in all copies of the
- * software, derivative works or modified versions, and any portions
- * thereof, and that both notices appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND CARNEGIE MELLON UNIVERSITY
- * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
- * SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Users of this software agree to return to Carnegie Mellon any
- * improvements or extensions that they make and grant Carnegie the
- * rights to redistribute these changes.
- *
- * Export of this software is permitted only after complying with the
- * regulations of the U.S. Deptartment of Commerce relating to the
- * Export of Technical Data.
- */
-/*
- * setpath --- smart interface for setting path variables
- *
- * usage: setpath(paths, cmds, localsyspath, dosuffix, printerrors)
- * char **paths, **cmds, *localsyspath;
- * int dosuffix, printerrors;
- *
- * The 'paths' argument is a list of pointers to path lists of the
- * form "name=value" where name is the name of the path and value
- * is a colon separated list of directories. There can never be
- * more than MAXDIRS (64) directories in a path.
- *
- * The 'cmds' argument may be a sequence of any of the following:
- * -r reset path to default
- * -i newpath insert newpath before localsyspath
- * -ia oldpath newpath insert newpath after oldpath
- * -ib oldpath newpath insert newpath before oldpath
- * -i# newpath insert newpath at position #
- * -d oldpath delete oldpath
- * -d# delete path at position #
- * -c oldpath newpath change oldpath to newpath
- * -c# newpath change position # to newpath
- *
- * The "-i newpath" command is equivilent to "-ib 'localsyspath' newpath".
- *
- * If 'dosuffix' is true, the appropriate suffix will be added to
- * all command operands for any system path in 'paths'.
- *
- * Both of the 'paths' and 'cmds' lists are terminated by a NULL
- * entry.
- *
- * if 'printerrors' is true, setpath will printf error diagnostics.
- *
- * WARNING !!!: Under no circumstances should anyone change this
- * module without fully understanding the impact on the C shell.
- * The C shell has it's own malloc and printf routines and this
- * module was carefully written taking that into account. Do not
- * use any stdio routines from this module except printf.
- *
- **********************************************************************
- * HISTORY
- *
- * Revision 1.4 90/12/11 17:58:44 mja
- * Add copyright/disclaimer for distribution.
- *
- * 05-Jun-88 Glenn Marcy (gm0w) at Carnegie-Mellon University
- * Make all non-entry points static.
- *
- * 30-Apr-88 Glenn Marcy (gm0w) at Carnegie-Mellon University
- * Added -r switch to reset paths to their default values.
- *
- * 06-Jan-86 Glenn Marcy (gm0w) at Carnegie-Mellon University
- * Created from old setpath program for the shell.
- *
- **********************************************************************
- */
-#include "sh.h"
-RCSID("$Id: ma.setp.c,v 1.12 1996/04/26 19:18:36 christos Exp $")
-
-#ifdef MACH
-
-#define MAXDIRS 64 /* max directories on a path */
-#ifndef NULL
-# define NULL 0
-#endif
-
-static int npaths; /* # pathlist arguments */
-
-static struct pelem {
- struct pelem *pnext; /* pointer to next path */
- char *pname; /* name of pathlist */
- char *psuf; /* suffix for pathlist */
- char *pdef; /* default for pathlist */
- int pdirs; /* # directories on each pathlist */
- char *pdir[MAXDIRS]; /* directory names for each pathlist */
-} *pathhead = NULL;
-
-static struct {
- char *name;
- char *suffix;
- char *defalt;
-} syspath[] = {
- "PATH", "/bin", ":/usr/ucb:/bin:/usr/bin",
- "CPATH", "/include", ":/usr/include",
- "LPATH", "/lib", ":/lib:/usr/lib",
- "MPATH", "/man", ":/usr/man",
- "EPATH", "/maclib", "",
- 0, 0, 0
-};
-
-static int sflag;
-static int eflag;
-
-#define INVALID { \
- if (eflag) xprintf(CGETS(10, 1, \
- "setpath: invalid command '%s'.\n"), cmd); \
- freepaths(); \
- return(-1); \
-}
-
-#define TOOFEW { \
- if (eflag) xprintf(CGETS(10, 2, \
- "setpath: insufficient arguments to command '%s'.\n"), cmd); \
- freepaths(); \
- return(-1); \
-}
-
-static int initpaths __P((char **));
-static void savepaths __P((char **));
-static void freepaths __P((void));
-static void rcmd __P((char *));
-static void icmd __P((char *, char *));
-static void iacmd __P((char *, char *));
-static void ibcmd __P((char *, char *));
-static void incmd __P((char *, int));
-static void insert __P((struct pelem *, int, char *));
-static void dcmd __P((char *));
-static void dncmd __P((int));
-static void delete __P((struct pelem *, int));
-static void ccmd __P((char *, char *));
-static void cncmd __P((char *, int));
-static void change __P((struct pelem *, int, char *));
-static int locate __P((struct pelem *, char *));
-
-
-
-int
-setpath(paths, cmds, localsyspath, dosuffix, printerrors)
-register char **paths, **cmds, *localsyspath;
-int dosuffix, printerrors;
-{
- register char *cmd, *cmd1, *cmd2;
- register int ncmd;
-
- sflag = dosuffix;
- eflag = printerrors;
- if (initpaths(paths) < 0)
- return(-1);
- if (npaths == 0)
- return(0);
- for (ncmd = 0; cmd = cmds[ncmd]; ncmd++) {
- if (cmd[0] != '-')
- INVALID;
- cmd1 = cmds[ncmd+1];
- cmd2 = cmds[ncmd+2];
- switch (cmd[1]) {
- case 'r':
- if (cmd[2] != '\0')
- INVALID;
- rcmd(localsyspath);
- break;
- case 'i':
- if (cmd[2] == '\0') {
- ncmd++;
- if (cmd1 == NULL) TOOFEW;
- icmd(cmd1, localsyspath);
- } else if (isdigit(cmd[2])) {
- ncmd++;
- if (cmd1 == NULL) TOOFEW;
- incmd(cmd1, atoi(cmd+2));
- } else if (cmd[3] != '\0' || (cmd[2] != 'a' && cmd[2] != 'b')) {
- INVALID;
- } else {
- ncmd += 2;
- if (cmd1 == NULL || cmd2 == NULL) TOOFEW;
- if (cmd[2] == 'a')
- iacmd(cmd1, cmd2);
- else
- ibcmd(cmd1, cmd2);
- }
- break;
- case 'd':
- if (cmd[2] == '\0') {
- ncmd++;
- if (cmd1 == NULL) TOOFEW;
- dcmd(cmd1);
- } else if (isdigit(cmd[2]))
- dncmd(atoi(cmd+2));
- else {
- INVALID;
- }
- break;
- case 'c':
- if (cmd[2] == '\0') {
- ncmd += 2;
- if (cmd1 == NULL || cmd2 == NULL) TOOFEW;
- ccmd(cmd1, cmd2);
- } else if (isdigit(cmd[2])) {
- ncmd++;
- if (cmd1 == NULL) TOOFEW;
- cncmd(cmd1, atoi(cmd+2));
- } else {
- INVALID;
- }
- break;
- default:
- INVALID;
- }
- }
- savepaths(paths);
- freepaths();
- return(0);
-}
-
-static int
-initpaths(paths)
-register char **paths;
-{
- register char *path, *val, *p, *q;
- register int i, done;
- register struct pelem *pe, *pathend;
-
- freepaths();
- for (npaths = 0; path = paths[npaths]; npaths++) {
- val = index(path, '=');
- if (val == NULL) {
- if (eflag)
- xprintf(CGETS(10, 3,
- "setpath: value missing in path '%s'\n"), path);
- freepaths();
- return(-1);
- }
- *val++ = '\0';
- pe = (struct pelem *)xmalloc((unsigned)(sizeof(struct pelem)));
- setzero((char *) pe, sizeof(struct pelem));
- if (pathhead == NULL)
- pathhead = pathend = pe;
- else {
- pathend->pnext = pe;
- pathend = pe;
- }
- p = strsave(path);
- pe->pname = p;
- pe->psuf = "";
- pe->pdef = "";
- for (i = 0; syspath[i].name; i++)
- if (strcmp(pe->pname, syspath[i].name) == 0) {
- pe->psuf = syspath[i].suffix;
- pe->pdef = syspath[i].defalt;
- break;
- }
- q = val;
- for (;;) {
- q = index(p = q, ':');
- done = (q == NULL);
- if (!done)
- *q++ = '\0';
- p = strsave(p);
- pe->pdir[pe->pdirs] = p;
- pe->pdirs++;
- if (done)
- break;
- }
- }
- return(0);
-}
-
-static void
-savepaths(paths)
-register char **paths;
-{
- register char *p, *q;
- register int npath, i, len;
- register struct pelem *pe;
-
- for (npath = 0, pe = pathhead; pe; npath++, pe = pe->pnext) {
- len = strlen(pe->pname) + 1;
- if (pe->pdirs == 0)
- len++;
- else for (i = 0; i < pe->pdirs; i++)
- len += strlen(pe->pdir[i]) + 1;
- p = xmalloc((unsigned)len);
- paths[npath] = p;
- for (q = pe->pname; *p = *q; p++, q++);
- *p++ = '=';
- if (pe->pdirs != 0) {
- for (i = 0; i < pe->pdirs; i++) {
- for (q = pe->pdir[i]; *p = *q; p++, q++);
- *p++ = ':';
- }
- p--;
- }
- *p = '\0';
- }
-}
-
-static void
-freepaths()
-{
- register char *p;
- register int i;
- register struct pelem *pe;
-
- if (npaths == 0 || pathhead == NULL)
- return;
- while (pe = pathhead) {
- if (pe->pname) {
- for (i = 0; i < pe->pdirs; i++) {
- if (pe->pdir[i] == NULL)
- continue;
- p = pe->pdir[i];
- pe->pdir[i] = NULL;
- xfree((ptr_t) p);
- }
- pe->pdirs = 0;
- p = pe->pname;
- pe->pname = NULL;
- xfree((ptr_t) p);
- }
- pathhead = pe->pnext;
- xfree((ptr_t) pe);
- }
- npaths = 0;
-}
-
-/***********************************************
- *** R E S E T A P A T H N A M E ***
- ***********************************************/
-
-static void
-rcmd(localsyspath) /* reset path with localsyspath */
-char *localsyspath;
-{
- register int n, done;
- register char *new, *p;
- register struct pelem *pe;
- char newbuf[MAXPATHLEN+1];
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- new = newbuf;
- *new = '\0';
- if (localsyspath != NULL) {
- *new = ':';
- (void) strcpy(new + 1, localsyspath);
- (void) strcat(new, pe->psuf);
- }
- (void) strcat(new, pe->pdef);
- for (n = 0; n < pe->pdirs; n++) {
- if (pe->pdir[n] == NULL)
- continue;
- p = pe->pdir[n];
- pe->pdir[n] = NULL;
- xfree((ptr_t) p);
- }
- pe->pdirs = 0;
- for (;;) {
- new = index(p = new, ':');
- done = (new == NULL);
- if (!done)
- *new++ = '\0';
- p = strsave(p);
- pe->pdir[pe->pdirs] = p;
- pe->pdirs++;
- if (done)
- break;
- }
- }
-}
-
-/***********************************************
- *** I N S E R T A P A T H N A M E ***
- ***********************************************/
-
-static void
-icmd(path, localsyspath) /* insert path before localsyspath */
-char *path, *localsyspath;
-{
- register int n;
- register char *new;
- register struct pelem *pe;
- char newbuf[MAXPATHLEN+1];
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- if (sflag)
- new = localsyspath;
- else {
- new = newbuf;
- (void) strcpy(new, localsyspath);
- (void) strcat(new, pe->psuf);
- }
- n = locate(pe, new);
- if (n >= 0)
- insert(pe, n, path);
- else
- insert(pe, 0, path);
- }
-}
-
-static void
-iacmd(inpath, path) /* insert path after inpath */
-char *inpath, *path;
-{
- register int n;
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- n = locate(pe, inpath);
- if (n >= 0)
- insert(pe, n + 1, path);
- else
- xprintf(CGETS(10, 4, "setpath: %s not found in %s\n"),
- inpath, pe->pname);
- }
-}
-
-static void
-ibcmd(inpath, path) /* insert path before inpath */
-char *inpath, *path;
-{
- register int n;
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- n = locate(pe, inpath);
- if (n >= 0)
- insert(pe, n, path);
- else
- xprintf(CGETS(10, 4, "setpath: %s not found in %s\n",
- inpath, pe->pname));
- }
-}
-
-static void
-incmd(path, n) /* insert path at position n */
-char *path;
-int n;
-{
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext)
- insert(pe, n, path);
-}
-
-static void
-insert(pe, loc, key)
-register struct pelem *pe;
-register int loc;
-register char *key;
-{
- register int i;
- register char *new;
- char newbuf[2000];
-
- if (sflag) { /* add suffix */
- new = newbuf;
- (void) strcpy(new, key);
- (void) strcat(new, pe->psuf);
- } else
- new = key;
- new = strsave(new);
- for (i = pe->pdirs; i > loc; --i)
- pe->pdir[i] = pe->pdir[i-1];
- if (loc > pe->pdirs)
- loc = pe->pdirs;
- pe->pdir[loc] = new;
- pe->pdirs++;
-}
-
-/***********************************************
- *** D E L E T E A P A T H N A M E ***
- ***********************************************/
-
-static void
-dcmd(path) /* delete path */
-char *path;
-{
- register int n;
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- n = locate(pe, path);
- if (n >= 0)
- delete(pe, n);
- else
- xprintf(CGETS(10, 4, "setpath: %s not found in %s\n"),
- path, pe->pname);
- }
-}
-
-static void
-dncmd(n) /* delete at position n */
-int n;
-{
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- if (n < pe->pdirs)
- delete(pe, n);
- else
- xprintf(CGETS(10, 5,
- "setpath: %d not valid position in %s\n"),
- n, pe->pname);
- }
-}
-
-static void
-delete(pe, n)
-register struct pelem *pe;
-int n;
-{
- register int d;
-
- xfree((ptr_t) (pe->pdir[n]));
- for (d = n; d < pe->pdirs - 1; d++)
- pe->pdir[d] = pe->pdir[d+1];
- --pe->pdirs;
-}
-
-/***********************************************
- *** C H A N G E A P A T H N A M E ***
- ***********************************************/
-
-static void
-ccmd(inpath, path) /* change inpath to path */
-char *inpath, *path;
-{
- register int n;
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- n = locate(pe, inpath);
- if (n >= 0)
- change(pe, n, path);
- else
- xprintf(CGETS(10, 4, "setpath: %s not found in %s\n"),
- inpath, pe->pname);
- }
-}
-
-static void
-cncmd(path, n) /* change at position n to path */
-char *path;
-int n;
-{
- register struct pelem *pe;
-
- for (pe = pathhead; pe; pe = pe->pnext) {
- if (n < pe->pdirs)
- change(pe, n, path);
- else
- xprintf(CGETS(10, 5,
- "setpath: %d not valid position in %s\n"),
- n, pe->pname);
- }
-}
-
-static void
-change(pe, loc, key)
-register struct pelem *pe;
-register int loc;
-register char *key;
-{
- register char *new;
- char newbuf[MAXPATHLEN+1];
-
- if (sflag) { /* append suffix */
- new = newbuf;
- (void) strcpy(new, key);
- (void) strcat(new, pe->psuf);
- } else
- new = key;
- new = strsave(new);
- xfree((ptr_t) (pe->pdir[loc]));
- pe->pdir[loc] = new;
-}
-
-/***************************************
- *** F I N D P A T H N A M E ***
- ***************************************/
-
-static int
-locate(pe, key)
-register struct pelem *pe;
-register char *key;
-{
- register int i;
- register char *realkey;
- char keybuf[MAXPATHLEN+1];
-
- if (sflag) {
- realkey = keybuf;
- (void) strcpy(realkey, key);
- (void) strcat(realkey, pe->psuf);
- } else
- realkey = key;
- for (i = 0; i < pe->pdirs; i++)
- if (strcmp(pe->pdir[i], realkey) == 0)
- break;
- return((i < pe->pdirs) ? i : -1);
-}
-#endif