Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

332 lines
7.0 KiB

//+-------------------------------------------------------------------
//
// File: ctext.cxx
//
// Contents: Implementation for CRegTextFile class
//
// Classes: None.
//
// Functions: CRegTextFile::GetString -- get a string & convert to unicode
// CRegTextFile::GetLong -- get a long from the file
//
// History: 18-Dec-91 Ricksa Created
// 19-Mar-92 Rickhi Skip over comment lines in file
//
//--------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <ctext.hxx>
TCHAR CRegTextFile::s_awcSysDir[MAX_PATH];
int CRegTextFile::s_cSysDir = 0;
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::CRegTextFile, public
//
// Synopsis: Open a file
//
// Effects: File is open
//
// Arguments: [pszFile] -- name of file to open
//
// Requires: Nothing.
//
// Returns: Returns pointer to the file opened.
//
// Signals: CException.
//
// Modifies: None.
//
// Derivation: None.
//
// Algorithm: Attempt to open the file & throw an exception if
// the open request fails.
//
// History: 19-Dec-91 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------
CRegTextFile::CRegTextFile(LPSTR pszFile)
{
if (lstrcmpA(pszFile, "") == 0)
{
_fp = stdin;
}
else if ((_fp = fopen(pszFile, "r")) == NULL)
{
printf("Open of file failed %s", pszFile);
}
if (s_cSysDir == 0)
{
// Get the system directory -- we divide by 2 because we want
// cSysDir to be the number of characters *not* the number of
// bytes.
s_cSysDir = GetSystemDirectory(s_awcSysDir, sizeof(s_awcSysDir))
/ sizeof(TCHAR);
}
}
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::~CRegTextFile, public
//
// Synopsis: Destroy object and close the file.
//
// Effects: Object is destroyed.
//
// Arguments: None.
//
// Requires: Valid pointer to CRegTextFile.
//
// Returns: Nothing.
//
// Signals: None.
//
// Modifies: Nothing global.
//
// Derivation: None.
//
// Algorithm: Simply closes the file.
//
// History: 19-Dec-91 Ricksa Created
//
// Notes:
//
//--------------------------------------------------------------------
CRegTextFile::~CRegTextFile(void)
{
if (_fp != stdin)
{
fclose(_fp);
}
}
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::GetString, public
//
// Synopsis: Reads an ASCII string from the
//
// Effects: Outputs a buffer filled with UNICODE text.
//
// Arguments: None.
//
// Requires: Pointer to CRegTextFile object.
//
// Returns: Pointer to a buffer filled with Unicode text.
//
// Signals: CException
//
// Algorithm: Read a line of ASCII text and convert it into
// Unicode and return a pointer to the data.
//
// History: 19-Dec-91 Ricksa Created
//
// Notes: This method is not multithreaded and the output
// buffer will be reset on the next call to GetString.
//
//--------------------------------------------------------------------
LPTSTR
CRegTextFile::GetString(void)
{
do
{
if (fgets(_abuf, sizeof(_abuf), _fp) == NULL)
{
printf("Read of file failed");
}
} while (_abuf[0] == COMMENT_MARK);
int len = lstrlenA(_abuf);
int last = len - 1;
// Hack needed because standard libraries think '\r' is part
// of a string.
if (_abuf[last] == 0x0a)
{
_abuf[last] = '\0';
len = last;
}
#ifdef UNICODE
// Convert to wide characters including trailing null
mbstowcs(_awcbuf, _abuf, len + 1);
#else
memcpy(_awcbuf, _abuf, len+1);
#endif
// return new string
return _awcbuf;
}
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::GetLong
//
// Synopsis: Get a string from a file and convert it to an unsigned long.
//
// Arguments: None.
//
// Requires: Pointer to valid CRegTextFile object.
//
// Returns: ULONG read from file.
//
// Signals: CException.
//
// Algorithm: Read string and covert data to a long.
//
// History: 19-Dec-91 Ricksa Created
//
// Notes: This method does no error checking.
//
//--------------------------------------------------------------------
ULONG
CRegTextFile::GetLong(void)
{
do
{
if (fgets(_abuf, sizeof(_abuf), _fp) == NULL)
{
printf("Read of long failed");
}
} while (_abuf[0] == COMMENT_MARK);
return atol(_abuf);
}
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::GetGUID
//
// Synopsis: Get a string from a file and convert it to a GUID.
//
// Arguments: None.
//
// Returns: a pointer to the GUID in the string buffer.
//
// Signals: CException.
//
// Algorithm: Read string and covert data to a GUID.
//
// History: 19-Dec-91 Ricksa Created
//
// Notes: This is not guaranteed to work in a multithreaded
// environment.
//
//--------------------------------------------------------------------
GUID *
CRegTextFile::GetGUID(void)
{
GUID *pguid = (GUID *) _awcbuf;
do
{
if (fgets(_abuf, sizeof(_abuf), _fp) == NULL)
{
printf("Read of GUID failed");
}
} while (_abuf[0] == COMMENT_MARK);
// Convert the string to a GUID
sscanf(_abuf, "%08lX%04X%04X",
&pguid->Data1, &pguid->Data2, &pguid->Data3);
for (int i = 0; i < 8; i++)
{
int tmp;
sscanf(_abuf + 16 + (i * 2), "%02X", &tmp);
pguid->Data4[i] = (char) tmp;
}
return pguid;
}
//+-------------------------------------------------------------------
//
// Member: CRegTextFile::GetPath
//
// Synopsis: Get a path to a file system object
//
// Returns: a pointer to the path in the string buffer.
//
// Algorithm: Read string and add the system directory
//
// History: 26-Mar-92 Ricksa Created
//
// Notes: This is not guaranteed to work in a multithreaded
// environment.
//
//--------------------------------------------------------------------
LPTSTR
CRegTextFile::GetPath(void)
{
GetString();
if (lstrcmpi(_awcbuf, TEXT("END_OF_FILE")) == 0)
{
return _awcbuf;
}
// Temporary buffer to store result
TCHAR awcTmp[MAX_PATH];
// If the first characters in the string are "@:" we
// want to prepend the string with the system directory.
#ifdef UNICODE
if (wcsnicmp(SYS_DIR_STR, _awcbuf, SYS_DIR_STR_LEN) == 0)
#else
if (strnicmp(SYS_DIR_STR, _awcbuf, SYS_DIR_STR_LEN) == 0)
#endif
{
// Copy in the system directory
lstrcpy(awcTmp, s_awcSysDir);
// Copy in the relative path
lstrcat(awcTmp, _awcbuf + SYS_DIR_STR_LEN);
// Copy whole string to output buffer
lstrcpy(_awcbuf, awcTmp);
}
else if ((_awcbuf[1] != ':') && (_awcbuf[3] != ':') && (_awcbuf[1] != '\\'))
{
// Convert relative path to absolute path based in the current
// directory.
GetCurrentDirectory(sizeof(awcTmp), awcTmp);
// Add a slash to end of the current directory
lstrcat(awcTmp, TEXT("\\"));
// Copy in the relative path
lstrcat(awcTmp, _awcbuf);
// Copy whole string to output buffer
lstrcpy(_awcbuf, awcTmp);
}
return _awcbuf;
}