X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/blobdiff_plain/ebcf9b833bc750ce81951a3278065bbb86ecbdce..f6779008e58e8d3158555dca574e7bbdb15a55dd:/test/decodeindex.c diff --git a/test/decodeindex.c b/test/decodeindex.c index bbe15f4..1eef6a6 100644 --- a/test/decodeindex.c +++ b/test/decodeindex.c @@ -19,56 +19,20 @@ #include #include #include -#include #include #include +#include "common.h" #define PROGNAME "decodeindex" static const char *progname = PROGNAME; -static const unsigned char sopts[] = "VH"; +static const char sopts[] = "VH"; static const struct option lopts[] = { { "version", 0, NULL, 'V' }, { "help", 0, NULL, 'H' }, { 0 } }; -/* - * Decode a hexadecimal string into a sequence of bytes. If there are an - * odd number of nibbles, treat the first character as the least significant - * nibble of the first byte. The result is written to the buffer specified by - * buf. At most n bytes are written to the buffer. - * - * Returns the number of bytes that would be written provided that n was large - * enough, or (size_t)-1 if the input is not valid. - */ -static size_t decode_hex(const char *hex, unsigned char *buf, size_t n) -{ - size_t len, count = 0; - char tmp[] = "00"; - - for (len = 0; hex[len]; len++) { - if (!isxdigit(hex[len])) - return -1; - } - - if (!len) - return 0; - - switch (len % 2) { - while (len > 0) { - case 0: tmp[0] = *hex++; len--; - case 1: tmp[1] = *hex++; len--; - - if (count < n) - buf[count] = strtoul(tmp, NULL, 16); - count++; - } - } - - return count; -} - static void print_usage(FILE *f) { fprintf(f, "Usage: %s [options] index [index ...]\n", progname); @@ -86,6 +50,12 @@ static void print_version(void) static void print_bytes(FILE *f, int indent, void *buf, size_t n) { fprintf(f, "%*s", indent, ""); + + if (n == 0) { + fprintf(f, "(empty)\n"); + return; + } + for (size_t i = 0; i < n; i++) fprintf(f, "%*s%.2hhx", i != 0, "", ((unsigned char *)buf)[i]); putc('\n', f); @@ -98,14 +68,11 @@ static int print_index(const char *hex) size_t n, rc; int ret = -1; - n = decode_hex(hex, buf, sizeof buf); + n = test_decode_hex(hex, buf, sizeof buf); if (n == -1) { fprintf(stderr, "%s: invalid hex sequence: %s\n", progname, hex); goto out; - } else if (n == 0) { - fprintf(stderr, "%s: empty argument\n", progname); - goto out; } else if (n > sizeof buf) { fprintf(stderr, "%s: hex sequence too long: %s\n", progname, hex);