diff options
| author | cvs2svn <cvs2svn@FreeBSD.org> | 2000-04-20 05:02:31 +0000 | 
|---|---|---|
| committer | cvs2svn <cvs2svn@FreeBSD.org> | 2000-04-20 05:02:31 +0000 | 
| commit | a6b1824f77ae9962ee6540ad8fa3bba94e4e1ff5 (patch) | |
| tree | 3312d5fb150b1be86248b58ee7672ea35f10da2e /contrib/tcsh/ma.setp.c | |
| parent | 959f4c6c47219db2985d7f094a4939407e1386a4 (diff) | |
Notes
Diffstat (limited to 'contrib/tcsh/ma.setp.c')
| -rw-r--r-- | contrib/tcsh/ma.setp.c | 618 | 
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 | 
