From patchwork Mon Feb 25 23:16:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gummerer X-Patchwork-Id: 10829257 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B65D213B5 for ; Mon, 25 Feb 2019 23:16:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A60CB2B864 for ; Mon, 25 Feb 2019 23:16:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A62D2BD35; Mon, 25 Feb 2019 23:16:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 32F6E2B864 for ; Mon, 25 Feb 2019 23:16:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728949AbfBYXQx (ORCPT ); Mon, 25 Feb 2019 18:16:53 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:38217 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728848AbfBYXQw (ORCPT ); Mon, 25 Feb 2019 18:16:52 -0500 Received: by mail-wm1-f67.google.com with SMTP id v26so561093wmh.3 for ; Mon, 25 Feb 2019 15:16:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=64Q/C+UvG7aY2L+o9q2/pGVmjnoxjBNn2y9cffInBG8=; b=fnDm9Ez5eekdPm3y1mgodmA0ZAcZT5vbVIWz/xE8Pp3RhouzdAoVADjSKn4DQ4mTbC MrPfjVmf8V0Ud3KqnBB6l6vBYA84Ij8HoTJVengAfXsoSb6C73/RiunAdJBAma9ERU+F +iayMIxrLQsNV0VD3yatwrJWo+fFugdNRpumh7BH6nXRnbIJUPpTcmqma6KxpouWfEms 350Z9x/lxt+njEMVdcVvQQ5YhuP/jqXUp/xgPNX1WhsnyCdD60968xAiPBLt1MjvUVYo rqWo9PKXTlfoMmxfSuS4wDhVaEZsdKxWnr/CUZpufU2BkhaQ10+A7MXLcRFuekNARra+ Q7hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=64Q/C+UvG7aY2L+o9q2/pGVmjnoxjBNn2y9cffInBG8=; b=laUj/6w8ZskkHn3qgjyNVSWPpHnO4fFcoGDi+MI2IkJK38Iq5p8iD7N0a6oOWFq7rq wOBvxuRXmyuaDZsLMU9mYDECny8xoMy4chbKPMyMLa3zRGbFLN3fgSRLdlMwF35VRLgk cR1Dxebi0GUdRww4RqrlfRTGILfIXLSnpFTKUTlyjqY0hlvo1ijoGRynpxs04JNEF1gx 5QMpi0h3ZZqnbjlSckak4neRmAkleZDlPiklDP849JEd4x1EJUgQQOfY03i18oIPhOL5 cnuePpvbG+kLpVZqATvqYtSWz1uw33MKrXRqq3Py55emZx2uuoVt/YzgaUQkjfxjhZoM MiGg== X-Gm-Message-State: AHQUAua4+IWRcf1Tasv5weyv8RyKDxRpWd1zVIUSS6898lb6b3JozEnQ FpLWNHgsj4a+ftln86S/TYCj+WdQ X-Google-Smtp-Source: AHgI3IbY160Q9iozvwJe47/8DZD/MGEkGoII8I4LHGUbAOqiR3d5NH2i7Bv3ft6+WlPgO0Ffg4o1Lg== X-Received: by 2002:a7b:c84b:: with SMTP id c11mr653079wml.108.1551136610362; Mon, 25 Feb 2019 15:16:50 -0800 (PST) Received: from localhost ([95.149.189.205]) by smtp.gmail.com with ESMTPSA id b197sm21347990wmd.23.2019.02.25.15.16.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 25 Feb 2019 15:16:49 -0800 (PST) From: Thomas Gummerer To: git@vger.kernel.org Cc: Junio C Hamano , Johannes Schindelin , Paul-Sebastian Ungureanu , =?utf-8?q?SZED?= =?utf-8?q?ER_G=C3=A1bor?= , Johannes Schindelin , Johannes Sixt , Thomas Gummerer Subject: [PATCH v13 03/27] strbuf.c: add `strbuf_insertf()` and `strbuf_vinsertf()` Date: Mon, 25 Feb 2019 23:16:07 +0000 Message-Id: <20190225231631.30507-4-t.gummerer@gmail.com> X-Mailer: git-send-email 2.21.0.rc2.291.g17236886c5 In-Reply-To: <20190225231631.30507-1-t.gummerer@gmail.com> References: <20190225231631.30507-1-t.gummerer@gmail.com> MIME-Version: 1.0 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Paul-Sebastian Ungureanu Implement `strbuf_insertf()` and `strbuf_vinsertf()` to insert data using a printf format string. Original-idea-by: Johannes Schindelin Signed-off-by: Paul-Sebastian Ungureanu Helped-by: Johannes Sixt Signed-off-by: Thomas Gummerer --- strbuf.c | 36 ++++++++++++++++++++++++++++++++++++ strbuf.h | 9 +++++++++ 2 files changed, 45 insertions(+) diff --git a/strbuf.c b/strbuf.c index 82e90f1dfe..87ecf7f975 100644 --- a/strbuf.c +++ b/strbuf.c @@ -249,6 +249,42 @@ void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len) strbuf_splice(sb, pos, 0, data, len); } +void strbuf_vinsertf(struct strbuf *sb, size_t pos, const char *fmt, va_list ap) +{ + int len, len2; + char save; + va_list cp; + + if (pos > sb->len) + die("`pos' is too far after the end of the buffer"); + va_copy(cp, ap); + len = vsnprintf(sb->buf + sb->len, 0, fmt, cp); + va_end(cp); + if (len < 0) + BUG("your vsnprintf is broken (returned %d)", len); + if (!len) + return; /* nothing to do */ + if (unsigned_add_overflows(sb->len, len)) + die("you want to use way too much memory"); + strbuf_grow(sb, len); + memmove(sb->buf + pos + len, sb->buf + pos, sb->len - pos); + /* vsnprintf() will append a NUL, overwriting one of our characters */ + save = sb->buf[pos + len]; + len2 = vsnprintf(sb->buf + pos, len + 1, fmt, ap); + sb->buf[pos + len] = save; + if (len2 != len) + BUG("your vsnprintf is broken (returns inconsistent lengths)"); + strbuf_setlen(sb, sb->len + len); +} + +void strbuf_insertf(struct strbuf *sb, size_t pos, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + strbuf_vinsertf(sb, pos, fmt, ap); + va_end(ap); +} + void strbuf_remove(struct strbuf *sb, size_t pos, size_t len) { strbuf_splice(sb, pos, len, "", 0); diff --git a/strbuf.h b/strbuf.h index be02150df3..8f8fe01e68 100644 --- a/strbuf.h +++ b/strbuf.h @@ -244,6 +244,15 @@ void strbuf_addchars(struct strbuf *sb, int c, size_t n); */ void strbuf_insert(struct strbuf *sb, size_t pos, const void *, size_t); +/** + * Insert data to the given position of the buffer giving a printf format + * string. The contents will be shifted, not overwritten. + */ +void strbuf_vinsertf(struct strbuf *sb, size_t pos, const char *fmt, + va_list ap); + +void strbuf_insertf(struct strbuf *sb, size_t pos, const char *fmt, ...); + /** * Remove given amount of data from a given position of the buffer. */