[comp.emacs] Diffs so MicroEMACS 3.9e can set environment vars

karl@sugar.UUCP (11/29/87)

Am I having fun yet?  Here's the context diffs for a new command,
'set-environment', which lets one set environment variables within
uEMACS (you can already read them with the &env function)

Usage: set-environment environment_variable_name value

example:	set-environment HOME "/usr/karl"
cooler example:	set-environment PATH &cat &env PATH ":/usr/local/bin"

Note that the code is well behaved in that it follows the uEMACS #ifdef for
environment variable support, ENVFUNC.  'putenv' is the key library routine that
must exist for this to work.

*** efunc.orig	Sun Nov 29 01:45:11 1987
--- efunc.h	Sun Nov 29 01:51:51 1987
***************
*** 196,197
  #endif
  #if	PROC

--- 196,200 -----
  #endif
+ #if	ENVFUNC
+ extern	int	setenv();		/* set o.s. environment variable */
+ #endif
  #if	PROC
***************
*** 389,390
  	{"set",				setvar},
  #if	CRYPT

--- 392,396 -----
  	{"set",				setvar},
+ #if	ENVFUNC
+ 	{"set-environment",		setenv},
+ #endif
  #if	CRYPT
*** eval.orig	Sat Nov 28 18:36:23 1987
--- eval.c	Sun Nov 29 02:58:08 1987
***************
*** 31,36
  	static char result[2 * NSTRING];	/* string result */
  	char *flook();			/* look file up on path */
  	char *xlat();			/* translate a char string */
  #if	ENVFUNC
  	char *getenv();			/* get environment string */
  #endif

--- 31,37 -----
  	static char result[2 * NSTRING];	/* string result */
  	char *flook();			/* look file up on path */
  	char *xlat();			/* translate a char string */
+ 	int itmp;			/* tmp variable */
  #if	ENVFUNC
  	char *getenv();			/* get environment string */
  #endif
***************
*** 334,339
  	/* and return it */
  	return(status);
  }
  
  findvar(var, vd, size)	/* find a variables type and name */
  

--- 337,384 -----
  	/* and return it */
  	return(status);
  }
+ 
+ #if ENVFUNC
+ int setenv(f, n)		/* set an o.s. environment variable */
+ int f;		/* default flag */
+ int n;		/* numeric arg (can overide prompted value) */
+ {
+ 	register int status;	/* status return */
+ 	VDESC vd;		/* variable num/type */
+ 	char var[NVSIZE+1];	/* name of variable to fetch */
+ 	char value[NSTRING];	/* value to set variable to */
+ 	char *envstr;
+ 
+ 	/* first get the variable to set.. */
+ 	if (clexec == FALSE) {
+ 		status = mlreply("Environment variable to set: ", &var[0], NVSIZE);
+ 		if (status != TRUE)
+ 			return(status);
+ 	} else {	/* macro line argument */
+ 		/* grab token and skip it */
+ 		execstr = token(execstr, var, NVSIZE + 1);
+ 	}
+ 
+ 	/* var contains the variable name text */
+ 
+ 	/* get the value for that variable */
+ 	if (f == TRUE)
+ 		strcpy(value, itoa(n));
+ 	else {
+ 		status = mlreply("Value: ", &value[0], NSTRING);
+ 		if (status != TRUE)
+ 			return(status);
+ 	}
+ 
+ 	/* allocate memory for the new environment variable */
+ 	if ((envstr = malloc(strlen(var) + strlen(value) + 2)) == NULL)
+ 		return(FALSE);
+ 	/* format the environment string */
+ 	sprintf(envstr,"%s=%s",var,value);
+ 	/* and set the appropriate value */
+ 	return(!putenv(envstr));
+ }
+ #endif
  
  findvar(var, vd, size)	/* find a variables type and name */
  

--