Skip to content

Commit

Permalink
error-handling: Add new routines
Browse files Browse the repository at this point in the history
Obviously all the old throw routines are still in place, so we can
gradually port over.
  • Loading branch information
vmg committed Mar 3, 2012
1 parent 845f831 commit 60bc2d2
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 3 deletions.
15 changes: 15 additions & 0 deletions include/git2/errors.h
Expand Up @@ -113,8 +113,23 @@ typedef enum {

/** The buffer is too short to satisfy the request */
GIT_ESHORTBUFFER = -32,
} git_error_t;

typedef struct {
char *message;
int klass;
} git_error;

typedef enum {
GITERR_NOMEMORY,

} git_error_class;

GIT_EXTERN(void) giterr_set(git_error **error_out, int error_class, const char *string, ...);
GIT_EXTERN(void) giterr_set_oom(git_error **error);
GIT_EXTERN(void) giterr_free(git_error *error);
GIT_EXTERN(void) giterr_clear(git_error **error);

/**
* Return a detailed error string with the latest error
* that occurred in the library.
Expand Down
64 changes: 64 additions & 0 deletions src/errors.c
Expand Up @@ -6,6 +6,7 @@
*/
#include "common.h"
#include "global.h"
#include "posix.h"
#include <stdarg.h>

static struct {
Expand Down Expand Up @@ -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;
}
}
8 changes: 6 additions & 2 deletions src/win32/posix_w32.c
Expand Up @@ -341,8 +341,12 @@ char *p_realpath(const char *orig_path, char *buffer)
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
Expand Down
2 changes: 1 addition & 1 deletion tests-clar/object/tree/frompath.c
Expand Up @@ -24,7 +24,7 @@ void test_object_tree_frompath__cleanup(void)
cl_fixture_cleanup("testrepo.git");
}

static void assert_tree_from_path(git_tree *root, const char *path, git_error expected_result, const char *expected_raw_oid)
static void assert_tree_from_path(git_tree *root, const char *path, int expected_result, const char *expected_raw_oid)
{
git_tree *containing_tree = NULL;

Expand Down

0 comments on commit 60bc2d2

Please sign in to comment.