diff options
| author | Alistair Popple <alistair@popple.id.au> | 2018-11-07 13:49:18 +1100 |
|---|---|---|
| committer | Alistair Popple <alistair@popple.id.au> | 2018-12-11 14:45:22 +1100 |
| commit | e09316fbf5ab120f147703b420bfe58518985601 (patch) | |
| tree | baf974b5f2ed945c6bcd114848a99f94b5492ebf /src | |
| parent | 6f8823d89fff24c89e486d2be8faaebc7a4944f4 (diff) | |
| download | pdbg-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.c | 26 | ||||
| -rw-r--r-- | src/parsers.h | 1 |
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); |

