diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2017-02-17 11:52:37 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2017-02-17 13:00:05 +0100 |
commit | 80b717af0c1c0602537a6e4d5fad76e09733f028 (patch) | |
tree | 64264beaa9822c3be7ed9b0c86608c8572c53e48 | |
parent | 298b11aed1f1517329dc6e5ead661855b1abfb05 (diff) | |
download | lvm2-80b717af0c1c0602537a6e4d5fad76e09733f028.tar.gz |
commands: cheap optimisation for parser
Some low-hanging fruits to cut of signification number of strcmp calls.
-rw-r--r-- | tools/command.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/tools/command.c b/tools/command.c index 5b31b4ef2..f1b9d8e67 100644 --- a/tools/command.c +++ b/tools/command.c @@ -495,31 +495,32 @@ static struct command_name *find_command_name(const char *name) { int i; + if (!islower(name[0])) + return NULL; /* Commands starts with lower-case */ + for (i = 0; i < MAX_COMMAND_NAMES; i++) { if (!command_names[i].name) break; if (!strcmp(command_names[i].name, name)) return &command_names[i]; } + return NULL; } static const char *is_command_name(char *str) { - int i; + const struct command_name *c; + + if ((c = find_command_name(str))) + return c->name; - for (i = 0; i < MAX_COMMAND_NAMES; i++) { - if (!command_names[i].name) - break; - if (!strcmp(command_names[i].name, str)) - return command_names[i].name; - } return NULL; } static int is_opt_name(char *str) { - if (!strncmp(str, "--", 2)) + if ((str[0] == '-') && (str[1] == '-')) return 1; if ((str[0] == '-') && (str[1] != '-')) @@ -535,18 +536,15 @@ static int is_opt_name(char *str) static int is_pos_name(char *str) { - if (!strncmp(str, "VG", 2)) - return 1; - if (!strncmp(str, "LV", 2)) - return 1; - if (!strncmp(str, "PV", 2)) - return 1; - if (!strncmp(str, "Tag", 3)) - return 1; - if (!strncmp(str, "String", 6)) - return 1; - if (!strncmp(str, "Select", 6)) - return 1; + switch (str[0]) { + case 'V': return (str[1] == 'G'); /* VG */ + case 'L': return (str[1] == 'V'); /* LV */ + case 'P': return (str[1] == 'V'); /* PV */ + case 'T': return (strncmp(str, "Tag", 3) == 0); + case 'S': return ((strncmp(str, "String", 6) == 0) || + (strncmp(str, "Select", 6) == 0)); + } + return 0; } |