- Fix CR-escaping.
This commit is contained in:
Enno Rehling 2009-07-16 20:30:42 +00:00
parent 3b861d6a33
commit 29e423fab4
3 changed files with 83 additions and 22 deletions

View File

@ -631,12 +631,17 @@ cr_output_ship(FILE * F, const ship * sh, const unit * u, int fcaptain, const fa
} }
static void static void
fwriteorder(FILE * F, const struct order * ord, const struct locale * lang) fwriteorder(FILE * F, const struct order * ord, const struct locale * lang, boolean escape)
{ {
char ebuf[1024];
char obuf[1024]; char obuf[1024];
const char * str = obuf;
fputc('"', F); fputc('"', F);
write_order(ord, obuf, sizeof(obuf)); write_order(ord, obuf, sizeof(obuf));
if (obuf[0]) fputs(obuf, F); if (escape) {
str = escape_string(obuf, ebuf, sizeof(ebuf));
}
if (str[0]) fputs(str, F);
fputc('"', F); fputc('"', F);
} }
@ -842,14 +847,14 @@ cr_output_unit(FILE * F, const region * r,
for (ord = u->old_orders; ord; ord = ord->next) { for (ord = u->old_orders; ord; ord = ord->next) {
/* this new order will replace the old defaults */ /* this new order will replace the old defaults */
if (is_persistent(ord)) { if (is_persistent(ord)) {
fwriteorder(F, ord, f->locale); fwriteorder(F, ord, f->locale, true);
fputc('\n', F); fputc('\n', F);
} }
} }
for (ord = u->orders; ord; ord = ord->next) { for (ord = u->orders; ord; ord = ord->next) {
if (u->old_orders && is_repeated(ord)) continue; /* unit has defaults */ if (u->old_orders && is_repeated(ord)) continue; /* unit has defaults */
if (is_persistent(ord)) { if (is_persistent(ord)) {
fwriteorder(F, ord, f->locale); fwriteorder(F, ord, f->locale, true);
fputc('\n', F); fputc('\n', F);
} }
} }

View File

@ -34,26 +34,82 @@ hashstring(const char* s)
return key & 0x7FFFFFFF; return key & 0x7FFFFFFF;
} }
/*
static const char *
escape_string_inplace(char * buffer, unsigned int len, unsigned int offset)
{
#define MAXQUOTES 32
char * o;
char * d[MAXQUOTES+1];
int i = 0;
o = strchr(buffer, '"');
if (!o) {
return buffer;
}
while (*o && i<MAXQUOTES) {
char * next = strchr(o, '"');
d[i++] = o;
o = next?next:(o+strlen(o));
}
d[i] = o;
if (i<MAXQUOTES) {
// more than 32 hits! must go recursive
char * start = d[i];
unsigned int nlen = len - (start-buffer) - MAXQUOTES;
escape_string_inplace(start, nlen, MAXQUOTES);
}
o[i] = '\0';
while (--i>0) {
const char * src = d[i];
char * dst = d[i] + i + offset;
size_t mlen = d[i+1] - d[i];
memmove(dst--, src, mlen);
*dst = '\\';
}
return buffer;
}
*/
INLINE_FUNCTION const char * INLINE_FUNCTION const char *
escape_string(const char * str, char * buffer, unsigned int len) escape_string(const char * str, char * buffer, unsigned int len)
{ {
static char s_buffer[4096]; /* STATIC_RESULT: used for return, not across calls */ const char * start = strchr(str, '\"');
const char * p = str; if (start) {
char * o; static char s_buffer[4096]; /* STATIC_RESULT: used for return, not across calls */
if (buffer==NULL) { const char * p;
buffer = s_buffer; char * o;
len = sizeof(s_buffer); size_t skip = start-str;
}
o = buffer; if (buffer==NULL) {
do { buffer = s_buffer;
switch (*p) { len = sizeof(s_buffer);
case '\"': }
case '\\': memcpy(buffer, str, skip);
(*o++) = '\\'; o = buffer + skip;
} p = str + skip;
(*o++) = (*p); do {
} while (*p++); if (*p == '\"') {
return buffer; if (len<2) {
*o = '\0';
break;
}
(*o++) = '\\';
len -= 2;
} else {
if (len<1) {
*o = '\0';
break;
}
--len;
}
(*o++) = (*p);
} while (*p++);
return buffer;
}
return str;
} }
INLINE_FUNCTION unsigned int jenkins_hash(unsigned int a) INLINE_FUNCTION unsigned int jenkins_hash(unsigned int a)

View File

@ -5338,7 +5338,7 @@
ingots and disintegrate afterwards. </text> ingots and disintegrate afterwards. </text>
</string> </string>
<string name="treegrow"> <string name="treegrow">
<text locale="de">Diese Ritual verstärkt die Wirkung des <text locale="de">Dieses Ritual verstärkt die Wirkung des
magischen Trankes um ein vielfaches. Wo sonst aus einem magischen Trankes um ein vielfaches. Wo sonst aus einem
Stecken nur ein Baum sprießen konnte, so treibt nun jeder Stecken nur ein Baum sprießen konnte, so treibt nun jeder
Ast Wurzeln. </text> Ast Wurzeln. </text>