diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/errors.c | 64 | ||||
| -rw-r--r-- | src/win32/posix_w32.c | 8 |
2 files changed, 70 insertions, 2 deletions
diff --git a/src/errors.c b/src/errors.c index 58e0976f2..0105c2538 100644 --- a/src/errors.c +++ b/src/errors.c @@ -6,6 +6,7 @@ */ #include "common.h" #include "global.h" +#include "posix.h" #include <stdarg.h> static struct { @@ -102,3 +103,66 @@ void git_clearerror(void) char *last_error = GIT_GLOBAL->error.last; last_error[0] = '\0'; } + +/******************************************** + * New error handling + ********************************************/ + +void giterr_set(git_error **error_out, int error_class, const char *string, ...) +{ + char error_str[1024]; + va_list arglist; + git_error *error; + + if (error_out == NULL) + return; + + error = git__malloc(sizeof(git_error)); + if (!error) { + giterr_set_oom(error_out); + return; + } + + va_start(arglist, string); + p_vsnprintf(error_str, sizeof(error_str), string, arglist); + va_end(arglist); + + error->message = git__strdup(error_str); + error->klass = error_class; + + if (error->message == NULL) { + free(error); + giterr_set_oom(error_out); + return; + } + + *error_out = error; +} + +static git_error g_git_oom_error = { + "Out of memory", + GITERR_NOMEMORY +}; + +void giterr_set_oom(git_error **error) +{ + if (error != NULL) + *error = &g_git_oom_error; +} + +void giterr_free(git_error *error) +{ + if (error == NULL || error == &g_git_oom_error) + return; + + free(error->message); + free(error); +} + +void giterr_clear(git_error **error) +{ + if (error != NULL) { + giterr_free(*error); + *error = NULL; + } +} diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 91585aeae..8e70719f9 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -341,8 +341,12 @@ done: int p_vsnprintf(char *buffer, size_t count, const char *format, va_list argptr) { #ifdef _MSC_VER - int len = _vsnprintf(buffer, count, format, argptr); - return (len < 0) ? _vscprintf(format, argptr) : len; + int len; + + if (count == 0 || (len = _vsnprintf(buffer, count, format, argptr)) < 0) + return p_vscprintf(format, argptr); + + return len; #else /* MinGW */ return vsnprintf(buffer, count, format, argptr); #endif |
