diff --git a/Makefile.am b/Makefile.am index 287288f..ae6265a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ diff --git a/src/shl_array.h b/src/shl_array.h new file mode 100644 index 0000000..2f30413 --- /dev/null +++ b/src/shl_array.h @@ -0,0 +1,152 @@ +/* + * shl - Dynamic Array + * + * Copyright (c) 2011-2012 David Herrmann + * 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 +#include +#include +#include + +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 */ diff --git a/src/static_misc.c b/src/static_misc.c index 00964de..5c4693d 100644 --- a/src/static_misc.c +++ b/src/static_misc.c @@ -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; diff --git a/src/static_misc.h b/src/static_misc.h index 96d8e7c..e621ca2 100644 --- a/src/static_misc.h +++ b/src/static_misc.h @@ -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; diff --git a/src/unicode.c b/src/unicode.c index b726506..548d1f7 100644 --- a/src/unicode.c +++ b/src/unicode.c @@ -60,6 +60,7 @@ #include #include #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: