Rewrite CsvParser.parseLine to make it simpler and gain some performance improvement.

Review URL: http://codereview.chromium.org/548198

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3746 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 9239bbdd
......@@ -77,3 +77,7 @@ assertEquals(
assertEquals(
['code-creation','RegExp','0xf6c21c00','826','NccyrJroXvg\\/([^,]*)'],
parser.parseLine('code-creation,RegExp,0xf6c21c00,826,"NccyrJroXvg\\/([^,]*)"'));
assertEquals(
['code-creation','Function','0x42f0a0','163',''],
parser.parseLine('code-creation,Function,0x42f0a0,163,""'));
......@@ -39,17 +39,17 @@ devtools.profiler.CsvParser = function() {
/**
* A regex for matching a trailing quote.
* A regex for matching a CSV field.
* @private
*/
devtools.profiler.CsvParser.TRAILING_QUOTE_RE_ = /\"$/;
devtools.profiler.CsvParser.CSV_FIELD_RE_ = /^"((?:[^"]|"")*)"|([^,]*)/;
/**
* A regex for matching a double quote.
* @private
*/
devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /""/g;
/**
......@@ -58,41 +58,26 @@ devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_ = /\"\"/g;
* @param {string} line Input line.
*/
devtools.profiler.CsvParser.prototype.parseLine = function(line) {
var insideQuotes = false;
var fieldRe = devtools.profiler.CsvParser.CSV_FIELD_RE_;
var doubleQuoteRe = devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_;
var pos = 0;
var endPos = line.length;
var fields = [];
var prevPos = 0;
for (var i = 0, n = line.length; i < n; ++i) {
switch (line.charAt(i)) {
case ',':
if (!insideQuotes) {
fields.push(line.substring(prevPos, i));
prevPos = i + 1;
}
break;
case '"':
if (!insideQuotes) {
insideQuotes = true;
// Skip the leading quote.
prevPos++;
} else {
if (i + 1 < n && line.charAt(i + 1) != '"') {
insideQuotes = false;
} else {
i++;
}
}
break;
}
}
if (n > 0) {
fields.push(line.substring(prevPos));
}
for (i = 0; i < fields.length; ++i) {
// Eliminate trailing quotes.
fields[i] = fields[i].replace(devtools.profiler.CsvParser.TRAILING_QUOTE_RE_, '');
// Convert quoted quotes into single ones.
fields[i] = fields[i].replace(devtools.profiler.CsvParser.DOUBLE_QUOTE_RE_, '"');
if (endPos > 0) {
do {
var fieldMatch = fieldRe.exec(line.substr(pos));
if (typeof fieldMatch[1] === "string") {
var field = fieldMatch[1];
pos += field.length + 3; // Skip comma and quotes.
fields.push(field.replace(doubleQuoteRe, '"'));
} else {
// The second field pattern will match anything, thus
// in the worst case the match will be an empty string.
var field = fieldMatch[2];
pos += field.length + 1; // Skip comma.
fields.push(field);
}
} while (pos <= endPos);
}
return fields;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment