acid \B format prints 1 garbage character after fmt e.g.: acid: 0xe\B 0b00000000000000000000000000001110p fix by using %b format (which itself needed a fix to print 0b as prefix if FmtSharp is set). a clean comple requires this addition to libc.h: /n/sources/plan9//sys/include/libc.h:177,184 - libc.h:180,189 #pragma varargck type "lld" vlong #pragma varargck type "llx" vlong + #pragma varargck type "llb" vlong #pragma varargck type "lld" uvlong #pragma varargck type "llx" uvlong + #pragma varargck type "llb" uvlong #pragma varargck type "ld" long #pragma varargck type "lx" long #pragma varargck type "lb" long Notes: Fri Jul 29 16:48:39 EDT 2011 geoff fixing the actual dofmt bug has also fixed acid. a decision about %#b emitting 0b has been deferred. Reference: /n/sources/patch/maybe/acidbfmt Date: Sun Sep 12 20:10:30 CES 2010 Signed-off-by: quanstro@quanstro.net Reviewed-by: geoff --- /sys/src/libc/fmt/dofmt.c Sun Sep 12 20:05:09 2010 +++ /sys/src/libc/fmt/dofmt.c Sun Sep 12 20:05:08 2010 @@ -415,12 +415,17 @@ *p-- = '0'; n = 1; } - for(w = f->prec; n < w && p > buf+3; n++) + for(w = f->prec; n < w && p > buf+4; n++){ + if((fl & FmtComma) && n % 4 == 3){ + *p-- = ','; + n++; + } *p-- = '0'; + } if(neg || (fl & (FmtSign|FmtSpace))) n++; if(fl & FmtSharp){ - if(base == 16) + if(base == 16 || base == 2) n += 2; else if(base == 8){ if(p[1] == '0') @@ -430,14 +435,19 @@ } } if((fl & FmtZero) && !(fl & (FmtLeft|FmtPrec))){ - for(w = f->width; n < w && p > buf+3; n++) + for(w = f->width; n < w && p > buf+4; n++){ + if((fl & FmtComma) && n % 4 == 3){ + *p-- = ','; + n++; + } *p-- = '0'; + } f->width = 0; } if(fl & FmtSharp){ - if(base == 16) + if(base == 16 || base == 2) *p-- = f->r; - if(base == 16 || base == 8) + if(base == 16 || base == 8 || base == 2) *p-- = '0'; } if(neg) @@ -512,12 +522,13 @@ int _badfmt(Fmt *f) { - char x[3]; + char x[2+UTFmax]; + int n; x[0] = '%'; - x[1] = f->r; - x[2] = '%'; - f->prec = 3; - _fmtcpy(f, x, 3, 3); + n = 1 + runetochar(x+1, (Rune*)&f->r); + x[n++] = '%'; + f->prec = n; + _fmtcpy(f, x, n, n); return 0; } --- /sys/src/cmd/acid/builtin.c Sun Sep 12 20:05:18 2010 +++ /sys/src/cmd/acid/builtin.c Sun Sep 12 20:05:15 2010 @@ -969,7 +969,6 @@ void patom(char type, Store *res) { - int i; char buf[512]; extern char *typenames[]; @@ -987,14 +986,7 @@ Bprint(bout, "%C", (int)res->ival); break; case 'B': - memset(buf, '0', 34); - buf[1] = 'b'; - for(i = 0; i < 32; i++) { - if(res->ival & (1<ival); break; case 'b': Bprint(bout, "%.2x", (int)res->ival&0xff);