Allow d_printf() to handle strings with escaped quotation marks since the
authorTim Potter <tpot@samba.org>
Fri, 26 Sep 2003 01:24:09 +0000 (01:24 +0000)
committerTim Potter <tpot@samba.org>
Fri, 26 Sep 2003 01:24:09 +0000 (01:24 +0000)
msg file includes the escape character.

Fixes bug #489.
(This used to be commit 8ce279e47184623e74f795294ffba842e4f2e848)

source3/intl/lang_tdb.c

index 5409ce6619dd8ec40735f70fc6dac70ac142ee34..af70b529ff952068e78dcc05da8dc3331d60bec3 100644 (file)
@@ -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)