From 2f5c998b6c94ec1b504b39f8ef5ebd86109ecba9 Mon Sep 17 00:00:00 2001 From: "U-QUAN-W4\\Administrator" Date: Tue, 23 Feb 2010 21:28:19 +0800 Subject: [PATCH] rewrite csv parsing code, fix some bugs --- pgadmin/frm/frmImport.cpp | 10 + pgadmin/utils/pgcsvfile.cpp | 558 ++++++++++++++++++++---------------- 2 files changed, 326 insertions(+), 242 deletions(-) diff --git a/pgadmin/frm/frmImport.cpp b/pgadmin/frm/frmImport.cpp index 7bcda5660..3d54646c8 100755 --- a/pgadmin/frm/frmImport.cpp +++ b/pgadmin/frm/frmImport.cpp @@ -4251,6 +4251,11 @@ bool frmImport::GenCSVSQLData(wxString& rowdatalist, wxString& rowlog, wxString* gridColsSampleData->SetCellTextColour(pvgridrowidx, pvgridcolidx, *wxBLUE); } }*/ + else if (m_colonemptyact[dbcolidx]==IMPEMPTY) + { + if (impmode!=IMPORTMODECOPY) + rowdatalist.Append(wxT("''")); + } else if (m_colonemptyact[dbcolidx]==IMPNULL) { if (impmode==IMPORTMODECOPY) @@ -4601,6 +4606,11 @@ bool frmImport::GenODBCSQLData(wxString& rowvals, wxString& rowlog, SQLWCHAR** o rowvals.Append(wxT("NULL")); } } + else if (m_colonemptyact[dbcolidx]==IMPEMPTY) + { + if (impmode!=IMPORTMODECOPY) + rowvals.Append(wxT("''")); + } else if (m_colonemptyact[dbcolidx]==IMPDEFAULT) rowvals.Append(wxT("DEFAULT")); else if (m_colonemptyact[dbcolidx]==IMPZERONUMBER) diff --git a/pgadmin/utils/pgcsvfile.cpp b/pgadmin/utils/pgcsvfile.cpp index 347494b11..2685a9288 100755 --- a/pgadmin/utils/pgcsvfile.cpp +++ b/pgadmin/utils/pgcsvfile.cpp @@ -1440,7 +1440,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, boo wxString **parsedvals, size_t *curcolnr, wxFileOffset *rsval, wxString *linedata) { wxASSERT(csvdata[*parsedoffset]); - +/* if (csvdata[*parsedoffset]==LF) { *rsval = ++(*parsedoffset); @@ -1463,7 +1463,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, boo return parsedvals; } } - +*/ int curvallen = 0; wxString *curval = NULL; @@ -1661,79 +1661,42 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { wxASSERT(csvdata[*parsedoffset]); - if ((m_forcelinebreak || !(*inquotedblk)) && csvdata[*parsedoffset]==LF) - { - *inquotedblk = false; - *incolparsing = false; - *rsval = ++(*parsedoffset); - *filelinenum++; - if (!parsedvals) - { - parsedvals = new wxString *[1]; - parsedvals[0] = NULL; - } - return parsedvals; - } - else if ((m_forcelinebreak || !(*inquotedblk)) && csvdata[*parsedoffset]==CR) - { - if (csvdata[(*parsedoffset)+1] || !hasmore) - { - (*parsedoffset)++; - if (csvdata[*parsedoffset]==LF) - (*parsedoffset)++; - - *inquotedblk = false; - *incolparsing = false; - *rsval = *parsedoffset; - *filelinenum++; - if (!parsedvals) - { - parsedvals = new wxString *[1]; - parsedvals[0] = NULL; - } - return parsedvals; - } - else - { - *rsval = wxInvalidOffset; - return parsedvals; - } - } - wxString **parsedarr = parsedvals, **tmparr; wxString *colval = NULL; if (parsedvals && *incolparsing) colval = parsedvals[*curcolnr]; - wxChar tmpchr; while (csvdata[*parsedoffset]) { - tmpchr = csvdata[*parsedoffset]; if (csvdata[*parsedoffset]==LF) { if (m_forcelinebreak || !(*inquotedblk)) { - *inquotedblk = false; (*parsedoffset)++; - *filelinenum++; + (*filelinenum)++; + if (!colval) + colval = new wxString; if (parsedarr) { - if (!(*incolparsing)) + if (*incolparsing) + *incolparsing = false; + else { tmparr = parsedarr; parsedarr = new wxString *[(*curcolnr)+2]; memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; } } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; - *incolparsing = false; + *inquotedblk = false; *rsval = *parsedoffset; return parsedarr; } @@ -1750,7 +1713,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con } else if (csvdata[*parsedoffset]==CR) { - if (csvdata[(*parsedoffset)+1] || (!csvdata[(*parsedoffset)+1] && !hasmore)) + if (csvdata[(*parsedoffset)+1] || !hasmore) { *filelinenum++; @@ -1760,25 +1723,29 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con if (csvdata[*parsedoffset]==LF) (*parsedoffset)++; + if (!colval) + colval = new wxString; if (parsedarr) { - if (!(*incolparsing)) + if (*incolparsing) + *incolparsing = false; + else { tmparr = parsedarr; parsedarr = new wxString *[(*curcolnr)+2]; memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; } } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; *inquotedblk = false; - *incolparsing = false; *rsval = *parsedoffset; return parsedarr; } @@ -1801,6 +1768,8 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con } else { + if (!colval) + colval = new wxString; if (parsedarr) { if (!(*incolparsing)) @@ -1810,6 +1779,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; *incolparsing = true; } } @@ -1817,9 +1787,9 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; *incolparsing = true; } - parsedarr[*curcolnr] = colval; *rsval = wxInvalidOffset; return parsedvals; } @@ -1830,7 +1800,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { if (linedata) linedata->Append(csvdata[*parsedoffset]); - if (colval) + if (!colval) colval = new wxString; switch (csvdata[(*parsedoffset)+1]) { @@ -1861,39 +1831,42 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con } else if (hasmore) { - if (!(*incolparsing)) + if (!colval) + colval = new wxString; + if (parsedarr) { - tmparr = parsedarr; - parsedarr = new wxString *[(*curcolnr)+2]; - memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); - delete []tmparr; - (*curcolnr)++; + if (!(*incolparsing)) + { + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; + *incolparsing = true; + } + } + else + { + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; *incolparsing = true; } - parsedarr[*curcolnr] = colval; *rsval = wxInvalidOffset; return parsedarr; } else { - if (!(*incolparsing)) - { - tmparr = parsedarr; - parsedarr = new wxString *[(*curcolnr)+2]; - memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); - delete []tmparr; - (*curcolnr)++; - } - parsedarr[*curcolnr] = colval; - *filelinenum++; + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + if (!colval) + colval = new wxString; + colval->Append(csvdata[*parsedoffset]); (*parsedoffset)++; - *inquotedblk = false; - *incolparsing = false; - *rsval = *parsedoffset; - return parsedarr; } } - else if (m_quotedby && *inquotedblk) + else if (m_quotedby && (*inquotedblk)) { if (csvdata[*parsedoffset]==m_quotedby) { @@ -1906,14 +1879,18 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { if (linedata) linedata->Append(csvdata[*parsedoffset]); + if (!colval) + colval = new wxString; colval->Append(csvdata[*parsedoffset]); (*parsedoffset)++; } else *inquotedblk = false; } - else + else if (hasmore) { + if (!colval) + colval = new wxString; if (parsedarr) { if (!(*incolparsing)) @@ -1924,17 +1901,26 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con delete []tmparr; (*curcolnr)++; *incolparsing = true; + parsedarr[*curcolnr] = colval; } } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + *incolparsing = true; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; *rsval = wxInvalidOffset; return parsedarr; } + else + { + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + *inquotedblk = false; + } } else { @@ -1946,185 +1932,157 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con (*parsedoffset)++; } } - else + else if (m_quotedby && csvdata[*parsedoffset]==m_quotedby) { - if (m_quotedby && csvdata[*parsedoffset]==m_quotedby) + if (csvdata[(*parsedoffset)+1]==m_quotedby) { - if (linedata) - linedata->Append(csvdata[*parsedoffset]); - - if (csvdata[(*parsedoffset)+1]==m_quotedby) + if (csvdata[(*parsedoffset)+2]) { - if (csvdata[(*parsedoffset)+2]) + if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0]) { - if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0]) + size_t dlmidx = (size_t)1; + while (m_chardlmvals[dlmidx]) { - size_t dlmidx = (size_t)1; - while (m_chardlmvals[dlmidx]) - { - if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx]) - break; - dlmidx++; - } - if (m_chardlmvals[dlmidx]) + if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx]) + break; + dlmidx++; + } + if (m_chardlmvals[dlmidx]) + { + if (csvdata[(*parsedoffset)+dlmidx+2]) { - if (csvdata[(*parsedoffset)+dlmidx+2]) + if (linedata) + linedata->Append(csvdata[*parsedoffset], 2); + if (!colval) + colval = new wxString; + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + (*parsedoffset)++; + while (dlmidx--) { if (linedata) - linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]); - if (!colval) - colval = new wxString; + linedata->Append(csvdata[*parsedoffset]); colval->Append(csvdata[*parsedoffset]); (*parsedoffset)++; - (*parsedoffset)++; - while (dlmidx--) + } + } + else if (hasmore) + { + if (!colval) + colval = new wxString; + if (parsedarr) + { + if (!(*incolparsing)) { - if (linedata) - linedata->Append(csvdata[*parsedoffset]); - colval->Append(csvdata[(*parsedoffset)++]); + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; + *incolparsing = true; } } else { - if (parsedarr) - { - if (!(*incolparsing)) - { - tmparr = parsedarr; - parsedarr = new wxString *[(*curcolnr)+2]; - memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); - delete []tmparr; - (*curcolnr)++; - *incolparsing = true; - } - } - else - { - parsedarr = new wxString *[1]; - *curcolnr = (size_t)0; - } + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; parsedarr[*curcolnr] = colval; - if (hasmore) - *rsval = wxInvalidOffset; - else - { - *parsedoffset += dlmidx + 2; - *rsval = *parsedoffset; - } - return parsedarr; + *incolparsing = true; } + *rsval = wxInvalidOffset; + + return parsedarr; } else { - if (colval) - colval->Append(csvdata[*parsedoffset]); - else + if (linedata) + linedata->Append(csvdata[*parsedoffset], 2); + if (!colval) colval = new wxString; + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + (*parsedoffset)++; + if (linedata) + linedata->Append(csvdata+(*parsedoffset)); + colval->Append(csvdata+(*parsedoffset)); if (parsedarr) { - if (!(*incolparsing)) + if (*incolparsing) + *incolparsing = false; + else { tmparr = parsedarr; parsedarr = new wxString *[(*curcolnr)+2]; memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; } - else - *incolparsing = false; } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; - colval = NULL; - *parsedoffset += dlmidx + 2; - if (linedata) - linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]); + + *parsedoffset += dlmidx; + *rsval = *parsedoffset; + + return parsedarr; } } else { - if (linedata) - linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]); if (!colval) colval = new wxString; - colval->Append(csvdata[*parsedoffset]); - (*parsedoffset)++; - (*parsedoffset)++; - } - } - else if (hasmore) - { - if (linedata) - linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]); - if (!colval) - colval = new wxString; - colval->Append(csvdata[*parsedoffset]); - (*parsedoffset)++; - (*parsedoffset)++; - if (parsedarr) - { - if (!(*incolparsing)) + + if (parsedarr) { - tmparr = parsedarr; - parsedarr = new wxString *[(*curcolnr)+2]; - memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); - delete []tmparr; - (*curcolnr)++; + if (*incolparsing) + *incolparsing = false; + else + { + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; + } } + else + { + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + } + colval = NULL; + if (linedata) + { + linedata->Append(csvdata[*parsedoffset], 2); + linedata->Append(m_chardlmvals); + } + *parsedoffset += dlmidx + 2; } - else - { - parsedarr = new wxString *[1]; - *curcolnr = (size_t)0; - } - *incolparsing = true; - parsedarr[*curcolnr] = colval; - *rsval = wxInvalidOffset; - return parsedarr; } else { if (linedata) - linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]); + linedata->Append(csvdata[*parsedoffset], 2); if (!colval) colval = new wxString; colval->Append(csvdata[*parsedoffset]); (*parsedoffset)++; (*parsedoffset)++; - if (parsedarr) - { - if (!(*incolparsing)) - { - tmparr = parsedarr; - parsedarr = new wxString *[(*curcolnr)+2]; - memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); - delete []tmparr; - (*curcolnr)++; - } - } - else - { - parsedarr = new wxString *[1]; - *curcolnr = (size_t)0; - } - *incolparsing = false; - parsedarr[*curcolnr] = colval; - *rsval = *parsedoffset; - return parsedarr; } } - else if (csvdata[(*parsedoffset)+1]) - { - *inquotedblk = true; - (*parsedoffset)++; - } else if (hasmore) { + if (!colval) + colval = new wxString; if (parsedarr) { if (!(*incolparsing)) @@ -2134,6 +2092,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; *incolparsing = true; } } @@ -2141,17 +2100,21 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + *incolparsing = true; } - parsedarr[*curcolnr] = colval; *rsval = wxInvalidOffset; return parsedarr; } else { + if (linedata) + linedata->Append(csvdata[*parsedoffset], 2); if (!colval) colval = new wxString; colval->Append(csvdata[*parsedoffset]); (*parsedoffset)++; + (*parsedoffset)++; if (parsedarr) { if (!(*incolparsing)) @@ -2161,42 +2124,110 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; - *incolparsing = true; + parsedarr[*curcolnr] = colval; } } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; + *incolparsing = false; *rsval = *parsedoffset; return parsedarr; } } - else if (m_chardlmvals && csvdata[*parsedoffset]==m_chardlmvals[0]) + else if (csvdata[(*parsedoffset)+1]) + { + *inquotedblk = true; + (*parsedoffset)++; + } + else if (hasmore) { - size_t dlmidx = (size_t)1; - while (m_chardlmvals[dlmidx]) + if (!colval) + colval = new wxString; + if (parsedarr) { - if (csvdata[(*parsedoffset)+dlmidx]!=m_chardlmvals[dlmidx]) - break; - dlmidx++; + if (!(*incolparsing)) + { + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; + *incolparsing = true; + } } - if (m_chardlmvals[dlmidx]) + else { - if (csvdata[(*parsedoffset)+dlmidx]) + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + *incolparsing = true; + } + *rsval = wxInvalidOffset; + return parsedarr; + } + else + { + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + if (!colval) + colval = new wxString; + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + if (parsedarr) + { + if (*incolparsing) + *incolparsing = false; + else { - if (!colval) - colval = new wxString; - while (dlmidx--) - { - if (linedata) - linedata->Append(csvdata[*parsedoffset]); - colval->Append(csvdata[(*parsedoffset)++]); - } + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; } - else + } + else + { + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + } + *rsval = *parsedoffset; + return parsedarr; + } + } + else if (m_chardlmvals && csvdata[*parsedoffset]==m_chardlmvals[0]) + { + size_t dlmidx = (size_t)1; + while (m_chardlmvals[dlmidx]) + { + if (csvdata[(*parsedoffset)+dlmidx]!=m_chardlmvals[dlmidx]) + break; + dlmidx++; + } + if (m_chardlmvals[dlmidx]) + { + if (csvdata[(*parsedoffset)+dlmidx]) + { + if (!colval) + colval = new wxString; + while (dlmidx--) + { + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + } + } + else if (hasmore) + { + if (colval) { if (parsedarr) { @@ -2207,6 +2238,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; *incolparsing = true; } } @@ -2214,20 +2246,25 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + *incolparsing = true; } - parsedarr[*curcolnr] = colval; - if (hasmore) - *rsval = wxInvalidOffset; - else - { - *parsedoffset += dlmidx; - *rsval = *parsedoffset; - } - return parsedarr; } + + *rsval = wxInvalidOffset; + return parsedarr; } else { + if (!colval) + colval = new wxString; + while (dlmidx--) + { + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + } if (parsedarr) { if (!(*incolparsing)) @@ -2237,32 +2274,58 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; } - else - *incolparsing = false; } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; - colval = NULL; - *parsedoffset += dlmidx; - if (linedata) - linedata->Append(m_chardlmvals); + + *incolparsing = false; + *rsval = *parsedoffset; + return parsedarr; } } else { + if (parsedarr) + { + if (*incolparsing) + *incolparsing = false; + else + { + tmparr = parsedarr; + parsedarr = new wxString *[(*curcolnr)+2]; + memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); + delete []tmparr; + (*curcolnr)++; + parsedarr[*curcolnr] = colval; + } + } + else + { + parsedarr = new wxString *[1]; + *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; + } + colval = NULL; + *parsedoffset += dlmidx; if (linedata) - linedata->Append(csvdata[*parsedoffset]); - if (!colval) - colval = new wxString; - colval->Append(csvdata[*parsedoffset]); - (*parsedoffset)++; + linedata->Append(m_chardlmvals); } } + else + { + if (linedata) + linedata->Append(csvdata[*parsedoffset]); + if (!colval) + colval = new wxString; + colval->Append(csvdata[*parsedoffset]); + (*parsedoffset)++; + } } if (parsedarr) @@ -2274,16 +2337,27 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1)); delete []tmparr; (*curcolnr)++; + parsedarr[*curcolnr] = colval; } } else { parsedarr = new wxString *[1]; *curcolnr = (size_t)0; + parsedarr[*curcolnr] = colval; } - parsedarr[*curcolnr] = colval; - *incolparsing = true; - *rsval = wxInvalidOffset; + + if (hasmore) + { + *rsval = wxInvalidOffset; + *incolparsing = true; + } + else + { + *rsval = *parsedoffset; + *incolparsing = false; + } + return parsedarr; } -- 2.39.5