/* * secde -- experimental lightweight Wayland/X11 server * Copyright (C) 2019 Samuel Lidén Borell * * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MISC_H #define MISC_H #include #define _map_getmask(map) ((1 << ((map).hashbits)) -1) #define _map_getbucket(map,key) ((map).buckets[key & _map_getmask(map)]) #define map_init(map) do { \ (map).hashbits = 4; \ (map).count = 0; \ (map).buckets = calloc(16, sizeof(*(map).buckets)); \ } while (0) #define map_add(map,key,T,result) do { \ int thekey = (key); \ T **entry; \ T *resultval; \ int mask = _map_getmask(map); \ if ((map).count > mask) { \ /* Enlarge map */ \ /* TODO */ \ } \ entry = &_map_getbucket(map, thekey); \ (map).count++; \ while (*entry && (*entry)->fd < thekey) { \ entry = &(*entry)->next; \ } \ resultval = malloc(sizeof(T)); \ resultval->fd = thekey; \ *entry = resultval; \ (result) = resultval; \ } while (0) #define map_remove(map,key,T) do { \ int thekey = (key); \ T **entry = &_map_getbucket(map, thekey); \ while (*entry && (*entry)->fd < thekey) { \ entry = &(*entry)->next; \ } \ if (*entry && (*entry)->fd == thekey) { \ T *remove = *entry; \ *entry = remove->next; \ free(remove); \ } \ } while (0) #define map_get(map,key,T,result) do { \ int thekey = (key); \ T *entry = _map_getbucket(map, thekey); \ for (;;) { \ if (!entry) { \ (result) = NULL; \ break; \ } else if (entry->fd < thekey) { \ entry = entry->next; \ continue; \ } else if (entry->fd == thekey) { \ (result) = entry; \ } else { \ (result) = NULL; \ } \ break; \ } \ } while (0) #endif