Blob


1 #include <lib9.h>
3 int
4 encodefmt(Fmt *f)
5 {
6 char *out;
7 char *buf, *p;
8 int len;
9 int ilen;
10 int rv;
11 uchar *b;
12 char obuf[64]; /* rsc optimization */
14 b = va_arg(f->args, uchar*);
15 if(b == 0)
16 return fmtstrcpy(f, "<nil>");
18 ilen = f->prec;
19 f->prec = 0;
21 if(!(f->flags&FmtPrec) || ilen < 0)
22 goto error;
24 f->flags &= ~FmtPrec;
26 switch(f->r){
27 case '<':
28 len = (8*ilen+4)/5 + 3;
29 break;
30 case '[':
31 len = (8*ilen+5)/6 + 4;
32 break;
33 case 'H':
34 len = 2*ilen + 1;
35 break;
36 default:
37 goto error;
38 }
40 if(len > sizeof(obuf)){
41 buf = malloc(len);
42 if(buf == nil)
43 goto error;
44 } else
45 buf = obuf;
47 /* convert */
48 out = buf;
49 switch(f->r){
50 case '<':
51 rv = enc32(out, len, b, ilen);
52 break;
53 case '[':
54 rv = enc64(out, len, b, ilen);
55 break;
56 case 'H':
57 rv = enc16(out, len, b, ilen);
58 if(rv >= 0 && (f->flags & FmtLong))
59 for(p = buf; *p; p++)
60 *p = tolower((uchar)*p);
61 break;
62 default:
63 rv = -1;
64 break;
65 }
66 if(rv < 0)
67 goto error;
69 fmtstrcpy(f, buf);
70 if(buf != obuf)
71 free(buf);
72 return 0;
74 error:
75 return fmtstrcpy(f, "<encodefmt>");
76 }