summaryrefslogtreecommitdiff
path: root/deps/v8/tools/csvparser.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/tools/csvparser.js')
-rw-r--r--deps/v8/tools/csvparser.js106
1 files changed, 65 insertions, 41 deletions
diff --git a/deps/v8/tools/csvparser.js b/deps/v8/tools/csvparser.js
index c7d46b535c..f0f8680cf8 100644
--- a/deps/v8/tools/csvparser.js
+++ b/deps/v8/tools/csvparser.js
@@ -29,50 +29,74 @@
/**
* Creates a CSV lines parser.
*/
-function CsvParser() {
-};
+class CsvParser {
+ /**
+ * Converts \x00 and \u0000 escape sequences in the given string.
+ *
+ * @param {string} input field.
+ **/
+ escapeField(string) {
+ let nextPos = string.indexOf("\\");
+ if (nextPos === -1) return string;
+ let result = string.substring(0, nextPos);
+ // Escape sequences of the form \x00 and \u0000;
+ let endPos = string.length;
+ let pos = 0;
+ while (nextPos !== -1) {
+ let escapeIdentifier = string.charAt(nextPos + 1);
+ pos = nextPos + 2;
+ if (escapeIdentifier == 'n') {
+ result += '\n';
+ nextPos = pos;
+ } else {
+ if (escapeIdentifier == 'x') {
+ // \x00 ascii range escapes consume 2 chars.
+ nextPos = pos + 2;
+ } else {
+ // \u0000 unicode range escapes consume 4 chars.
+ nextPos = pos + 4;
+ }
+ // Convert the selected escape sequence to a single character.
+ let escapeChars = string.substring(pos, nextPos);
+ result += String.fromCharCode(parseInt(escapeChars, 16));
+ }
-/**
- * A regex for matching a CSV field.
- * @private
- */
-CsvParser.CSV_FIELD_RE_ = /^"((?:[^"]|"")*)"|([^,]*)/;
-
-
-/**
- * A regex for matching a double quote.
- * @private
- */
-CsvParser.DOUBLE_QUOTE_RE_ = /""/g;
-
+ // Continue looking for the next escape sequence.
+ pos = nextPos;
+ nextPos = string.indexOf("\\", pos);
+ // If there are no more escape sequences consume the rest of the string.
+ if (nextPos === -1) {
+ result += string.substr(pos);
+ } else if (pos != nextPos) {
+ result += string.substring(pos, nextPos);
+ }
+ }
+ return result;
+ }
-/**
- * Parses a line of CSV-encoded values. Returns an array of fields.
- *
- * @param {string} line Input line.
- */
-CsvParser.prototype.parseLine = function(line) {
- var fieldRe = CsvParser.CSV_FIELD_RE_;
- var doubleQuoteRe = CsvParser.DOUBLE_QUOTE_RE_;
- var pos = 0;
- var endPos = line.length;
- var fields = [];
- 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, '"'));
+ /**
+ * Parses a line of CSV-encoded values. Returns an array of fields.
+ *
+ * @param {string} line Input line.
+ */
+ parseLine(line) {
+ var pos = 0;
+ var endPos = line.length;
+ var fields = [];
+ if (endPos == 0) return fields;
+ let nextPos = 0;
+ while(nextPos !== -1) {
+ nextPos = line.indexOf(',', pos);
+ let field;
+ if (nextPos === -1) {
+ field = line.substr(pos);
} 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);
+ field = line.substring(pos, nextPos);
}
- } while (pos <= endPos);
+ fields.push(this.escapeField(field));
+ pos = nextPos + 1;
+ };
+ return fields
}
- return fields;
-};
+}