summaryrefslogtreecommitdiff
path: root/source3/intl/lang_tdb.c
diff options
context:
space:
mode:
authorTim Potter <tpot@samba.org>2003-09-29 06:22:04 +0000
committerTim Potter <tpot@samba.org>2003-09-29 06:22:04 +0000
commit981c82b16e82da859f7205cfc37ffe849e58b78c (patch)
tree34deadb5060702cc0be66242850b2a8b326d02c1 /source3/intl/lang_tdb.c
parentcd5c595ccd6e4861c0d744645fb17eb9adbe5908 (diff)
downloadsamba-981c82b16e82da859f7205cfc37ffe849e58b78c.tar.gz
samba-981c82b16e82da859f7205cfc37ffe849e58b78c.tar.bz2
samba-981c82b16e82da859f7205cfc37ffe849e58b78c.zip
Merge from 3.0:
>Allow d_printf() to handle strings with escaped quotation marks since the >msg file includes the escape character. > >Fixes bug #489. (This used to be commit 0871be2bfad8bfa5d4f0ff78e732c1073055da2e)
Diffstat (limited to 'source3/intl/lang_tdb.c')
-rw-r--r--source3/intl/lang_tdb.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/source3/intl/lang_tdb.c b/source3/intl/lang_tdb.c
index 5409ce6619..af70b529ff 100644
--- a/source3/intl/lang_tdb.c
+++ b/source3/intl/lang_tdb.c
@@ -176,16 +176,47 @@ BOOL lang_tdb_init(const char *lang)
const char *lang_msg(const char *msgid)
{
TDB_DATA key, data;
+ char *p, *q, *msgid_quoted;
+ int count;
lang_tdb_init(NULL);
if (!tdb) return msgid;
- key.dptr = (char *)msgid;
- key.dsize = strlen(msgid)+1;
+ /* Due to the way quotes in msgids are escaped in the msg file we
+ must replace " with \" before doing a lookup in the tdb. */
+
+ count = 0;
+
+ for(p = msgid; *p; p++) {
+ if (*p == '\"')
+ count++;
+ }
+
+ if (!(msgid_quoted = malloc(strlen(msgid) + count + 1)))
+ return msgid;
+
+ /* string_sub() is unsuitable here as it replaces some punctuation
+ chars with underscores. */
+
+ for(p = msgid, q = msgid_quoted; *p; p++) {
+ if (*p == '\"') {
+ *q = '\\';
+ q++;
+ }
+ *q = *p;
+ q++;
+ }
+
+ *q = 0;
+
+ key.dptr = (char *)msgid_quoted;
+ key.dsize = strlen(msgid_quoted)+1;
data = tdb_fetch(tdb, key);
+ free(msgid_quoted);
+
/* if the message isn't found then we still need to return a pointer
that can be freed. Pity. */
if (!data.dptr)