shl: move kmscon_array_* to shl_array_*

This moves all array code into the SHL library and fixes all users.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-09-16 08:51:26 +02:00
parent aed1373bc6
commit 2b5b7d3736
5 changed files with 176 additions and 139 deletions

View File

@ -73,6 +73,17 @@ else
AM_CFLAGS += -O0
endif
#
# SHL - Static Helper Library
# The SHL subsystem contains several small code pieces used all over kmscon and
# other applications.
#
SHL_DLIST = \
src/shl_dlist.h
SHL_ARRAY = \
src/shl_array.h
#
# libeloop
# This library contains the whole event-loop implementation of kmscon. It is
@ -83,7 +94,7 @@ lib_LTLIBRARIES += \
libeloop.la
libeloop_la_SOURCES = \
src/shl_dlist.h \
$(SHL_DLIST) \
src/static_llog.h \
src/static_hook.h \
src/eloop.h \
@ -121,7 +132,7 @@ lib_LTLIBRARIES += \
libuterm.la
libuterm_la_SOURCES = \
src/shl_dlist.h \
$(SHL_DLIST) \
src/uterm.h \
src/uterm_keysyms.h \
src/uterm_input.h \
@ -239,7 +250,8 @@ src/text_font_unifont_data.c: $(UNIFONT) genunifont$(EXEEXT)
#
libkmscon_core_la_SOURCES = \
src/shl_dlist.h \
$(SHL_DLIST) \
$(SHL_ARRAY) \
src/main.h \
src/conf.c src/conf.h \
src/ui.c src/ui.h \
@ -346,7 +358,7 @@ endif
#
kmscon_SOURCES = \
src/shl_dlist.h \
$(SHL_DLIST) \
src/main.c
kmscon_LDADD = \
libuterm.la \

152
src/shl_array.h Normal file
View File

@ -0,0 +1,152 @@
/*
* shl - Dynamic Array
*
* Copyright (c) 2011-2012 David Herrmann <dh.herrmann@googlemail.com>
* Copyright (c) 2011 University of Tuebingen
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* A dynamic array implementation
*/
#ifndef SHL_ARRAY_H
#define SHL_ARRAY_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
struct shl_array {
size_t element_size;
size_t length;
size_t size;
void *data;
};
#define SHL_ARRAY_AT(_arr, _type, _pos) \
(&((_type*)shl_array_get_array(_arr))[(_pos)])
static inline int shl_array_new(struct shl_array **out, size_t element_size,
size_t initial_size)
{
struct shl_array *arr;
if (!out || !element_size)
return -EINVAL;
if (!initial_size)
initial_size = 4;
arr = malloc(sizeof(*arr));
if (!arr)
return -ENOMEM;
memset(arr, 0, sizeof(*arr));
arr->element_size = element_size;
arr->length = 0;
arr->size = initial_size;
arr->data = malloc(arr->element_size * arr->size);
if (!arr->data) {
free(arr);
return -ENOMEM;
}
*out = arr;
return 0;
}
static inline void shl_array_free(struct shl_array *arr)
{
if (!arr)
return;
free(arr->data);
free(arr);
}
static inline int shl_array_push(struct shl_array *arr, void *data)
{
void *tmp;
size_t newsize;
if (!arr || !data)
return -EINVAL;
if (arr->length >= arr->size) {
newsize = arr->size * 2;
tmp = realloc(arr->data, arr->element_size * newsize);
if (!tmp)
return -ENOMEM;
arr->data = tmp;
arr->size = newsize;
}
memcpy(((uint8_t*)arr->data) + arr->element_size * arr->length,
data, arr->element_size);
++arr->length;
return 0;
}
static inline void shl_array_pop(struct shl_array *arr)
{
if (!arr || !arr->length)
return;
--arr->length;
}
static inline void *shl_array_get_array(struct shl_array *arr)
{
if (!arr)
return NULL;
return arr->data;
}
static inline size_t shl_array_get_length(struct shl_array *arr)
{
if (!arr)
return 0;
return arr->length;
}
static inline size_t shl_array_get_bsize(struct shl_array *arr)
{
if (!arr)
return 0;
return arr->length * arr->element_size;
}
static inline size_t shl_array_get_element_size(struct shl_array *arr)
{
if (!arr)
return 0;
return arr->element_size;
}
#endif /* SHL_ARRAY_H */

View File

@ -298,116 +298,6 @@ bool kmscon_hashtable_find(struct kmscon_hashtable *tbl, void **out, void *key)
return false;
}
struct kmscon_array {
size_t element_size;
size_t length;
size_t size;
void *data;
};
int kmscon_array_new(struct kmscon_array **out, size_t element_size,
size_t initial_size)
{
struct kmscon_array *arr;
if (!out || !element_size)
return -EINVAL;
if (!initial_size)
initial_size = 4;
arr = malloc(sizeof(*arr));
if (!arr)
return -ENOMEM;
memset(arr, 0, sizeof(*arr));
arr->element_size = element_size;
arr->length = 0;
arr->size = initial_size;
arr->data = malloc(arr->element_size * arr->size);
if (!arr->data) {
free(arr);
return -ENOMEM;
}
*out = arr;
return 0;
}
void kmscon_array_free(struct kmscon_array *arr)
{
if (!arr)
return;
free(arr->data);
free(arr);
}
int kmscon_array_push(struct kmscon_array *arr, void *data)
{
void *tmp;
size_t newsize;
if (!arr || !data)
return -EINVAL;
if (arr->length >= arr->size) {
newsize = arr->size * 2;
tmp = realloc(arr->data, arr->element_size * newsize);
if (!tmp)
return -ENOMEM;
arr->data = tmp;
arr->size = newsize;
}
memcpy(((uint8_t*)arr->data) + arr->element_size * arr->length,
data, arr->element_size);
++arr->length;
return 0;
}
void kmscon_array_pop(struct kmscon_array *arr)
{
if (!arr || !arr->length)
return;
--arr->length;
}
void *kmscon_array_get_array(struct kmscon_array *arr)
{
if (!arr)
return NULL;
return arr->data;
}
size_t kmscon_array_get_length(struct kmscon_array *arr)
{
if (!arr)
return 0;
return arr->length;
}
size_t kmscon_array_get_bsize(struct kmscon_array *arr)
{
if (!arr)
return 0;
return arr->length * arr->element_size;
}
size_t kmscon_array_get_element_size(struct kmscon_array *arr)
{
if (!arr)
return 0;
return arr->element_size;
}
struct kmscon_timer {
struct timespec start;
uint64_t elapsed;

View File

@ -71,24 +71,6 @@ int kmscon_hashtable_insert(struct kmscon_hashtable *tbl, void *key,
void *data);
bool kmscon_hashtable_find(struct kmscon_hashtable *tbl, void **out, void *key);
/* dynamic arrays */
struct kmscon_array;
int kmscon_array_new(struct kmscon_array **out, size_t element_size,
size_t initial_size);
void kmscon_array_free(struct kmscon_array *arr);
int kmscon_array_push(struct kmscon_array *arr, void *data);
void kmscon_array_pop(struct kmscon_array *arr);
void *kmscon_array_get_array(struct kmscon_array *arr);
size_t kmscon_array_get_length(struct kmscon_array *arr);
size_t kmscon_array_get_bsize(struct kmscon_array *arr);
size_t kmscon_array_get_element_size(struct kmscon_array *arr);
#define KMSCON_ARRAY_AT(_arr, _type, _pos) \
(&((_type*)kmscon_array_get_array(_arr))[(_pos)])
/* time measurement */
struct kmscon_timer;

View File

@ -60,6 +60,7 @@
#include <stdlib.h>
#include <string.h>
#include "log.h"
#include "shl_array.h"
#include "static_misc.h"
#include "unicode.h"
@ -104,7 +105,7 @@ static const char default_u8[] = { 0 };
static pthread_mutex_t table_mutex = PTHREAD_MUTEX_INITIALIZER;
static uint32_t table_next_id;
static struct kmscon_array *table_index;
static struct shl_array *table_index;
static struct kmscon_hashtable *table_symbols;
static unsigned int hash_ucs4(const void *key)
@ -155,19 +156,19 @@ static int table__init()
table_next_id = TSM_UCS4_MAX + 2;
ret = kmscon_array_new(&table_index, sizeof(uint32_t*), 4);
ret = shl_array_new(&table_index, sizeof(uint32_t*), 4);
if (ret) {
log_err("cannot allocate table-index");
return ret;
}
/* first entry is not used so add dummy */
kmscon_array_push(table_index, &val);
shl_array_push(table_index, &val);
ret = kmscon_hashtable_new(&table_symbols, hash_ucs4, cmp_ucs4,
free, NULL);
if (ret) {
kmscon_array_free(table_index);
shl_array_free(table_index);
return -ENOMEM;
}
@ -211,8 +212,8 @@ static const uint32_t *table__get(tsm_symbol_t *sym, size_t *size)
return &tsm_symbol_default;
}
ucs4 = *KMSCON_ARRAY_AT(table_index, uint32_t*,
*sym - (TSM_UCS4_MAX + 1));
ucs4 = *SHL_ARRAY_AT(table_index, uint32_t*,
*sym - (TSM_UCS4_MAX + 1));
if (!ucs4) {
if (size)
*size = 1;
@ -288,7 +289,7 @@ tsm_symbol_t tsm_symbol_append(tsm_symbol_t sym, uint32_t ucs4)
memcpy(nval, buf, s * sizeof(uint32_t));
nsym = table_next_id++;
kmscon_hashtable_insert(table_symbols, nval, (void*)(long)nsym);
kmscon_array_push(table_index, &nval);
shl_array_push(table_index, &nval);
rsym = nsym;
unlock: