All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
	Jeff King <peff@peff.net>
Subject: [PATCH v4 02/21] strbuf: make strbuf_getline_crlf() global
Date: Thu, 14 Jan 2016 15:58:17 -0800	[thread overview]
Message-ID: <1452815916-6447-3-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1452815916-6447-1-git-send-email-gitster@pobox.com>

Often we read "text" files that are supplied by the end user
(e.g. commit log message that was edited with $GIT_EDITOR upon 'git
commit -e'), and in some environments lines in a text file are
terminated with CRLF.  Existing strbuf_getline() knows to read a
single line and then strip the terminating byte from the result, but
it is handy to have a version that is more tailored for a "text"
input that takes both '\n' and '\r\n' as line terminator (aka
<newline> in POSIX lingo) and returns the body of the line after
stripping <newline>.

Recently reimplemented "git am" uses such a function implemented
privately; move it to strbuf.[ch] and make it available for others.

Note that we do not blindly replace calls to strbuf_getline() that
uses LF as the line terminator with calls to strbuf_getline_crlf()
and this is very much deliberate.  Some callers may want to treat an
incoming line that ends with CR (and terminated with LF) to have a
payload that includes the final CR, and such a blind replacement
will result in misconversion when done without code audit.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin/am.c | 15 ---------------
 strbuf.c     | 12 ++++++++++++
 strbuf.h     |  7 +++++++
 3 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 9fb42fd..d96735c 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -46,21 +46,6 @@ static int is_empty_file(const char *filename)
 }
 
 /**
- * Like strbuf_getline(), but treats both '\n' and "\r\n" as line terminators.
- */
-static int strbuf_getline_crlf(struct strbuf *sb, FILE *fp)
-{
-	if (strbuf_getwholeline(sb, fp, '\n'))
-		return EOF;
-	if (sb->buf[sb->len - 1] == '\n') {
-		strbuf_setlen(sb, sb->len - 1);
-		if (sb->len > 0 && sb->buf[sb->len - 1] == '\r')
-			strbuf_setlen(sb, sb->len - 1);
-	}
-	return 0;
-}
-
-/**
  * Returns the length of the first line of msg.
  */
 static int linelen(const char *msg)
diff --git a/strbuf.c b/strbuf.c
index b165d04..7ad5ea4 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -510,6 +510,18 @@ int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
 	return 0;
 }
 
+int strbuf_getline_crlf(struct strbuf *sb, FILE *fp)
+{
+	if (strbuf_getwholeline(sb, fp, '\n'))
+		return EOF;
+	if (sb->buf[sb->len - 1] == '\n') {
+		strbuf_setlen(sb, sb->len - 1);
+		if (sb->len && sb->buf[sb->len - 1] == '\r')
+			strbuf_setlen(sb, sb->len - 1);
+	}
+	return 0;
+}
+
 int strbuf_getwholeline_fd(struct strbuf *sb, int fd, int term)
 {
 	strbuf_reset(sb);
diff --git a/strbuf.h b/strbuf.h
index 7123fca..d84c866 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -388,6 +388,13 @@ extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
  */
 extern int strbuf_getline(struct strbuf *, FILE *, int);
 
+/*
+ * Similar to strbuf_getline(), but uses '\n' as the terminator,
+ * and additionally treats a '\r' that comes immediately before '\n'
+ * as part of the terminator.
+ */
+extern int strbuf_getline_crlf(struct strbuf *, FILE *);
+
 /**
  * Like `strbuf_getline`, but keeps the trailing terminator (if
  * any) in the buffer.
-- 
2.7.0-250-ge1b5ba3

  parent reply	other threads:[~2016-01-14 23:58 UTC|newest]

Thread overview: 114+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-11 20:21 [PATCH] revisions --stdin: accept CRLF line terminators Johannes Sixt
2015-08-11 21:35 ` Junio C Hamano
2015-08-11 22:14   ` Junio C Hamano
2015-08-12 18:24     ` Johannes Sixt
2015-10-28 22:25     ` [PATCH 00/17] Peace with CRLF Junio C Hamano
2015-10-28 22:25       ` [PATCH 01/17] strbuf: add strbuf_gets() Junio C Hamano
2015-10-28 22:25       ` [PATCH 02/17] check-attr, check-ignore, checkout-index: read paths with strbuf_gets() Junio C Hamano
2015-10-28 22:25       ` [PATCH 03/17] update-index: read --index-info " Junio C Hamano
2015-10-28 22:25       ` [PATCH 04/17] update-index: read list of paths with strbuf_gets() under --stdin Junio C Hamano
2015-10-28 22:25       ` [PATCH 05/17] mktree: read textual tree representation with strbuf_gets() Junio C Hamano
2015-10-28 22:25       ` [PATCH 06/17] hash-object: read --stdin-paths " Junio C Hamano
2015-10-28 22:25       ` [PATCH 07/17] revision: read --stdin " Junio C Hamano
2015-10-28 22:25       ` [PATCH 08/17] rev-parse: read parseopt spec " Junio C Hamano
2015-10-28 22:25       ` [PATCH 09/17] ident.c: read /etc/mailname " Junio C Hamano
2015-10-28 22:25       ` [PATCH 10/17] remote.c: read $GIT_DIR/remotes/* " Junio C Hamano
2015-10-28 22:25       ` [PATCH 11/17] clone/sha1_file: read info/alternates " Junio C Hamano
2015-10-28 22:25       ` [PATCH 12/17] transport-helper: read helper response " Junio C Hamano
2015-10-28 22:25       ` [PATCH 13/17] cat-file: read batch stream " Junio C Hamano
2015-10-28 22:25       ` [PATCH 14/17] column: read lines " Junio C Hamano
2015-10-28 22:25       ` [PATCH 15/17] send-pack: read list of refs " Junio C Hamano
2015-10-28 22:26       ` [PATCH 16/17] grep: read -f file " Junio C Hamano
2015-10-28 22:26       ` [PATCH 17/17] test-sha1-array: read command stream " Junio C Hamano
2015-12-16 22:03       ` [PATCH v2 00/17] Peace with CRLF Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 01/17] strbuf: make strbuf_getline_crlf() global Junio C Hamano
2016-01-04 12:25           ` Johannes Schindelin
2016-01-04 19:17             ` Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 02/17] check-attr, check-ignore, checkout-index: read paths with strbuf_getline_crlf() Junio C Hamano
2016-01-04 12:25           ` Johannes Schindelin
2016-01-04 12:27             ` Johannes Schindelin
2016-01-04 19:20               ` Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 03/17] update-index: read --index-info " Junio C Hamano
2016-01-04 12:27           ` Johannes Schindelin
2016-01-04 19:50             ` Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 04/17] update-index: read list of paths with strbuf_getline_crlf() under --stdin Junio C Hamano
2016-01-04 12:27           ` Johannes Schindelin
2015-12-16 22:03         ` [PATCH v2 05/17] mktree: read textual tree representation with strbuf_getline_crlf() Junio C Hamano
2016-01-04 12:27           ` Johannes Schindelin
2015-12-16 22:03         ` [PATCH v2 06/17] hash-object: read --stdin-paths " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 07/17] revision: read --stdin " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 08/17] rev-parse: read parseopt spec " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 09/17] ident.c: read /etc/mailname " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 10/17] remote.c: read $GIT_DIR/remotes/* " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 11/17] clone/sha1_file: read info/alternates " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 12/17] transport-helper: read helper response " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 13/17] cat-file: read batch stream " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 14/17] column: read lines " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 15/17] send-pack: read list of refs " Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 16/17] grep: read -f file " Junio C Hamano
2016-01-04 12:27           ` Johannes Schindelin
2016-01-04 19:30             ` Junio C Hamano
2015-12-16 22:03         ` [PATCH v2 17/17] test-sha1-array: read command stream " Junio C Hamano
2016-01-04 12:27           ` Johannes Schindelin
2016-01-04 12:25         ` [PATCH v2 00/17] Peace with CRLF Johannes Schindelin
2016-01-14  3:03         ` [PREVIEW v3 0/9] Preview of "Peace with CRLF" rerolled Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 1/9] strbuf: miniscule style fix Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 2/9] strbuf: make strbuf_getline_crlf() global Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 3/9] strbuf: introduce strbuf_getline_{lf,nul}() Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 4/9] mktree: there are only two line terminators Junio C Hamano
2016-01-14 10:11             ` Jeff King
2016-01-14  3:03           ` [PREVIEW v3 5/9] check-attr: " Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 6/9] check-ignore: " Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 7/9] update-index: " Junio C Hamano
2016-01-14 10:09             ` Jeff King
2016-01-14  3:03           ` [PREVIEW v3 8/9] checkout-index: " Junio C Hamano
2016-01-14 10:18             ` Jeff King
2016-01-14 17:13               ` Junio C Hamano
2016-01-14 20:13                 ` Jeff King
2016-01-14  3:03           ` [PREVIEW v3 9/9] strbuf: give strbuf_getline() to the "most text friendly" variant Junio C Hamano
2016-01-14  3:03           ` [PREVIEW v3 9/9] strbuf: retire strbuf_getline() for now Junio C Hamano
2016-01-14  3:09             ` Junio C Hamano
2016-01-14 10:23           ` [PREVIEW v3 0/9] Preview of "Peace with CRLF" rerolled Jeff King
2016-01-14 23:58           ` [PATCH v4 00/21] Peace with CRLF Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 01/21] strbuf: miniscule style fix Junio C Hamano
2016-01-14 23:58             ` Junio C Hamano [this message]
2016-01-14 23:58             ` [PATCH v4 03/21] strbuf: introduce strbuf_getline_{lf,nul}() Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 04/21] mktree: there are only two possible line terminations Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 05/21] check-attr: " Junio C Hamano
2016-01-15 19:16               ` Jeff King
2016-01-15 19:36                 ` Jeff King
2016-01-15 21:20                   ` Junio C Hamano
2016-01-15 21:23                     ` Jeff King
2016-01-15 21:29                       ` Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 06/21] check-ignore: " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 07/21] update-index: " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 08/21] checkout-index: " Junio C Hamano
2016-01-15 20:08               ` Jeff King
2016-01-15 20:20                 ` Jeff King
2016-01-15 21:22                 ` Junio C Hamano
2016-01-15 23:31                   ` Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 09/21] strbuf: give strbuf_getline() to the "most text friendly" variant Junio C Hamano
2016-01-15  1:46               ` Eric Sunshine
2016-01-15 18:02                 ` Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 10/21] hash-object: read --stdin-paths with strbuf_getline() Junio C Hamano
2016-01-15 20:23               ` Jeff King
2016-01-14 23:58             ` [PATCH v4 11/21] revision: read --stdin " Junio C Hamano
2016-01-15  1:50               ` Eric Sunshine
2016-01-15 18:38                 ` Junio C Hamano
2016-01-15 20:27               ` Jeff King
2016-01-14 23:58             ` [PATCH v4 12/21] rev-parse: read parseopt spec " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 13/21] ident.c: read /etc/mailname " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 14/21] remote.c: read $GIT_DIR/remotes/* " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 15/21] clone/sha1_file: read info/alternates " Junio C Hamano
2016-01-15  1:52               ` Eric Sunshine
2016-01-14 23:58             ` [PATCH v4 16/21] transport-helper: read helper response " Junio C Hamano
2016-01-15 20:31               ` Jeff King
2016-01-14 23:58             ` [PATCH v4 17/21] cat-file: read batch stream " Junio C Hamano
2016-01-15 20:41               ` Jeff King
2016-01-14 23:58             ` [PATCH v4 18/21] column: read lines " Junio C Hamano
2016-01-15 20:43               ` Jeff King
2016-01-14 23:58             ` [PATCH v4 19/21] send-pack: read list of refs " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 20/21] grep: read -f file " Junio C Hamano
2016-01-14 23:58             ` [PATCH v4 21/21] test-sha1-array: read command stream " Junio C Hamano
2016-01-15 19:10             ` [PATCH v4 00/21] Peace with CRLF Jeff King
2016-01-15 20:49             ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452815916-6447-3-git-send-email-gitster@pobox.com \
    --to=gitster@pobox.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.