Blob
1 #include <lib9.h>3 int4 encodefmt(Fmt *f)5 {6 char *out;7 char *buf;8 int len;9 int ilen;10 int rv;11 uchar *b;12 char obuf[64]; // rsc optimization14 if(!(f->flags&FmtPrec) || f->prec < 0)15 goto error;17 b = va_arg(f->args, uchar*);19 ilen = f->prec;20 f->prec = 0;21 f->flags &= ~FmtPrec;22 switch(f->r){23 case '<':24 len = (8*ilen+4)/5 + 3;25 break;26 case '[':27 len = (8*ilen+5)/6 + 4;28 break;29 case 'H':30 len = 2*ilen + 1;31 break;32 default:33 goto error;34 }36 if(len > sizeof(obuf)){37 buf = malloc(len);38 if(buf == nil)39 goto error;40 } else41 buf = obuf;43 // convert44 out = buf;45 switch(f->r){46 case '<':47 rv = enc32(out, len, b, ilen);48 break;49 case '[':50 rv = enc64(out, len, b, ilen);51 break;52 case 'H':53 rv = enc16(out, len, b, ilen);54 break;55 default:56 rv = -1;57 break;58 }59 if(rv < 0)60 goto error;62 fmtstrcpy(f, buf);63 if(buf != obuf)64 free(buf);65 return 0;67 error:68 return fmtstrcpy(f, "<encodefmt>");69 }