344 lines
7.7 KiB
C
344 lines
7.7 KiB
C
//---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1993-1994
|
|
//
|
|
// File: state.c
|
|
//
|
|
// This file contains the state & .ini file routines
|
|
//
|
|
// History:
|
|
// 08-06-93 ScottH Transferred from twin code
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
///////////////////////////////////////////////////// INCLUDES
|
|
|
|
#include "brfprv.h" // common headers
|
|
|
|
///////////////////////////////////////////////////// TYPEDEFS
|
|
|
|
#ifdef DEBUG
|
|
|
|
// Some of the .ini processing code was pimped from the sync engine.
|
|
//
|
|
|
|
typedef struct _INIKEYHEADER
|
|
{
|
|
LPCTSTR pszSectionName;
|
|
LPCTSTR pszKeyName;
|
|
LPCTSTR pszDefaultRHS;
|
|
} INIKEYHEADER;
|
|
|
|
typedef struct _BOOLINIKEY
|
|
{
|
|
INIKEYHEADER ikh;
|
|
LPUINT puStorage;
|
|
DWORD dwFlag;
|
|
} BOOLINIKEY;
|
|
|
|
typedef struct _INTINIKEY
|
|
{
|
|
INIKEYHEADER ikh;
|
|
LPUINT puStorage;
|
|
} INTINIKEY;
|
|
|
|
#endif
|
|
|
|
|
|
// Some of these macros taken from prefs.h in Pen project...
|
|
//
|
|
#define PutIniIntCmp(idsSection, idsKey, nNewValue, nSave) \
|
|
if ((nNewValue) != (nSave)) PutIniInt(idsSection, idsKey, nNewValue)
|
|
|
|
#define WritePrivateProfileInt(szApp, szKey, i, lpFileName) \
|
|
{TCHAR sz[7]; \
|
|
WritePrivateProfileString(szApp, szKey, SzFromInt(sz, i), lpFileName);}
|
|
|
|
|
|
///////////////////////////////////////////////////// MODULE DATA
|
|
|
|
#ifdef DEBUG
|
|
|
|
#pragma data_seg(DATASEG_PERINSTANCE)
|
|
|
|
// Array of keys with Integer RHSs to be processed by ProcessIniFile()
|
|
|
|
static INTINIKEY s_rgiik[] =
|
|
{
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyTraceFlags, c_szZero },
|
|
&g_uTraceFlags
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyDumpFlags, c_szZero },
|
|
&g_uDumpFlags
|
|
},
|
|
|
|
};
|
|
|
|
// Array of keys with Boolean RHSs to be processed by ProcessIniFile()
|
|
|
|
static BOOLINIKEY s_rgbik[] =
|
|
{
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnOpen, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONOPEN
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnClose, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONCLOSE
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnRunOnce, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONRUNONCE
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnValidate, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONVALIDATE
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnThreadAtt, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONTHREADATT
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnThreadDet, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONTHREADDET
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnProcessAtt, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONPROCESSATT
|
|
},
|
|
|
|
{
|
|
{ c_szIniSecDebugUI, c_szIniKeyBreakOnProcessDet, c_szZero },
|
|
&g_uBreakFlags,
|
|
BF_ONPROCESSDET
|
|
},
|
|
};
|
|
|
|
#pragma data_seg()
|
|
|
|
|
|
/* Boolean TRUE strings used by IsIniYes() (comparison is case-insensitive) */
|
|
|
|
static LPCTSTR s_rgpszTrue[] =
|
|
{
|
|
TEXT("1"),
|
|
TEXT("On"),
|
|
TEXT("True"),
|
|
TEXT("Y"),
|
|
TEXT("Yes")
|
|
};
|
|
|
|
/* Boolean FALSE strings used by IsIniYes() (comparison is case-insensitive) */
|
|
|
|
static LPCTSTR s_rgpszFalse[] =
|
|
{
|
|
TEXT("0"),
|
|
TEXT("Off"),
|
|
TEXT("False"),
|
|
TEXT("N"),
|
|
TEXT("No")
|
|
};
|
|
|
|
#endif // DEBUG
|
|
|
|
|
|
///////////////////////////////////////////////////// PROCEDURES
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Determines whether a string corresponds to a boolean
|
|
TRUE value.
|
|
Returns: The boolean value (TRUE or FALSE)
|
|
Cond: --
|
|
*/
|
|
BOOL PRIVATE IsIniYes(
|
|
LPCTSTR psz)
|
|
{
|
|
int i;
|
|
BOOL bNotFound = TRUE;
|
|
BOOL bResult;
|
|
|
|
ASSERT(psz);
|
|
|
|
/* Is the value TRUE? */
|
|
|
|
for (i = 0; i < ARRAYSIZE(s_rgpszTrue); i++)
|
|
{
|
|
if (IsSzEqual(psz, s_rgpszTrue[i]))
|
|
{
|
|
bResult = TRUE;
|
|
bNotFound = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Is the value FALSE? */
|
|
|
|
if (bNotFound)
|
|
{
|
|
for (i = 0; i < ARRAYSIZE(s_rgpszFalse); i++)
|
|
{
|
|
if (IsSzEqual(psz, s_rgpszFalse[i]))
|
|
{
|
|
bResult = FALSE;
|
|
bNotFound = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* Is the value a known string? */
|
|
|
|
if (bNotFound)
|
|
{
|
|
/* No. Whine about it. */
|
|
|
|
DEBUG_MSG(TF_WARNING, TEXT("IsIniYes() called on unknown Boolean RHS '%s'."), psz);
|
|
bResult = FALSE;
|
|
}
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Process keys with boolean RHSs.
|
|
Returns: --
|
|
Cond: --
|
|
*/
|
|
void PRIVATE ProcessBooleans(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAYSIZE(s_rgbik); i++)
|
|
{
|
|
DWORD dwcbKeyLen;
|
|
TCHAR szRHS[MAXBUFLEN];
|
|
BOOLINIKEY * pbik = &(s_rgbik[i]);
|
|
LPCTSTR lpcszRHS;
|
|
|
|
/* Look for key. */
|
|
|
|
dwcbKeyLen = GetPrivateProfileString(pbik->ikh.pszSectionName,
|
|
pbik->ikh.pszKeyName, TEXT(""), szRHS,
|
|
ARRAYSIZE(szRHS), c_szIniFile);
|
|
|
|
if (dwcbKeyLen)
|
|
lpcszRHS = szRHS;
|
|
else
|
|
lpcszRHS = pbik->ikh.pszDefaultRHS;
|
|
|
|
if (IsIniYes(lpcszRHS))
|
|
{
|
|
if (IsFlagClear(*(pbik->puStorage), pbik->dwFlag))
|
|
DEBUG_MSG(TF_GENERAL, TEXT("ProcessIniFile(): %s set in %s![%s]."),
|
|
pbik->ikh.pszKeyName,
|
|
c_szIniFile,
|
|
pbik->ikh.pszSectionName);
|
|
|
|
SetFlag(*(pbik->puStorage), pbik->dwFlag);
|
|
}
|
|
else
|
|
{
|
|
if (IsFlagSet(*(pbik->puStorage), pbik->dwFlag))
|
|
DEBUG_MSG(TF_GENERAL, TEXT("ProcessIniFile(): %s cleared in %s![%s]."),
|
|
pbik->ikh.pszKeyName,
|
|
c_szIniFile,
|
|
pbik->ikh.pszSectionName);
|
|
|
|
ClearFlag(*(pbik->puStorage), pbik->dwFlag);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Process keys with integer RHSs.
|
|
Returns: --
|
|
Cond: --
|
|
*/
|
|
void PRIVATE ProcessIntegers(void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < ARRAYSIZE(s_rgiik); i++)
|
|
{
|
|
DWORD dwcbKeyLen;
|
|
TCHAR szRHS[MAXBUFLEN];
|
|
INTINIKEY * piik = &(s_rgiik[i]);
|
|
LPCTSTR lpcszRHS;
|
|
|
|
/* Look for key. */
|
|
|
|
dwcbKeyLen = GetPrivateProfileString(piik->ikh.pszSectionName,
|
|
piik->ikh.pszKeyName, TEXT(""), szRHS,
|
|
ARRAYSIZE(szRHS), c_szIniFile);
|
|
|
|
if (dwcbKeyLen)
|
|
lpcszRHS = szRHS;
|
|
else
|
|
lpcszRHS = piik->ikh.pszDefaultRHS;
|
|
|
|
*(piik->puStorage) = AnsiToInt(lpcszRHS);
|
|
|
|
DEBUG_MSG(TF_GENERAL, TEXT("ProcessIniFile(): %s set to %#04x."),
|
|
piik->ikh.pszKeyName, *(piik->puStorage));
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef DEBUG
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Process initialization file
|
|
Returns: TRUE if initialization is successful
|
|
Cond: --
|
|
*/
|
|
BOOL PUBLIC ProcessIniFile(void)
|
|
{
|
|
BOOL bResult = TRUE;
|
|
|
|
// Currently, all integer keys are for DEBUG use only.
|
|
//
|
|
ProcessIntegers();
|
|
|
|
// Currently, all boolean keys are for DEBUG use only.
|
|
//
|
|
ProcessBooleans();
|
|
|
|
return bResult;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Copy user settings to the .ini file
|
|
Returns: TRUE on success
|
|
Cond: --
|
|
*/
|
|
BOOL PUBLIC CommitIniFile(void)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
#endif
|
|
|