bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fixing argp doc strings


From: Sergey Poznyakoff
Subject: Fixing argp doc strings
Date: Sat, 09 Sep 2006 08:39:36 +0300

Hello,

I have installed the following change:

2006-09-09  Sergey Poznyakoff  <address@hidden>

        * argp-help.c (argp_doc): Split the untranslated doc string on
          '\v', and translate the two parts separately, instead of
          feeding the whole string to gettext.  This allows to exclude
          '\v' from the msgids visible to the translator by writing doc
          strings as N_("..") "\v" N_("..").


Index: argp-help.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/argp-help.c,v
retrieving revision 1.22
retrieving revision 1.24
diff -p -u -r1.22 -r1.24
--- argp-help.c 13 Mar 2006 09:51:53 -0000      1.22
+++ argp-help.c 9 Sep 2006 05:38:06 -0000       1.24
@@ -1475,46 +1475,51 @@ argp_doc (const struct argp *argp, const
 {
   const char *text;
   const char *inp_text;
+  size_t inp_text_len = 0;
+  const char *trans_text;
   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 = post ? 0 : argp->doc;
+      trans_text = dgettext (argp->argp_domain, inp_text);
     }
   else
-    inp_text = 0;
+    trans_text = inp_text = 0;
 
   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
                              ? ARGP_KEY_HELP_POST_DOC
                              : ARGP_KEY_HELP_PRE_DOC,
-                             inp_text, input);
+                             trans_text, input);
     }
   else
-    text = (const char *) inp_text;
+    text = (const char *) trans_text;
 
   if (text)
     {
       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');
@@ -1522,9 +1527,10 @@ argp_doc (const struct argp *argp, const
       anything = 1;
     }
 
-  if (text && text != inp_text)
+  if (text && text != trans_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)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]