rewrite csv parsing code, fix some bugs
authorU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Tue, 23 Feb 2010 13:28:19 +0000 (21:28 +0800)
committerU-QUAN-W4\Administrator <Administrator@QUAN-W4.(none)>
Tue, 23 Feb 2010 13:28:19 +0000 (21:28 +0800)
pgadmin/frm/frmImport.cpp
pgadmin/utils/pgcsvfile.cpp

index 7bcda5660863ac4e8f5041b342b525db55ed087b..3d54646c88a5e14bca2894b619797a32a32985fd 100755 (executable)
@@ -4251,6 +4251,11 @@ bool frmImport::GenCSVSQLData(wxString& rowdatalist, wxString& rowlog, wxString*
                     gridColsSampleData->SetCellTextColour(pvgridrowidx, pvgridcolidx, *wxBLUE);\r
                 }\r
             }*/\r
+            else if (m_colonemptyact[dbcolidx]==IMPEMPTY)\r
+            {\r
+                if (impmode!=IMPORTMODECOPY)\r
+                    rowdatalist.Append(wxT("''"));\r
+            }\r
             else if (m_colonemptyact[dbcolidx]==IMPNULL)\r
             {\r
                 if (impmode==IMPORTMODECOPY)\r
@@ -4601,6 +4606,11 @@ bool frmImport::GenODBCSQLData(wxString& rowvals, wxString& rowlog, SQLWCHAR** o
                         rowvals.Append(wxT("NULL"));\r
                 }\r
             }\r
+            else if (m_colonemptyact[dbcolidx]==IMPEMPTY)\r
+            {\r
+                if (impmode!=IMPORTMODECOPY)\r
+                    rowvals.Append(wxT("''"));\r
+            }\r
             else if (m_colonemptyact[dbcolidx]==IMPDEFAULT)\r
                 rowvals.Append(wxT("DEFAULT"));\r
             else if (m_colonemptyact[dbcolidx]==IMPZERONUMBER)\r
index 347494b111f64a315efa35aa708ecca95b79d216..2685a92888b3c57b3fb9229a60548902ef0ad311 100755 (executable)
@@ -1440,7 +1440,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, boo
                 wxString **parsedvals, size_t *curcolnr, wxFileOffset *rsval, wxString *linedata)\r
 {\r
     wxASSERT(csvdata[*parsedoffset]);\r
-\r
+/*\r
     if (csvdata[*parsedoffset]==LF)\r
     {\r
         *rsval = ++(*parsedoffset);\r
@@ -1463,7 +1463,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, boo
             return parsedvals;\r
         }\r
     }\r
-\r
+*/\r
     int curvallen = 0;\r
     wxString *curval = NULL;\r
 \r
@@ -1661,79 +1661,42 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
 {\r
     wxASSERT(csvdata[*parsedoffset]);\r
 \r
-    if ((m_forcelinebreak || !(*inquotedblk)) && csvdata[*parsedoffset]==LF)\r
-    {\r
-        *inquotedblk = false;\r
-        *incolparsing = false;\r
-        *rsval = ++(*parsedoffset);\r
-        *filelinenum++;\r
-        if (!parsedvals)\r
-        {\r
-            parsedvals = new wxString *[1];\r
-            parsedvals[0] = NULL;\r
-        }\r
-        return parsedvals;\r
-    }\r
-    else if ((m_forcelinebreak || !(*inquotedblk)) && csvdata[*parsedoffset]==CR)\r
-    {\r
-        if (csvdata[(*parsedoffset)+1] || !hasmore)\r
-        {\r
-            (*parsedoffset)++;\r
-            if (csvdata[*parsedoffset]==LF)\r
-                (*parsedoffset)++;\r
-\r
-            *inquotedblk = false;\r
-            *incolparsing = false;\r
-            *rsval = *parsedoffset;\r
-            *filelinenum++;\r
-            if (!parsedvals)\r
-            {\r
-                parsedvals = new wxString *[1];\r
-                parsedvals[0] = NULL;\r
-            }\r
-            return parsedvals;\r
-        }\r
-        else\r
-        {\r
-            *rsval = wxInvalidOffset;\r
-            return parsedvals;\r
-        }\r
-    }\r
-\r
     wxString **parsedarr = parsedvals, **tmparr;\r
     wxString *colval = NULL;\r
     if (parsedvals && *incolparsing)\r
         colval = parsedvals[*curcolnr];\r
 \r
-    wxChar tmpchr;\r
     while (csvdata[*parsedoffset])\r
     {\r
-        tmpchr = csvdata[*parsedoffset];\r
         if (csvdata[*parsedoffset]==LF)\r
         {\r
             if (m_forcelinebreak || !(*inquotedblk))\r
             {\r
-                *inquotedblk = false;\r
                 (*parsedoffset)++;\r
-                *filelinenum++;\r
+                (*filelinenum)++;\r
+                if (!colval)\r
+                    colval = new wxString;\r
                 if (parsedarr)\r
                 {\r
-                    if (!(*incolparsing))\r
+                    if (*incolparsing)\r
+                        *incolparsing = false;\r
+                    else\r
                     {\r
                         tmparr = parsedarr;\r
                         parsedarr = new wxString *[(*curcolnr)+2];\r
                         memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                         delete []tmparr;\r
                         (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
                 }\r
                 else\r
                 {\r
                     parsedarr = new wxString *[1];\r
                     *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
                 }\r
-                parsedarr[*curcolnr] = colval;\r
-                *incolparsing = false;\r
+                *inquotedblk = false;\r
                 *rsval = *parsedoffset;\r
                 return parsedarr;\r
             }\r
@@ -1750,7 +1713,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
         }\r
         else if (csvdata[*parsedoffset]==CR)\r
         {\r
-            if (csvdata[(*parsedoffset)+1] || (!csvdata[(*parsedoffset)+1] && !hasmore))\r
+            if (csvdata[(*parsedoffset)+1] || !hasmore)\r
             {\r
                 *filelinenum++;\r
 \r
@@ -1760,25 +1723,29 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                     if (csvdata[*parsedoffset]==LF)\r
                         (*parsedoffset)++;\r
 \r
+                    if (!colval)\r
+                        colval = new wxString;\r
                     if (parsedarr)\r
                     {\r
-                        if (!(*incolparsing))\r
+                        if (*incolparsing)\r
+                            *incolparsing = false;\r
+                        else\r
                         {\r
                             tmparr = parsedarr;\r
                             parsedarr = new wxString *[(*curcolnr)+2];\r
                             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                             delete []tmparr;\r
                             (*curcolnr)++;\r
+                            parsedarr[*curcolnr] = colval;\r
                         }\r
                     }\r
                     else\r
                     {\r
                         parsedarr = new wxString *[1];\r
                         *curcolnr = (size_t)0;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
-                    parsedarr[*curcolnr] = colval;\r
                     *inquotedblk = false;\r
-                    *incolparsing = false;\r
                     *rsval = *parsedoffset;\r
                     return parsedarr;\r
                 }\r
@@ -1801,6 +1768,8 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
             }\r
             else\r
             {\r
+                if (!colval)\r
+                    colval = new wxString;\r
                 if (parsedarr)\r
                 {\r
                     if (!(*incolparsing))\r
@@ -1810,6 +1779,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                         memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                         delete []tmparr;\r
                         (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
                         *incolparsing = true;\r
                     }\r
                 }\r
@@ -1817,9 +1787,9 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                 {\r
                     parsedarr = new wxString *[1];\r
                     *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
                     *incolparsing = true;\r
                 }\r
-                parsedarr[*curcolnr] = colval;\r
                 *rsval = wxInvalidOffset;\r
                 return parsedvals;\r
             }\r
@@ -1830,7 +1800,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
             {\r
                 if (linedata)\r
                     linedata->Append(csvdata[*parsedoffset]);\r
-                if (colval)\r
+                if (!colval)\r
                     colval = new wxString;\r
                 switch (csvdata[(*parsedoffset)+1])\r
                 {\r
@@ -1861,39 +1831,42 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
             }\r
             else if (hasmore)\r
             {\r
-                if (!(*incolparsing))\r
+                if (!colval)\r
+                    colval = new wxString;\r
+                if (parsedarr)\r
                 {\r
-                    tmparr = parsedarr;\r
-                    parsedarr = new wxString *[(*curcolnr)+2];\r
-                    memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                    delete []tmparr;\r
-                    (*curcolnr)++;\r
+                    if (!(*incolparsing))\r
+                    {\r
+                        tmparr = parsedarr;\r
+                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                        delete []tmparr;\r
+                        (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
+                        *incolparsing = true;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    parsedarr = new wxString *[1];\r
+                    *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
                     *incolparsing = true;\r
                 }\r
-                parsedarr[*curcolnr] = colval;\r
                 *rsval = wxInvalidOffset;\r
                 return parsedarr;\r
             }\r
             else\r
             {\r
-                if (!(*incolparsing))\r
-                {\r
-                    tmparr = parsedarr;\r
-                    parsedarr = new wxString *[(*curcolnr)+2];\r
-                    memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                    delete []tmparr;\r
-                    (*curcolnr)++;\r
-                }\r
-                parsedarr[*curcolnr] = colval;\r
-                *filelinenum++;\r
+                if (linedata)\r
+                    linedata->Append(csvdata[*parsedoffset]);\r
+                if (!colval)\r
+                    colval = new wxString;\r
+                colval->Append(csvdata[*parsedoffset]);\r
                 (*parsedoffset)++;\r
-                *inquotedblk = false;\r
-                *incolparsing = false;\r
-                *rsval = *parsedoffset;\r
-                return parsedarr;\r
             }\r
         }\r
-        else if (m_quotedby && *inquotedblk)\r
+        else if (m_quotedby && (*inquotedblk))\r
         {\r
             if (csvdata[*parsedoffset]==m_quotedby)\r
             {\r
@@ -1906,14 +1879,18 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                     {\r
                         if (linedata)\r
                             linedata->Append(csvdata[*parsedoffset]);\r
+                        if (!colval)\r
+                            colval = new wxString;\r
                         colval->Append(csvdata[*parsedoffset]);\r
                         (*parsedoffset)++;\r
                     }\r
                     else\r
                         *inquotedblk = false;\r
                 }\r
-                else\r
+                else if (hasmore)\r
                 {\r
+                    if (!colval)\r
+                        colval = new wxString;\r
                     if (parsedarr)\r
                     {\r
                         if (!(*incolparsing))\r
@@ -1924,17 +1901,26 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                             delete []tmparr;\r
                             (*curcolnr)++;\r
                             *incolparsing = true;\r
+                            parsedarr[*curcolnr] = colval;\r
                         }\r
                     }\r
                     else\r
                     {\r
                         parsedarr = new wxString *[1];\r
                         *curcolnr = (size_t)0;\r
+                        *incolparsing = true;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
-                    parsedarr[*curcolnr] = colval;\r
                     *rsval = wxInvalidOffset;\r
                     return parsedarr;\r
                 }\r
+                else\r
+                {\r
+                    if (linedata)\r
+                        linedata->Append(csvdata[*parsedoffset]);\r
+                    (*parsedoffset)++;\r
+                    *inquotedblk = false;\r
+                }\r
             }\r
             else\r
             {\r
@@ -1946,185 +1932,157 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                 (*parsedoffset)++;\r
             }\r
         }\r
-        else\r
+        else if (m_quotedby && csvdata[*parsedoffset]==m_quotedby)\r
         {\r
-            if (m_quotedby && csvdata[*parsedoffset]==m_quotedby)\r
+            if (csvdata[(*parsedoffset)+1]==m_quotedby)\r
             {\r
-                if (linedata)\r
-                    linedata->Append(csvdata[*parsedoffset]);\r
-\r
-                if (csvdata[(*parsedoffset)+1]==m_quotedby)\r
+                if (csvdata[(*parsedoffset)+2])\r
                 {\r
-                    if (csvdata[(*parsedoffset)+2])\r
+                    if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0])\r
                     {\r
-                        if (m_chardlmvals && csvdata[(*parsedoffset)+2]==m_chardlmvals[0])\r
+                        size_t dlmidx = (size_t)1;\r
+                        while (m_chardlmvals[dlmidx])\r
                         {\r
-                            size_t dlmidx = (size_t)1;\r
-                            while (m_chardlmvals[dlmidx])\r
-                            {\r
-                                if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx])\r
-                                    break;\r
-                                dlmidx++;\r
-                            }\r
-                            if (m_chardlmvals[dlmidx])\r
+                            if (csvdata[(*parsedoffset)+dlmidx+2]!=m_chardlmvals[dlmidx])\r
+                                break;\r
+                            dlmidx++;\r
+                        }\r
+                        if (m_chardlmvals[dlmidx])\r
+                        {\r
+                            if (csvdata[(*parsedoffset)+dlmidx+2])\r
                             {\r
-                                if (csvdata[(*parsedoffset)+dlmidx+2])\r
+                                if (linedata)\r
+                                    linedata->Append(csvdata[*parsedoffset], 2);\r
+                                if (!colval)\r
+                                    colval = new wxString;\r
+                                colval->Append(csvdata[*parsedoffset]);\r
+                                (*parsedoffset)++;\r
+                                (*parsedoffset)++;\r
+                                while (dlmidx--)\r
                                 {\r
                                     if (linedata)\r
-                                        linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                                    if (!colval)\r
-                                        colval = new wxString;\r
+                                        linedata->Append(csvdata[*parsedoffset]);\r
                                     colval->Append(csvdata[*parsedoffset]);\r
                                     (*parsedoffset)++;\r
-                                    (*parsedoffset)++;\r
-                                    while (dlmidx--)\r
+                                }\r
+                            }\r
+                            else if (hasmore)\r
+                            {\r
+                                if (!colval)\r
+                                    colval = new wxString;\r
+                                if (parsedarr)\r
+                                {\r
+                                    if (!(*incolparsing))\r
                                     {\r
-                                        if (linedata)\r
-                                            linedata->Append(csvdata[*parsedoffset]);\r
-                                        colval->Append(csvdata[(*parsedoffset)++]);\r
+                                        tmparr = parsedarr;\r
+                                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                                        delete []tmparr;\r
+                                        (*curcolnr)++;\r
+                                        parsedarr[*curcolnr] = colval;\r
+                                        *incolparsing = true;\r
                                     }\r
                                 }\r
                                 else\r
                                 {\r
-                                    if (parsedarr)\r
-                                    {\r
-                                        if (!(*incolparsing))\r
-                                        {\r
-                                            tmparr = parsedarr;\r
-                                            parsedarr = new wxString *[(*curcolnr)+2];\r
-                                            memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                            delete []tmparr;\r
-                                            (*curcolnr)++;\r
-                                            *incolparsing = true;\r
-                                        }\r
-                                    }\r
-                                    else\r
-                                    {\r
-                                        parsedarr = new wxString *[1];\r
-                                        *curcolnr = (size_t)0;\r
-                                    }\r
+                                    parsedarr = new wxString *[1];\r
+                                    *curcolnr = (size_t)0;\r
                                     parsedarr[*curcolnr] = colval;\r
-                                    if (hasmore)\r
-                                        *rsval = wxInvalidOffset;\r
-                                    else\r
-                                    {\r
-                                        *parsedoffset += dlmidx + 2;\r
-                                        *rsval = *parsedoffset;\r
-                                    }\r
-                                    return parsedarr;\r
+                                    *incolparsing = true;\r
                                 }\r
+                                *rsval = wxInvalidOffset;\r
+\r
+                                return parsedarr;\r
                             }\r
                             else\r
                             {\r
-                                if (colval)\r
-                                    colval->Append(csvdata[*parsedoffset]);\r
-                                else\r
+                                if (linedata)\r
+                                    linedata->Append(csvdata[*parsedoffset], 2);\r
+                                if (!colval)\r
                                     colval = new wxString;\r
+                                colval->Append(csvdata[*parsedoffset]);\r
+                                (*parsedoffset)++;\r
+                                (*parsedoffset)++;\r
+                                if (linedata)\r
+                                    linedata->Append(csvdata+(*parsedoffset));\r
+                                colval->Append(csvdata+(*parsedoffset));\r
 \r
                                 if (parsedarr)\r
                                 {\r
-                                    if (!(*incolparsing))\r
+                                    if (*incolparsing)\r
+                                        *incolparsing = false;\r
+                                    else\r
                                     {\r
                                         tmparr = parsedarr;\r
                                         parsedarr = new wxString *[(*curcolnr)+2];\r
                                         memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                                         delete []tmparr;\r
                                         (*curcolnr)++;\r
+                                        parsedarr[*curcolnr] = colval;\r
                                     }\r
-                                    else\r
-                                        *incolparsing = false;\r
                                 }\r
                                 else\r
                                 {\r
                                     parsedarr = new wxString *[1];\r
                                     *curcolnr = (size_t)0;\r
+                                    parsedarr[*curcolnr] = colval;\r
                                 }\r
-                                parsedarr[*curcolnr] = colval;\r
-                                colval = NULL;\r
-                                *parsedoffset += dlmidx + 2;\r
-                                if (linedata)\r
-                                    linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
+\r
+                                *parsedoffset += dlmidx;\r
+                                *rsval = *parsedoffset;\r
+\r
+                                return parsedarr;\r
                             }\r
                         }\r
                         else\r
                         {\r
-                            if (linedata)\r
-                                linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
                             if (!colval)\r
                                 colval = new wxString;\r
-                            colval->Append(csvdata[*parsedoffset]);\r
-                            (*parsedoffset)++;\r
-                            (*parsedoffset)++;\r
-                        }\r
-                    }\r
-                    else if (hasmore)\r
-                    {\r
-                        if (linedata)\r
-                            linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
-                        if (!colval)\r
-                            colval = new wxString;\r
-                        colval->Append(csvdata[*parsedoffset]);\r
-                        (*parsedoffset)++;\r
-                        (*parsedoffset)++;\r
-                        if (parsedarr)\r
-                        {\r
-                            if (!(*incolparsing))\r
+\r
+                            if (parsedarr)\r
                             {\r
-                                tmparr = parsedarr;\r
-                                parsedarr = new wxString *[(*curcolnr)+2];\r
-                                memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                delete []tmparr;\r
-                                (*curcolnr)++;\r
+                                if (*incolparsing)\r
+                                    *incolparsing = false;\r
+                                else\r
+                                {\r
+                                    tmparr = parsedarr;\r
+                                    parsedarr = new wxString *[(*curcolnr)+2];\r
+                                    memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                                    delete []tmparr;\r
+                                    (*curcolnr)++;\r
+                                    parsedarr[*curcolnr] = colval;\r
+                                }\r
                             }\r
+                            else\r
+                            {\r
+                                parsedarr = new wxString *[1];\r
+                                *curcolnr = (size_t)0;\r
+                                parsedarr[*curcolnr] = colval;\r
+                            }\r
+                            colval = NULL;\r
+                            if (linedata)\r
+                            {\r
+                                linedata->Append(csvdata[*parsedoffset], 2);\r
+                                linedata->Append(m_chardlmvals);\r
+                            }\r
+                            *parsedoffset += dlmidx + 2;\r
                         }\r
-                        else\r
-                        {\r
-                            parsedarr = new wxString *[1];\r
-                            *curcolnr = (size_t)0;\r
-                        }\r
-                        *incolparsing = true;\r
-                        parsedarr[*curcolnr] = colval;\r
-                        *rsval = wxInvalidOffset;\r
-                        return parsedarr;\r
                     }\r
                     else\r
                     {\r
                         if (linedata)\r
-                            linedata->Append(csvdata[*parsedoffset]).Append(csvdata[(*parsedoffset)+1]);\r
+                            linedata->Append(csvdata[*parsedoffset], 2);\r
                         if (!colval)\r
                             colval = new wxString;\r
                         colval->Append(csvdata[*parsedoffset]);\r
                         (*parsedoffset)++;\r
                         (*parsedoffset)++;\r
-                        if (parsedarr)\r
-                        {\r
-                            if (!(*incolparsing))\r
-                            {\r
-                                tmparr = parsedarr;\r
-                                parsedarr = new wxString *[(*curcolnr)+2];\r
-                                memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
-                                delete []tmparr;\r
-                                (*curcolnr)++;\r
-                            }\r
-                        }\r
-                        else\r
-                        {\r
-                            parsedarr = new wxString *[1];\r
-                            *curcolnr = (size_t)0;\r
-                        }\r
-                        *incolparsing = false;\r
-                        parsedarr[*curcolnr] = colval;\r
-                        *rsval = *parsedoffset;\r
-                        return parsedarr;\r
                     }\r
                 }\r
-                else if (csvdata[(*parsedoffset)+1])\r
-                {\r
-                    *inquotedblk = true;\r
-                    (*parsedoffset)++;\r
-                }\r
                 else if (hasmore)\r
                 {\r
+                    if (!colval)\r
+                        colval = new wxString;\r
                     if (parsedarr)\r
                     {\r
                         if (!(*incolparsing))\r
@@ -2134,6 +2092,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                             delete []tmparr;\r
                             (*curcolnr)++;\r
+                            parsedarr[*curcolnr] = colval;\r
                             *incolparsing = true;\r
                         }\r
                     }\r
@@ -2141,17 +2100,21 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                     {\r
                         parsedarr = new wxString *[1];\r
                         *curcolnr = (size_t)0;\r
+                        parsedarr[*curcolnr] = colval;\r
+                        *incolparsing = true;\r
                     }\r
-                    parsedarr[*curcolnr] = colval;\r
                     *rsval = wxInvalidOffset;\r
                     return parsedarr;\r
                 }\r
                 else\r
                 {\r
+                    if (linedata)\r
+                        linedata->Append(csvdata[*parsedoffset], 2);\r
                     if (!colval)\r
                         colval = new wxString;\r
                     colval->Append(csvdata[*parsedoffset]);\r
                     (*parsedoffset)++;\r
+                    (*parsedoffset)++;\r
                     if (parsedarr)\r
                     {\r
                         if (!(*incolparsing))\r
@@ -2161,42 +2124,110 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                             delete []tmparr;\r
                             (*curcolnr)++;\r
-                            *incolparsing = true;\r
+                            parsedarr[*curcolnr] = colval;\r
                         }\r
                     }\r
                     else\r
                     {\r
                         parsedarr = new wxString *[1];\r
                         *curcolnr = (size_t)0;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
-                    parsedarr[*curcolnr] = colval;\r
+                    *incolparsing = false;\r
                     *rsval = *parsedoffset;\r
                     return parsedarr;\r
                 }\r
             }\r
-            else if (m_chardlmvals && csvdata[*parsedoffset]==m_chardlmvals[0])\r
+            else if (csvdata[(*parsedoffset)+1])\r
+            {\r
+                *inquotedblk = true;\r
+                (*parsedoffset)++;\r
+            }\r
+            else if (hasmore)\r
             {\r
-                size_t dlmidx = (size_t)1;\r
-                while (m_chardlmvals[dlmidx])\r
+                if (!colval)\r
+                    colval = new wxString;\r
+                if (parsedarr)\r
                 {\r
-                    if (csvdata[(*parsedoffset)+dlmidx]!=m_chardlmvals[dlmidx])\r
-                        break;\r
-                    dlmidx++;\r
+                    if (!(*incolparsing))\r
+                    {\r
+                        tmparr = parsedarr;\r
+                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                        delete []tmparr;\r
+                        (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
+                        *incolparsing = true;\r
+                    }\r
                 }\r
-                if (m_chardlmvals[dlmidx])\r
+                else\r
                 {\r
-                    if (csvdata[(*parsedoffset)+dlmidx])\r
+                    parsedarr = new wxString *[1];\r
+                    *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
+                    *incolparsing = true;\r
+                }\r
+                *rsval = wxInvalidOffset;\r
+                return parsedarr;\r
+            }\r
+            else\r
+            {\r
+                if (linedata)\r
+                    linedata->Append(csvdata[*parsedoffset]);\r
+                if (!colval)\r
+                    colval = new wxString;\r
+                colval->Append(csvdata[*parsedoffset]);\r
+                (*parsedoffset)++;\r
+                if (parsedarr)\r
+                {\r
+                    if (*incolparsing)\r
+                        *incolparsing = false;\r
+                    else\r
                     {\r
-                        if (!colval)\r
-                            colval = new wxString;\r
-                        while (dlmidx--)\r
-                        {\r
-                            if (linedata)\r
-                                linedata->Append(csvdata[*parsedoffset]);\r
-                            colval->Append(csvdata[(*parsedoffset)++]);\r
-                        }\r
+                        tmparr = parsedarr;\r
+                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                        delete []tmparr;\r
+                        (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
-                    else\r
+                }\r
+                else\r
+                {\r
+                    parsedarr = new wxString *[1];\r
+                    *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
+                }\r
+                *rsval = *parsedoffset;\r
+                return parsedarr;\r
+            }\r
+        }\r
+        else if (m_chardlmvals && csvdata[*parsedoffset]==m_chardlmvals[0])\r
+        {\r
+            size_t dlmidx = (size_t)1;\r
+            while (m_chardlmvals[dlmidx])\r
+            {\r
+                if (csvdata[(*parsedoffset)+dlmidx]!=m_chardlmvals[dlmidx])\r
+                    break;\r
+                dlmidx++;\r
+            }\r
+            if (m_chardlmvals[dlmidx])\r
+            {\r
+                if (csvdata[(*parsedoffset)+dlmidx])\r
+                {\r
+                    if (!colval)\r
+                        colval = new wxString;\r
+                    while (dlmidx--)\r
+                    {\r
+                        if (linedata)\r
+                            linedata->Append(csvdata[*parsedoffset]);\r
+                        colval->Append(csvdata[*parsedoffset]);\r
+                        (*parsedoffset)++;\r
+                    }\r
+                }\r
+                else if (hasmore)\r
+                {\r
+                    if (colval)\r
                     {\r
                         if (parsedarr)\r
                         {\r
@@ -2207,6 +2238,7 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                                 memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                                 delete []tmparr;\r
                                 (*curcolnr)++;\r
+                                parsedarr[*curcolnr] = colval;\r
                                 *incolparsing = true;\r
                             }\r
                         }\r
@@ -2214,20 +2246,25 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                         {\r
                             parsedarr = new wxString *[1];\r
                             *curcolnr = (size_t)0;\r
+                            parsedarr[*curcolnr] = colval;\r
+                            *incolparsing = true;\r
                         }\r
-                        parsedarr[*curcolnr] = colval;\r
-                        if (hasmore)\r
-                            *rsval = wxInvalidOffset;\r
-                        else\r
-                        {\r
-                            *parsedoffset += dlmidx;\r
-                            *rsval = *parsedoffset;\r
-                        }\r
-                        return parsedarr;\r
                     }\r
+\r
+                    *rsval = wxInvalidOffset;\r
+                    return parsedarr;\r
                 }\r
                 else\r
                 {\r
+                    if (!colval)\r
+                        colval = new wxString;\r
+                    while (dlmidx--)\r
+                    {\r
+                        if (linedata)\r
+                            linedata->Append(csvdata[*parsedoffset]);\r
+                        colval->Append(csvdata[*parsedoffset]);\r
+                        (*parsedoffset)++;\r
+                    }\r
                     if (parsedarr)\r
                     {\r
                         if (!(*incolparsing))\r
@@ -2237,32 +2274,58 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
                             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
                             delete []tmparr;\r
                             (*curcolnr)++;\r
+                            parsedarr[*curcolnr] = colval;\r
                         }\r
-                        else\r
-                            *incolparsing = false;\r
                     }\r
                     else\r
                     {\r
                         parsedarr = new wxString *[1];\r
                         *curcolnr = (size_t)0;\r
+                        parsedarr[*curcolnr] = colval;\r
                     }\r
-                    parsedarr[*curcolnr] = colval;\r
-                    colval = NULL;\r
-                    *parsedoffset += dlmidx;\r
-                    if (linedata)\r
-                        linedata->Append(m_chardlmvals);\r
+\r
+                    *incolparsing = false;\r
+                    *rsval = *parsedoffset;\r
+                    return parsedarr;\r
                 }\r
             }\r
             else\r
             {\r
+                if (parsedarr)\r
+                {\r
+                    if (*incolparsing)\r
+                        *incolparsing = false;\r
+                    else\r
+                    {\r
+                        tmparr = parsedarr;\r
+                        parsedarr = new wxString *[(*curcolnr)+2];\r
+                        memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
+                        delete []tmparr;\r
+                        (*curcolnr)++;\r
+                        parsedarr[*curcolnr] = colval;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    parsedarr = new wxString *[1];\r
+                    *curcolnr = (size_t)0;\r
+                    parsedarr[*curcolnr] = colval;\r
+                }\r
+                colval = NULL;\r
+                *parsedoffset += dlmidx;\r
                 if (linedata)\r
-                    linedata->Append(csvdata[*parsedoffset]);\r
-                if (!colval)\r
-                    colval = new wxString;\r
-                colval->Append(csvdata[*parsedoffset]);\r
-                (*parsedoffset)++;\r
+                    linedata->Append(m_chardlmvals);\r
             }\r
         }\r
+        else\r
+        {\r
+            if (linedata)\r
+                linedata->Append(csvdata[*parsedoffset]);\r
+            if (!colval)\r
+                colval = new wxString;\r
+            colval->Append(csvdata[*parsedoffset]);\r
+            (*parsedoffset)++;\r
+        }\r
     }\r
 \r
     if (parsedarr)\r
@@ -2274,16 +2337,27 @@ wxString **pgCSVFile::ParseLine(const wxChar *csvdata, size_t *parsedoffset, con
             memcpy(parsedarr, tmparr, sizeof(parsedarr)*((*curcolnr)+1));\r
             delete []tmparr;\r
             (*curcolnr)++;\r
+            parsedarr[*curcolnr] = colval;\r
         }\r
     }\r
     else\r
     {\r
         parsedarr = new wxString *[1];\r
         *curcolnr = (size_t)0;\r
+        parsedarr[*curcolnr] = colval;\r
     }\r
-    parsedarr[*curcolnr] = colval;\r
-    *incolparsing = true;\r
-    *rsval = wxInvalidOffset;\r
+\r
+    if (hasmore)\r
+    {\r
+        *rsval = wxInvalidOffset;\r
+        *incolparsing = true;\r
+    }\r
+    else\r
+    {\r
+        *rsval = *parsedoffset;\r
+        *incolparsing = false;\r
+    }\r
+\r
     return parsedarr;\r
 }\r
 \r