config: do not use C function names as struct members
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>
This commit is contained in:
parent
b2dc09455a
commit
49d6cfa5c2
32
config.c
32
config.c
@ -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;
|
||||
@ -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';
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user