Compare commits

...

7 Commits

Author SHA1 Message Date
e0c8b46bfa refactor: tests work, all fine 2026-05-14 08:20:56 -06:00
0a0350c1c1 refactor: changed arrayslice init 2026-05-14 06:59:25 -06:00
36bd2a37c7 refactor: changed arrayslice_to_arraylsit 2026-05-14 06:53:38 -06:00
dc274787e3 refactor: slices take same approach for init 2026-05-14 06:48:56 -06:00
d69a74dad2 refactor: init takes pointer to pointer for compatibliity
Its better for me this way, its just this little change at least, next
is fucking going and fixig all damn tests, the fucking wors part
2026-05-13 20:42:04 -06:00
310b25ce1f updates to cmake 2026-04-23 12:23:52 -06:00
af03e25979 README update
d
2026-04-23 11:38:29 -06:00
6 changed files with 401 additions and 360 deletions

View File

@@ -1,39 +1,48 @@
cmake_minimum_required(VERSION 3.20) cmake_minimum_required(VERSION 3.20)
project(calculator VERSION 1.0 LANGUAGES C) project(arraylist VERSION 1.0 LANGUAGES C)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON)
# Export compile_commands.json (para clangd) # clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_compile_options( # Opciones
option(ARRAYLIST_BUILD_TESTS "Build arraylist tests" ON)
option(ARRAYLIST_ENABLE_SANITIZERS "Enable sanitizers for tests" ON)
# ------------------------
# Library
# ------------------------
add_library(arraylist
src/arraylist.c
)
target_include_directories(arraylist
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
target_compile_options(arraylist PRIVATE
-Wall -Wall
-Wextra -Wextra
-Wpedantic -Wpedantic
) )
# ------------------------
# Example (opcional)
# ------------------------
add_executable(arraylist_example src/main.c)
include_directories(include) target_link_libraries(arraylist_example
arraylist
add_library(arraylist_lib
src/arraylist.c
) )
add_executable(arraylist_main src/main.c)
target_link_libraries(arraylist_main arraylist_lib)
function(enable_sanitizers target)
target_compile_options(${target} PRIVATE -fsanitize=address -fno-omit-frame-pointer)
target_link_options(${target} PRIVATE -fsanitize=address)
endfunction()
# ------------------------ # ------------------------
# Testing # Testing
# ------------------------ # ------------------------
if(ARRAYLIST_BUILD_TESTS)
enable_testing() enable_testing()
add_subdirectory(test) add_subdirectory(test)
endif()

1
README.md Normal file
View File

@@ -0,0 +1 @@
# Hola

View File

@@ -20,9 +20,12 @@ typedef enum {
ARRLIST_INVALID_CAPACITY, ARRLIST_INVALID_CAPACITY,
ARRLIST_IS_BORROWED, ARRLIST_IS_BORROWED,
ARRLIST_INVALID_SLICE, ARRLIST_INVALID_SLICE,
ARRLIST_INVALID_ARR,
ARRLIST_INVALID_START,
ARRLIST_BORROW_UNDERFLOW,
} ArrayListErr; } ArrayListErr;
ArrayList *arraylist_init(size_t capacity, size_t elem_size); ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size);
ArrayListErr arraylist_destroy(ArrayList **arr); ArrayListErr arraylist_destroy(ArrayList **arr);
ArrayListErr arraylist_clear(ArrayList *arr); ArrayListErr arraylist_clear(ArrayList *arr);
ArrayList *arraylist_clone(const ArrayList *arr); ArrayList *arraylist_clone(const ArrayList *arr);
@@ -47,8 +50,8 @@ ArrayListErr arraylist_resize(ArrayList *arr, size_t new_capacity);
ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve); ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve);
//Slice stuff //Slice stuff
ArraySlice *arraylist_slice(ArrayList *arr, size_t start, size_t len); ArrayListErr arraylist_slice(ArraySlice **slice, ArrayList *arr, size_t start, size_t len);
ArraySlice *arraylist_slice_unsafe(ArrayList *arr, size_t start, size_t len); ArrayListErr arraylist_slice_unsafe(ArraySlice **slice, ArrayList *arr, size_t start, size_t len);
ArrayListErr arrayslice_destroy(ArraySlice **slice); ArrayListErr arrayslice_destroy(ArraySlice **slice);
bool arrayslice_is_valid(const ArraySlice *slice); bool arrayslice_is_valid(const ArraySlice *slice);
@@ -62,6 +65,6 @@ ArrayListErr arrayslice_next(ArraySlice *slice, void *out);
ArrayListErr arrayslice_reset(ArraySlice *slice); ArrayListErr arrayslice_reset(ArraySlice *slice);
ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n); ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n);
ArrayList *arrayslice_to_arraylist(const ArraySlice *slice); ArrayListErr arrayslice_to_arraylist(ArrayList **arr, const ArraySlice *slice);
#endif #endif

View File

@@ -26,34 +26,42 @@ struct ArraySlice {
static ArrayListErr arraylist_grow(ArrayList *arr); static ArrayListErr arraylist_grow(ArrayList *arr);
static ArrayListErr arraylist_shrink(ArrayList *arr); static ArrayListErr arraylist_shrink(ArrayList *arr);
ArrayList *arraylist_init(size_t capacity, size_t elem_size) { ArrayListErr arraylist_init(ArrayList **arr, size_t capacity, size_t elem_size) {
if (arr == NULL) {
return ARRLIST_NULL_ARG;
}
*arr = NULL;
if (capacity == 0) { if (capacity == 0) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
if (elem_size == 0) { if (elem_size == 0) {
return NULL; return ARRLIST_INVALID_ELEM_SIZE;
} }
if (capacity > SIZE_MAX / elem_size) { if (capacity > SIZE_MAX / elem_size) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
ArrayList *arr = malloc(sizeof(ArrayList)); ArrayList *new_arr = malloc(sizeof(ArrayList));
if (arr == NULL) { if (new_arr == NULL) {
return NULL; return ARRLIST_BAD_ALLOC;
}
arr->capacity = capacity;
arr->elem_size = elem_size;
arr->len = 0;
arr->borrows = 0;
arr->buffer = malloc(capacity * elem_size);
if (arr->buffer == NULL) {
free(arr);
return NULL;
} }
return arr; new_arr->capacity = capacity;
new_arr->elem_size = elem_size;
new_arr->len = 0;
new_arr->borrows = 0;
new_arr->buffer = malloc(capacity * elem_size);
if (new_arr->buffer == NULL) {
free(new_arr);
return ARRLIST_BAD_ALLOC;
}
*arr = new_arr;
return ARRLIST_OK;
} }
ArrayListErr arraylist_destroy(ArrayList **arr) { ArrayListErr arraylist_destroy(ArrayList **arr) {
@@ -428,68 +436,69 @@ ArrayListErr arraylist_reserve(ArrayList *arr, size_t size_to_reserve) {
return ARRLIST_OK; return ARRLIST_OK;
} }
ArraySlice *arraylist_slice(ArrayList *arr, size_t start, size_t len) { ArrayListErr arraylist_slice(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) { if (arr == NULL || slice == NULL) {
return NULL; return ARRLIST_NULL_ARG;
} }
if (arr->len == 0 || len == 0) { if (arr->len == 0) {
return NULL; return ARRLIST_INVALID_ARR;
} }
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) { if (start > SIZE_MAX - len) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
if (start + len > arr->len) { if (start + len > arr->len || len == 0) {
return NULL; return ARRLIST_INVALID_START;
} }
ArraySlice *slice = malloc(sizeof(ArraySlice)); ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (slice == NULL) { if (new_slice == NULL) {
return NULL; return ARRLIST_BAD_ALLOC;
} }
slice->arr = arr; new_slice->arr = arr;
slice->start = start; new_slice->start = start;
slice->end = start + len; new_slice->end = start + len;
slice->current = start; new_slice->current = start;
slice->is_safe = true; new_slice->is_safe = true;
arr->borrows++; arr->borrows++;
*slice = new_slice;
return slice; return ARRLIST_OK;
} }
ArraySlice *arraylist_slice_unsafe(ArrayList *arr, size_t start, size_t len) { ArrayListErr arraylist_slice_unsafe(ArraySlice **slice, ArrayList *arr, size_t start, size_t len) {
if (arr == NULL) { if (arr == NULL || slice == NULL) {
return NULL; return ARRLIST_NULL_ARG;
} }
if (arr->len == 0 || len == 0) { if (arr->len == 0) {
return NULL; return ARRLIST_INVALID_ARR;
} }
if (start > SIZE_MAX / arr->elem_size || len > SIZE_MAX / arr->elem_size) { if (start > SIZE_MAX - len) {
return NULL; return ARRLIST_INVALID_CAPACITY;
} }
if (start + len > arr->len) { if (start + len > arr->len || len == 0) {
return NULL; return ARRLIST_INVALID_START;
} }
ArraySlice *slice = malloc(sizeof(ArraySlice)); ArraySlice *new_slice = malloc(sizeof(ArraySlice));
if (slice == NULL) { if (new_slice == NULL) {
return NULL; return ARRLIST_BAD_ALLOC;
} }
slice->arr = arr; new_slice->arr = arr;
slice->start = start; new_slice->start = start;
slice->end = start + len; new_slice->end = start + len;
slice->current = start; new_slice->current = start;
slice->is_safe = false; new_slice->is_safe = false;
return slice; *slice = new_slice;
return ARRLIST_OK;
} }
ArrayListErr arrayslice_destroy(ArraySlice **slice) { ArrayListErr arrayslice_destroy(ArraySlice **slice) {
@@ -578,20 +587,30 @@ ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n) {
return ARRLIST_OK; return ARRLIST_OK;
} }
ArrayList *arrayslice_to_arraylist(const ArraySlice *slice) { ArrayListErr arrayslice_to_arraylist(ArrayList **arr, const ArraySlice *slice) {
if (slice == NULL || slice->arr == NULL) { if (slice == NULL || slice->arr == NULL) {
return NULL; return ARRLIST_NULL_ARG;
}
if (arr == NULL) {
return ARRLIST_NULL_ARG;
} }
if (slice->start >= slice->end) { if (slice->start >= slice->end) {
return NULL; return ARRLIST_INVALID_SLICE;
} }
size_t len = slice->end - slice->start; size_t len = slice->end - slice->start;
ArrayList *new_arr = arraylist_init(arraylist_capacity(slice->arr), slice->arr->elem_size); ArrayList *new_arr;
if (new_arr == NULL) { ArrayListErr init_err = arraylist_init(
return NULL; &new_arr,
arraylist_capacity(slice->arr),
slice->arr->elem_size
);
if (init_err != ARRLIST_OK) {
return init_err;
} }
memcpy( memcpy(
@@ -602,5 +621,6 @@ ArrayList *arrayslice_to_arraylist(const ArraySlice *slice) {
new_arr->len = len; new_arr->len = len;
return new_arr; *arr = new_arr;
return ARRLIST_OK;
} }

View File

@@ -3,13 +3,21 @@ find_package(cmocka REQUIRED)
add_executable(test_arraylist test_arraylist.c) add_executable(test_arraylist test_arraylist.c)
target_link_libraries(test_arraylist target_link_libraries(test_arraylist
arraylist_lib arraylist
cmocka::cmocka cmocka::cmocka
) )
enable_sanitizers(test_arraylist) # Sanitizers (portables)
if(ARRAYLIST_ENABLE_SANITIZERS)
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(test_arraylist PRIVATE
-fsanitize=address
-fno-omit-frame-pointer
)
target_link_options(test_arraylist PRIVATE
-fsanitize=address
)
endif()
endif()
target_compile_options(test_arraylist PRIVATE -fsanitize=address -fno-omit-frame-pointer) add_test(NAME arraylist_tests COMMAND test_arraylist)
target_link_options(test_arraylist PRIVATE -fsanitize=address)
add_test(NAME arraylist_tests COMMAND arraylists_arena)

File diff suppressed because it is too large Load Diff