@@ -36,7 +36,7 @@ public int read()
36
36
if (c != '\\' ) {
37
37
return c ;
38
38
}
39
- mark (6 );
39
+ in . mark (6 );
40
40
int val = 0 ;
41
41
for (int i = 0 ; i < 6 ; i ++) {
42
42
esc = in .read ();
@@ -50,40 +50,42 @@ public int read()
50
50
val = (val << 4 ) + (esc - 87 );
51
51
} else if (esc == 10 || esc == 9 || esc == 32 ) { // CSS whitespace.
52
52
// U+000A LINE FEED, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
53
- if ((val > 96 && val < 124 ) || (val > 64 && val < 91 ) || ( val > 47 && val < 58 ) ) {
53
+ if ((val > 96 && val < 124 ) || (val > 64 && val < 91 )) {
54
54
return val ;
55
55
}
56
56
} else {
57
- if ((val > 96 && val < 124 ) || (val > 64 && val < 91 ) || ( val > 47 && val < 58 ) ) {
57
+ if ((val > 96 && val < 124 ) || (val > 64 && val < 91 )) {
58
58
//we must unread 1
59
- reset ();
59
+ in . reset ();
60
60
i ++;
61
61
for (int j = 0 ; j < i ; j ++) {
62
62
in .read ();
63
63
}
64
64
return val ;
65
65
}
66
- reset ();
66
+ in . reset ();
67
67
return c ;
68
68
}
69
69
}
70
70
// we read up to 6 char test value first
71
- if ((val <= 96 || val >= 124 ) && (val <= 64 || val >= 91 ) && ( val <= 47 || val >= 58 ) ) {
72
- reset ();
71
+ if ((val <= 96 || val >= 124 ) && (val <= 64 || val >= 91 )) {
72
+ in . reset ();
73
73
return c ;
74
74
}
75
75
mark (1 );
76
76
c = in .read ();
77
77
// not a CSS WHITESPACE
78
78
if (c != 10 && c != 9 && c != 32 ) {
79
- reset ();
79
+ in . reset ();
80
80
}
81
81
return val ;
82
82
}
83
83
84
84
@ Override
85
85
public int read (char [] cbuf , int off , int len ) throws IOException {
86
86
int i , j , k , l , cki ;
87
+ boolean ignoreEscape = false ;
88
+
87
89
char [] chars = new char [len ];
88
90
in .mark (len );
89
91
l = super .read (chars , 0 , len );
@@ -108,6 +110,7 @@ public int read(char[] cbuf, int off, int len) throws IOException {
108
110
if (chars [i ] == '\\' ) {
109
111
int val = 0 ;
110
112
boolean escaped = false ;
113
+ ignoreEscape = false ;
111
114
for (k = 1 ; k < 7 && k + i < l ; k ++) {
112
115
cki = chars [k + i ];
113
116
// 0-9
@@ -120,55 +123,64 @@ public int read(char[] cbuf, int off, int len) throws IOException {
120
123
val = (val << 4 ) + (cki - 87 );
121
124
} else if (cki == 10 || cki == 9 || cki == 32 ) { // CSS whitespace.
122
125
// U+000A LINE FEED, U+0009 CHARACTER TABULATION, or U+0020 SPACE.
123
- if ((val > 96 && val < 124 ) || (val > 64 && val < 91 ) || ( val > 47 && val < 58 ) ) {
126
+ if ((val > 96 && val < 124 ) || (val > 64 && val < 91 )) {
124
127
chars [j ++] = (char ) val ;
125
128
escaped = true ;
126
129
i += k ;
127
- break ;
128
130
}
131
+ escaped = true ;
132
+ ignoreEscape = true ;
133
+ break ;
129
134
} else {
130
135
if (val == 0 ) {
131
136
if ((cki > 96 && cki < 124 ) || (cki > 64 && cki < 91 )) {
132
137
// so we found a regular char, just remove the escaping
133
138
break ;
134
139
}
135
140
}
136
- if ((val > 96 && val < 124 ) || (val > 64 && val < 91 ) || ( val > 47 && val < 58 ) ) {
141
+ if ((val > 96 && val < 124 ) || (val > 64 && val < 91 )) {
137
142
chars [j ++] = (char ) val ;
138
143
escaped = true ;
139
144
i += k - 1 ;
140
145
break ;
146
+ } else {
147
+ ignoreEscape = true ;
141
148
}
142
149
}
143
150
}
144
- if (k == 7 && !escaped ) {
145
- if ((val > 96 && val < 124 ) || (val > 64 && val < 91 ) || (val > 47 && val < 58 )) {
146
- chars [j ++] = (char ) val ;
147
- escaped = true ;
148
- i += k - 1 ;
149
- if (i + 1 < l ) {
150
- cki = chars [i + 1 ];
151
- // skip extra space
152
- if (cki == 10 || cki == 9 || cki == 32 ) {
153
- i ++;
151
+ if (!ignoreEscape ) {
152
+ if (k == 7 && !escaped ) {
153
+ if ((val > 96 && val < 124 ) || (val > 64 && val < 91 )) {
154
+ chars [j ++] = (char ) val ;
155
+ escaped = true ;
156
+ i += k - 1 ;
157
+ if (i + 1 < l ) {
158
+ cki = chars [i + 1 ];
159
+ // skip extra space
160
+ if (cki == 10 || cki == 9 || cki == 32 ) {
161
+ i ++;
162
+ }
154
163
}
155
- }
156
- } else {
157
- // do nothing
158
- chars [j ++] = chars [i ];
159
- }
160
- } else {
161
- // we reached the end, unescaping didn't happen let's stop here
162
- // unless we are the last
163
- if (!escaped ) {
164
- if (j != 0 ) {
165
- in .reset ();
166
- in .skip (i );
167
- break ;
168
164
} else {
165
+ // do nothing
166
+ ignoreEscape = true ;
169
167
chars [j ++] = chars [i ];
170
168
}
169
+ } else {
170
+ // we reached the end, unescaping didn't happen let's stop here
171
+ // unless we are the last
172
+ if (!escaped ) {
173
+ if (j != 0 ) {
174
+ in .reset ();
175
+ in .skip (i );
176
+ break ;
177
+ } else {
178
+ chars [j ++] = chars [i ];
179
+ }
180
+ }
171
181
}
182
+ } else {
183
+ chars [j ++] = chars [i ];
172
184
}
173
185
} else {
174
186
chars [j ++] = chars [i ];
0 commit comments