From fd02178983c99006a2bef5467c80730407881724 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 4 Dec 2006 12:56:36 +0000 Subject: Break up some modules a little finer, in support of some Python bindings. All regression tests pass. No logic changes. --- hex.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 hex.c (limited to 'hex.c') diff --git a/hex.c b/hex.c new file mode 100644 index 00000000..48e9ad3e --- /dev/null +++ b/hex.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + +#include "gpsd_config.h" +#include "gpsd.h" + +char /*@ observer @*/ *gpsd_hexdump(const void *binbuf, size_t binbuflen) +{ + static char hexbuf[MAX_PACKET_LENGTH*2+1]; +#ifndef SQUELCH_ENABLE + size_t i, j = 0; + size_t len = (size_t)((binbuflen > MAX_PACKET_LENGTH) ? MAX_PACKET_LENGTH : binbuflen); + const char *ibuf = (const char *)binbuf; + const char *hexchar = "0123456789abcdef"; + + /*@ -shiftimplementation @*/ + for (i = 0; i < len; i++) { + hexbuf[j++] = hexchar[ (ibuf[i]&0xf0)>>4 ]; + hexbuf[j++] = hexchar[ ibuf[i]&0x0f ]; + } + /*@ +shiftimplementation @*/ + hexbuf[j] ='\0'; +#else /* SQUELCH defined */ + hexbuf[0] = '\0'; +#endif /* SQUELCH_ENABLE */ + return hexbuf; +} + +int gpsd_hexpack(char *src, char *dst, int len){ + int i, k, l; + + l = (int)(strlen(src) / 2); + if ((l < 1) || (l > len)) + return -1; + + bzero(dst, len); + for (i = 0; i < l; i++) + if ((k = hex2bin(src+i*2)) != -1) + dst[i] = (char)(k & 0xff); + else + return -1; + return l; +} + +/*@ +charint -shiftimplementation @*/ +int hex2bin(char *s) +{ + int a, b; + + a = s[0] & 0xff; + b = s[1] & 0xff; + + if ((a >= 'a') && (a <= 'z')) + a = a + 10 - 'a'; + else if ((a >= 'A') && (a <= 'Z')) + a = a + 10 - 'A'; + else if ((a >= '0') && (a <= '9')) + a -= '0'; + else + return -1; + + if ((b >= 'a') && (b <= 'z')) + b = b + 10 - 'a'; + else if ((b >= 'A') && (b <= 'Z')) + b = b + 10 - 'A'; + else if ((b >= '0') && (b <= '9')) + b -= '0'; + else + return -1; + + return ((a<<4) + b); +} +/*@ -charint +shiftimplementation @*/ -- cgit v1.2.1