ext/yajl/yajl_encode.c in yajl-ruby-1.4.0 vs ext/yajl/yajl_encode.c in yajl-ruby-1.4.1
- old
+ new
@@ -57,16 +57,22 @@
const unsigned char * str,
unsigned int len,
unsigned int htmlSafe)
{
unsigned int beg = 0;
- unsigned int end = 0;
+ unsigned int end = 0;
+ unsigned int increment = 0;
char hexBuf[7];
+ char entityBuffer[7];
hexBuf[0] = '\\'; hexBuf[1] = 'u'; hexBuf[2] = '0'; hexBuf[3] = '0';
hexBuf[6] = 0;
+ entityBuffer[0] = '\\'; entityBuffer[1] = 'u'; entityBuffer[2] = '2'; entityBuffer[3] = '0';
+ entityBuffer[6] = 0;
+
while (end < len) {
+ increment = 1;
const char * escaped = NULL;
switch (str[end]) {
case '\r': escaped = "\\r"; break;
case '\n': escaped = "\\n"; break;
case '\\': escaped = "\\\\"; break;
@@ -74,24 +80,54 @@
case '"': escaped = "\\\""; break;
case '\f': escaped = "\\f"; break;
case '\b': escaped = "\\b"; break;
case '\t': escaped = "\\t"; break;
case '/':
- if (htmlSafe) {
+ if (htmlSafe == 1 || htmlSafe == 2) {
escaped = "\\/";
}
break;
+ /* Escaping 0xe280a8 0xe280a9 */
+ case 0xe2:
+ if (htmlSafe == 2) {
+ if (len - end >= 2 && str[end + 1] == 0x80) {
+ if (str[end + 2] == 0xa8) {
+ increment = 3;
+ entityBuffer[4] = '2';
+ entityBuffer[5] = '8';
+ escaped = entityBuffer;
+ break;
+ }
+
+ if (str[end + 2] == 0xa9) {
+ increment = 3;
+ entityBuffer[4] = '2';
+ entityBuffer[5] = '9';
+ escaped = entityBuffer;
+ break;
+ }
+ }
+ }
+ case '<':
+ case '>':
+ case '&':
+ if (htmlSafe == 2) {
+ CharToHex(str[end], hexBuf + 4);
+ escaped = hexBuf;
+ }
+ break;
default:
if ((unsigned char) str[end] < 32) {
CharToHex(str[end], hexBuf + 4);
escaped = hexBuf;
}
break;
}
if (escaped != NULL) {
print(ctx, (const char *) (str + beg), end - beg);
print(ctx, escaped, (unsigned int)strlen(escaped));
- beg = ++end;
+ end += increment;
+ beg = end;
} else {
++end;
}
}
print(ctx, (const char *) (str + beg), end - beg);