| encodefmt.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
| git clone git://git.suckless.org/9base | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| encodefmt.c (1072B) | |
| --- | |
| 1 #include <lib9.h> | |
| 2 | |
| 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 */ | |
| 13 | |
| 14 b = va_arg(f->args, uchar*); | |
| 15 if(b == 0) | |
| 16 return fmtstrcpy(f, "<nil>"); | |
| 17 | |
| 18 ilen = f->prec; | |
| 19 f->prec = 0; | |
| 20 | |
| 21 if(!(f->flags&FmtPrec) || ilen < 0) | |
| 22 goto error; | |
| 23 | |
| 24 f->flags &= ~FmtPrec; | |
| 25 | |
| 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 } | |
| 39 | |
| 40 if(len > sizeof(obuf)){ | |
| 41 buf = malloc(len); | |
| 42 if(buf == nil) | |
| 43 goto error; | |
| 44 } else | |
| 45 buf = obuf; | |
| 46 | |
| 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; | |
| 68 | |
| 69 fmtstrcpy(f, buf); | |
| 70 if(buf != obuf) | |
| 71 free(buf); | |
| 72 return 0; | |
| 73 | |
| 74 error: | |
| 75 return fmtstrcpy(f, "<encodefmt>"); | |
| 76 } |