home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
sysutl
/
dcsetenv.arc
/
ENVVAR.C
next >
Wrap
C/C++ Source or Header
|
1989-02-16
|
2KB
|
119 lines
/* envvar.c -- a collection of routines to modify the parent environment */
/* Originally coded by "Jim Anderson" <bilbo.jta@SEAS.UCLA.EDU> */
/* Modified by "David J. Camp" <david%wubios@wucs1.wustl.edu> */
/*
Routines to maniplate command.com's copy of the environment.
Must be compiled for a large data model (compact, large or huge).
Must use -Zp option.
*/
#include <dos.h>
#include <stddef.h>
#include <stdio.h>
static
char far *
envptr(size)
int *size;
{
struct INT_VEC {
unsigned short off, seg;
} far *intvecs;
struct MCB {
char id;
unsigned int owner;
unsigned int size;
} far *mcb;
struct PSP {
char pad[0x2c];
unsigned short envseg;
} far *psp;
char far *env;
unsigned int cmdpid;
intvecs = (struct INT_VEC far *) 0L;
cmdpid = intvecs[0x2e].seg;
mcb = (struct MCB far *) ((long)(cmdpid - 1) << 16);
do {
mcb = (struct MCB far *) (((long)(FP_SEG(mcb) + mcb->size + 1)) << 16);
} while (mcb->owner != cmdpid && mcb->id == 'M');
if (mcb->owner == cmdpid) {
env = (char far *) ((long)(FP_SEG(mcb) + 1) << 16);
*size = mcb->size * 16;
}
else {
fprintf(stderr, "Cannot find command environment\n");
exit(1);
}
return env;
}
int
msetenv(var,value)
char *var, *value;
{
char *env1, *env2;
char *cp;
int size;
int l;
env1 = env2 = envptr(&size);
l = strlen(var);
strupr(var);
while (*env2)
{
if ((strncmp(var,env2,l) == 0) && (env2[l] == '='))
{
cp = env2 + strlen(env2) + 1;
memcpy (env2, cp, size - (cp - env1));
}
else
{
env2 += strlen (env2) + 1;
}
}
if (strlen(value) == 0)
return(0);
if (size - (env2 - env1) >= l + strlen(value) + 3)
{
strcpy(env2,var);
strcat(env2,"=");
strcat(env2,value);
env2[strlen(env2)+1] = 0;
return(0);
}
return(-1);
}
char far *
mgetenv(var)
char *var;
{
int l;
char *env;
env = envptr(&l);
l = strlen(var);
strupr(var);
while (*env) {
if ((strncmp(env,var,l) == 0) && (env[l] == '='))
return(env + l + 1);
env += strlen(env) + 1;
}
return(NULL);
}