1 /* 2 * GIT - The information manager from hell 3 * 4 * Copyright (C) Linus Torvalds, 2005 5 */ 6 #include "util.h" 7 8 static 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 15 static NORETURN void usage_builtin(const char *err) 16 { 17 fprintf(stderr, "\n Usage: %s\n", err); 18 exit(129); 19 } 20 21 static NORETURN void die_builtin(const char *err, va_list params) 22 { 23 report(" Fatal: ", err, params); 24 exit(128); 25 } 26 27 static void error_builtin(const char *err, va_list params) 28 { 29 report(" Error: ", err, params); 30 } 31 32 static 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. */ 39 static void (*usage_routine)(const char *err) NORETURN = usage_builtin; 40 static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin; 41 static void (*error_routine)(const char *err, va_list params) = error_builtin; 42 static void (*warn_routine)(const char *err, va_list params) = warn_builtin; 43 44 void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN) 45 { 46 die_routine = routine; 47 } 48 49 void usage(const char *err) 50 { 51 usage_routine(err); 52 } 53 54 void 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 63 int 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 73 void 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