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.
 
 
 
 
 
 

131 lines
3.3 KiB

//*********************************************************************
//* 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;
}