public import "ecere"
+public int UnescapeString(char * d, char * s, int len)
+{
+ int j = 0, k = 0;
+ char ch;
+ while(j < len && (ch = s[j]))
+ {
+ switch(ch)
+ {
+ case '\\':
+ switch((ch = s[++j]))
+ {
+ case 'n': d[k] = '\n'; break;
+ case 't': d[k] = '\t'; break;
+ case 'a': d[k] = '\a'; break;
+ case 'b': d[k] = '\b'; break;
+ case 'f': d[k] = '\f'; break;
+ case 'r': d[k] = '\r'; break;
+ case 'v': d[k] = '\v'; break;
+ case '\\': d[k] = '\\'; break;
+ case '\"': d[k] = '\"'; break;
+ case '\'': d[k] = '\''; break;
+ default: d[k] = '\\'; d[k] = ch;
+ }
+ break;
+ default:
+ d[k] = ch;
+ }
+ j++, k++;
+ }
+ d[k] = '\0';
+ return k;
+}
+
// to be moved in ecere?
public class FileHandler
{
char valueQuotes;
int expectedFieldCount;
bool tolerateNewLineInValues;
+ bool escaped;
+ bool lastFieldEndsWithNewLine;
//bool checkNulls;
//bool checkCurlies;
};
virtual void Process()
{
bool quoted = false, status = true;
+ bool escaped = false;
Array<String> values { };
bool started = false;
int start = 0, end = 0;
int readCount = 0;
Array<char> buffer { minAllocSize = 4096 };
- //info.charNum = 0;
+ info.charNum = 0;
info.lineNum = 0;
info.rowNum = 0;
info.fieldNum = 0;
char ch = buffer[c];
if(quoted)
{
- if(ch == options.valueQuotes)
+ // For Git import...
+ bool inTextQuote = false;
+
+ if(options.lastFieldEndsWithNewLine && info.fieldNum == options.expectedFieldCount - 1 && ch == '\"' && info.charNum > 0)
+ inTextQuote = true;
+
+ if(!inTextQuote && !escaped && ch == options.valueQuotes)
{
quoted = false;
end = c;
}
+ if(options.escaped && ch == '\\')
+ escaped = true;
+ else
+ escaped = false;
}
else
{
{
int len = started ? (end-start) : 0;
String value = new char[len+1];
- memcpy(value, &buffer[start], len);
- value[len] = 0;
+ if(options.escaped)
+ UnescapeString(value, &buffer[start], len);
+ else
+ {
+ memcpy(value, &buffer[start], len);
+ value[len] = 0;
+ }
values.Add(value);
}
start = end = 0;
info.rowNum++;
status = OnRowStrings(values);
values.Free();
- //info.charNum = 0;
info.fieldNum = 0;
}
}
end = c+1;
}
}
- //info.charNum++;
+ if(ch == '\r' || ch == '\n')
+ info.charNum = 0;
+ else
+ info.charNum++;
}
}
if(end > start)
{
int len = end-start;
+
String value = new char[len+1];
- memcpy(value, &buffer[start], len);
- value[len] = 0;
+ if(options.escaped)
+ UnescapeString(value, &buffer[start], len);
+ else
+ {
+ memcpy(value, &buffer[start], len);
+ value[len] = 0;
+ }
values.Add(value);
}
if(values.count && status)