mirror of
https://github.com/zxing/zxing.git
synced 2025-02-21 02:55:27 -08:00
Issue #197 : handle escaped backslash preceding terminator
This commit is contained in:
parent
58be32036a
commit
e4ff7d9bb9
|
@ -116,7 +116,7 @@ public abstract class ResultParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static String unescapeBackslash(String escaped) {
|
protected static String unescapeBackslash(String escaped) {
|
||||||
int backslash = escaped.indexOf((int) '\\');
|
int backslash = escaped.indexOf('\\');
|
||||||
if (backslash < 0) {
|
if (backslash < 0) {
|
||||||
return escaped;
|
return escaped;
|
||||||
}
|
}
|
||||||
|
@ -208,13 +208,13 @@ public abstract class ResultParser {
|
||||||
int start = i; // Found the start of a match here
|
int start = i; // Found the start of a match here
|
||||||
boolean more = true;
|
boolean more = true;
|
||||||
while (more) {
|
while (more) {
|
||||||
i = rawText.indexOf((int) endChar, i);
|
i = rawText.indexOf(endChar, i);
|
||||||
if (i < 0) {
|
if (i < 0) {
|
||||||
// No terminating end character? uh, done. Set i such that loop terminates and break
|
// No terminating end character? uh, done. Set i such that loop terminates and break
|
||||||
i = rawText.length();
|
i = rawText.length();
|
||||||
more = false;
|
more = false;
|
||||||
} else if (rawText.charAt(i - 1) == '\\') {
|
} else if (countPrecedingBackslashes(rawText, i) % 2 != 0) {
|
||||||
// semicolon was escaped so continue
|
// semicolon was escaped (odd count of preceding backslashes) so continue
|
||||||
i++;
|
i++;
|
||||||
} else {
|
} else {
|
||||||
// found a match
|
// found a match
|
||||||
|
@ -239,6 +239,18 @@ public abstract class ResultParser {
|
||||||
return matches.toArray(new String[matches.size()]);
|
return matches.toArray(new String[matches.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int countPrecedingBackslashes(CharSequence s, int pos) {
|
||||||
|
int count = 0;
|
||||||
|
for (int i = pos - 1; i >= 0; i--) {
|
||||||
|
if (s.charAt(i) == '\\') {
|
||||||
|
count++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static String matchSinglePrefixedField(String prefix, String rawText, char endChar, boolean trim) {
|
static String matchSinglePrefixedField(String prefix, String rawText, char endChar, boolean trim) {
|
||||||
String[] matches = matchPrefixedField(prefix, rawText, endChar, trim);
|
String[] matches = matchPrefixedField(prefix, rawText, endChar, trim);
|
||||||
return matches == null ? null : matches[0];
|
return matches == null ? null : matches[0];
|
||||||
|
|
|
@ -64,6 +64,11 @@ public final class WifiParsedResultTestCase extends Assert {
|
||||||
doTest("WIFI:S:TenChars;P:hello\\:there;T:WEP;;", "TenChars", "hello:there", "WEP");
|
doTest("WIFI:S:TenChars;P:hello\\:there;T:WEP;;", "TenChars", "hello:there", "WEP");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEscape() {
|
||||||
|
doTest("WIFI:T:WPA;S:test;P:my_password\\\\;;", "test", "my_password\\", "WPA");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given the string contents for the barcode, check that it matches our expectations
|
* Given the string contents for the barcode, check that it matches our expectations
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue