55 lines
788 B
C
55 lines
788 B
C
|
|
#include "std.h"
|
||
|
|
#include "dat.h"
|
||
|
|
|
||
|
|
static int
|
||
|
|
unhex(char c)
|
||
|
|
{
|
||
|
|
if('0' <= c && c <= '9')
|
||
|
|
return c-'0';
|
||
|
|
if('a' <= c && c <= 'f')
|
||
|
|
return c-'a'+10;
|
||
|
|
if('A' <= c && c <= 'F')
|
||
|
|
return c-'A'+10;
|
||
|
|
abort();
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
int
|
||
|
|
hexparse(char *hex, uchar *dat, int ndat)
|
||
|
|
{
|
||
|
|
int i, n;
|
||
|
|
|
||
|
|
n = strlen(hex);
|
||
|
|
if(n%2)
|
||
|
|
return -1;
|
||
|
|
n /= 2;
|
||
|
|
if(n > ndat)
|
||
|
|
return -1;
|
||
|
|
if(hex[strspn(hex, "0123456789abcdefABCDEF")] != '\0')
|
||
|
|
return -1;
|
||
|
|
for(i=0; i<n; i++)
|
||
|
|
dat[i] = (unhex(hex[2*i])<<4)|unhex(hex[2*i+1]);
|
||
|
|
return n;
|
||
|
|
}
|
||
|
|
|
||
|
|
char*
|
||
|
|
estrappend(char *s, char *fmt, ...)
|
||
|
|
{
|
||
|
|
char *t;
|
||
|
|
int l;
|
||
|
|
va_list arg;
|
||
|
|
|
||
|
|
va_start(arg, fmt);
|
||
|
|
t = vsmprint(fmt, arg);
|
||
|
|
if(t == nil)
|
||
|
|
sysfatal("out of memory");
|
||
|
|
va_end(arg);
|
||
|
|
l = s ? strlen(s) : 0;
|
||
|
|
s = erealloc(s, l+strlen(t)+1);
|
||
|
|
strcpy(s+l, t);
|
||
|
|
free(t);
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
|