(argp_doc): Split the untranslated doc string on '\v',
authorSergey Poznyakoff <gray@gnu.org.ua>
Sat, 9 Sep 2006 05:12:46 +0000 (05:12 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Sat, 9 Sep 2006 05:12:46 +0000 (05:12 +0000)
and translate the two parts separately, instead of feeding
the whole string to gettext.  This allows to exclude
'\v' from the strings visible to the translator by writing doc
strings as N_("..") "\v" N_("..").

lib/argp-help.c

index 0dce126..a83a356 100644 (file)
@@ -1475,17 +1475,26 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
 {
   const char *text;
   const char *inp_text;
+  size_t inp_text_len = 0;
   void *input = 0;
   int anything = 0;
-  size_t inp_text_limit = 0;
-  const char *doc = dgettext (argp->argp_domain, argp->doc);
   const struct argp_child *child = argp->children;
 
-  if (doc)
+  if (argp->doc)
     {
-      char *vt = strchr (doc, '\v');
-      inp_text = post ? (vt ? vt + 1 : 0) : doc;
-      inp_text_limit = (!post && vt) ? (vt - doc) : 0;
+      char *vt = strchr (argp->doc, '\v');
+      if (vt)
+       {
+         if (post)
+           inp_text = vt + 1;
+         else
+           {
+             inp_text_len = vt - argp->doc;
+             inp_text = __strndup (argp->doc, inp_text_len);
+           }
+       }
+      else
+       inp_text = dgettext (argp->argp_domain, post ? 0 : argp->doc);
     }
   else
     inp_text = 0;
@@ -1493,9 +1502,6 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
   if (argp->help_filter)
     /* We have to filter the doc strings.  */
     {
-      if (inp_text_limit)
-       /* Copy INP_TEXT so that it's nul-terminated.  */
-       inp_text = __strndup (inp_text, inp_text_limit);
       input = __argp_input (argp, state);
       text =
        (*argp->help_filter) (post
@@ -1511,10 +1517,7 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
       if (pre_blank)
        __argp_fmtstream_putc (stream, '\n');
 
-      if (text == inp_text && inp_text_limit)
-       __argp_fmtstream_write (stream, inp_text, inp_text_limit);
-      else
-       __argp_fmtstream_puts (stream, text);
+      __argp_fmtstream_puts (stream, text);
 
       if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
        __argp_fmtstream_putc (stream, '\n');
@@ -1524,7 +1527,8 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
 
   if (text && text != inp_text)
     free ((char *) text);      /* Free TEXT returned from the help filter.  */
-  if (inp_text && inp_text_limit && argp->help_filter)
+
+  if (inp_text && inp_text_len)
     free ((char *) inp_text);  /* We copied INP_TEXT, so free it now.  */
 
   if (post && argp->help_filter)