From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ot1-x32f.google.com (mail-ot1-x32f.google.com [IPv6:2607:f8b0:4864:20::32f]) by sourceware.org (Postfix) with ESMTPS id 2727F38446A4 for ; Wed, 14 Dec 2022 14:29:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2727F38446A4 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-ot1-x32f.google.com with SMTP id v19-20020a9d5a13000000b0066e82a3872dso1820364oth.5 for ; Wed, 14 Dec 2022 06:29:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=dK/mtFCec3NJa12qaXjf7liBabznDAp8ESyI57ikOe8=; b=lnOrhZgBO30CSMZeCk4fEpEz4hz/F7DdBVzRqPyPp6I3RoSHKWB2mZ6mCv0PpkoivJ dZx7pe1ph3XguEkBmkXvPPNNK19KWtm95v0hP9aaosvhSHObSSfv4GlCqy+imXUD4Uf4 6/WOaS1V8cTIjSBGkCp3natkTWbeY0lCjbZ6JsVC0A6cz4FO5rUlmRHVYZXLyPT0atZP 6RAZ55OKglMwFEp/81l0Kvxm4bs8lYsGy3AAJOy3mk9T+os7A5C7d0W0pbnHNB+fVuTs WC3b0g5KvPejZtU7l9XDoEflqgKsuVQ0G+P5jCEKPsUIkbcJQPG1tVFZLc+ALziBMKOH mPSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dK/mtFCec3NJa12qaXjf7liBabznDAp8ESyI57ikOe8=; b=QC2DYt2VSeEuWypnkbihm+SM5jyUei1xiF/+CnOpPmAQI9KNm0Va8MG0wCUpIOzDpq g9HnM1od2VLhBF2w4FYfxn2R8GKInPOnlpmIgDLjB8QnhNaWE3rrdOVxHK6S5fN5jC8f n8yQXTF/YQ9oWK92iO5IdmhLO8ujQVm17MUkBrWBtgVMEAkw5R5LiV0t5d5AsoeSn+bN LPUpEnFYgfEezREG/N7jk4dp8vtRtlu1ONzI5NZJ7DEVysfLIdJf/fcT2U5Mfh4p3QaR pM9iChz5sv8f6SSi8qk3eXl56kEkKQlhEnTmg04ANi/8WqeXvfLDNoCcLVkQD9S46Pou KaBg== X-Gm-Message-State: ANoB5plDqrpk1p3eIuGH6DoLVJYFVU97uMR+p1Lhma0EIWFcja++EUAw eVvX4Z55vLzGhKj8+KgclzL7gHNSi+WbV/irWjg= X-Google-Smtp-Source: AA0mqf4aQS9Q9zgoJkYlFQj1saiG4zix9tjhKCQX4Z66ZAVh4jxR/4nRXORPkypp+0yJvq+2ct8sjg== X-Received: by 2002:a05:6830:11d4:b0:670:83ed:1152 with SMTP id v20-20020a05683011d400b0067083ed1152mr8401391otq.16.1671028142671; Wed, 14 Dec 2022 06:29:02 -0800 (PST) Received: from ?IPV6:2804:1b3:a7c2:f05e:98ce:57c2:5097:ae83? ([2804:1b3:a7c2:f05e:98ce:57c2:5097:ae83]) by smtp.gmail.com with ESMTPSA id l23-20020a9d7a97000000b00667ff6b7e9esm2460626otn.40.2022.12.14.06.29.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 14 Dec 2022 06:29:01 -0800 (PST) Message-ID: Date: Wed, 14 Dec 2022 11:28:59 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PATCH v5 03/11] stdio-common: Add __printf_function_invoke Content-Language: en-US To: libc-alpha@sourceware.org, Florian Weimer References: <8699991d4d2c2a85ee497acb9d2740a2afef0816.1670858473.git.fweimer@redhat.com> From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: <8699991d4d2c2a85ee497acb9d2740a2afef0816.1670858473.git.fweimer@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 12/12/22 12:23, Florian Weimer via Libc-alpha wrote: > And __wprintf_function_invoke. These functions will be used to > to call registered printf specifier callbacks on printf buffers > after vfprintf and vfwprintf have been converted to buffers. The new > implementation avoids alloca/variable length arrays. LGTM, thanks. Reviewed-by: Adhemerval Zanella > --- > include/printf.h | 10 +++++ > stdio-common/Makefile | 2 + > stdio-common/Xprintf_function_invoke.c | 58 ++++++++++++++++++++++++++ > stdio-common/printf_function_invoke.c | 22 ++++++++++ > stdio-common/wprintf_function_invoke.c | 22 ++++++++++ > 5 files changed, 114 insertions(+) > create mode 100644 stdio-common/Xprintf_function_invoke.c > create mode 100644 stdio-common/printf_function_invoke.c > create mode 100644 stdio-common/wprintf_function_invoke.c > > diff --git a/include/printf.h b/include/printf.h > index 78accaab6d..8f064149d3 100644 > --- a/include/printf.h > +++ b/include/printf.h > @@ -41,6 +41,16 @@ union printf_arg > void *pa_user; > }; > > +/* Invoke a registered printf callback. Called from vfprintf and vfwprintf. */ > +int __printf_function_invoke (void *, printf_function callback, > + union printf_arg *args_value, > + size_t ndata_args, > + struct printf_info *info) attribute_hidden; > +int __wprintf_function_invoke (void *, printf_function callback, > + union printf_arg *args_value, > + size_t ndata_args, > + struct printf_info *info) attribute_hidden; > + > #include > > /* Now define the internal interfaces. */ Ok. > diff --git a/stdio-common/Makefile b/stdio-common/Makefile > index 120d66ea93..6e6da091b1 100644 > --- a/stdio-common/Makefile > +++ b/stdio-common/Makefile > @@ -63,6 +63,7 @@ routines := \ > printf_buffer_write \ > printf_fp \ > printf_fphex \ > + printf_function_invoke \ > printf_size \ > psiginfo \ > psignal \ > @@ -101,6 +102,7 @@ routines := \ > wprintf_buffer_puts_1 \ > wprintf_buffer_to_file \ > wprintf_buffer_write \ > + wprintf_function_invoke \ > # routines > > aux := \ Ok. > diff --git a/stdio-common/Xprintf_function_invoke.c b/stdio-common/Xprintf_function_invoke.c > new file mode 100644 > index 0000000000..908d02bf24 > --- /dev/null > +++ b/stdio-common/Xprintf_function_invoke.c > @@ -0,0 +1,58 @@ > +/* Invoke a printf specifier handler. Generic version. > + Copyright (C) 1991-2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > + > +int > +Xprintf (function_invoke) (void *buf, > + printf_function callback, > + union printf_arg *args_value, > + size_t ndata_args, > + struct printf_info *info) > +{ > + /* Most custom specifiers expect just one argument. Use the heap > + for larger argument arrays. */ > + const void *onstack_args[4]; > + const void **args; > + if (ndata_args <= array_length (onstack_args)) > + args = onstack_args; > + else > + { > + args = calloc (ndata_args, sizeof (*args)); > + if (args == NULL) > + return -1; > + } > + > + for (unsigned int i = 0; i < ndata_args; ++i) > + args[i] = &args_value[i]; > + > + struct Xprintf (buffer_as_file) s; > + Xprintf (buffer_as_file_init) (&s, buf); > + > + /* Call the function. */ > + int done = callback (Xprintf (buffer_as_file_get) (&s), info, args); > + > + if (!Xprintf (buffer_as_file_terminate) (&s)) > + done = -1; > + > + if (args != onstack_args) > + free (args); > + > + /* Potential error from the callback function. */ > + return done; > +} Ok. > diff --git a/stdio-common/printf_function_invoke.c b/stdio-common/printf_function_invoke.c > new file mode 100644 > index 0000000000..8919b892ca > --- /dev/null > +++ b/stdio-common/printf_function_invoke.c > @@ -0,0 +1,22 @@ > +/* Invoke a printf specifier handler. Multibyte version. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include "printf_buffer-char.h" > +#include "Xprintf_function_invoke.c" Ok. > diff --git a/stdio-common/wprintf_function_invoke.c b/stdio-common/wprintf_function_invoke.c > new file mode 100644 > index 0000000000..29a6b4e073 > --- /dev/null > +++ b/stdio-common/wprintf_function_invoke.c > @@ -0,0 +1,22 @@ > +/* Invoke a printf specifier handler. Wide version. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library 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 > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include "printf_buffer-wchar_t.h" > +#include "Xprintf_function_invoke.c" Ok.