1
0
mirror of https://github.com/golang/go synced 2024-11-25 06:07:58 -07:00

libbio: fix Bprint bug

Make Bprint work even when the amount of output
exceeds the available buffer space.

R=r
CC=golang-dev
https://golang.org/cl/1968041
This commit is contained in:
Russ Cox 2010-08-10 17:38:28 -07:00
parent 753c9b5710
commit 9d5da464ff

View File

@ -3,6 +3,7 @@ http://code.google.com/p/inferno-os/source/browse/libbio/bprint.c
Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved. Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
Revisions Copyright © 2010 Google Inc. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@ -30,25 +31,52 @@ THE SOFTWARE.
int int
Bprint(Biobuf *bp, char *fmt, ...) Bprint(Biobuf *bp, char *fmt, ...)
{ {
va_list ap; int n;
char *ip, *ep, *out; va_list arg;
int n;
ep = (char*)bp->ebuf; va_start(arg, fmt);
ip = ep + bp->ocount; n = Bvprint(bp, fmt, arg);
va_start(ap, fmt); va_end(arg);
out = vseprint(ip, ep, fmt, ap); return n;
va_end(ap); }
if(out == nil || out >= ep-5) {
Bflush(bp); static int
ip = ep + bp->ocount; bflush(Fmt *f)
va_start(ap, fmt); {
out = vseprint(ip, ep, fmt, ap); Biobuf *bp;
va_end(ap);
if(out >= ep-5) if(f->stop == nil)
return Beof; return 0;
}
n = out-ip; bp = f->farg;
bp->ocount += n; bp->ocount = (char*)f->to - (char*)f->stop;
return n; if(Bflush(bp) < 0) {
f->stop = nil;
f->to = nil;
return 0;
}
f->to = (char*)f->stop + bp->ocount;
return 1;
}
int
Bvprint(Biobuf *bp, char *fmt, va_list arg)
{
int n;
Fmt f;
memset(&f, 0, sizeof f);
fmtlocaleinit(&f, nil, nil, nil);
f.stop = bp->ebuf;
f.to = (char*)f.stop + bp->ocount;
f.flush = bflush;
f.farg = bp;
n = fmtvprint(&f, fmt, arg);
if(f.stop != nil)
bp->ocount = (char*)f.to - (char*)f.stop;
return n;
} }