Loading...
Searching...
No Matches
handler.c
Go to the documentation of this file.
/*!
\file lib/gis/handler.c
\brief GIS Library - Error handlers
(C) 2010-2011 by the GRASS Development Team
This program is free software under the GNU General Public
License (>=v2). Read the file COPYING that comes with GRASS
for details.
\author Glynn Clements
*/
#include <stddef.h>
#include <grass/gis.h>
/*!
\brief Error handler (see G_add_error_handler() for usage)
*/
struct handler {
/*!
\brief Pointer to the handler routine
*/
void (*func)(void *);
/*!
\brief Pointer to closure data
*/
void *closure;
};
static struct handler *handlers;
static int num_handlers;
static int max_handlers;
static struct handler *alloc_handler(void)
{
int i;
for (i = 0; i < num_handlers; i++) {
struct handler *h = &handlers[i];
if (!h->func)
return h;
}
if (num_handlers >= max_handlers) {
max_handlers += 10;
handlers = G_realloc(handlers, max_handlers * sizeof(struct handler));
}
return &handlers[num_handlers++];
}
/*!
\brief Add new error handler
Example
\code
static void error_handler(void *p) {
const char *map = (const char *) p;
Vect_delete(map);
}
G_add_error_handler(error_handler, new->answer);
\endcode
\param func handler to add
\param closure pointer to closure data
*/
void G_add_error_handler(void (*func)(void *), void *closure)
{
struct handler *h = alloc_handler();
h->func = func;
h->closure = closure;
}
/*!
\brief Remove existing error handler
\param func handler to be remove
\param closure pointer to closure data
*/
void G_remove_error_handler(void (*func)(void *), void *closure)
{
int i;
for (i = 0; i < num_handlers; i++) {
struct handler *h = &handlers[i];
if (h->func == func && h->closure == closure) {
h->func = NULL;
h->closure = NULL;
}
}
}
/*!
\brief Call available error handlers (internal use only)
*/
void G__call_error_handlers(void)
{
int i;
for (i = 0; i < num_handlers; i++) {
struct handler *h = &handlers[i];
if (h->func)
(*h->func)(h->closure);
}
}
NULL
#define NULL
Definition ccmath.h:32
G_add_error_handler
void G_add_error_handler(void(*func)(void *), void *closure)
Add new error handler.
Definition handler.c:71
G__call_error_handlers
void G__call_error_handlers(void)
Call available error handlers (internal use only).
Definition handler.c:102
G_remove_error_handler
void G_remove_error_handler(void(*func)(void *), void *closure)
Remove existing error handler.
Definition handler.c:85