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
|
||||
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
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user