summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlistair Popple <alistair@popple.id.au>2018-11-07 13:49:18 +1100
committerAlistair Popple <alistair@popple.id.au>2018-12-11 14:45:22 +1100
commite09316fbf5ab120f147703b420bfe58518985601 (patch)
treebaf974b5f2ed945c6bcd114848a99f94b5492ebf /src
parent6f8823d89fff24c89e486d2be8faaebc7a4944f4 (diff)
downloadpdbg-e09316fbf5ab120f147703b420bfe58518985601.tar.gz
pdbg-e09316fbf5ab120f147703b420bfe58518985601.zip
optcmd: Add parser for 8-bit power of 2 integers
Signed-off-by: Alistair Popple <alistair@popple.id.au>
Diffstat (limited to 'src')
-rw-r--r--src/parsers.c26
-rw-r--r--src/parsers.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/src/parsers.c b/src/parsers.c
index 868c383..8575784 100644
--- a/src/parsers.c
+++ b/src/parsers.c
@@ -1,3 +1,4 @@
+#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
@@ -55,6 +56,31 @@ uint16_t *parse_number16(const char *argv)
return n;
}
+/* Parse an 8-bit number that is a power of 2 */
+uint8_t *parse_number8_pow2(const char *argv)
+{
+ uint8_t *n;
+ unsigned long int tmp, i;
+ char *endptr;
+
+ if (!argv)
+ return NULL;
+
+ errno = 0;
+ tmp = strtoul(argv, &endptr, 0);
+ if (tmp >= 256)
+ return NULL;
+
+ for (i = tmp; i; i >>= 1)
+ if ((i & 1) && (i >> 1))
+ return NULL;
+
+ n = malloc(sizeof(*n));
+ *n = tmp;
+
+ return n;
+}
+
/* Parse a GPR number, returning an error if it's greater than 32 */
int *parse_gpr(const char *argv)
{
diff --git a/src/parsers.h b/src/parsers.h
index 935c242..ba52178 100644
--- a/src/parsers.h
+++ b/src/parsers.h
@@ -16,6 +16,7 @@
uint64_t *parse_number64(const char *argv);
uint32_t *parse_number32(const char *argv);
uint16_t *parse_number16(const char *argv);
+uint8_t *parse_number8_pow2(const char *argv);
int *parse_gpr(const char *argv);
int *parse_spr(const char *argv);
bool *parse_flag_noarg(const char *argv);
OpenPOWER on IntegriCloud