Skip to content

Commit

Permalink
config: do not use C function names as struct members
Browse files Browse the repository at this point in the history
According to C99, section 7.1.4:

  Any function declared in a header may be additionally
  implemented as a function-like macro defined in the
  header.

Therefore calling our struct member function pointer "fgetc"
may run afoul of unwanted macro expansion when we call:

  char c = cf->fgetc(cf);

This turned out to be a problem on uclibc, which defines
fgetc as a macro and causes compilation failure.

The standard suggests fixing this in a few ways:

  1. Using extra parentheses to inhibit the function-like
     macro expansion. E.g., "(cf->fgetc)(cf)". This is
     undesirable as it's ugly, and each call site needs to
     remember to use it (and on systems without the macro,
     forgetting will compile just fine).

  2. Using #undef (because a conforming implementation must
     also be providing fgetc as a function). This is
     undesirable because presumably the implementation was
     using the macro for a performance benefit, and we are
     dropping that optimization.

Instead, we can simply use non-colliding names.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Aug 27, 2013
1 parent b2dc094 commit 49d6cfa
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ struct config_source {
struct strbuf value;
struct strbuf var;

int (*fgetc)(struct config_source *c);
int (*ungetc)(int c, struct config_source *conf);
long (*ftell)(struct config_source *c);
int (*do_fgetc)(struct config_source *c);
int (*do_ungetc)(int c, struct config_source *conf);
long (*do_ftell)(struct config_source *c);
};

static struct config_source *cf;
Expand Down Expand Up @@ -217,13 +217,13 @@ int git_config_from_parameters(config_fn_t fn, void *data)

static int get_next_char(void)
{
int c = cf->fgetc(cf);
int c = cf->do_fgetc(cf);

if (c == '\r') {
/* DOS like systems */
c = cf->fgetc(cf);
c = cf->do_fgetc(cf);
if (c != '\n') {
cf->ungetc(c, cf);
cf->do_ungetc(c, cf);
c = '\r';
}
}
Expand Down Expand Up @@ -982,9 +982,9 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
top.u.file = f;
top.name = filename;
top.die_on_error = 1;
top.fgetc = config_file_fgetc;
top.ungetc = config_file_ungetc;
top.ftell = config_file_ftell;
top.do_fgetc = config_file_fgetc;
top.do_ungetc = config_file_ungetc;
top.do_ftell = config_file_ftell;

ret = do_config_from(&top, fn, data);

Expand All @@ -1003,9 +1003,9 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
top.u.buf.pos = 0;
top.name = name;
top.die_on_error = 0;
top.fgetc = config_buf_fgetc;
top.ungetc = config_buf_ungetc;
top.ftell = config_buf_ftell;
top.do_fgetc = config_buf_fgetc;
top.do_ungetc = config_buf_ungetc;
top.do_ftell = config_buf_ftell;

return do_config_from(&top, fn, data);
}
Expand Down Expand Up @@ -1186,7 +1186,7 @@ static int store_aux(const char *key, const char *value, void *cb)
return 1;
}

store.offset[store.seen] = cf->ftell(cf);
store.offset[store.seen] = cf->do_ftell(cf);
store.seen++;
}
break;
Expand All @@ -1213,19 +1213,19 @@ static int store_aux(const char *key, const char *value, void *cb)
* Do not increment matches: this is no match, but we
* just made sure we are in the desired section.
*/
store.offset[store.seen] = cf->ftell(cf);
store.offset[store.seen] = cf->do_ftell(cf);
/* fallthru */
case SECTION_END_SEEN:
case START:
if (matches(key, value)) {
store.offset[store.seen] = cf->ftell(cf);
store.offset[store.seen] = cf->do_ftell(cf);
store.state = KEY_SEEN;
store.seen++;
} else {
if (strrchr(key, '.') - key == store.baselen &&
!strncmp(key, store.key, store.baselen)) {
store.state = SECTION_SEEN;
store.offset[store.seen] = cf->ftell(cf);
store.offset[store.seen] = cf->do_ftell(cf);
}
}
}
Expand Down

0 comments on commit 49d6cfa

Please sign in to comment.