Files
libucore/src/ucore_bcd.c
T
2012-11-15 18:26:31 +01:00

56 lines
970 B
C

#include <ctype.h>
#include <stdint.h>
#include <stddef.h>
#include <ucore/ucore_string.h>
size_t
uc_ascii2bcd(const char *ascii, unsigned char *bcdout, unsigned char filler)
{
unsigned char *bcdp = bcdout;
int shift = 0;
*bcdp = 0;
for(; *ascii; ascii++) {
if(*ascii < '0' || *ascii > '9') {
continue;
}
*bcdp |= (*ascii - '0') << shift;
if(shift) {
bcdp++;
*bcdp = 0;
}
shift = 4 - shift;
}
if(shift) {
*bcdp |= (filler & 0xf) << 4;
bcdp++;
}
return bcdp - bcdout;
}
static const char hex[] = "0123456789ABCDEF";
size_t
uc_bcd2ascii(const unsigned char *bcd, size_t bcdlen, char *asciiout)
{
size_t i;
size_t idx = 0;
for(i = 0; i < bcdlen; i++) {
asciiout[idx] = hex[bcd[i] & 0xf];
idx++;
asciiout[idx] = hex[(bcd[i] & 0xf0) >> 4];
idx++;
}
asciiout[idx] = 0;
return idx;
}