Mercurial > hg > th-libs
view th_util.h @ 23:a4f894105953
Add ringbuffer implementation.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 09 Jun 2011 17:33:18 +0300 |
parents | bbb243eba688 |
children | 06a72c643460 |
line wrap: on
line source
/* * Generic utility-functions, macros and defaults * Programmed and designed by Matti 'ccr' Hamalainen * (C) Copyright 2002-2010 Tecnic Software productions (TNSP) * * Please read file 'COPYING' for information on license and distribution. */ #ifndef _TH_UTIL_H #define _TH_UTIL_H #ifdef __cplusplus extern "C" { #endif #include "th_types.h" #include <stdarg.h> #include <stdlib.h> #include <sys/types.h> #ifndef HAVE_NO_ASSERT #include <assert.h> #endif #ifdef HAVE_STRING_H #include <string.h> #define HAVE_MEMSET 1 #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif #ifdef HAVE_MEMORY_H #include <memory.h> #endif #ifdef TH_NO_DEFAULTS #define TH_PROG_AUTHOR NULL #define TH_PROG_LICENSE NULL #else #define TH_PROG_AUTHOR "By Matti 'ccr' Hämäläinen (C) Copyright 2011 TNSP" #define TH_PROG_LICENSE "This software is licensed under GNU GPL version 2" #endif /* Replacement for assert() */ #ifdef HAVE_NO_ASSERT # ifdef NDEBUG # define assert(NEXPR) /* stub */ # else # define assert(NEXPR) do { if (!(NEXPR)) { fprintf(stderr, "[%s:%d] assert(" # NEXPR ") failed!\n", __FILE__, __LINE__); abort(); } } while (0) # endif #endif /* Global variables */ extern int th_verbosityLevel; extern char *th_prog_name, *th_prog_fullname, *th_prog_version, *th_prog_author, *th_prog_license; /* Functions */ void th_init(char *progName, char *progFullName, char *progVersion, char *progAuthor, char *progLicense); void THERR(const char *, ...); void THMSG(int, const char *, ...); void THPRINT(int, const char *, ...); void THERR_V(const char *, va_list); void THMSG_V(int, const char *, va_list); void THPRINT_V(int, const char *, va_list); void *th_malloc(size_t); void *th_calloc(size_t, size_t); void *th_realloc(void *, size_t); void th_free(void *); #ifdef HAVE_MEMSET #define th_memset memset #else void *th_memset(void *, int, size_t); #endif /* Doubly linked list handling */ typedef struct _qlist_t { void *data; size_t num; struct _qlist_t *prev, *next; } qlist_t; qlist_t * th_llist_new(void *data); void th_llist_free(qlist_t *list); void th_llist_free_func(qlist_t *list, void (*freefunc)(void *data)); qlist_t * th_llist_append(qlist_t **list, void *data); qlist_t * th_llist_prepend(qlist_t **list, void *data); void th_llist_delete(qlist_t **list, const void *data); void th_llist_delete_node(qlist_t **list, qlist_t *node); qlist_t * th_llist_get_nth(qlist_t *list, const size_t n); size_t th_llist_length(const qlist_t *list); ssize_t th_llist_position(const qlist_t *list, const qlist_t *node); qlist_t * th_llist_find(qlist_t *list, const void *data); qlist_t * th_llist_find_func(qlist_t *list, const void *userdata, int (compare)(const void *, const void *)); /* Ringbuffer implementation */ typedef struct { void **data; int n, size; void (*deallocator)(void *); } qringbuf_t; qringbuf_t * th_ringbuf_new(const size_t size, void (*mdeallocator)(void *)); BOOL th_ringbuf_grow(qringbuf_t *buf, const size_t n); void th_ringbuf_free(qringbuf_t *buf); void th_ringbuf_add(qringbuf_t *buf, void *ptr); #ifdef __cplusplus } #endif #endif /* _TH_UTIL_H */