blob: 5dd2f48817b78540830ae833c3c07c589ba5ecc9 [file] [log] [blame]
rscb2cfc4e2003-09-30 17:47:41 +00001#include <lib9.h>
2
3int
4encodefmt(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
13
rsca6ea03a2003-10-11 02:49:01 +000014 if(!(f->flags&FmtPrec) || f->prec < 0)
rscb2cfc4e2003-09-30 17:47:41 +000015 goto error;
16
17 b = va_arg(f->args, uchar*);
18
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 }
35
36 if(len > sizeof(obuf)){
37 buf = malloc(len);
38 if(buf == nil)
39 goto error;
40 } else
41 buf = obuf;
42
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;
61
62 fmtstrcpy(f, buf);
63 if(buf != obuf)
64 free(buf);
65 return 0;
66
67error:
68 return fmtstrcpy(f, "<encodefmt>");
69}