Skip to content

Commit f9fe79d

Browse files
Retain escape sequences in lexer, fixes #5 (#21)
Retain escape sequences in lexer, fixes #5 \\ is preserved in Lexer, leaving it to later stages to decide what masking is to be used.
1 parent 6251e96 commit f9fe79d

6 files changed

Lines changed: 11 additions & 15 deletions

File tree

src/main/java/org/z3950/zing/cql/CQLGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private String generate_base_relation() throws MissingParameterException {
204204
private String generate_term() {
205205
switch (rnd.nextInt(10)) {
206206
case 0: return "cat";
207-
case 1: return "\"cat\"";
207+
case 1: return "\"cat\\\""; // A term with both bare quotes and escaped quotes
208208
case 2: return "comp.os.linux";
209209
case 3: return "xml:element";
210210
case 4: return "<xml.element>";

src/main/java/org/z3950/zing/cql/CQLLexer.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,15 @@ else if (comp.equals("<>")) {
6969
//remember quote char
7070
char mark = c;
7171
qi++;
72-
boolean escaped = false;
7372
buf.setLength(0); //reset buffer
74-
while (qi < ql) {
75-
if (!escaped && qs.charAt(qi) == mark) //terminator
76-
break;
77-
if (escaped && strchr("*?^\\", qs.charAt(qi))) //no escaping for d-quote
78-
buf.append("\\");
79-
if (!escaped && qs.charAt(qi) == '\\') { //escape-char
80-
escaped = true;
73+
while (qi < ql && qs.charAt(qi) != mark) {
74+
if (qs.charAt(qi) == '\\') { //escape-char
75+
if (qi == ql - 1) {
76+
break; //unterminated
77+
}
78+
buf.append(qs.charAt(qi));
8179
qi++;
82-
continue;
8380
}
84-
escaped = false; //reset escape
8581
buf.append(qs.charAt(qi));
8682
qi++;
8783
}

src/main/java/org/z3950/zing/cql/CQLTermNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static String maybeQuote(String str) {
229229
str.indexOf('/') != -1 ||
230230
str.indexOf('(') != -1 ||
231231
str.indexOf(')') != -1) {
232-
str = '"' + str.replace("\"", "\\\"") + '"';
232+
str = '"' + str.replaceAll("(?<!\\\\)\"", "\\\\\"") + '"';
233233
}
234234

235235
return str;

src/test/resources/regression/06/03.xcql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
<relation>
44
<value>=</value>
55
</relation>
6-
<term>^cat says "fish"</term>
6+
<term>^cat says \"fish\"</term>
77
</searchClause>

src/test/resources/regression/06/06.xcql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
<relation>
44
<value>=</value>
55
</relation>
6-
<term>^cat*fishdog"horse?</term>
6+
<term>^cat*fishdog\"horse?</term>
77
</searchClause>

src/test/resources/regression/12/01.xcql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
<relation>
44
<value>=</value>
55
</relation>
6-
<term>term\*\?\^</term>
6+
<term>te\rm\*\?\^</term>
77
</searchClause>

0 commit comments

Comments
 (0)