Started rearranging things to allow for subtests; I should clean up the allocation stuff in libui first, so they can be borrowed.

This commit is contained in:
Pietro Gagliardi 2019-05-19 11:05:20 -04:00
parent efb761f5f2
commit 66f1f75992
1 changed files with 39 additions and 27 deletions

View File

@ -22,35 +22,36 @@ static void internalError(const char *fmt, ...)
abort();
}
static void *mustmalloc(size_t n, const char *what)
static void *mustMalloc(size_t n, const char *what)
{
void *x;
void *p;
x = malloc(n);
if (x == NULL)
p = malloc(n);
if (p == NULL)
internalError("memory exhausted allocating %s", what);
memset(x, 0, n);
return x;
memset(p, 0, n);
return p;
}
#define new(T) ((T *) mustmalloc(sizeof (T), #T))
#define newArray(T, n) ((T *) mustmalloc(n * sizeof (T), #T "[" #n "]"))
#define mustNew(T) ((T *) mustMalloc(sizeof (T), #T))
#define mustNewArray(T, n) ((T *) mustMalloc(n * sizeof (T), #T "[]"))
static void *mustrealloc(void *x, size_t prevN, size_t n, const char *what)
static void *mustRealloc(void *p, size_t old, size_t new, const char *what)
{
void *y;
// don't use realloc() because we want to clear the new memory
y = malloc(n);
if (y == NULL)
p = realloc(p, new);
if (p == NULL)
internalError("memory exhausted reallocating %s", what);
memset(y, 0, n);
memmove(y, x, prevN);
free(x);
return y;
if (new > old)
memset(((uint8_t *) p) + old, 0, new - old);
return p;
}
#define resizeArray(x, T, prevN, n) ((T *) mustrealloc(x, prevN * sizeof (T), n * sizeof (T), #T "[" #n "]"))
#define mustResizeArray(x, T, old, new) ((T *) mustRealloc(x, old * sizeof (T), new * sizeof (T), #T "[]"))
static void mustFree(void *p)
{
free(p);
}
static int mustvsnprintf(char *s, size_t n, const char *format, va_list ap)
{
@ -73,6 +74,15 @@ static int mustsnprintf(char *s, size_t n, const char *format, ...)
return ret;
}
static char *muststrdup(const char *s)
{
char *t;
t = (char *) mustMalloc((strlen(s) + 1) * sizeof (char), "char[]");
strcpy(t, s);
return t;
}
// a struct outbuf of NULL writes directly to stdout
struct outbuf {
char *buf;
@ -100,7 +110,7 @@ static void outbufCopyStr(struct outbuf *o, const char *str, size_t len)
prevcap = o->cap;
o->cap += grow;
o->buf = resizeArray(o->buf, char, prevcap, o->cap);
o->buf = mustResizeArray(o->buf, char, prevcap, o->cap);
}
memmove(o->buf + o->len, str, len * sizeof (char));
o->len += len;
@ -126,7 +136,7 @@ static void outbufVprintf(struct outbuf *o, int indent, const char *format, va_l
n = mustvsnprintf(NULL, 0, format, ap2);
// TODO handle n < 0 case
va_end(ap2);
buf = newArray(char, n + 1);
buf = mustNewArray(char, n + 1);
mustvsnprintf(buf, n + 1, format, ap);
// strip trailing blank lines
@ -155,7 +165,7 @@ static void outbufVprintf(struct outbuf *o, int indent, const char *format, va_l
outbufCopyStr(o, lineStart, strlen(lineStart));
outbufAddNewline(o);
free(buf);
mustFree(buf);
}
static void outbufPrintf(struct outbuf *o, int indent, const char *format, ...)
@ -188,6 +198,7 @@ struct defer {
struct testingT {
// set at test creation time
const char *name;
char *computedName;
void (*f)(testingT *);
const char *file;
long line;
@ -216,6 +227,7 @@ static void initTest(testingT *t, const char *name, void (*f)(testingT *), const
{
memset(t, 0, sizeof (testingT));
t->name = name;
t->computedName = muststrdup(name);
t->f = f;
t->file = file;
t->line = line;
@ -239,7 +251,7 @@ void testingprivSetRegisterTest(testingSet **pset, const char *name, void (*f)(t
if (pset != NULL) {
set = *pset;
if (set == NULL) {
set = new(testingSet);
set = mustNew(testingSet);
*pset = set;
}
}
@ -248,7 +260,7 @@ void testingprivSetRegisterTest(testingSet **pset, const char *name, void (*f)(t
prevcap = set->cap;
set->cap += nGrow;
set->tests = resizeArray(set->tests, testingT, prevcap, set->cap);
set->tests = mustResizeArray(set->tests, testingT, prevcap, set->cap);
}
initTest(set->tests + set->len, name, f, file, line);
set->len++;
@ -361,11 +373,11 @@ void testingprivTLogvfFull(testingT *t, const char *file, long line, const char
n2 = mustvsnprintf(NULL, 0, format, ap2);
// TODO handle n2 < 0 case
va_end(ap2);
buf = newArray(char, n + n2 + 1);
buf = mustNewArray(char, n + n2 + 1);
mustsnprintf(buf, n + 1, "%s:%ld: ", file, line);
mustvsnprintf(buf + n, n2 + 1, format, ap);
outbufPrintf(&(t->output), t->indent, "%s", buf);
free(buf);
mustFree(buf);
}
void testingTFail(testingT *t)
@ -400,7 +412,7 @@ void testingTDefer(testingT *t, void (*f)(testingT *t, void *data), void *data)
{
struct defer *d;
d = new(struct defer);
d = mustNew(struct defer);
d->f = f;
d->data = data;
// add to the head of the list so defers are run in reverse order of how they were added