зеркало из https://github.com/microsoft/git.git
Introduce usagef() that takes a printf-style format
Some new callers would want to use printf-like formatting, when issuing their usage messages. An option is to change usage() itself also be like printf(), which would make it similar to die() and warn(). But usage() is typically fixed, as opposed to die() and warn() that gives diagnostics depending on the situation. Indeed, the majority of strings given by existing callsites to usage() are fixed strings. If we were to make usage() take printf-style format, they all need to be changed to have "%s" as their first argument. So instead, introduce usagef() so that limited number of callers can use it. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
99caeed05d
Коммит
64b1cb74f8
|
@ -189,6 +189,7 @@ extern char *gitbasename(char *);
|
||||||
|
|
||||||
/* General helper functions */
|
/* General helper functions */
|
||||||
extern NORETURN void usage(const char *err);
|
extern NORETURN void usage(const char *err);
|
||||||
|
extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||||
extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||||
extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
extern NORETURN void die_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||||
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
|
||||||
|
|
17
usage.c
17
usage.c
|
@ -12,9 +12,9 @@ static void report(const char *prefix, const char *err, va_list params)
|
||||||
fprintf(stderr, "%s%s\n", prefix, msg);
|
fprintf(stderr, "%s%s\n", prefix, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NORETURN void usage_builtin(const char *err)
|
static NORETURN void usage_builtin(const char *err, va_list params)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "usage: %s\n", err);
|
report("usage: ", err, params);
|
||||||
exit(129);
|
exit(129);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ static void warn_builtin(const char *warn, va_list params)
|
||||||
|
|
||||||
/* If we are in a dlopen()ed .so write to a global variable would segfault
|
/* If we are in a dlopen()ed .so write to a global variable would segfault
|
||||||
* (ugh), so keep things static. */
|
* (ugh), so keep things static. */
|
||||||
static NORETURN_PTR void (*usage_routine)(const char *err) = usage_builtin;
|
static NORETURN_PTR void (*usage_routine)(const char *err, va_list params) = usage_builtin;
|
||||||
static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
|
static NORETURN_PTR void (*die_routine)(const char *err, va_list params) = die_builtin;
|
||||||
static void (*error_routine)(const char *err, va_list params) = error_builtin;
|
static void (*error_routine)(const char *err, va_list params) = error_builtin;
|
||||||
static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
|
static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
|
||||||
|
@ -46,9 +46,18 @@ void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list param
|
||||||
die_routine = routine;
|
die_routine = routine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void usagef(const char *err, ...)
|
||||||
|
{
|
||||||
|
va_list params;
|
||||||
|
|
||||||
|
va_start(params, err);
|
||||||
|
usage_routine(err, params);
|
||||||
|
va_end(params);
|
||||||
|
}
|
||||||
|
|
||||||
void usage(const char *err)
|
void usage(const char *err)
|
||||||
{
|
{
|
||||||
usage_routine(err);
|
usagef("%s", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
void die(const char *err, ...)
|
void die(const char *err, ...)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче