NEWENV.C
Upload User: dcs7469208
Upload Date: 2010-01-02
Package Size: 443k
Code Size: 9k
Category:

OS Develop

Development Platform:

DOS

  1. #include "../../hdr/portab.h"
  2. #include "globals.h"
  3. #include "proto.h"
  4. extern UWORD _psp;
  5. static psp FAR *lpPsp;
  6. static BYTE FAR *lpEnviron;
  7. static mcb FAR *lpArena;
  8. BOOL EnvClearVar(BYTE *pszName);
  9. COUNT EnvSizeUp(VOID);
  10. VOID EnvCopy(BYTE FAR *lpszDest, BYTE FAR *lpszSrc);
  11. void main(int argc, char *argv)
  12. {
  13. UWORD uEnvSize;
  14. lpPsp = (psp FAR *)MK_FP(_psp, 0);
  15. lpEnviron = MK_FP(lpPsp -> ps_environ, 0);
  16. lpArena = MK_FP(lpPsp -> ps_environ - 1, 0);
  17. uEnvSize = lpArena -> m_size;
  18. printf("Starting size = %dn", EnvSizeUp());
  19. EnvClearVar("PATH");
  20. printf("Ending size = %dn", EnvSizeUp());
  21. EnvAlloc(512);
  22. printf("After EnvAlloc(), size = %dn", EnvSizeUp());
  23. printf("COMSPEC = %sn", EnvLookup("COMSPEC"));
  24. printf("EnvDump:n");
  25. EnvDump();
  26. EnvSetVar("PATH", "c:\;c:\dos");
  27. printf("nNew EnvDump:n");
  28. EnvDump();
  29. EnvSetVar("PROMPT", "$n$g");
  30. printf("nFinal EnvDump:n");
  31. EnvDump();
  32. }
  33. BYTE *EnvLookup(pszName)
  34. BYTE *pszName;
  35. {
  36. BYTE FAR *lpszString;
  37. static BYTE szNameBuffer[MAX_CMDLINE];
  38. BYTE *pszLclString;
  39. COUNT nNameLen;
  40. strcpy(szNameBuffer, pszName);
  41. nNameLen = strlen(pszName);
  42. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  43. *pszLclString = toupper(*pszLclString);
  44. lpszString = lpEnviron;
  45. while('' != *lpszString)
  46. {
  47. if(0 == fstrncmp(lpszString, (BYTE FAR *)szNameBuffer, nNameLen))
  48. {
  49. /* Match, skip the variable name */
  50. while(*lpszString && '=' != *lpszString)
  51. ++lpszString;
  52. ++lpszString;
  53. /* Now copy var into static buffer */
  54. for(pszLclString = szNameBuffer; *lpszString; )
  55. {
  56. *pszLclString++ = *lpszString++;
  57. }
  58. *pszLclString = '';
  59. return szNameBuffer;
  60. }
  61. else
  62. {
  63. while(*lpszString)
  64. *lpszString++;
  65. ++lpszString;
  66. }
  67. }
  68. return (BYTE *)0;
  69. }
  70. BOOL EnvClearVar(BYTE *pszName)
  71. {
  72. COUNT nNameLen;
  73. UWORD uNewEnv;
  74. BYTE FAR *lpszSrc, FAR *lpszDest;
  75. BOOL bError;
  76. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  77. strcpy(szNameBuffer, pszName);
  78. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  79. *pszLclString = toupper(*pszLclString);
  80. nNameLen = strlen(pszName);
  81. lpszSrc = lpEnviron;
  82. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  83. if(bError)
  84. return FALSE;
  85. lpszDest = MK_FP(uNewEnv, 0);
  86. /* Copy the old environment into the new and skip the one we */
  87. /* want to delete. */
  88. while('' != *lpszSrc)
  89. {
  90. if(0 == fstrncmp(lpszSrc, (BYTE FAR *)szNameBuffer, nNameLen))
  91. {
  92. /* Match, skip the source */
  93. while(*lpszSrc)
  94. ++lpszSrc;
  95. ++lpszSrc;
  96. }
  97. else
  98. {
  99. while(*lpszSrc)
  100. *lpszDest++ = *lpszSrc++;
  101. ++lpszSrc;
  102. *lpszDest++ = '';
  103. }
  104. }
  105. /* Copy the terminating entry */
  106. *lpszDest++ = *lpszSrc++;
  107. /* Copy the invocation part */
  108. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  109. while(*lpszSrc)
  110. *lpszDest++ = *lpszSrc++;
  111. /* and finally null terminate. */
  112. *lpszDest++ = '';
  113. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  114. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  115. return !bError;
  116. }
  117. VOID EnvCopy(BYTE FAR *lpszDest, BYTE FAR *lpszSrc)
  118. {
  119. UWORD uNewEnv;
  120. BOOL bError;
  121. while('' != *lpszSrc)
  122. {
  123. while(*lpszSrc)
  124. *lpszDest++ = *lpszSrc++;
  125. ++lpszSrc;
  126. *lpszDest++ = '';
  127. }
  128. /* Copy the terminating entry */
  129. *lpszDest++ = *lpszSrc++;
  130. /* Copy the invocation part */
  131. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  132. while(*lpszSrc)
  133. *lpszDest++ = *lpszSrc++;
  134. /* and finally null terminate. */
  135. *lpszDest++ = '';
  136. }
  137. COUNT EnvSizeUp(VOID)
  138. {
  139. UWORD uNewEnv;
  140. BOOL bError;
  141. BYTE FAR *lpszSrc = lpEnviron;
  142. COUNT nSize = 0;
  143. while('' != *lpszSrc)
  144. {
  145. while(*lpszSrc)
  146. lpszSrc++, ++nSize;
  147. ++lpszSrc, ++nSize;
  148. }
  149. /* Count the terminating entry */
  150. lpszSrc++, ++nSize;
  151. /* Count the invocation part */
  152. ((UWORD FAR *)lpszSrc)++;
  153. nSize += sizeof(UWORD);
  154. while(*lpszSrc)
  155. lpszSrc++, ++nSize;
  156. /* Count the terminating null ... */
  157. nSize++;
  158. /* and return the count. */
  159. return nSize;
  160. }
  161. BOOL EnvAlloc(COUNT nSize)
  162. {
  163. COUNT nKlicks;
  164. BOOL bError;
  165. UWORD uSeg;
  166. /* Check for error */
  167. if(nSize <= EnvSizeUp())
  168. return FALSE;
  169. /* Do the allocation, then copy the environment */
  170. nKlicks = (nSize + PARASIZE - 1)/PARASIZE;
  171. uSeg = DosAllocMem(nKlicks, (BOOL FAR *)&bError);
  172. if(!bError)
  173. {
  174. EnvCopy(MK_FP(uSeg, 0), lpEnviron);
  175. DosFreeMem(FP_SEG(lpEnviron), bError);
  176. if(bError)
  177. {
  178. DosFreeMem(uSeg, &bError);
  179. return FALSE;
  180. }
  181. lpEnviron = MK_FP(uSeg, 0);
  182. return TRUE;
  183. }
  184. else
  185. return FALSE;
  186. }
  187. BOOL EnvSetVar(BYTE *pszName, BYTE *pszValue)
  188. {
  189. BYTE *pszOldVal;
  190. /* See if it's already defined.  If it is, then we have a */
  191. /* operation.  Otherwise, we do an append. */
  192. pszOldVal = EnvLookup(pszName);
  193. if(pszOldVal) /* Replace operation */
  194. {
  195. COUNT nSize, nNameLen;
  196. UWORD uEnvSize;
  197. psp FAR *lpPsp;
  198. mcb FAR *lpArena;
  199. UWORD uNewEnv, uArenaSeg;
  200. BYTE FAR *lpszSrc, FAR *lpszDest;
  201. BOOL bError;
  202. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  203. if((strlen(pszName)+strlen(pszValue)+2-strlen(pszOldVal))
  204.  >= EnvSizeUp())
  205. return FALSE;
  206. strcpy(szNameBuffer, pszName);
  207. nNameLen = strlen(szNameBuffer);
  208. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  209. *pszLclString = toupper(*pszLclString);
  210. lpszSrc = lpEnviron;
  211. uArenaSeg = FP_SEG(lpEnviron) - 1;
  212. lpArena = MK_FP(uArenaSeg, 0);
  213. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  214. if(bError)
  215. return FALSE;
  216. lpszDest = MK_FP(uNewEnv, 0);
  217. /* Copy the old environment into the new and append the */
  218. /* new one. */
  219. while('' != *lpszSrc)
  220. {
  221. if(0 == fstrncmp(lpszSrc, (BYTE FAR *)szNameBuffer, nNameLen))
  222. {
  223. /* Copy in the new string */
  224. for(pszLclString = szNameBuffer; *pszLclString; )
  225. *lpszDest++ = *pszLclString++;
  226. *lpszDest++ = '=';
  227. for(pszLclString = pszValue; *pszLclString; )
  228. *lpszDest++ = *pszLclString++;
  229. *lpszDest++ = '';
  230. /* Skip past the source */
  231. while(*lpszSrc)
  232. lpszSrc++;
  233. ++lpszSrc;
  234. }
  235. else
  236. {
  237. while(*lpszSrc)
  238. *lpszDest++ = *lpszSrc++;
  239. ++lpszSrc;
  240. *lpszDest++ = '';
  241. }
  242. }
  243. /* Copy the terminating entry */
  244. *lpszDest++ = *lpszSrc++;
  245. /* Copy the invocation part */
  246. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  247. while(*lpszSrc)
  248. *lpszDest++ = *lpszSrc++;
  249. /* and finally null terminate. */
  250. *lpszDest++ = '';
  251. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  252. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  253. return !bError;
  254. }
  255. else /* Append operation */
  256. {
  257. COUNT nSize;
  258. UWORD uEnvSize;
  259. psp FAR *lpPsp;
  260. mcb FAR *lpArena;
  261. UWORD uNewEnv, uArenaSeg;
  262. BYTE FAR *lpszSrc, FAR *lpszDest;
  263. BOOL bError;
  264. BYTE szNameBuffer[MAX_CMDLINE], *pszLclString;
  265. if((strlen(pszName)+strlen(pszValue)+2) >= EnvSizeUp())
  266. return FALSE;
  267. strcpy(szNameBuffer, pszName);
  268. for(pszLclString = szNameBuffer; *pszLclString != ''; pszLclString++)
  269. *pszLclString = toupper(*pszLclString);
  270. lpszSrc = lpEnviron;
  271. uArenaSeg = FP_SEG(lpEnviron) - 1;
  272. lpArena = MK_FP(uArenaSeg, 0);
  273. uNewEnv = DosAllocMem(lpArena -> m_size, (BOOL FAR *)&bError);
  274. if(bError)
  275. return FALSE;
  276. lpszDest = MK_FP(uNewEnv, 0);
  277. /* Copy the old environment into the new and append the */
  278. /* new one. */
  279. while('' != *lpszSrc)
  280. {
  281. while(*lpszSrc)
  282. *lpszDest++ = *lpszSrc++;
  283. ++lpszSrc;
  284. *lpszDest++ = '';
  285. }
  286. /* Append the new one. */
  287. for(pszLclString = szNameBuffer; *pszLclString; )
  288. *lpszDest++ = *pszLclString++;
  289. *lpszDest++ = '=';
  290. for(pszLclString = pszValue; *pszLclString; )
  291. *lpszDest++ = *pszLclString++;
  292. *lpszDest++ = '';
  293. /* Copy the terminating entry */
  294. *lpszDest++ = *lpszSrc++;
  295. /* Copy the invocation part */
  296. *((UWORD FAR *)lpszDest)++ = *((UWORD FAR *)lpszSrc)++;
  297. while(*lpszSrc)
  298. *lpszDest++ = *lpszSrc++;
  299. /* and finally null terminate. */
  300. *lpszDest++ = '';
  301. EnvCopy(lpEnviron, MK_FP(uNewEnv, 0));
  302. DosFreeMem(uNewEnv, (BOOL FAR *)&bError);
  303. return !bError;
  304. }
  305. return TRUE;
  306. }
  307. BOOL EnvDump(VOID)
  308. {
  309. BYTE FAR *lpszEnv;
  310. BYTE *pszLclBuffer;
  311. COUNT nCount;
  312. for(lpszEnv = lpEnviron; *lpszEnv != ''; )
  313. {
  314. static BYTE szBuffer[MAX_CMDLINE];
  315. for(pszLclBuffer = szBuffer, nCount = 0;
  316.  nCount < MAX_CMDLINE; nCount++)
  317. {
  318. *pszLclBuffer++ = *lpszEnv++;
  319. if(!*lpszEnv)
  320. break;
  321. }
  322. *pszLclBuffer++ = '';
  323. ++lpszEnv;
  324. printf("%sn", szBuffer);
  325. }
  326. return TRUE;
  327. }