9front - general discussion about 9front
 help / color / mirror / Atom feed
From: Alex Musolino <alex@musolino.id.au>
To: 9front@9front.org
Subject: Re: [9front] hgfs(4) loadrevinfo patch
Date: Sun, 8 Dec 2019 20:39:00 +1030	[thread overview]
Message-ID: <E12BCD0BE1713C7C27D73538C7AA6409@musolino.id.au> (raw)
In-Reply-To: 14C9554C3CB0AFFD0F8EDAA40E360768@musolino.id.au

> I'll send an updated patch tomorrow night.

Okay, here it is.

diff -r aca41046f6ee sys/src/cmd/hgfs/info.c
--- a/sys/src/cmd/hgfs/info.c	Mon Dec 02 14:50:53 2019 -0800
+++ b/sys/src/cmd/hgfs/info.c	Sun Dec 08 20:38:42 2019 +1030
@@ -1,16 +1,18 @@
 #include <u.h>
 #include <libc.h>
 #include <thread.h>
+#include <bio.h>
 #include "dat.h"
 #include "fns.h"
 
 Revinfo*
 loadrevinfo(Revlog *changelog, int rev)
 {
-	char buf[BUFSZ], *p, *e;
-	int fd, line, eof, inmsg, n;
+	int c, fd;
+	char *line;
 	Revinfo *ri;
 	vlong off;
+	Biobuf *buf;
 
 	if((fd = revlogopentemp(changelog, rev)) < 0)
 		return nil;
@@ -21,59 +23,56 @@
 	ri = malloc(sizeof(*ri));
 	memset(ri, 0, sizeof(*ri));
 
+	ri->logoff = off;
 	memmove(ri->chash, changelog->map[rev].hash, HASHSZ);
 
-	eof = 0;
-	line = 0;
-	inmsg = 0;
-	p = buf;
-	e = buf + BUFSZ;
-	while(eof == 0){
-		if((n = read(fd, p, e - p)) < 0)
-			break;
-		if(n == 0){
-			eof = 1;
-			*p = '\n';
-			n++;
+	buf = Bfdopen(fd, OREAD);
+	line = Brdstr(buf, '\n', 1);
+	if(line == nil)
+		goto Error;
+	hex2hash(line, ri->mhash);
+	free(line);
+
+	line = Brdstr(buf, '\n', 1);
+	if(line == nil)
+		goto Error;
+	ri->who = line;
+
+	line = Brdstr(buf, '\n', 1);
+	if(line == nil)
+		goto Error;
+	ri->when = strtol(line, nil, 10);
+	free(line);
+
+	ri->logoff = Boffset(buf);
+
+	for(;;){
+		if((c = Bgetc(buf)) < 0)
+			goto Error;
+		if(c == '\n'){
+			if((c = Bgetc(buf)) < 0)
+				goto Error;
+			if(c == '\n')
+				break;
 		}
-		p += n;
-		while((p > buf) && (e = memchr(buf, '\n', p - buf))){
-			*e++ = 0;
+	}
 
-			switch(line++){
-			case 0:
-				hex2hash(buf, ri->mhash);
-				break;
-			case 1:
-				ri->who = strdup(buf);
-				break;
-			case 2:
-				ri->when = strtol(buf, nil, 10);
-				break;
-			case 3:
-				ri->logoff = off;
-			default:
-				if(!inmsg){
-					if(*buf == 0){
-						ri->loglen = off - ri->logoff;
-						inmsg = 1;
-					}
-				} else {
-					n = ri->why ? strlen(ri->why) : 0;
-					ri->why = realloc(ri->why, n + strlen(buf)+2);
-					if(n > 0) ri->why[n++] = '\n';
-					strcpy(ri->why + n, buf);
-				}
-			}
-			n = e - buf;
-			p -= n;
-			if(p > buf)
-				memmove(buf, e, p - buf);
-			off += n;
-		}
-		e = buf + BUFSZ;
-	}
+	ri->loglen = Boffset(buf) - ri->logoff - 1;
+
+	line = Brdstr(buf, '\0', 1);
+	if(line == nil)
+		goto Error;
+	ri->why = line;
+
+	Bterm(buf);
 	close(fd);
 
 	return ri;
+Error:
+	Bterm(buf);
+	close(fd);
+	free(ri->who);
+	free(ri->why);
+	free(ri);
+	return nil;
 }


             reply	other threads:[~2019-12-08 10:09 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-08 10:09 Alex Musolino [this message]
  -- strict thread matches above, loose matches on Subject: below --
2019-12-09  0:55 cinap_lenrek
2019-12-07  2:27 Alex Musolino
2019-12-07  2:10 cinap_lenrek

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=E12BCD0BE1713C7C27D73538C7AA6409@musolino.id.au \
    --to=alex@musolino.id.au \
    --cc=9front@9front.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).