aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/common/Csv.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-06-27 20:20:51 +0200
committerShauren <shauren.trinity@gmail.com>2021-06-27 20:20:51 +0200
commitb70f34b696c75dee9af1387d2e1536cd9edffa4b (patch)
treec53d89e5c84264d183cea463f6a214f5c0963911 /dep/CascLib/src/common/Csv.cpp
parent0bbf3f7300895008a37796f3d5be7e8f23c9a143 (diff)
Dep/CascLib: Update to ladislav-zezula/CascLib@37a948bdb5f493b6a0959489baa07e1636002c3b
Diffstat (limited to 'dep/CascLib/src/common/Csv.cpp')
-rw-r--r--dep/CascLib/src/common/Csv.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/dep/CascLib/src/common/Csv.cpp b/dep/CascLib/src/common/Csv.cpp
index 40a50ec723b..4afaae10a0a 100644
--- a/dep/CascLib/src/common/Csv.cpp
+++ b/dep/CascLib/src/common/Csv.cpp
@@ -21,7 +21,7 @@ static const CASC_CSV_LINE NullLine;
//-----------------------------------------------------------------------------
// Local functions
-static char * NextLine(char * szLine)
+static char * NextLine_Default(void * /* pvUserData */, char * szLine)
{
// Find the end of the line
while(szLine[0] != 0 && szLine[0] != 0x0A && szLine[0] != 0x0D)
@@ -35,7 +35,7 @@ static char * NextLine(char * szLine)
return (szLine[0] != 0) ? szLine : NULL;
}
-static char * NextColumn(char * szColumn)
+static char * NextColumn_Default(void * /* pvUserData */, char * szColumn)
{
// Find the end of the column
while(szColumn[0] != 0 && szColumn[0] != '|')
@@ -86,6 +86,7 @@ CASC_CSV_LINE::~CASC_CSV_LINE()
bool CASC_CSV_LINE::SetLine(CASC_CSV * pParent, char * szCsvLine)
{
+ CASC_CSV_NEXTPROC PfnNextColumn = pParent->GetNextColumnProc();
char * szCsvColumn;
size_t nHdrColumns = 0;
size_t nColumns = 0;
@@ -99,7 +100,7 @@ bool CASC_CSV_LINE::SetLine(CASC_CSV * pParent, char * szCsvLine)
{
// Get current line and the next one
szCsvColumn = szCsvLine;
- szCsvLine = NextColumn(szCsvLine);
+ szCsvLine = PfnNextColumn(pParent->GetUserData(), szCsvLine);
// Save the current line
Columns[nColumns].szValue = szCsvColumn;
@@ -154,12 +155,17 @@ CASC_CSV::CASC_CSV(size_t nLinesMax, bool bHasHeader)
{
// Initialize the class variables
memset(HashTable, 0xFF, sizeof(HashTable));
+ m_pvUserData = NULL;
m_szCsvFile = NULL;
m_szCsvPtr = NULL;
m_nCsvFile = 0;
m_nLines = 0;
m_bHasHeader = bHasHeader;
+ // Initialize the "NextLine" function that will serve for finding next line in the text
+ PfnNextLine = NextLine_Default;
+ PfnNextColumn = NextColumn_Default;
+
// Nonzero number of lines means a finite CSV handler. The CSV will be loaded at once.
// Zero means that the user needs to call LoadNextLine() and then the line data
if(nLinesMax != 0)
@@ -185,6 +191,21 @@ CASC_CSV::~CASC_CSV()
m_szCsvFile = NULL;
}
+DWORD CASC_CSV::SetNextLineProc(CASC_CSV_NEXTPROC PfnNextLineProc, CASC_CSV_NEXTPROC PfnNextColProc, void * pvUserData)
+{
+ // Set the procedure for next line parsing
+ if(PfnNextLineProc != NULL)
+ PfnNextLine = PfnNextLineProc;
+
+ // Set procedure for next columne parsing
+ if(PfnNextColProc != NULL)
+ PfnNextColumn = PfnNextColProc;
+
+ // Save the user data
+ m_pvUserData = pvUserData;
+ return ERROR_SUCCESS;
+}
+
DWORD CASC_CSV::Load(LPCTSTR szFileName)
{
DWORD cbFileData = 0;
@@ -193,8 +214,7 @@ DWORD CASC_CSV::Load(LPCTSTR szFileName)
m_szCsvFile = (char *)LoadFileToMemory(szFileName, &cbFileData);
if (m_szCsvFile != NULL)
{
- // There is one extra byte reserved by LoadFileToMemory, so we can put zero there
- m_szCsvFile[cbFileData] = 0;
+ // Assign the data to the CSV object
m_szCsvPtr = m_szCsvFile;
m_nCsvFile = cbFileData;
@@ -282,7 +302,7 @@ bool CASC_CSV::LoadNextLine(CASC_CSV_LINE & Line)
char * szCsvLine = m_szCsvPtr;
// Get the next line
- m_szCsvPtr = NextLine(m_szCsvPtr);
+ m_szCsvPtr = PfnNextLine(m_pvUserData, m_szCsvPtr);
// Initialize the line
if (Line.SetLine(this, szCsvLine))