Fixed memory leaks in test suite
[libgit2.git] / src / util.c
blob84a5237f8ce73ff4cdf8b644ddfa9f0bcedb45df
1 #define GIT__NO_HIDE_MALLOC
2 #include "common.h"
3 #include <stdarg.h>
4 #include <stdio.h>
6 void *git__malloc(size_t n)
8 void *r = malloc(n);
9 if (!r)
10 return git_ptr_error(GIT_ENOMEM);
11 return r;
14 void *git__calloc(size_t a, size_t b)
16 void *r = calloc(a, b);
17 if (!r)
18 return git_ptr_error(GIT_ENOMEM);
19 return r;
22 char *git__strdup(const char *s)
24 char *r = strdup(s);
25 if (!s)
26 return git_ptr_error(GIT_ENOMEM);
27 return r;
30 int git__fmt(char *buf, size_t buf_sz, const char *fmt, ...)
32 va_list va;
33 int r;
35 va_start(va, fmt);
36 r = vsnprintf(buf, buf_sz, fmt, va);
37 va_end(va);
38 if (r < 0 || ((size_t) r) >= buf_sz)
39 return GIT_ERROR;
40 return r;
43 int git__prefixcmp(const char *str, const char *prefix)
45 for (;;) {
46 char p = *(prefix++), s;
47 if (!p)
48 return 0;
49 if ((s = *(str++)) != p)
50 return s - p;
54 int git__suffixcmp(const char *str, const char *suffix)
56 size_t a = strlen(str);
57 size_t b = strlen(suffix);
58 if (a < b)
59 return -1;
60 return strcmp(str + (a - b), suffix);
63 int git__dirname(char *dir, size_t n, char *path)
65 char *s;
66 size_t len;
68 assert(dir && n > 1);
70 if (!path || !*path || (s = strrchr(path, '/')) == NULL) {
71 strcpy(dir, ".");
72 return 1;
75 if (s == path) { /* "/[aaa]" */
76 strcpy(dir, "/");
77 return 1;
80 if ((len = s - path) >= n)
81 return GIT_ERROR;
83 memcpy(dir, path, len);
84 dir[len] = '\0';
86 return len;
89 int git__basename(char *base, size_t n, char *path)
91 char *s;
92 size_t len;
94 assert(base && n > 1);
96 if (!path || !*path) {
97 strcpy(base, ".");
98 return 1;
100 len = strlen(path);
102 if ((s = strrchr(path, '/')) == NULL) {
103 if (len >= n)
104 return GIT_ERROR;
105 strcpy(base, path);
106 return len;
109 if (s == path && len == 1) { /* "/" */
110 strcpy(base, "/");
111 return 1;
114 len -= s - path;
115 if (len >= n)
116 return GIT_ERROR;
118 memcpy(base, s+1, len);
119 base[len] = '\0';
121 return len;