/****************************************************************/ /* */ /* env.c */ /* */ /* command.com Environment Support */ /* */ /* August 9, 1991 */ /* */ /* Copyright (c) 1995 */ /* Pasquale J. Villani */ /* All Rights Reserved */ /* */ /* This file is part of DOS-C. */ /* */ /* DOS-C is free software; you can redistribute it and/or */ /* modify it under the terms of the GNU General Public License */ /* as published by the Free Software Foundation; either version */ /* 2, or (at your option) any later version. */ /* */ /* DOS-C is distributed in the hope that it will be useful, but */ /* WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */ /* the GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public */ /* License along with DOS-C; see the file COPYING. If not, */ /* write to the Free Software Foundation, 675 Mass Ave, */ /* Cambridge, MA 02139, USA. */ /****************************************************************/ /* $Logfile: C:/dos-c/src/command/env.c_v $ */ /* * $Log: C:/dos-c/src/command/env.c_v $ * * Rev 1.1 01 Sep 1995 18:04:36 patv * First GPL release. * * Rev 1.0 02 Jul 1995 10:01:54 patv * Initial revision. */ #include "../../hdr/portab.h" #include "globals.h" #include "proto.h" static BYTE *RcsId = "$Header: C:/dos-c/src/command/env.c_v 1.1 01 Sep 1995 18:04:36 patv $"; COUNT EnvSizeUp() { COUNT Size; BYTE FAR *s; for(Size = 0, s = env; *s != '\0'; ) { while(*s != '\0') { ++s; ++Size; } ++s; ++Size; } return Size; } BOOL EnvAlloc(size) COUNT size; { COUNT klicks; BOOL err; UWORD seg; klicks = (size + PARASIZE - 1)/PARASIZE; seg = DosAllocMem(klicks, (BOOL FAR *)&err); if(!err) { BYTE FAR *s, FAR *p; p = MK_FP(seg, 0); for(s = env; *s != '\0'; ) { fstrncpy(p, s, MAX_CMDLINE); while(*s != '\0') ++s; while(*p != '\0') ++p; ++s; ++p; } *p = '\0'; env = MK_FP(seg, 0); return TRUE; } else return FALSE; } BOOL EnvFree(s) BYTE FAR *s; { UWORD seg; BOOL err; seg = FP_SEG(s); DosFreeMem(seg, (BOOL FAR *)err); return !err; } BYTE *EnvLookup(name) BYTE *name; { BYTE FAR *s; BYTE namebuf[MAX_CMDLINE], *p; strcpy(namebuf, name); for(p = namebuf; *p != '\0'; p++) *p = toupper(*p); for(s = env; *s != '\0'; ) { static BYTE buf[MAX_CMDLINE]; BYTE pattern[MAX_CMDLINE], *lp; fstrncpy((BYTE FAR *)buf, s, MAX_CMDLINE); lp = scanspl(buf, pattern, '='); ++lp; if(strcmp(pattern, namebuf) == 0) return lp; while(*s != '\0') ++s; ++s; } return (BYTE *)0; } BOOL EnvClearVar(name) BYTE *name; { BYTE buf[MAX_CMDLINE]; BYTE test_name[MAX_CMDLINE]; BYTE FAR *s, FAR *p; for(p = env; *p != '\0'; ) { fstrncpy((BYTE FAR *)buf, p, MAX_CMDLINE); scanspl(buf, test_name, '='); /* if they compare you have the variable to delete */ if(strcmp(test_name, name) == 0) { /* scan forward til start of next string */ /* start copying until the end */ s = p; while(*s != '\0') s++; s++; while(1) { while(*s != '\0') *p++ = *s++; *p++ = *s++; if(*s == '\0') break; } *p = '\0'; /* Update system PATH immediately */ if(strcmp(name,"PATH") == 0) scopy(dflt_path_string, path); return TRUE; } while(*p != '\0') ++p; ++p; } /* never found the variable to clear */ return FALSE; } BOOL EnvSetVar(name, value) BYTE *name; BYTE *value; { BYTE FAR *s; BYTE namebuf[MAX_CMDLINE], *p; COUNT old_size = 0; strcpy(namebuf, name); /* clear current value, then set new value */ EnvClearVar(name); /* Get to the end of the environment and add the new string (or */ /* the replacement string) to the end. */ for(s = env; *s != '\0'; ) { while(*s != '\0') { ++old_size; ++s; } ++s; ++old_size; } /* Build the new environment string. */ strcat(namebuf, "="); strcat(namebuf, value); /* Let's test to see if we have room. */ if(EnvSize < (old_size + strlen(namebuf) + 1)) return FALSE; /* copy the string to the end (as determined above) */ fstrncpy(s, (BYTE FAR *)namebuf, MAX_CMDLINE); /* Now terminate the environment */ for( ; *s != '\0'; ++s) ; *++s = '\0'; return TRUE; } BOOL EnvDump() { BYTE FAR *s; for(s = env; *s != '\0'; ) { static BYTE buf[MAX_CMDLINE]; fstrncpy((BYTE FAR *)buf, s, MAX_CMDLINE); printf("%s\n",(buf)); while(*s != '\0') ++s; ++s; } return TRUE; }