Skip to content

Commit

Permalink
sync error-handling split logic with syntax regex and RBQL
Browse files Browse the repository at this point in the history
  • Loading branch information
mechatroner committed Sep 8, 2018
1 parent 240f115 commit a294a47
Showing 1 changed file with 33 additions and 37 deletions.
70 changes: 33 additions & 37 deletions rainbow_utils.js
Original file line number Diff line number Diff line change
@@ -1,48 +1,44 @@
function extract_next_field(src, dlm, preserve_quotes, cidx, result) {
var warning = false;
if (src.charAt(cidx) === '"') {
var uidx = src.indexOf('"', cidx + 1);
while (uidx != -1 && uidx + 1 < src.length && src.charAt(uidx + 1) == '"') {
uidx = src.indexOf('"', uidx + 2);
}
if (uidx != -1 && (uidx + 1 == src.length || src.charAt(uidx + 1) == dlm)) {
if (preserve_quotes) {
result.push(src.substring(cidx, uidx + 1));
} else {
result.push(src.substring(cidx + 1, uidx).replace(/""/g, '"'));
}
return [uidx + 2, false];
}
warning = true;
}
var uidx = src.indexOf(dlm, cidx);
if (uidx == -1)
uidx = src.length;
var field = src.substring(cidx, uidx);
warning = warning || field.indexOf('"') != -1;
result.push(field);
return [uidx + 1, warning];
}


function split_quoted_str(src, dlm, preserve_quotes=false) {
if (src.indexOf('"') == -1)
if (src.indexOf('"') == -1) // Optimization for most common case
return [src.split(dlm), false];
var result = [];
var cidx = 0;
var warning = false;
while (cidx < src.length) {
if (src.charAt(cidx) === '"') {
var uidx = cidx + 1;
while (true) {
uidx = src.indexOf('"', uidx);
if (uidx == -1) {
result.push(src.substring(cidx));
return [result, true];
} else if (uidx + 1 == src.length || src.charAt(uidx + 1) == dlm) {
if (preserve_quotes) {
result.push(src.substring(cidx, uidx + 1));
} else {
result.push(src.substring(cidx + 1, uidx).replace(/""/g, '"'));
}
cidx = uidx + 2;
break;
} else if (src.charAt(uidx + 1) == '"') {
uidx += 2;
continue;
} else {
result.push(src.substring(cidx));
return [result, true];
}
}
} else {
var uidx = src.indexOf(dlm, cidx);
if (uidx == -1)
uidx = src.length;
var field = src.substring(cidx, uidx);
if (field.indexOf('"') != -1) {
result.push(src.substring(cidx));
return [result, true];
}
result.push(field);
cidx = uidx + 1;
}
var extraction_report = extract_next_field(src, dlm, preserve_quotes, cidx, result);
cidx = extraction_report[0];
warning = warning || extraction_report[1];
}
if (src.charAt(src.length - 1) == dlm)
result.push('');
return [result, false];
return [result, warning];
}


Expand Down

0 comments on commit a294a47

Please sign in to comment.