[Pdbg] [RFC][PATCH] WIP: Refactor commands and command argument parsing
Balbir Singh
bsingharora at gmail.com
Fri Jun 1 00:45:48 AEST 2018
On Thu, May 31, 2018 at 11:56 AM, Alistair Popple <alistair at popple.id.au> wrote:
> On Wednesday, 30 May 2018 6:57:40 PM AEST Balbir Singh wrote:
>> On Wed, May 30, 2018 at 2:26 PM, Alistair Popple <alistair at popple.id.au> wrote:
>> > ---
>> > Makefile.am | 2 +-
>> > src/cfam.c | 52 ++++++----------------
>> > src/main.c | 49 ++++++---------------
>> > src/opt.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> > src/opt.h | 96 +++++++++++++++++++++++++++++++++++++++++
>> > src/reg.c | 137 +++++++++++++++++++---------------------------------------
>> > src/ring.c | 32 +++-----------
>> > src/scom.c | 51 +++++-----------------
>> > src/thread.c | 35 ++++++---------
>> > 9 files changed, 334 insertions(+), 259 deletions(-)
>> > create mode 100644 src/opt.c
>> > create mode 100644 src/opt.h
>>
>> Without a changelog it's really hard to review the
>> intention/improvement. Having said that print_cmds_usage() is ugliest
>> function I've seen written in all of pdbg (please find a better way to
>> do this).
>
> Oh be fair ... I found this yesterday:
>
> while ((!((val & HTM_MEM_SIZE_SMALL) && i>>20 == 16)) && (!(!(val & HTM_MEM_SIZE_SMALL) && i>>20 == 512))) {
>
> Surely that must be in the running :-)
>
Surely that wins, sigh!
> But yeah, that is something I will cleanup before posting a non-WIP version.
>
>> There's a bit of type dependency in parsing, but I guess
>> it's the lack of proper type inference semantics.
>
> Sorry, I should've included a better changelog.
>
> The intent here is to centralise command argument parsing so that we don't have
> code like this copied everywhere:
>
> int handle_spr(int optind, int argc, char *argv[])
> {
> char *endptr;
> uint64_t spr;
>
> if (optind + 1 >= argc) {
> printf("%s: command '%s' requires a GPR\n", argv[0], argv[optind]);
> return -1;
> }
>
> errno = 0;
> spr = strtoull(argv[optind + 1], &endptr, 0);
> if (errno || *endptr != '\0') {
> printf("%s: command '%s' couldn't parse GPR '%s'\n",
> argv[0], argv[optind], argv[optind + 1]);
> return -1;
> }
>
> Which is not only prone to copy-and-paste bugs (have you spotted the error in
> the above?) but also a pain to maintain/change due to the multiple copies. We
> could certainly refactor that somewhat to reduce code duplication and that's the
> rabbit hole I started down to end up with:
>
> int parse_spr(char *arg)
> {
> ...
> }
>
> int getspr(int spr) {
> ...
> };
> DEFINE_CMD1(getspr, spr);
>
> Where `spr` specifies the parser for converting the "char *" command argument
> into a "int spr" is `parse_spr`. Note that it is in fact type safe as well -
> changing parse_spr() to return a long int instead of an int for example will
> result in a grokable compiler error.
>
That's much better, yeah we probably just need a type converter from
string to type T, I suppose. I still don't like the ACTION1/2, seems
irrelavant to the cause.
Balbir
More information about the Pdbg
mailing list