From patchwork Mon Nov 25 18:08:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Girish Joshi X-Patchwork-Id: 36191 Received: (qmail 51472 invoked by alias); 25 Nov 2019 18:08:18 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 51460 invoked by uid 89); 25 Nov 2019 18:08:17 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=vt, HX-Spam-Relays-External:209.85.166.65, *doc, H*f:sk:w@mail. X-HELO: mail-io1-f65.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=gBL8TnTiuK4DaztEUq6eqrz/+W1oFxK5yJsLHD11ZM8=; b=gAdw8yyaYyQex2kgbzAcz6ryQHD2IFUF5xbOk2sI5Qw/kD1GNxYLRINhNCkbJeqA61 QZcidXal0GizQ3u0BuDoTTQkLSACMKyN4wY5YwNPn0JJvr5p7i8Lttqcif1Dazh7g1Bb oflnjIAH33JRbU1HgWkR2TV+dKNDCly8Amreq67bCbqI178DnphxUch0GxY/stugvmyQ IVqiv2dIw5Wx+mir0yk2YJfeCKmluP31nfQ/wh3C5cKiB9kg+YR4aiv2pbm0CUhqcvJc LjgraER+jOW9Y5oEx8xUs/xf+d9dxksTGSZIuJB7VRS+KrH6fVB7vGQA6G9cnXaA+kKA 2p7g== MIME-Version: 1.0 References: <871s1bep2u.fsf@oldenburg2.str.redhat.com> In-Reply-To: From: Girish Joshi Date: Mon, 25 Nov 2019 23:38:02 +0530 Message-ID: Subject: Re: [PATCH] argp: argp.doc prints incorrectly when it starts with "\v" [BZ #19038] To: Joseph Myers Cc: libc-alpha@sourceware.org Thanks Joseph for the review. Here is a patch with the required changes. Please let me know if more changes are needed in it. argp/argp-help.c: added validation for leading \v in the doc string. argp/tst-argp3.c: added test case when the doc string contains leading \v. argp/Makefile: added tst-argp3 to tests Overview: argp.doc prints incorrectly when it starts with '\v'. In argp-help.c in the function variable is being initialized only once, which causes the whole documentation to be printed if there is a leading '\v' in the doc string. Implementation: 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 to the function is false and the complete doc needs to be printed. --- 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 c97e4c307c..8206da8cd8 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 85f5792bfe..68422127d2 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..997072ba7d --- /dev/null +++ b/argp/tst-argp3.c @@ -0,0 +1,68 @@ +/* Test for argparse with leading '\v' in the doc string. + Copyright (C) 2019 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 .*/ + + +#include +#include + +#include +#include + + +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 +