9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

u16.c (808B)


      1 #include <lib9.h>
      2 static char t16e[] = "0123456789ABCDEF";
      3 
      4 int
      5 dec16(uchar *out, int lim, char *in, int n)
      6 {
      7 	int c, w = 0, i = 0;
      8 	uchar *start = out;
      9 	uchar *eout = out + lim;
     10 
     11 	while(n-- > 0){
     12 		c = *in++;
     13 		if('0' <= c && c <= '9')
     14 			c = c - '0';
     15 		else if('a' <= c && c <= 'z')
     16 			c = c - 'a' + 10;
     17 		else if('A' <= c && c <= 'Z')
     18 			c = c - 'A' + 10;
     19 		else
     20 			continue;
     21 		w = (w<<4) + c;
     22 		i++;
     23 		if(i == 2){
     24 			if(out + 1 > eout)
     25 				goto exhausted;
     26 			*out++ = w;
     27 			w = 0;
     28 			i = 0;
     29 		}
     30 	}
     31 exhausted:
     32 	return out - start;
     33 }
     34 
     35 int
     36 enc16(char *out, int lim, uchar *in, int n)
     37 {
     38 	uint c;
     39 	char *eout = out + lim;
     40 	char *start = out;
     41 
     42 	while(n-- > 0){
     43 		c = *in++;
     44 		if(out + 2 >= eout)
     45 			goto exhausted;
     46 		*out++ = t16e[c>>4];
     47 		*out++ = t16e[c&0xf];
     48 	}
     49 exhausted:
     50 	*out = 0;
     51 	return out - start;
     52 }