Blame


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