diff options
| author | Leon Clarke <leonclarke@google.com> | 2010-02-03 11:58:03 +0000 |
|---|---|---|
| committer | Leon Clarke <leonclarke@google.com> | 2010-02-03 11:58:03 +0000 |
| commit | 4515c472dc3e5ed2448a564600976759e569a0a8 (patch) | |
| tree | 67d539a5e9fa0e72e2490426693bf73d1e36173f /tools/csvparser.js | |
| parent | d91b9f7d46489a9ee00f9cb415630299c76a502b (diff) | |
| download | android_external_v8-4515c472dc3e5ed2448a564600976759e569a0a8.tar.gz android_external_v8-4515c472dc3e5ed2448a564600976759e569a0a8.tar.bz2 android_external_v8-4515c472dc3e5ed2448a564600976759e569a0a8.zip | |
Update v8 to bleeding_edge revision 3784
Diffstat (limited to 'tools/csvparser.js')
| -rw-r--r-- | tools/csvparser.js | 59 |
1 files changed, 22 insertions, 37 deletions
diff --git a/tools/csvparser.js b/tools/csvparser.js index 9e58deae..6e101e20 100644 --- a/tools/csvparser.js +++ b/tools/csvparser.js @@ -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; }; |
