usage.c 1.7 KB

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