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:
parent
aed1373bc6
commit
2b5b7d3736
20
Makefile.am
20
Makefile.am
@ -73,6 +73,17 @@ else
|
|||||||
AM_CFLAGS += -O0
|
AM_CFLAGS += -O0
|
||||||
endif
|
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
|
# libeloop
|
||||||
# This library contains the whole event-loop implementation of kmscon. It is
|
# This library contains the whole event-loop implementation of kmscon. It is
|
||||||
@ -83,7 +94,7 @@ lib_LTLIBRARIES += \
|
|||||||
libeloop.la
|
libeloop.la
|
||||||
|
|
||||||
libeloop_la_SOURCES = \
|
libeloop_la_SOURCES = \
|
||||||
src/shl_dlist.h \
|
$(SHL_DLIST) \
|
||||||
src/static_llog.h \
|
src/static_llog.h \
|
||||||
src/static_hook.h \
|
src/static_hook.h \
|
||||||
src/eloop.h \
|
src/eloop.h \
|
||||||
@ -121,7 +132,7 @@ lib_LTLIBRARIES += \
|
|||||||
libuterm.la
|
libuterm.la
|
||||||
|
|
||||||
libuterm_la_SOURCES = \
|
libuterm_la_SOURCES = \
|
||||||
src/shl_dlist.h \
|
$(SHL_DLIST) \
|
||||||
src/uterm.h \
|
src/uterm.h \
|
||||||
src/uterm_keysyms.h \
|
src/uterm_keysyms.h \
|
||||||
src/uterm_input.h \
|
src/uterm_input.h \
|
||||||
@ -239,7 +250,8 @@ src/text_font_unifont_data.c: $(UNIFONT) genunifont$(EXEEXT)
|
|||||||
#
|
#
|
||||||
|
|
||||||
libkmscon_core_la_SOURCES = \
|
libkmscon_core_la_SOURCES = \
|
||||||
src/shl_dlist.h \
|
$(SHL_DLIST) \
|
||||||
|
$(SHL_ARRAY) \
|
||||||
src/main.h \
|
src/main.h \
|
||||||
src/conf.c src/conf.h \
|
src/conf.c src/conf.h \
|
||||||
src/ui.c src/ui.h \
|
src/ui.c src/ui.h \
|
||||||
@ -346,7 +358,7 @@ endif
|
|||||||
#
|
#
|
||||||
|
|
||||||
kmscon_SOURCES = \
|
kmscon_SOURCES = \
|
||||||
src/shl_dlist.h \
|
$(SHL_DLIST) \
|
||||||
src/main.c
|
src/main.c
|
||||||
kmscon_LDADD = \
|
kmscon_LDADD = \
|
||||||
libuterm.la \
|
libuterm.la \
|
||||||
|
152
src/shl_array.h
Normal file
152
src/shl_array.h
Normal 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 */
|
@ -298,116 +298,6 @@ bool kmscon_hashtable_find(struct kmscon_hashtable *tbl, void **out, void *key)
|
|||||||
return false;
|
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 kmscon_timer {
|
||||||
struct timespec start;
|
struct timespec start;
|
||||||
uint64_t elapsed;
|
uint64_t elapsed;
|
||||||
|
@ -71,24 +71,6 @@ int kmscon_hashtable_insert(struct kmscon_hashtable *tbl, void *key,
|
|||||||
void *data);
|
void *data);
|
||||||
bool kmscon_hashtable_find(struct kmscon_hashtable *tbl, void **out, void *key);
|
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 */
|
/* time measurement */
|
||||||
|
|
||||||
struct kmscon_timer;
|
struct kmscon_timer;
|
||||||
|
@ -60,6 +60,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "shl_array.h"
|
||||||
#include "static_misc.h"
|
#include "static_misc.h"
|
||||||
#include "unicode.h"
|
#include "unicode.h"
|
||||||
|
|
||||||
@ -104,7 +105,7 @@ static const char default_u8[] = { 0 };
|
|||||||
|
|
||||||
static pthread_mutex_t table_mutex = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t table_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static uint32_t table_next_id;
|
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 struct kmscon_hashtable *table_symbols;
|
||||||
|
|
||||||
static unsigned int hash_ucs4(const void *key)
|
static unsigned int hash_ucs4(const void *key)
|
||||||
@ -155,19 +156,19 @@ static int table__init()
|
|||||||
|
|
||||||
table_next_id = TSM_UCS4_MAX + 2;
|
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) {
|
if (ret) {
|
||||||
log_err("cannot allocate table-index");
|
log_err("cannot allocate table-index");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* first entry is not used so add dummy */
|
/* 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,
|
ret = kmscon_hashtable_new(&table_symbols, hash_ucs4, cmp_ucs4,
|
||||||
free, NULL);
|
free, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kmscon_array_free(table_index);
|
shl_array_free(table_index);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +212,7 @@ static const uint32_t *table__get(tsm_symbol_t *sym, size_t *size)
|
|||||||
return &tsm_symbol_default;
|
return &tsm_symbol_default;
|
||||||
}
|
}
|
||||||
|
|
||||||
ucs4 = *KMSCON_ARRAY_AT(table_index, uint32_t*,
|
ucs4 = *SHL_ARRAY_AT(table_index, uint32_t*,
|
||||||
*sym - (TSM_UCS4_MAX + 1));
|
*sym - (TSM_UCS4_MAX + 1));
|
||||||
if (!ucs4) {
|
if (!ucs4) {
|
||||||
if (size)
|
if (size)
|
||||||
@ -288,7 +289,7 @@ tsm_symbol_t tsm_symbol_append(tsm_symbol_t sym, uint32_t ucs4)
|
|||||||
memcpy(nval, buf, s * sizeof(uint32_t));
|
memcpy(nval, buf, s * sizeof(uint32_t));
|
||||||
nsym = table_next_id++;
|
nsym = table_next_id++;
|
||||||
kmscon_hashtable_insert(table_symbols, nval, (void*)(long)nsym);
|
kmscon_hashtable_insert(table_symbols, nval, (void*)(long)nsym);
|
||||||
kmscon_array_push(table_index, &nval);
|
shl_array_push(table_index, &nval);
|
||||||
rsym = nsym;
|
rsym = nsym;
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user