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