ENV.C
上传用户:dcs7469208
上传日期:2010-01-02
资源大小:443k
文件大小:10k
源码类别:

操作系统开发

开发平台:

DOS

  1. /****************************************************************/
  2. /* */
  3. /*       env.c */
  4. /* */
  5. /*     command.com Environment Support  */
  6. /* */
  7. /*   August 9, 1991 */
  8. /* */
  9. /* Copyright (c) 1995 */
  10. /* Pasquale J. Villani */
  11. /* All Rights Reserved */
  12. /* */
  13. /* This file is part of DOS-C. */
  14. /* */
  15. /* DOS-C is free software; you can redistribute it and/or */
  16. /* modify it under the terms of the GNU General Public License */
  17. /* as published by the Free Software Foundation; either version */
  18. /* 2, or (at your option) any later version. */
  19. /* */
  20. /* DOS-C is distributed in the hope that it will be useful, but */
  21. /* WITHOUT ANY WARRANTY; without even the implied warranty of */
  22. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See */
  23. /* the GNU General Public License for more details. */
  24. /* */
  25. /* You should have received a copy of the GNU General Public */
  26. /* License along with DOS-C; see the file COPYING.  If not, */
  27. /* write to the Free Software Foundation, 675 Mass Ave, */
  28. /* Cambridge, MA 02139, USA. */
  29. /****************************************************************/
  30. /* $Log:   C:/dos-c/src/command/env.c_v  $
  31.  * 
  32.  *    Rev 1.3   31 Jan 1998  8:02:22   patv
  33.  * Re-written for improved environment handling.  Also fixed EnvSetVar bug.
  34.  *
  35.  *    Rev 1.2   29 Aug 1996 13:06:52   patv
  36.  * Bug fixes for v0.91b
  37.  *
  38.  *    Rev 1.1   01 Sep 1995 18:04:36   patv
  39.  * First GPL release.
  40.  *
  41.  *    Rev 1.0   02 Jul 1995 10:01:54   patv
  42.  * Initial revision.
  43.  */
  44. /* $EndLog$ */
  45. #include "../../hdr/portab.h"
  46. #include "globals.h"
  47. #include "proto.h"
  48. #ifdef VERSION_STRINGS
  49. static BYTE *RcsId = "$Header:   C:/dos-c/src/command/env.c_v   1.3   31 Jan 1998  8:02:22   patv  $";
  50. #endif
  51. BOOL EnvClearVar(BYTE *pszName);
  52. COUNT EnvSizeUp(VOID);
  53. VOID EnvCopy(BYTE FAR *lpszDest, BYTE FAR *lpszSrc);
  54. COUNT EnvSizeUp(VOID)
  55. {
  56. UWORD uNewEnv;
  57. BOOL bError;
  58. BYTE FAR *lpszSrc = lpEnviron;
  59. COUNT nSize = 0;
  60. while('' != *lpszSrc)
  61. {
  62. while(*lpszSrc)
  63. lpszSrc++, ++nSize;
  64. ++lpszSrc, ++nSize;
  65. }
  66. /* Count the terminating entry */
  67. lpszSrc++, ++nSize;
  68. /* Count the invocation part */
  69. ((UWORD FAR *)lpszSrc)++;
  70. nSize += sizeof(UWORD);
  71. while(*lpszSrc)
  72. lpszSrc++, ++nSize;
  73. /* Count the terminating null ... */
  74. nSize++;
  75. /* and return the count. */
  76. return nSize;
  77. }
  78. BOOL EnvAlloc(COUNT nSize)
  79. {
  80. COUNT nKlicks;
  81. BOOL bError;
  82. UWORD uSeg;
  83. /* Check for error */
  84. if(nSize <= EnvSizeUp())
  85. return FALSE;
  86. /* Do the allocation, then copy the environment */
  87. nKlicks = (nSize + PARASIZE - 1)/PARASIZE;
  88. uSeg = DosAllocMem(nKlicks, (BOOL FAR *)&bError);
  89. if(!bError)
  90. {
  91. EnvCopy(MK_FP(uSeg, 0), lpEnviron);
  92. DosFreeMem(FP_SEG(lpEnviron), &bError);
  93. if(bError)
  94. {
  95. DosFreeMem(uSeg, &bError);
  96. return FALSE;
  97. }
  98. lpEnviron = MK_FP(uSeg, 0);
  99. return TRUE;
  100. }
  101. else
  102. return FALSE;
  103. }
  104. BOOL EnvFree(BYTE FAR *lpMem)
  105. {
  106. UWORD uSeg;
  107. BOOL bError;
  108. uSeg = FP_SEG(lpMem);
  109. DosFreeMem(uSeg, (BOOL FAR *)bError);
  110. return !bError;
  111. }
  112. BYTE *EnvLookup(pszName)
  113. BYTE *pszName;
  114. {
  115. BYTE FAR *lpszString;
  116. static BYTE szNameBuffer[MAX_CMDLINE];
  117. BYTE *pszLclString;
  118. COUNT nNameLen;
  119. strcpy(szNameBuffer, pszName);
  120. nNameLen = strlen(pszName);
  121. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  122. *pszLclString = toupper(*pszLclString);
  123. lpszString = lpEnviron;
  124. while('' != *lpszString)
  125. {
  126. if((0 == fstrncmp(lpszString, (BYTE FAR *)szNameBuffer, nNameLen))
  127. || (0 == fstrncmp(lpszString, (BYTE FAR *)pszName, nNameLen)))
  128. {
  129. /* Match, skip the variable name */
  130. while(*lpszString && '=' != *lpszString)
  131. ++lpszString;
  132. ++lpszString;
  133. /* Now copy var into static buffer */
  134. for(pszLclString = szNameBuffer; *lpszString; )
  135. {
  136. *pszLclString++ = *lpszString++;
  137. }
  138. *pszLclString = '';
  139. return szNameBuffer;
  140. }
  141. else
  142. {
  143. while(*lpszString)
  144. *lpszString++;
  145. ++lpszString;
  146. }
  147. }
  148. return (BYTE *)0;
  149. }
  150. BOOL EnvClearVar(BYTE *pszName)
  151. {
  152. COUNT nNameLen, uArenaSeg;
  153. UWORD uNewEnv;
  154. BYTE FAR *lpszSrc, FAR *lpszDest;
  155. BOOL bError;
  156. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  157. mcb FAR *lpArena;
  158. strcpy(szNameBuffer, pszName);
  159. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  160. *pszLclString = toupper(*pszLclString);
  161. nNameLen = strlen(pszName);
  162. lpszSrc = lpEnviron;
  163. uArenaSeg = FP_SEG(lpEnviron) - 1;
  164. lpArena = MK_FP(uArenaSeg, 0);
  165. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  166. if(bError)
  167. return FALSE;
  168. lpszDest = MK_FP(uNewEnv, 0);
  169. /* Copy the old environment into the new and skip the one we */
  170. /* want to delete. */
  171. while('' != *lpszSrc)
  172. {
  173. if((0 == fstrncmp(lpszSrc, (BYTE FAR *)szNameBuffer, nNameLen))
  174. || (0 == fstrncmp(lpszSrc, (BYTE FAR *)pszName, nNameLen)))
  175. {
  176. /* Match, skip the source */
  177. while(*lpszSrc)
  178. ++lpszSrc;
  179. ++lpszSrc;
  180. }
  181. else
  182. {
  183. while(*lpszSrc)
  184. *lpszDest++ = *lpszSrc++;
  185. ++lpszSrc;
  186. *lpszDest++ = '';
  187. }
  188. }
  189. /* Copy the terminating entry */
  190. *lpszDest++ = *lpszSrc++;
  191. /* Copy the invocation part */
  192. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  193. while(*lpszSrc)
  194. *lpszDest++ = *lpszSrc++;
  195. /* and finally null terminate. */
  196. *lpszDest++ = '';
  197. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  198. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  199. return !bError;
  200. }
  201. VOID EnvCopy(BYTE FAR *lpszDest, BYTE FAR *lpszSrc)
  202. {
  203. UWORD uNewEnv;
  204. BOOL bError;
  205. while('' != *lpszSrc)
  206. {
  207. while(*lpszSrc)
  208. *lpszDest++ = *lpszSrc++;
  209. ++lpszSrc;
  210. *lpszDest++ = '';
  211. }
  212. /* Copy the terminating entry */
  213. *lpszDest++ = *lpszSrc++;
  214. /* Copy the invocation part */
  215. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  216. while(*lpszSrc)
  217. *lpszDest++ = *lpszSrc++;
  218. /* and finally null terminate. */
  219. *lpszDest++ = '';
  220. }
  221. BOOL EnvSetVar(BYTE *pszName, BYTE *pszValue)
  222. {
  223. BYTE *pszOldVal;
  224. /* See if it's already defined.  If it is, then we have a */
  225. /* operation.  Otherwise, we do an append. */
  226. pszOldVal = EnvLookup(pszName);
  227. if(pszOldVal) /* Replace operation */
  228. {
  229. COUNT nSize, nNameLen;
  230. UWORD uEnvSize;
  231. psp FAR *lpPsp;
  232. mcb FAR *lpArena;
  233. UWORD uNewEnv, uArenaSeg;
  234. BYTE FAR *lpszSrc, FAR *lpszDest;
  235. BOOL bError;
  236. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  237. if((strlen(pszName)+strlen(pszValue)+2-strlen(pszOldVal))
  238.  >= EnvSizeUp())
  239. return FALSE;
  240. strcpy(szNameBuffer, pszName);
  241. nNameLen = strlen(szNameBuffer);
  242. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  243. *pszLclString = toupper(*pszLclString);
  244. lpszSrc = lpEnviron;
  245. uArenaSeg = FP_SEG(lpEnviron) - 1;
  246. lpArena = MK_FP(uArenaSeg, 0);
  247. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  248. if(bError)
  249. return FALSE;
  250. lpszDest = MK_FP(uNewEnv, 0);
  251. /* Copy the old environment into the new and append the */
  252. /* new one. */
  253. while('' != *lpszSrc)
  254. {
  255. if((0 == fstrncmp(lpszSrc, (BYTE FAR *)szNameBuffer, nNameLen))
  256. || (0 == fstrncmp(lpszSrc, (BYTE FAR *)pszName, nNameLen)))
  257. {
  258. /* Copy in the new string */
  259. for(pszLclString = szNameBuffer; *pszLclString; )
  260. *lpszDest++ = *pszLclString++;
  261. *lpszDest++ = '=';
  262. for(pszLclString = pszValue; *pszLclString; )
  263. *lpszDest++ = *pszLclString++;
  264. *lpszDest++ = '';
  265. /* Skip past the source */
  266. while(*lpszSrc)
  267. lpszSrc++;
  268. ++lpszSrc;
  269. }
  270. else
  271. {
  272. while(*lpszSrc)
  273. *lpszDest++ = *lpszSrc++;
  274. ++lpszSrc;
  275. *lpszDest++ = '';
  276. }
  277. }
  278. /* Copy the terminating entry */
  279. *lpszDest++ = *lpszSrc++;
  280. /* Copy the invocation part */
  281. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  282. while(*lpszSrc)
  283. *lpszDest++ = *lpszSrc++;
  284. /* and finally null terminate. */
  285. *lpszDest++ = '';
  286. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  287. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  288. return !bError;
  289. }
  290. else /* Append operation */
  291. {
  292. COUNT nSize;
  293. UWORD uEnvSize;
  294. psp FAR *lpPsp;
  295. mcb FAR *lpArena;
  296. UWORD uNewEnv, uArenaSeg;
  297. BYTE FAR *lpszSrc, FAR *lpszDest;
  298. BOOL bError;
  299. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  300. if((strlen(pszName)+strlen(pszValue)+2) >= EnvSizeUp())
  301. return FALSE;
  302. strcpy(szNameBuffer, pszName);
  303. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  304. *pszLclString = toupper(*pszLclString);
  305. lpszSrc = lpEnviron;
  306. uArenaSeg = FP_SEG(lpEnviron) - 1;
  307. lpArena = MK_FP(uArenaSeg, 0);
  308. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  309. if(bError)
  310. return FALSE;
  311. lpszDest = MK_FP(uNewEnv, 0);
  312. /* Copy the old environment into the new and append the */
  313. /* new one. */
  314. while('' != *lpszSrc)
  315. {
  316. while(*lpszSrc)
  317. *lpszDest++ = *lpszSrc++;
  318. ++lpszSrc;
  319. *lpszDest++ = '';
  320. }
  321. /* Append the new one. */
  322. for(pszLclString = szNameBuffer; *pszLclString; )
  323. *lpszDest++ = *pszLclString++;
  324. *lpszDest++ = '=';
  325. for(pszLclString = pszValue; *pszLclString; )
  326. *lpszDest++ = *pszLclString++;
  327. *lpszDest++ = '';
  328. /* Copy the terminating entry */
  329. *lpszDest++ = *lpszSrc++;
  330. /* Copy the invocation part */
  331. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  332. while(*lpszSrc)
  333. *lpszDest++ = *lpszSrc++;
  334. /* and finally null terminate. */
  335. *lpszDest++ = '';
  336. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  337. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  338. return !bError;
  339. }
  340. return TRUE;
  341. }
  342. BOOL EnvDump(VOID)
  343. {
  344. BYTE FAR *lpszEnv;
  345. BYTE *pszLclBuffer;
  346. COUNT nCount;
  347. for(lpszEnv = lpEnviron; *lpszEnv != ''; )
  348. {
  349. static BYTE szBuffer[MAX_CMDLINE];
  350. for(pszLclBuffer = szBuffer, nCount = 0;
  351.  nCount < MAX_CMDLINE; nCount++)
  352. {
  353. *pszLclBuffer++ = *lpszEnv++;
  354. if(!*lpszEnv)
  355. break;
  356. }
  357. *pszLclBuffer++ = '';
  358. ++lpszEnv;
  359. printf("%sn", szBuffer);
  360. }
  361. return TRUE;
  362. }