a
This commit is contained in:
53
libc/u16.c
Normal file
53
libc/u16.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
static char t16e[] = "0123456789ABCDEF";
|
||||
|
||||
int
|
||||
dec16(uchar *out, int lim, char *in, int n)
|
||||
{
|
||||
int c, w = 0, i = 0;
|
||||
uchar *start = out;
|
||||
uchar *eout = out + lim;
|
||||
|
||||
while(n-- > 0){
|
||||
c = *in++;
|
||||
if('0' <= c && c <= '9')
|
||||
c = c - '0';
|
||||
else if('a' <= c && c <= 'z')
|
||||
c = c - 'a' + 10;
|
||||
else if('A' <= c && c <= 'Z')
|
||||
c = c - 'A' + 10;
|
||||
else
|
||||
continue;
|
||||
w = (w<<4) + c;
|
||||
i++;
|
||||
if(i == 2){
|
||||
if(out + 1 > eout)
|
||||
goto exhausted;
|
||||
*out++ = w;
|
||||
w = 0;
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
exhausted:
|
||||
return out - start;
|
||||
}
|
||||
|
||||
int
|
||||
enc16(char *out, int lim, uchar *in, int n)
|
||||
{
|
||||
uint c;
|
||||
char *eout = out + lim;
|
||||
char *start = out;
|
||||
|
||||
while(n-- > 0){
|
||||
c = *in++;
|
||||
if(out + 2 >= eout)
|
||||
goto exhausted;
|
||||
*out++ = t16e[c>>4];
|
||||
*out++ = t16e[c&0xf];
|
||||
}
|
||||
exhausted:
|
||||
*out = 0;
|
||||
return out - start;
|
||||
}
|
Reference in New Issue
Block a user