encodefmt.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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 }