]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/port/u16.c
libregexp: improve the transition to next available thread, instruction, and generation
[plan9front.git] / sys / src / libc / port / u16.c
1 #include <u.h>
2 #include <libc.h>
3 static char t16e[] = "0123456789ABCDEF";
4
5 int
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
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 }