Flag die methods as noreturn
[TortoiseGit.git] / ext / gitdll / die.cpp
blobab3aa8722bf83d58abd9755f2b520a3d7382c9e6
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2011, 2013, 2016-2017 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "stdafx.h"
20 #include "gitdll.h"
21 #include "stdio.h"
23 #define MAX_ERROR_STR_SIZE 512
24 extern "C" char g_last_error[MAX_ERROR_STR_SIZE]={0};
25 extern "C" int close_all();
26 static int dyingRecCnt = 0;
28 static void reset_dll_state()
30 close_all();
31 dyingRecCnt = 0;
34 static void set_last_error(const char *err, va_list params)
36 memset(g_last_error, 0, MAX_ERROR_STR_SIZE);
37 vsnprintf(g_last_error, MAX_ERROR_STR_SIZE - 1, err, params);
40 extern "C" [[noreturn]] void die_dll(const char* err, va_list params)
42 set_last_error(err, params);
43 reset_dll_state();
44 throw g_last_error;
47 [[noreturn]] void die(const char* err, ...)
49 va_list params;
50 va_start(params, err);
51 set_last_error(err, params);
52 va_end(params);
54 reset_dll_state();
56 throw g_last_error;
59 extern "C" void handle_error(const char*, va_list)
61 // ignore for now
64 extern "C" void handle_warning(const char*, va_list)
66 // ignore for now
69 extern "C" [[noreturn]] void vc_exit(int code)
71 if (strlen(g_last_error))
73 char old_err[MAX_ERROR_STR_SIZE];
74 memcpy(old_err, g_last_error, MAX_ERROR_STR_SIZE);
75 die("libgit called \"exit(%d)\". Last error was:\n%s", code, old_err);
77 else
78 die("libgit called \"exit(%d)\".", code);
81 extern "C" int die_is_recursing_dll()
83 return dyingRecCnt++;