Skip to content

Commit

Permalink
fsck: provide a function to parse fsck message IDs
Browse files Browse the repository at this point in the history
These functions will be used in the next commits to allow the user to
ask fsck to handle specific problems differently, e.g. demoting certain
errors to warnings. The upcoming `fsck_set_msg_types()` function has to
handle partial strings because we would like to be able to parse, say,
'missingemail=warn,missingtaggerentry=warn' command line parameters
(which will be passed by receive-pack to index-pack and unpack-objects).

To make the parsing robust, we generate strings from the enum keys, and
using these keys, we match up strings without dashes case-insensitively
to the corresponding enum values.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Jun 22, 2015
1 parent c99ba49 commit f417eed
Showing 1 changed file with 33 additions and 2 deletions.
35 changes: 33 additions & 2 deletions fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,46 @@ enum fsck_msg_id {
};
#undef MSG_ID

#define MSG_ID(id, msg_type) { FSCK_##msg_type },
#define STR(x) #x
#define MSG_ID(id, msg_type) { STR(id), NULL, FSCK_##msg_type },
static struct {
const char *id_string;
const char *downcased;
int msg_type;
} msg_id_info[FSCK_MSG_MAX + 1] = {
FOREACH_MSG_ID(MSG_ID)
{ -1 }
{ NULL, NULL, -1 }
};
#undef MSG_ID

static int parse_msg_id(const char *text)
{
int i;

if (!msg_id_info[0].downcased) {
/* convert id_string to lower case, without underscores. */
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);

msg_id_info[i].downcased = q;
while (*p)
if (*p == '_')
p++;
else
*(q)++ = tolower(*(p)++);
*q = '\0';
}
}

for (i = 0; i < FSCK_MSG_MAX; i++)
if (!strcmp(text, msg_id_info[i].downcased))
return i;

return -1;
}

static int fsck_msg_type(enum fsck_msg_id msg_id,
struct fsck_options *options)
{
Expand Down

0 comments on commit f417eed

Please sign in to comment.