Blob


1 #include <lib9.h>
3 int
4 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 optimization
14 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 } else
41 buf = obuf;
43 // convert
44 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 }