1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/*
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * GIT - The information manager from hell
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) Linus Torvalds, 2005
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "util.h"
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void report(const char *prefix, const char *err, va_list params)
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char msg[1024];
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	vsnprintf(msg, sizeof(msg), err, params);
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	fprintf(stderr, " %s%s\n", prefix, msg);
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic NORETURN void usage_builtin(const char *err)
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	fprintf(stderr, "\n Usage: %s\n", err);
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	exit(129);
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic NORETURN void die_builtin(const char *err, va_list params)
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	report(" Fatal: ", err, params);
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	exit(128);
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void error_builtin(const char *err, va_list params)
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	report(" Error: ", err, params);
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void warn_builtin(const char *warn, va_list params)
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	report(" Warning: ", warn, params);
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* If we are in a dlopen()ed .so write to a global variable would segfault
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * (ugh), so keep things static. */
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void (*usage_routine)(const char *err) NORETURN = usage_builtin;
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void (*error_routine)(const char *err, va_list params) = error_builtin;
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void (*warn_routine)(const char *err, va_list params) = warn_builtin;
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	die_routine = routine;
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid usage(const char *err)
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	usage_routine(err);
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid die(const char *err, ...)
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_list params;
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_start(params, err);
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	die_routine(err, params);
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_end(params);
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengint error(const char *err, ...)
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_list params;
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_start(params, err);
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	error_routine(err, params);
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_end(params);
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return -1;
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid warning(const char *warn, ...)
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_list params;
76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_start(params, warn);
78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	warn_routine(warn, params);
79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	va_end(params);
80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
81