//+------------------------------------------------------------------- // // 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 #pragma hdrstop #include 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; }