|
|
#include "precomp.h"
#pragma hdrstop
/* File - SYSINICM.C */
extern HWND hwndFrame;
void APIENTRY ConstructSysIniLine(SZ, SZ, SZ); SZ APIENTRY SzNextConfigLine(SZ); SZ APIENTRY SzSysIniEdit(SZ, SZ, SZ, SZ); BOOL APIENTRY FCreateSysIniKeyValue(SZ, SZ, SZ, SZ, CMO); SZ APIENTRY SzCopyBuf(SZ, SZ, int); int APIENTRY Linelenl(SZ);
#define ISWHITE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r')
#define UP_CASE(c) (CHP)(LOBYTE(LOWORD((DWORD)(AnsiUpper((LPSTR)MAKELONG((WORD)(c),0))))))
#define MAX_INF_LINE_LEN (150)
#define ISEOL(c) ((c) == '\n' || (c) == '\r')
#define _CR 0x0D
#define LF 0x0A
/* void ConstructSysIniLine(char*, char*, char*);
* * ENTRY: szSysIniLine, Address of a buffer large enough to hold the * constructed system.ini line. * ProfString, The profile string to be used in constructing * the system.ini line. * NameString, The name of the driver, exe, or any string to * be placed after the profile string in the new * system.ini line. * * EXIT : No exit value, newly constructed system.ini line will reside * in buffer pointed to by szSysIniLine. * ***********************************************************************/ void APIENTRY ConstructSysIniLine(szSysIniLine, szProfString, szNameString) SZ szSysIniLine; SZ szProfString; SZ szNameString; { strcpy(szSysIniLine, szProfString); SzStrCat(szSysIniLine, "="); if (*(szNameString + 1) == ':') SzStrCat(szSysIniLine, (szNameString + 2)); else SzStrCat(szSysIniLine, szNameString); }
/* LPSTR fnNextConfigLine(LPSTR lpFileOffset);
* * Advances Far pointer into config.sys files to the first non-white char * of the next line in the buffer containing the file. Will return null * in the EOF case. * * ENTRY: Far pointer into buffer holding file. * * EXIT: Far pointer into buffer holding file. NULL on EOF. * ***********************************************************************/ SZ APIENTRY SzNextConfigLine(szFileOffset) SZ szFileOffset; { while (!ISEOL(*szFileOffset)) szFileOffset = SzNextChar(szFileOffset);
while (ISWHITE(*szFileOffset) && *szFileOffset != 0) szFileOffset = SzNextChar(szFileOffset);
return(szFileOffset); }
/* BOOL fnSysIniEdit(PSTR szSection,PSTR szSysIniLine);
* * This function will either add or remove an entire line from the * system.ini file. * * ENTRY: szSection, section string, [boot], [system], or [win386] * specifies section from which line will be added to. Ignored * when removing an entry. * * szSysIniLine, buffer containing line to be added to system.ini * file. In the case of RETURN, this buffer will return the line * from system.ini * * EXIT: Returns bool value as to success or failure of function. * ***********************************************************************/ SZ APIENTRY SzSysIniEdit(szFile, szSection, szSysIniLine, szIniBuf) SZ szFile; SZ szSection; SZ szSysIniLine; SZ szIniBuf; { BOOL fResult; SZ szFileOffset; SZ szTo; SZ szNewHead;
szFileOffset = szIniBuf; while (ISWHITE(*szFileOffset) && *szFileOffset != '\0') szFileOffset = SzNextChar(szFileOffset);
if (*szFileOffset == '\0') /* REVIEW should create it */ { EvalAssert(EercErrorHandler(hwndFrame, grcMissingSysIniSectionErr, fTrue, szSection, szFile, 0) == eercAbort); return(NULL); }
while ((szTo = (SZ)SAlloc(strlen(szIniBuf) + strlen(szSysIniLine) + 3)) == (SZ)NULL) if (!FHandleOOM(hwndFrame)) return(NULL);
szNewHead = szTo; fResult = fFalse; while (*szFileOffset != 0 && fResult == fFalse) { if (!strncmp(szSection, SzNextChar(szFileOffset),strlen(szSection))) { szTo = SzCopyBuf(szFileOffset, szTo, Linelenl(szFileOffset)); szTo = SzCopyBuf(szSysIniLine, szTo, strlen(szSysIniLine)); szFileOffset = SzNextConfigLine(szFileOffset); *szTo = _CR; szTo = SzNextChar(szTo); *szTo = LF; szTo = SzNextChar(szTo); SzCopyBuf(szFileOffset, szTo, 0Xffff); SFree(szIniBuf); szIniBuf = szNewHead; fResult = fTrue; continue; } szTo = SzCopyBuf(szFileOffset, szTo, Linelenl(szFileOffset)); szFileOffset = SzNextConfigLine(szFileOffset); }
if (fResult) return(szIniBuf); else { /* REVIEW should create it */ EvalAssert(EercErrorHandler(hwndFrame, grcMissingSysIniSectionErr, fTrue, szSection, szFile, 0) == eercAbort); return(NULL); } }
/*
** Purpose: ** Arguments: ** szFile: a zero terminated string containing the file name for the ** ini file. ** szSect: a zero terminated string containing the name of the section ** in which the key/value pair will be created. ** szKey: the name of the key to be created in the section szSect. ** szValue: the name of the value to be created in conjunction with the ** key szKey in the section szSect. ** cmo: valid command options: ** cmoNone: no effect ** cmoOverwrite: causes the key/value pair to be removed if it ** already exists before creating the key. ** cmoVital: causes the Vital command handler to be called ** if the function fails for any reason. ** Returns: ** fTrue if the function succeeds, fFalse otherwise. ** ****************************************************************************/ BOOL APIENTRY FCreateSysIniKeyValue(SZ szFile, SZ szSect, SZ szKey, SZ szValue, CMO cmo) { struct _stat FileStatus; CHL szSysIniLine[MAX_INF_LINE_LEN]; PFH pfh; SZ szIniBuf; BOOL fVital = cmo & cmoVital; EERC eerc;
while ((pfh = PfhOpenFile(szFile, ofmRead)) == (PFH)NULL) if ((eerc = EercErrorHandler(hwndFrame, grcOpenFileErr, fVital, szFile, 0, 0)) != eercAbort) return(eerc == eercIgnore);
while (_fstat(pfh->iDosfh, &FileStatus)) if ((eerc = EercErrorHandler(hwndFrame, grcReadFileErr, fVital, szFile, 0, 0)) != eercAbort) { EvalAssert(FCloseFile(pfh)); return(eerc == eercIgnore); }
while ((szIniBuf = (SZ)SAlloc((CB)FileStatus.st_size + 1)) == (SZ)NULL) if (!FHandleOOM(hwndFrame)) { EvalAssert(FCloseFile(pfh)); return(!fVital); }
Assert((CB)(FileStatus.st_size) < (CB)(-1)); if ((CB)(FileStatus.st_size) != CbReadFile(pfh, szIniBuf, (CB)(FileStatus.st_size))) { EvalAssert(EercErrorHandler(hwndFrame, grcReadFileErr, fVital, szFile, 0, 0) == eercAbort); SFree(szIniBuf); EvalAssert(FCloseFile(pfh)); return(!fVital); }
*(szIniBuf + FileStatus.st_size) = '\0'; EvalAssert(FCloseFile(pfh));
ConstructSysIniLine((SZ)szSysIniLine, szKey, szValue); if ((szIniBuf = SzSysIniEdit(szFile, szSect, szSysIniLine, szIniBuf)) == (SZ)NULL) { SFree(szIniBuf); return(!fVital); }
while (!(pfh = PfhOpenFile(szFile, ofmCreate))) if ((eerc = EercErrorHandler(hwndFrame, grcOpenFileErr, fVital, szFile, 0, 0)) != eercAbort) { SFree(szIniBuf); return(eerc == eercIgnore); }
if (strlen(szIniBuf) != CbWriteFile(pfh, szIniBuf, strlen(szIniBuf))) { EvalAssert(FCloseFile(pfh)); SFree(szIniBuf); EvalAssert(EercErrorHandler(hwndFrame, grcWriteFileErr, fVital, szFile, 0, 0) == eercAbort); return(!fVital); }
EvalAssert(FCloseFile(pfh)); SFree(szIniBuf);
return(fTrue); }
/* LPSTR NEAR PASCAL fnCopyBuff(LPSTR pFrom, LPSTR pTo);
* * Function moves the remaining contents of a text buffer from one location * within the buffer to a new location within the buffer. This is used to * either remove or make room for an entry in the file buffer. * * ENTRY: pointers To and From designate where the remaining protion of the * buffer will be moved to. The new buffer will be NULL terminated. * * EXIT: Returns pointer to next available char position in the buffer. * ***********************************************************************/ SZ APIENTRY SzCopyBuf(szFrom,szTo,iCnt) SZ szFrom; SZ szTo; int iCnt; { /* REVIEW won't work for DBCS */ while (*szFrom != 0 && iCnt-- != 0) { *szTo = *szFrom; szTo = SzNextChar(szTo); szFrom = SzNextChar(szFrom); }
if (*szFrom == '\0') *szTo = '\0';
return(szTo); }
/* int fnLinelenl(LPSTR)
* * Returns length of buffer line up to and including the LF char. * (far pointer version). * * ENTRY: LPSTR to buffer * EXIT: length of line. * ***********************************************************************/ int APIENTRY Linelenl(szBuf) SZ szBuf; { unsigned i = 1;
while (*szBuf != LF) { szBuf = SzNextChar(szBuf); i++; }
return(i); }
|