132 lines
3.3 KiB
C++
132 lines
3.3 KiB
C++
//*********************************************************************
|
|
//* Microsoft Windows **
|
|
//* Copyright(c) Microsoft Corp., 1994 **
|
|
//*********************************************************************
|
|
|
|
// ############################################################################
|
|
// INCLUDES
|
|
#include "appdefs.h"
|
|
#include "ccsv.h"
|
|
|
|
// ############################################################################
|
|
// DEFINES
|
|
#define chComma L','
|
|
#define chNewline L'\n'
|
|
#define chReturn L'\r'
|
|
|
|
// ############################################################################
|
|
//
|
|
// CCSVFile - simple file i/o for CSV files
|
|
//
|
|
CCSVFile::CCSVFile()
|
|
{
|
|
m_hFile = 0;
|
|
m_iLastRead = 0;
|
|
m_pchLast = m_pchBuf = NULL;
|
|
}
|
|
|
|
// ############################################################################
|
|
CCSVFile::~CCSVFile()
|
|
{
|
|
if(m_hFile)
|
|
CloseHandle(m_hFile);
|
|
|
|
//AssertMsg(!m_hFile, L"CCSV file is still open");
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOLEAN CCSVFile::Open(LPCWSTR pszFileName)
|
|
{
|
|
//AssertMsg(!m_hFile, L"a file is already open.");
|
|
|
|
m_hFile = CreateFile((LPCWSTR)pszFileName,
|
|
GENERIC_READ, FILE_SHARE_READ,
|
|
0, OPEN_EXISTING, 0, 0);
|
|
if (INVALID_HANDLE_VALUE == m_hFile)
|
|
{
|
|
return FALSE;
|
|
}
|
|
m_pchLast = m_pchBuf = NULL;
|
|
return TRUE;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOLEAN CCSVFile::ReadToken(LPWSTR psz, DWORD cchMax)
|
|
{
|
|
LPWSTR pszLast;
|
|
int ch;
|
|
|
|
ch = ChNext();
|
|
if (-1 == ch)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
pszLast = psz + (cchMax - 1);
|
|
while ( psz < pszLast &&
|
|
chComma != ch &&
|
|
chNewline != ch &&
|
|
chReturn != ch &&
|
|
-1 != ch)
|
|
{
|
|
*psz++ = (WCHAR)ch;
|
|
ch = ChNext(); //Read in the next WCHARacter
|
|
}
|
|
|
|
*psz++ = L'\0';
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOLEAN CCSVFile::SkipTillEOL()
|
|
{
|
|
int ch = ChNext();
|
|
if (-1 == ch)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
while ( chNewline != ch &&
|
|
-1 != ch)
|
|
{
|
|
ch = ChNext(); //Read in the next character
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
// ############################################################################
|
|
void CCSVFile::Close(void)
|
|
{
|
|
if (m_hFile)
|
|
CloseHandle(m_hFile);
|
|
|
|
m_hFile = 0;
|
|
}
|
|
|
|
// ############################################################################
|
|
BOOL CCSVFile::FReadInBuffer(void)
|
|
{
|
|
//Read another buffer
|
|
if (!ReadFile(m_hFile, m_rgchBuf, CCSVFILE_BUFFER_SIZE, &m_cchAvail, NULL) || !m_cchAvail)
|
|
return FALSE; //nothing more to read
|
|
|
|
// Convert ANSI to UNICODE
|
|
MultiByteToWideChar(CP_ACP, 0, m_rgchBuf, m_cchAvail, m_rgwchBuf, m_cchAvail);
|
|
|
|
m_pchBuf = m_rgwchBuf;
|
|
m_pchLast = m_pchBuf + m_cchAvail;
|
|
|
|
return TRUE; //success
|
|
}
|
|
|
|
// ############################################################################
|
|
inline int CCSVFile::ChNext(void)
|
|
{
|
|
if (m_pchBuf >= m_pchLast && !FReadInBuffer()) //implies that we finished reading the buffer. Read in some more.
|
|
return -1; //nothing more to read
|
|
|
|
m_iLastRead = *m_pchBuf++;
|
|
return m_iLastRead;
|
|
}
|