311 lines
8.5 KiB
C
311 lines
8.5 KiB
C
#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);
|
|
}
|