initial commit

This commit is contained in:
mykola2312 2022-04-16 16:22:31 +03:00
commit 21132d5c2c
8 changed files with 166 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.vscode
build

18
CMakeLists.txt Normal file
View file

@ -0,0 +1,18 @@
cmake_minimum_required(VERSION 3.10)
project(cutil)
set(HEADERS
cutypes.h
cutil.h
list.h
)
set(SOURCES
cutil.c
list.c
)
add_library(cutil STATIC ${SOURCES} ${HEADERS})
add_executable(test test.c)
target_link_libraries(test cutil)

5
cutil.c Normal file
View file

@ -0,0 +1,5 @@
#include "cutil.h"
void* (*cu_malloc)(size_t) = CUTIL_MALLOC;
void* (*cu_relloac)(void*, size_t) = CUTIL_REALLOC;
void* (*cu_free)(void*) = CUTIL_FREE;

15
cutil.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef __CUTIL_H
#define __CUTIL_H
#include "cutypes.h"
#include <stdlib.h>
#define CUTIL_MALLOC malloc
#define CUTIL_REALLOC realloc
#define CUTIL_FREE free
extern void* (*cu_malloc)(size_t);
extern void* (*cu_relloac)(void*, size_t);
extern void* (*cu_free)(void*);
#endif

12
cutypes.h Normal file
View file

@ -0,0 +1,12 @@
#ifndef __CUTYPES_H
#define __CUTYPES_H
#include <stddef.h>
#include <stdint.h>
typedef unsigned int uint;
typedef void* cu_ptr;
#define CU_PTR_SIZE sizeof(cu_ptr)
#endif

57
list.c Normal file
View file

@ -0,0 +1,57 @@
#include "list.h"
#include "cutil.h"
#include <string.h>
void list_init(list_t* list)
{
list->first = NULL;
list->last = NULL;
list->count = 0;
}
void list_clear(list_t* list)
{
list_node_t* node = list->first;
if (node)
{
list_node_t* next;
do {
next = node->next;
cu_free(node);
} while(node = next);
}
list->first = NULL;
list->last = NULL;
list->count = 0;
}
void list_add(list_t* list, uint size, void* data)
{
uint nodeSize = LIST_NODE_SIZE + size;
list_node_t* node = (list_node_t*)cu_malloc(nodeSize);
memset(node, '\0', nodeSize);
if (data)
{
memcpy((uint8_t*)node + LIST_NODE_SIZE, data, size);
}
list_node_t* last = list->last;
if (!list->first) list->first = node;
if (last)
{
last->next = node;
node->prev = last;
}
list->last = node;
list->count++;
}
void list_remove(list_t* list, list_node_t* node)
{
if (node->prev) node->prev->next = node->next;
if (node->next) node->next->prev = node->prev;
if (list->first == node) list->first = node->next;
if (list->last == node) list->last == node->prev;
list->count--;
cu_free(node);
}

32
list.h Normal file
View file

@ -0,0 +1,32 @@
#ifndef __LIST_H
#define __LIST_H
#include "cutypes.h"
typedef struct list_node_s {
struct list_node_s* prev;
struct list_node_s* next;
uint8_t data[1];
} list_node_t;
#define LIST_NODE_SIZE (CU_PTR_SIZE * 2)
#define LIST_NODE_PTR(data) ((uint8_t*)data - LIST_NODE_SIZE)
#define LIST_NODE_DATA(node) ((uint8_t*)node + LIST_NODE_SIZE)
#define LIST_NODE_VALUE(node, type) (*(type*)LIST_NODE_DATA(node))
typedef struct {
list_node_t* first;
list_node_t* last;
uint count;
} list_t;
void list_init(list_t* list);
void list_clear(list_t* list);
void list_add(list_t* list, uint size, void* data);
void list_remove(list_t* list, list_node_t* node);
#define CU_LIST_FOREACH(list) \
for(list_node_t* i = (list)->first; i; i = i->next)
#endif

25
test.c Normal file
View file

@ -0,0 +1,25 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "list.h"
int main()
{
list_t list;
list_init(&list);
srand(time(NULL));
for (uint i = 0; i < 5; i++)
{
uint num = rand();
list_add(&list, sizeof(uint), &num);
}
CU_LIST_FOREACH(&list)
{
printf("%p\t%d\n", i, LIST_NODE_VALUE(i, uint));
}
list_clear(&list);
return 0;
}