/* Terminality - a portable terminal handling library * Copyright (C) 1998-2002, Emil Mikulic. * This is LGPL - look at COPYING.LIB */ /* Project: Terminality * File: register.c * Authors: Michal Safranek * Description: Element register */ const char register_rcsid[] = "$Id: register.c,v 1.7 2002/07/26 01:39:40 darkmoon Exp $"; #define __REGISTER_INTERNAL__ #include "register.h" #include /* Element register list - here are elements stored */ tn_list *register_list = NULL; /* Max elem id now */ int register_maxid = -1; /* Add element to register */ int register_add(element_type type, void *ptr) { register_elem *re = xmalloc(sizeof(register_elem)); re->type = type; re->elem = ptr; re->id = ++register_maxid; if (register_list) tn_list_add(register_list, re); else register_list = tn_list_new(re); return re->id; } /* Del element from register */ int register_del(int id) { int i, j, maxid; register_elem *re = NULL; assert(id > -1); for(i = 0; i < tn_list_size(register_list); i++) { if ((re = (register_elem *) tn_list_getdata(register_list, i))->id == id) { xfree(re); re = NULL; tn_list_delete(register_list, i); if (id == register_maxid) { /* find new maxid */ maxid = -1; for (j = 0; jid > maxid) maxid = re->id; } register_maxid = maxid; } return 1; } } return 0; } /* Free whole register */ void register_free(void) { int i; if(register_list) { for (i = 0; i < tn_list_size(register_list); i++) { xfree(tn_list_getdata(register_list, i)); } tn_list_free(register_list); tn_list_kill(register_list); register_list = NULL; register_maxid = -1; } } /* Call-back function for all elements */ void register_callback(void (*fce)(element_type, void *)) { int i; register_elem *re; for(i = 0; i < tn_list_size(register_list); i++) { re = (register_elem *) tn_list_getdata(register_list, i); fce(re->type, re->elem); } }