Rewrite CsvParser.parseLine to make it simpler and gain some performance improvement.
authormikhail.naganov@gmail.com <mikhail.naganov@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 29 Jan 2010 13:32:32 +0000 (13:32 +0000)
committermikhail.naganov@gmail.com <mikhail.naganov@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 29 Jan 2010 13:32:32 +0000 (13:32 +0000)
Review URL: http://codereview.chromium.org/548198

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3746 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

test/mjsunit/tools/csvparser.js
tools/csvparser.js

index db3a2eba30e0c66475e8650baeb5b2bea69810e1..6ac490805fbbb8156258680edeebb72346434c4c 100644 (file)
@@ -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,""'));
index 9e58deaea0f5f5710cbf219c19cb8c72fe85ce34..6e101e206b91fccbfaaaf7b3a002363441411857 100644 (file)
@@ -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;
 };