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