Check for proper escaping in JSON and TRANSLATE DUMP.

This commit is contained in:
Dianne Skoll
2025-02-01 11:15:25 -05:00
parent 35a4994b3e
commit 51b831fb6a
6 changed files with 71 additions and 18 deletions

View File

@@ -388,7 +388,13 @@ void PrintJSONChar(char c) {
case '\t': printf("\\t"); break;
case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
default: printf("%c", c);
default:
if ((c > 0 && c < 32) || c == 0x7f) {
printf("\\u%04x", (unsigned int) c);
} else {
printf("%c", c);
}
break;
}
}
@@ -403,7 +409,13 @@ void PrintJSONString(char const *s)
case '\t': printf("\\t"); break;
case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
default: printf("%c", *s);
default:
if ((*s > 0 && *s < 32) || *s == 0x7f) {
printf("\\u%04x", (unsigned int) *s);
} else {
printf("%c", *s);
}
break;
}
s++;
}
@@ -420,7 +432,13 @@ void PrintJSONStringLC(char const *s)
case '\t': printf("\\t"); break;
case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
default: printf("%c", tolower(*s));
default:
if ((*s > 0 && *s < 32) || *s == 0x7f) {
printf("\\u%04x", (unsigned int) *s);
} else {
printf("%c", tolower(*s));
}
break;
}
s++;
}

View File

@@ -273,7 +273,7 @@ int GetTranslatedStringTryingVariants(char const *orig, DynamicBuffer *out);
char const *GetErr(int r);
char const *tr(char const *s);
void print_escaped_string(FILE *fp, char const *s);
void print_escaped_string_helper(FILE *fp, char const *s, int esc_for_remind);
void print_escaped_string_helper(FILE *fp, char const *s, int esc_for_remind, int json);
void GenerateSysvarTranslationTemplates(void);
void TranslationTemplate(char const *msg);
TrigInfo *NewTrigInfo(char const *i);

View File

@@ -48,10 +48,10 @@ TranslationTemplate(char const *in)
}
printf("TRANSLATE ");
print_escaped_string_helper(stdout, in, 1);
print_escaped_string_helper(stdout, in, 1, 0);
if (FindTranslation(in)) {
printf(" ");
print_escaped_string_helper(stdout, tr(in), 1);
print_escaped_string_helper(stdout, tr(in), 1, 0);
printf("\n");
} else {
printf(" \"\"\n");
@@ -66,7 +66,7 @@ GenerateTranslationTemplate(void)
printf("# Translation table template\n\n");
printf("TRANSLATE \"LANGID\" ");
print_escaped_string_helper(stdout, tr("LANGID"), 1);
print_escaped_string_helper(stdout, tr("LANGID"), 1, 0);
printf("\n\n");
printf("BANNER %s\n", DBufValue(&Banner));
@@ -74,14 +74,14 @@ GenerateTranslationTemplate(void)
printf("\n# Weekday Names\n");
for (i=0; i<7; i++) {
printf("SET $%s ", DayName[i]);
print_escaped_string_helper(stdout, tr(DayName[i]), 1);
print_escaped_string_helper(stdout, tr(DayName[i]), 1, 0);
printf("\n");
}
printf("\n# Month Names\n");
for (i=0; i<12; i++) {
printf("SET $%s ", MonthName[i]);
print_escaped_string_helper(stdout, tr(MonthName[i]), 1);
print_escaped_string_helper(stdout, tr(MonthName[i]), 1, 0);
printf("\n");
}
@@ -178,11 +178,17 @@ ClearTranslationTable(void)
void
print_escaped_string(FILE *fp, char const *s)
{
print_escaped_string_helper(fp, s, 0);
print_escaped_string_helper(fp, s, 0, 0);
}
void
print_escaped_string_helper(FILE *fp, char const *s, int esc_for_remind) {
print_escaped_string_json(FILE *fp, char const *s)
{
print_escaped_string_helper(fp, s, 0, 1);
}
void
print_escaped_string_helper(FILE *fp, char const *s, int esc_for_remind, int json) {
putc('"', fp);
while(*s) {
switch(*s) {
@@ -196,11 +202,20 @@ print_escaped_string_helper(FILE *fp, char const *s, int esc_for_remind) {
case '"': putc('\\', fp); putc('"', fp); break;
case '\\': putc('\\', fp); putc('\\', fp); break;
default:
if (esc_for_remind && *s == '[') {
fprintf(fp, "[\"[\"]");
if ((*s > 0 && *s < 32) || *s == 0x7f) {
if (json) {
fprintf(fp, "\\u%04x", (unsigned int) *s);
} else {
fprintf(fp, "\\x%02x", (unsigned int) *s);
}
} else {
putc(*s, fp); break;
if (esc_for_remind && *s == '[') {
fprintf(fp, "[\"[\"]");
} else {
putc(*s, fp);
}
}
break;
}
s++;
}
@@ -245,9 +260,9 @@ DumpTranslationTable(FILE *fp, int json)
fprintf(fp, ",");
}
done=1;
print_escaped_string(fp, item->orig);
print_escaped_string_json(fp, item->orig);
fprintf(fp, ":");
print_escaped_string(fp, item->translated);
print_escaped_string_json(fp, item->translated);
}
item = hash_table_next(&TranslationTable, item);
}

View File

@@ -1268,13 +1268,13 @@ void GenerateSysvarTranslationTemplates(void)
continue;
}
printf("SET $%s ", SysVarArr[i].name);
print_escaped_string_helper(stdout, tr(msg), 1);
print_escaped_string_helper(stdout, tr(msg), 1, 0);
printf("\n");
} else if (!strcmp(SysVarArr[i].name, "Hplu") ||
!strcmp(SysVarArr[i].name, "Mplu")) {
msg = * (char const **) SysVarArr[i].value;
printf("SET $%s ", SysVarArr[i].name);
print_escaped_string_helper(stdout, tr(msg), 1);
print_escaped_string_helper(stdout, tr(msg), 1, 0);
printf("\n");
}
}

View File

@@ -689,6 +689,16 @@ set a "\x00"
set a "\x0P"
set a "\x00P"
EOF
# Test translate table dumping
../src/remind - 1 Feb 2024 <<EOF >> ../tests/test.out 2>&1
TRANSLATE "\x03" "BREAK"
TRANSLATE DUMP
EOF
../src/remind -ppp - 1 Feb 2024 <<EOF >> ../tests/test.out 2>&1
TRANSLATE "\x03" "BREAK"
EOF
# Languages
for i in ../include/lang/??.rem ; do
../src/remind -r -q "-ii=\"$i\"" ../tests/tstlang.rem 1 Feb 2024 13:34 >> ../tests/test.out 2>&1

View File

@@ -24689,6 +24689,16 @@ a "xPOO"
-stdin-(24): \x00 is not a valid escape sequence
-stdin-(25): \x00 is not a valid escape sequence
-stdin-(26): \x00 is not a valid escape sequence
# Translation table
TRANSLATE "LANGID" "en"
TRANSLATE "\x03" "BREAK"
No reminders.
[
{
"translations":{"LANGID":"en","\u0003":"BREAK"},"caltype":"monthly","monthname":"February","year":2024,"daysinmonth":29,"firstwkday":4,"mondayfirst":0,"daynames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"prevmonthname":"January","daysinprevmonth":31,"prevmonthyear":2024,"nextmonthname":"March","daysinnextmonth":31,"nextmonthyear":2024,"entries":[
]
}
]
Agenda pel dijous, 1 de febrer de 2024:
Language: ca