Johannes Schindelin <[email protected]> writes:
> diff --git a/fsck.c b/fsck.c
> index 1a3f7ce..e81a342 100644
> --- a/fsck.c
> +++ b/fsck.c
> @@ -64,30 +64,29 @@ enum fsck_msg_id {
> #undef MSG_ID
>
> #define STR(x) #x
> -#define MSG_ID(id, msg_type) { STR(id), FSCK_##msg_type },
> +#define MSG_ID(id, msg_type) { STR(id), NULL, FSCK_##msg_type },
> static struct {
> const char *id_string;
> + const char *lowercased;
> int msg_type;
> } msg_id_info[FSCK_MSG_MAX + 1] = {
> FOREACH_MSG_ID(MSG_ID)
> - { NULL, -1 }
> + { NULL, NULL, -1 }
> };
> #undef MSG_ID
>
> static int parse_msg_id(const char *text)
> {
> - static char **lowercased;
> int i;
>
> - if (!lowercased) {
> + if (!msg_id_info[0].lowercased) {
> /* convert id_string to lower case, without underscores. */
> - lowercased = xmalloc(FSCK_MSG_MAX * sizeof(*lowercased));
> for (i = 0; i < FSCK_MSG_MAX; i++) {
> const char *p = msg_id_info[i].id_string;
> int len = strlen(p);
> char *q = xmalloc(len);
>
> - lowercased[i] = q;
> + msg_id_info[i].lowercased = q;
> while (*p)
> if (*p == '_')
> p++;
> @@ -98,7 +97,7 @@ static int parse_msg_id(const char *text)
> }
>
> for (i = 0; i < FSCK_MSG_MAX; i++)
> - if (!strcmp(text, lowercased[i]))
> + if (!strcmp(text, msg_id_info[i].lowercased))
> return i;
>
> return -1;
Heh, this was the first thing that came to my mind when I saw 03/19
that lazily prepares downcased version (which is good) but do so in
a separately allocated buffer (which is improved by this change) ;-)
IOW, I think all of the above should have been part of 03/19, not
"oops I belatedly realized that this way is better" fixup here.
The end result looks good, so let's keep reading.
> +void fsck_set_msg_types(struct fsck_options *options, const char *values)
> +{
> + char *buf = xstrdup(values), *to_free = buf;
> + int done = 0;
> +
> + while (!done) {
> + int len = strcspn(buf, " ,|"), equal;
> +
> + done = !buf[len];
> + if (!len) {
> + buf++;
> + continue;
> + }
> + buf[len] = '\0';
> +
> + for (equal = 0; equal < len &&
> + buf[equal] != '=' && buf[equal] != ':'; equal++)
Style. I'd format this more like so:
for (equal = 0;
equal < len && buf[equal] != '=' && buf[equal] != ':';
equal++)
> + buf[equal] = tolower(buf[equal]);
> + buf[equal] = '\0';
> +
> + if (equal == len)
> + die("Missing '=': '%s'", buf);
> +
> + fsck_set_msg_type(options, buf, buf + equal + 1);
> + buf += len + 1;
> + }
> + free(to_free);
> +}
Overall, the change is good (and it was good in v6, too), and I
think it has become simpler to follow the logic with the upfront
downcasing.
Thanks.
--
To unsubscribe from this list: send the line "unsubscribe git" in