From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from vultr.musolino.id.au ([45.76.123.158]) by ewsd; Sun Dec 8 05:10:05 EST 2019 Received: from 118.211.112.149 ([118.211.112.149]) by vultr; Sun Dec 8 21:09:04 EST 2019 Message-ID: From: Alex Musolino Date: Sun, 8 Dec 2019 20:39:00 +1030 To: 9front@9front.org Subject: Re: [9front] hgfs(4) loadrevinfo patch In-Reply-To: 14C9554C3CB0AFFD0F8EDAA40E360768@musolino.id.au MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: content-addressed managed realtime service-aware rich-client optimizer > 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 #include #include +#include #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; }