unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] argp: argp.doc prints incorrectly when it starts with "\v" [BZ #19038]
@ 2019-05-06  8:55 Girish Joshi
  2019-05-06 12:37 ` Florian Weimer
  0 siblings, 1 reply; 27+ messages in thread
From: Girish Joshi @ 2019-05-06  8:55 UTC (permalink / raw)
  To: libc-alpha

In argp-help.c `char *vt` is being initialized only once. It needs to
be initialized for every child in the doc and it needs to be printed
only in two cases.
1. There are no children and the doc does not starts with '\v'.
2. Argument `first_only` to the function `argp_doc` is false and the
complete doc needs to be printed.

diff --git a/argp/argp-help.c b/argp/argp-help.c
index 3b1727c4aa..ee4d247824 100644
--- a/argp/argp-help.c
+++ b/argp/argp-help.c
@@ -1465,10 +1465,11 @@ argp_doc (const struct argp *argp, const
struct argp_state *state,
   size_t inp_text_limit = 0;
   const char *doc = dgettext (argp->argp_domain, argp->doc);
   const struct argp_child *child = argp->children;
+  char *vt = 0;

   if (doc)
     {
-      char *vt = strchr (doc, '\v');
+      vt = strchr (doc, '\v');
       inp_text = post ? (vt ? vt + 1 : 0) : doc;
       inp_text_limit = (!post && vt) ? (vt - doc) : 0;
     }
@@ -1498,8 +1499,11 @@ argp_doc (const struct argp *argp, const struct
argp_state *state,

       if (text == inp_text && inp_text_limit)
        __argp_fmtstream_write (stream, inp_text, inp_text_limit);
-      else
-       __argp_fmtstream_puts (stream, text);
+      else{
+        if((!vt && !child) || (text == inp_text && !first_only)){
+          __argp_fmtstream_puts (stream, text);
+       }
+      }

       if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
        __argp_fmtstream_putc (stream, '\n');

^ permalink raw reply related	[flat|nested] 27+ messages in thread
* [PATCH] argp: argp.doc prints incorrectly when it starts with "\v" [BZ #19038]
@ 2020-03-03 18:13 Girish Joshi
  2020-03-19 19:38 ` Girish Joshi via Libc-alpha
  2020-03-21  2:03 ` DJ Delorie via Libc-alpha
  0 siblings, 2 replies; 27+ messages in thread
From: Girish Joshi @ 2020-03-03 18:13 UTC (permalink / raw)
  To: libc-alpha

Hello,
Reposting this patch for BZ #19038, as now I have the copyright assignment
with FSF.

Here the bug is that; if doc string starts with `\v` then the whole doc string
is printed both before and after the options.

The bug can be reproduced using following code.

#include<stdlib.h>
#include<argp.h>

static char doc[] = "\vthis is post_doc";
static struct argp argp = {NULL, NULL, NULL, doc};

int main(int argc, char *args[]){
     argp_parse(&argp, argc, args, 0, 0, NULL);
}

Currently we get the output of this code as

$ argp-help --help
Usage: argp-help [OPTION...]

this is post_doc

  -?, --help                 Give this help list
      --usage                Give a short usage message

this is post_doc

As mentioned in the comment on bugzilla, the first occurrence of
"this is post_doc" is erroneous.

This is happening because in argp-help.c in the function argp_doc 'char *vt'
(which is responsible for determining the position for vertical tab in the
doc string) is being initialized only once,

It should be initialized for each child in the documentation.

The next thing is the complete doc string needs to be printed only if
1. If there is only one child in the doc string
   and the doc string does not start with '\v'.
2. The argument 'first_only' to the function 'argp_doc' is 0.

After applying the patch we get the output as following.

$ argp-help --help
Usage: argp-help [OPTION...]

  -?, --help                 Give this help list
      --usage                Give a short usage message

this is post_doc

A test case for this is also added in the patch.
Following is the patch for this bug.

From 36cfdeab88ec3ecfe971cd70c798a9615d6adc41 Mon Sep 17 00:00:00 2001
From: Girish Joshi <girish946@gmail.com>
Date: Thu, 6 Feb 2020 01:03:18 +0530
Subject: [PATCH] Fix argp.doc prints incorrectly when it starts with '\v' (Bug
 19038)

"char *vt" in the function "argp_doc" is initialized for every child in the doc.

The complete doc string is printed only in two cases.
1. There is only one child in the doc and the doc does not starts with '\v'.
2. Argument "first_only" to the function "argp_doc" is 0.

Added test argp/tst-argp3.c for this case.
---
 argp/Makefile    |  2 +-
 argp/argp-help.c | 10 +++++--
 argp/tst-argp3.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 77 insertions(+), 3 deletions(-)
 create mode 100644 argp/tst-argp3.c

diff --git a/argp/Makefile b/argp/Makefile
index 1f9b074bed..0c0270ffef 100644
--- a/argp/Makefile
+++ b/argp/Makefile
@@ -27,7 +27,7 @@ routines    = $(addprefix argp-, ba fmtstream
fs-xinl help parse pv \
                      pvh xinl eexst)

 tests        = argp-test tst-argp1 bug-argp1 tst-argp2 bug-argp2 \
-          tst-ldbl-argp
+          tst-ldbl-argp tst-argp3

 CFLAGS-argp-help.c += $(uses-callbacks) -fexceptions
 CFLAGS-argp-parse.c += $(uses-callbacks)
diff --git a/argp/argp-help.c b/argp/argp-help.c
index 2bcd6549fd..8d213e4586 100644

--- a/argp/argp-help.c
+++ b/argp/argp-help.c
@@ -1465,10 +1465,11 @@ argp_doc (const struct argp *argp, const
struct argp_state *state,
   size_t inp_text_limit = 0;
   const char *doc = dgettext (argp->argp_domain, argp->doc);
   const struct argp_child *child = argp->children;
+  char *vt = 0;

   if (doc)
     {
-      char *vt = strchr (doc, '\v');
+      vt = strchr (doc, '\v');
       inp_text = post ? (vt ? vt + 1 : 0) : doc;
       inp_text_limit = (!post && vt) ? (vt - doc) : 0;
     }
@@ -1499,7 +1500,12 @@ argp_doc (const struct argp *argp, const struct
argp_state *state,
       if (text == inp_text && inp_text_limit)
     __argp_fmtstream_write (stream, inp_text, inp_text_limit);
       else
-    __argp_fmtstream_puts (stream, text);
+      {
+        if ((!vt && !child) || (text == inp_text && !first_only))
+        {
+          __argp_fmtstream_puts (stream, text);
+        }
+      }

       if (__argp_fmtstream_point (stream) > __argp_fmtstream_lmargin (stream))
     __argp_fmtstream_putc (stream, '\n');
diff --git a/argp/tst-argp3.c b/argp/tst-argp3.c
new file mode 100644
index 0000000000..cfdace2574
--- /dev/null
+++ b/argp/tst-argp3.c
@@ -0,0 +1,68 @@
+/* Test for argparse with leading '\v' in the doc string.
+  Copyright (C) 2020 Free Software Foundation, Inc.

+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 3 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <https://www.gnu.org/licenses/>.*/
+
+
+#include<stdlib.h>
+#include<argp.h>
+
+#include <support/capture_subprocess.h>
+#include <support/check.h>
+
+
+static char expected_success[] = "Usage: arp [OPTION...]\n\
+\n\
+  -?, --help                 Give this help list\n\
+      --usage                Give a short usage message\n\
+\n\
+this is post_doc\n\
+";
+char *argv[3] = { (char *) "arp", NULL, NULL };
+
+static void
+do_test_call (void)
+{
+  static char doc[] = "\vthis is post_doc";
+  static struct argp argp = {NULL, NULL, NULL, doc};
+
+  argp_parse (&argp, 2, argv, 0, 0, NULL);
+}
+
+static int
+do_one_test (const char *expected)
+{
+  struct support_capture_subprocess result;
+  result = support_capture_subprocess ((void *) &do_test_call, NULL);
+
+  TEST_COMPARE_STRING (result.out.buffer, expected);
+
+  return 0;
+}
+
+
+static int
+do_test (void)
+{
+  const char *argument = "--help";
+  argv[1] = (char *)argument;
+  // success condition
+  do_one_test (expected_success);
+  return 0;
+}
+
+/* This file references do_test above and contains the definition of
+   the main function.  */
+#include <support/test-driver.c>
+
--
2.21.1

^ permalink raw reply related	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2021-02-18 21:13 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-06  8:55 [PATCH] argp: argp.doc prints incorrectly when it starts with "\v" [BZ #19038] Girish Joshi
2019-05-06 12:37 ` Florian Weimer
2019-05-06 13:38   ` Girish Joshi
2019-05-30  8:14     ` Girish Joshi
2019-05-30 12:52       ` Adhemerval Zanella
2019-07-05  9:01       ` Girish Joshi
2019-07-05 10:34         ` Girish Joshi
2019-07-25 15:33           ` Joseph Myers
2019-11-25 18:08             ` Girish Joshi
2019-11-30 14:47               ` Girish Joshi
2019-11-30 15:05                 ` Carlos O'Donell
2020-01-07 17:55                   ` Girish Joshi
2020-01-20 17:21               ` Girish Joshi
2020-01-24  2:38                 ` Carlos O'Donell
2020-02-11 18:40                   ` Girish Joshi
2020-02-20  7:09                     ` Girish Joshi
  -- strict thread matches above, loose matches on Subject: below --
2020-03-03 18:13 Girish Joshi
2020-03-19 19:38 ` Girish Joshi via Libc-alpha
2020-03-21  2:03 ` DJ Delorie via Libc-alpha
2020-03-25 17:55   ` Girish Joshi via Libc-alpha
2020-05-07 19:53     ` Girish Joshi via Libc-alpha
2020-05-23 10:10       ` Girish Joshi via Libc-alpha
2020-06-14 15:50       ` Girish Joshi via Libc-alpha
2020-06-15  8:56       ` Florian Weimer via Libc-alpha
2020-06-15  9:51         ` Girish Joshi via Libc-alpha
2020-06-15 14:38           ` Zack Weinberg
2021-02-18 21:13             ` Girish Joshi via Libc-alpha

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).