git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 14/14] imap-send.c: simplify logic in lf_to_crlf()

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jan 15, 2013, 08:06 UTC
Message-ID
<1358237193-8887-15-git-send-email-mhagger@alum.mit.edu>
In-Reply-To
<1358237193-8887-1-git-send-email-mhagger@alum.mit.edu>
* The first character in the string used to be special-cased to get
  around the fact that msg->buf[i - 1] is not defined for i == 0.
  Instead, keep track of the previous character in a separate
  variable, "lastc", initialized in such a way to let the loop handle
  i == 0 correctly.
* Make the two loops over the string look as similar as possible to
  make it more obvious that the count computed in the first pass
  agrees with the true length of the new string written in the second
  pass.  As a side effect, this makes it possible to use the "j"
  counter in place of lfnum and new_len.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 imap-send.c | 52 +++++++++++++++++++++++-----------------------------
 1 file changed, 23 insertions(+), 29 deletions(-)
diff --git a/imap-send.c b/imap-send.c
index f2933e9..1d40207 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -1081,42 +1081,36 @@ bail:
 	return NULL;
 }
 
+/*
+ * Insert CR characters as necessary in *msg to ensure that every LF
+ * character in *msg is preceded by a CR.
+ */
 static void lf_to_crlf(struct strbuf *msg)
 {
-	size_t new_len;
 	char *new;
-	int i, j, lfnum = 0;
-
-	if (msg->buf[0] == '\n')
-		lfnum++;
-	for (i = 1; i < msg->len; i++) {
-		if (msg->buf[i - 1] != '\r' && msg->buf[i] == '\n')
-			lfnum++;
+	size_t i, j;
+	char lastc;
+
+	/* First pass: tally, in j, the size of the new string: */
+	for (i = j = 0, lastc = '\0'; i < msg->len; i++) {
+		if (msg->buf[i] == '\n' && lastc != '\r')
+			j++; /* a CR will need to be added here */
+		lastc = msg->buf[i];
+		j++;
 	}
 
-	new_len = msg->len + lfnum;
-	new = xmalloc(new_len + 1);
-	if (msg->buf[0] == '\n') {
-		new[0] = '\r';
-		new[1] = '\n';
-		i = 1;
-		j = 2;
-	} else {
-		new[0] = msg->buf[0];
-		i = 1;
-		j = 1;
-	}
-	for ( ; i < msg->len; i++) {
-		if (msg->buf[i] != '\n') {
-			new[j++] = msg->buf[i];
-			continue;
-		}
-		if (msg->buf[i - 1] != '\r')
+	new = xmalloc(j + 1);
+
+	/*
+	 * Second pass: write the new string.  Note that this loop is
+	 * otherwise identical to the first pass.
+	 */
+	for (i = j = 0, lastc = '\0'; i < msg->len; i++) {
+		if (msg->buf[i] == '\n' && lastc != '\r')
 			new[j++] = '\r';
-		/* otherwise it already had CR before */
-		new[j++] = '\n';
+		lastc = new[j++] = msg->buf[i];
 	}
-	strbuf_attach(msg, new, new_len, new_len + 1);
+	strbuf_attach(msg, new, j, j + 1);
 }
 
 /*
-- 
1.8.0.3
Previous: Michael HaggertyNext: Jeff King
Message 23 of 25 in “Remove unused code from imap-send.c”
  1. 00/14 Remove unused code from imap-send.cMichael Haggerty, Jan 15, 2013
  2. 01/14 imap-send.c: remove msg_data::flags, which was always zeroMichael Haggerty, Jan 15, 2013
  3. 02/14 imap-send.c: remove struct msg_dataMichael Haggerty, Jan 15, 2013
  4. 03/14 iamp-send.c: remove unused struct imap_store_confMichael Haggerty, Jan 15, 2013
  5. 04/14 imap-send.c: remove struct store_confMichael Haggerty, Jan 15, 2013
  6. 05/14 imap-send.c: remove struct messageMichael Haggerty, Jan 15, 2013
  7. 06/14 imap-send.c: remove some unused fields from struct storeMichael Haggerty, Jan 15, 2013
  8. Jonathan NiederJan 15, 2013
  9. Junio C HamanoJan 15, 2013
  10. Jonathan NiederJan 15, 2013
  11. Michael HaggertyJan 16, 2013
  12. 07/14 imap-send.c: inline imap_parse_list() in imap_list()Michael Haggerty, Jan 15, 2013
  13. Matt KraaiJan 15, 2013
  14. Michael HaggertyJan 16, 2013
  15. Junio C HamanoJan 16, 2013
  16. Michael HaggertyJan 17, 2013
  17. 08/14 imap-send.c: remove struct imap argument to parse_imap_list_l()Michael Haggerty, Jan 15, 2013
  18. 09/14 imap-send.c: remove namespace fields from struct imapMichael Haggerty, Jan 15, 2013
  19. 10/14 imap-send.c: remove unused field imap_store::trashncMichael Haggerty, Jan 15, 2013
  20. 11/14 imap-send.c: use struct imap_store instead of struct storeMichael Haggerty, Jan 15, 2013
  21. 12/14 imap-send.c: remove unused field imap_store::uidvalidityMichael Haggerty, Jan 15, 2013
  22. 13/14 imap-send.c: fold struct store into struct imap_storeMichael Haggerty, Jan 15, 2013
  23. 14/14 imap-send.c: simplify logic in lf_to_crlf()Michael Haggerty, Jan 15, 2013
  24. Jeff KingJan 15, 2013
  25. Jonathan NiederJan 15, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.