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