usage.con commit merge-recursive: don't segfault while handling rename clashes (c94736a)
   1/*
   2 * GIT - The information manager from hell
   3 *
   4 * Copyright (C) Linus Torvalds, 2005
   5 */
   6#include "git-compat-util.h"
   7
   8static void report(const char *prefix, const char *err, va_list params)
   9{
  10        char msg[256];
  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, "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}