xalloc
This commit is contained in:
parent
25d789c77b
commit
2c2c0781d9
6 changed files with 190 additions and 26 deletions
31
src/common/die.c
Normal file
31
src/common/die.c
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* common/die.c - functionality for killing things in creative ways.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Henrik Hautakoski <henrik@fiktivkod.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void die(const char *err, ...) {
|
||||||
|
|
||||||
|
va_list vl;
|
||||||
|
va_start(vl, err);
|
||||||
|
vfprintf(stderr, err, vl);
|
||||||
|
va_end(vl);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void die_errno(const char *desc) {
|
||||||
|
|
||||||
|
if (errno)
|
||||||
|
perror(desc);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
@ -10,31 +10,13 @@
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <malloc.h>
|
#include "xalloc.h"
|
||||||
#include <assert.h>
|
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
|
|
||||||
#define CHNK_SIZE 128
|
#define CHNK_SIZE 128
|
||||||
|
|
||||||
char strbuf_null = '\0';
|
char strbuf_null = '\0';
|
||||||
|
|
||||||
static void* xrealloc(void *ptr, size_t size) {
|
|
||||||
|
|
||||||
assert(size);
|
|
||||||
ptr = realloc(ptr, size);
|
|
||||||
assert(ptr != NULL);
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void* xcalloc(size_t nmemb, size_t size) {
|
|
||||||
|
|
||||||
assert(nmemb);
|
|
||||||
assert(size);
|
|
||||||
void *ptr = calloc(nmemb, size);
|
|
||||||
assert(ptr != NULL);
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void strbuf_init(strbuf_t *s) {
|
void strbuf_init(strbuf_t *s) {
|
||||||
|
|
||||||
s->buf = &strbuf_null;
|
s->buf = &strbuf_null;
|
||||||
|
|
@ -69,7 +51,7 @@ char* strbuf_release(strbuf_t *s) {
|
||||||
char *ret;
|
char *ret;
|
||||||
|
|
||||||
if (!s->alloc_size)
|
if (!s->alloc_size)
|
||||||
ret = xcalloc(1, 1);
|
ret = xmallocz(1);
|
||||||
else if (s->len + 1 != s->alloc_size)
|
else if (s->len + 1 != s->alloc_size)
|
||||||
ret = xrealloc(s->buf, s->len + 1);
|
ret = xrealloc(s->buf, s->len + 1);
|
||||||
else
|
else
|
||||||
|
|
@ -85,7 +67,7 @@ void strbuf_free(strbuf_t *s) {
|
||||||
if (!s->alloc_size)
|
if (!s->alloc_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
free(s->buf);
|
xfree(s->buf);
|
||||||
strbuf_init(s);
|
strbuf_init(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
18
src/common/util.h
Normal file
18
src/common/util.h
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
/* common/util.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Henrik Hautakoski <henrik@fiktivkod.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COMMON_UTIL_H
|
||||||
|
#define __COMMON_UTIL_H
|
||||||
|
|
||||||
|
void die(const char *, ...);
|
||||||
|
|
||||||
|
void die_errno(const char *);
|
||||||
|
|
||||||
|
#endif /* __COMMOT_UTIL_H */
|
||||||
85
src/common/xalloc.c
Normal file
85
src/common/xalloc.c
Normal file
|
|
@ -0,0 +1,85 @@
|
||||||
|
/* common/xalloc.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Henrik Hautakoski <henrik@fiktivkod.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "util.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
#define CHECK(expr) \
|
||||||
|
if (!(expr)) \
|
||||||
|
goto bail
|
||||||
|
|
||||||
|
#define CHECK_SET_ERRNO(expr, no) \
|
||||||
|
if (!(expr)) { \
|
||||||
|
errno = no; \
|
||||||
|
goto bail; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __DEBUG__
|
||||||
|
# define CHECK_INPUT(s) CHECK_SET_ERRNO(s, EINVAL)
|
||||||
|
#else
|
||||||
|
# define CHECK_INPUT(s)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void* xmalloc(size_t size) {
|
||||||
|
|
||||||
|
CHECK_INPUT(size);
|
||||||
|
|
||||||
|
void *ptr = malloc(size);
|
||||||
|
CHECK(ptr);
|
||||||
|
return ptr;
|
||||||
|
bail:
|
||||||
|
die_errno("xmalloc");
|
||||||
|
}
|
||||||
|
|
||||||
|
void* xmallocz(size_t size) {
|
||||||
|
|
||||||
|
CHECK_INPUT(size);
|
||||||
|
|
||||||
|
void *ptr = malloc(size);
|
||||||
|
CHECK(ptr);
|
||||||
|
memset(ptr, 0, size);
|
||||||
|
return ptr;
|
||||||
|
bail:
|
||||||
|
die_errno("xmallocz");
|
||||||
|
}
|
||||||
|
|
||||||
|
void* xrealloc(void *ptr, size_t size) {
|
||||||
|
|
||||||
|
CHECK_INPUT(size);
|
||||||
|
|
||||||
|
ptr = realloc(ptr, size);
|
||||||
|
CHECK(ptr);
|
||||||
|
return ptr;
|
||||||
|
bail:
|
||||||
|
die_errno("xrealloc");
|
||||||
|
}
|
||||||
|
|
||||||
|
char* xstrdup(const char *s) {
|
||||||
|
|
||||||
|
CHECK_INPUT(s);
|
||||||
|
|
||||||
|
char *c = strdup(s);
|
||||||
|
CHECK(c);
|
||||||
|
return c;
|
||||||
|
bail:
|
||||||
|
die_errno("xstrdup");
|
||||||
|
}
|
||||||
|
|
||||||
|
void xfree(void *ptr) {
|
||||||
|
|
||||||
|
CHECK_INPUT(ptr);
|
||||||
|
free(ptr);
|
||||||
|
return;
|
||||||
|
bail:
|
||||||
|
die_errno("xfree");
|
||||||
|
}
|
||||||
26
src/common/xalloc.h
Normal file
26
src/common/xalloc.h
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
/* common/xalloc.h - stricter memory allocation.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Henrik Hautakoski <henrik@fiktivkod.org>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COMMON_XALLOC_H
|
||||||
|
#define __COMMON_XALLOC_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void* xmalloc(size_t);
|
||||||
|
|
||||||
|
void* xmallocz(size_t);
|
||||||
|
|
||||||
|
void* xrealloc(void *, size_t);
|
||||||
|
|
||||||
|
char* xstrdup(const char *);
|
||||||
|
|
||||||
|
void xfree(void *);
|
||||||
|
|
||||||
|
#endif /* __COMMON_XALLOC_H */
|
||||||
|
|
@ -9,17 +9,30 @@ raw_inotify :
|
||||||
$(CC) -linotifytools t_raw_inotify.c -o test_raw_inotify
|
$(CC) -linotifytools t_raw_inotify.c -o test_raw_inotify
|
||||||
|
|
||||||
strbuf :
|
strbuf :
|
||||||
$(CC) $(CFLAGS) ../src/common/strbuf.c t_strbuf.c -o test_strbuf
|
$(CC) $(CFLAGS) \
|
||||||
|
../src/common/strbuf.c \
|
||||||
|
../src/common/xalloc.c \
|
||||||
|
../src/common/die.c \
|
||||||
|
t_strbuf.c -o test_strbuf
|
||||||
|
|
||||||
path :
|
path :
|
||||||
$(CC) $(DEFS) $(CFLAGS) unit.c ../src/common/strbuf.c ../src/common/path.c t_path.c -o test_path
|
$(CC) $(CFLAGS) \
|
||||||
|
unit.c \
|
||||||
|
../src/common/xalloc.c \
|
||||||
|
../src/common/die.c \
|
||||||
|
../src/common/strbuf.c \
|
||||||
|
../src/common/path.c \
|
||||||
|
t_path.c -o test_path
|
||||||
|
|
||||||
rbtree :
|
rbtree :
|
||||||
$(CC) $(DEFS) $(CFLAGS) unit.c ../src/common/rbtree.c t_rbtree.c -o test_rbtree
|
$(CC) $(CFLAGS) unit.c ../src/common/rbtree.c t_rbtree.c -o test_rbtree
|
||||||
|
|
||||||
inotify :
|
inotify :
|
||||||
$(CC) -lpthread -D INOTIFY_DEBUG -D RB_DEBUG $(CFLAGS) \
|
$(CC) -lpthread -D INOTIFY_DEBUG -D RB_DEBUG $(CFLAGS) \
|
||||||
../src/common/rbtree.c \
|
../src/common/rbtree.c \
|
||||||
|
../src/common/xalloc.c \
|
||||||
|
../src/common/die.c \
|
||||||
|
../src/common/strbuf.c \
|
||||||
../src/common/path.c \
|
../src/common/path.c \
|
||||||
../src/notify/event.c \
|
../src/notify/event.c \
|
||||||
../src/notify/tree.c \
|
../src/notify/tree.c \
|
||||||
|
|
@ -27,18 +40,27 @@ inotify :
|
||||||
t_inotify.c -o test_inotify
|
t_inotify.c -o test_inotify
|
||||||
|
|
||||||
tree :
|
tree :
|
||||||
$(CC) $(CFLAGS) ../src/common/path.c ../src/notify/tree.c t_tree.c -o test_tree
|
$(CC) $(CFLAGS) \
|
||||||
|
../src/common/path.c \
|
||||||
|
../src/notify/tree.c \
|
||||||
|
../src/common/xalloc.c \
|
||||||
|
../src/common/die.c \
|
||||||
|
../src/common/strbuf.c \
|
||||||
|
t_tree.c -o test_tree
|
||||||
|
|
||||||
indexer :
|
indexer :
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) \
|
$(CC) $(CFLAGS) $(LDFLAGS) \
|
||||||
../src/common/rbtree.c \
|
../src/common/rbtree.c \
|
||||||
../src/common/path.c \
|
../src/common/path.c \
|
||||||
|
../src/common/xalloc.c \
|
||||||
|
../src/common/die.c \
|
||||||
|
../src/common/strbuf.c \
|
||||||
../src/notify/tree.c \
|
../src/notify/tree.c \
|
||||||
../src/notify/inotify.c \
|
../src/notify/inotify.c \
|
||||||
../src/notify/event.c \
|
../src/notify/event.c \
|
||||||
../src/arch/mysql.c \
|
../src/arch/mysql.c \
|
||||||
../src/indexer.c \
|
../src/indexer.c \
|
||||||
t_indexer.c -o test_indexer
|
t_indexer.c -o test_indexer
|
||||||
|
|
||||||
mysql :
|
mysql :
|
||||||
$(CC) -D DB_DEBUG $(CFLAGS) $(LDFLAGS) ../src/arch/mysql.c t_mysql.c -o test_mysql
|
$(CC) -D DB_DEBUG $(CFLAGS) $(LDFLAGS) ../src/arch/mysql.c t_mysql.c -o test_mysql
|
||||||
|
|
|
||||||
Reference in a new issue