vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

encodefmt.c (1099B)


      1 #include "u.h"
      2 #include "lib.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 }