|  | #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; | 
|  | } | 
|  |  | 
|  |  |