Compare commits
10 Commits
81e3ab2c67
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0354c7b485 | |||
| 9f32891bbc | |||
| b3ebff3635 | |||
| 14bd6ce5fd | |||
| 09e96f8112 | |||
|
|
9cbd0b29ef | ||
| 26fd329caa | |||
| 1e224702a3 | |||
| 74cca183e0 | |||
| e26bf613a5 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -9,6 +9,6 @@ test.*
|
|||||||
*.obj
|
*.obj
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
libwapp-build
|
libwapp-build
|
||||||
libwapp.so
|
dist
|
||||||
*.vs
|
*.vs
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|||||||
136
Makefile
136
Makefile
@@ -1,31 +1,42 @@
|
|||||||
CC = clang
|
.PHONY: help full prng testing uuid core primitives all clean builddir build-test run-test codegen install build-lib ccodegen
|
||||||
CXX = clang++
|
|
||||||
AR = ar
|
|
||||||
BUILD_TYPE = debug
|
|
||||||
CSTD = -std=gnu11
|
|
||||||
CXXSTD = -std=gnu++11
|
|
||||||
CFLAGS = -Wall -Wextra -Werror -pedantic -Isrc
|
|
||||||
LIBFLAGS = -fPIC
|
|
||||||
KERNEL = $(shell uname -s)
|
|
||||||
MACHINE = $(shell uname -m)
|
|
||||||
PLATFORM = $(KERNEL)_$(MACHINE)
|
|
||||||
TEST_INCLUDE = -Isrc $(shell find tests -type d | xargs -I{} echo -n "-I{} ")
|
|
||||||
TEST_SRC = $(shell find tests -type f -name "*.c" | xargs -I{} echo -n "{} ")
|
|
||||||
TEST_C_SRC = src/wapp.c $(TEST_SRC)
|
|
||||||
TEST_CXX_SRC = $(shell find tests -type f -name "*.cc" | xargs -I{} echo -n "{} ")
|
|
||||||
BUILD_DIR = libwapp-build/$(PLATFORM)-$(BUILD_TYPE)
|
|
||||||
LIB_NAME = wapp
|
|
||||||
OBJ_OUT = $(BUILD_DIR)/$(LIB_NAME).o
|
|
||||||
LIB_OUT = $(BUILD_DIR)/lib$(LIB_NAME).a
|
|
||||||
TEST_C_OUT = $(BUILD_DIR)/wapptest
|
|
||||||
TEST_CXX_OUT = $(BUILD_DIR)/wapptestcc
|
|
||||||
|
|
||||||
ifeq ($(BUILD_TYPE),debug)
|
# External variables
|
||||||
CFLAGS += -g -fsanitize=address,undefined -DWAPP_DEBUG_ASSERT
|
CC = clang
|
||||||
else ifeq ($(BUILD_TYPE),release)
|
CXX = clang++
|
||||||
CFLAGS += -O3
|
AR = ar
|
||||||
|
BUILD_TYPE = Debug
|
||||||
|
BUILD_DIR = libwapp-build/$(PLATFORM)-$(BUILD_TYPE)
|
||||||
|
INSTALL_PREFIX = dist
|
||||||
|
|
||||||
|
# Internal variables
|
||||||
|
override CFLAGS = -Wall -Wextra -Werror -pedantic -Isrc
|
||||||
|
override LIBFLAGS = -fPIC
|
||||||
|
override CSTD := -std=gnu11
|
||||||
|
override CXXSTD := -std=gnu++11
|
||||||
|
override KERNEL := $(shell uname -s)
|
||||||
|
override MACHINE := $(shell uname -m)
|
||||||
|
override PLATFORM := $(KERNEL)_$(MACHINE)
|
||||||
|
override TEST_INCLUDE := -Isrc $(shell find tests -type d | xargs -I{} echo -n "-I{} ")
|
||||||
|
override TEST_SRC := $(shell find tests -type f -name "*.c" | xargs -I{} echo -n "{} ")
|
||||||
|
override TEST_C_SRC := src/wapp.c $(TEST_SRC)
|
||||||
|
override TEST_CXX_SRC := $(shell find tests -type f -name "*.cc" | xargs -I{} echo -n "{} ")
|
||||||
|
override LIB_NAME := wapp
|
||||||
|
override OBJ_OUT := $(BUILD_DIR)/$(LIB_NAME).o
|
||||||
|
override LIB_OUT := $(BUILD_DIR)/lib$(LIB_NAME).a
|
||||||
|
override TEST_C_OUT := $(BUILD_DIR)/wapptest
|
||||||
|
override TEST_CXX_OUT := $(BUILD_DIR)/wapptestcc
|
||||||
|
override INCLUDE_INSTALL := $(INSTALL_PREFIX)/include/$(LIB_NAME)
|
||||||
|
override LIB_INSTALL := $(INSTALL_PREFIX)/lib
|
||||||
|
override HEADER_INSTALL_CMD := scripts/header_install.sh
|
||||||
|
|
||||||
|
ifeq ($(BUILD_TYPE),Debug)
|
||||||
|
override CFLAGS += -g -fsanitize=address,undefined -DWAPP_DEBUG_ASSERT
|
||||||
|
else ifeq ($(BUILD_TYPE),RelWithDebInfo)
|
||||||
|
override CFLAGS += -g -O2 -fsanitize=address,undefined -DWAPP_DEBUG_ASSERT
|
||||||
|
else ifeq ($(BUILD_TYPE),Release)
|
||||||
|
override CFLAGS += -O3
|
||||||
else
|
else
|
||||||
$(error Invalid BUILD type '$(BUILD_TYPE)'. Use 'debug' or 'release')
|
$(error Invalid BUILD type '$(BUILD_TYPE)'. Use 'Debug', 'RelWithDebInfo' or 'Release')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CC),gcc)
|
ifeq ($(CC),gcc)
|
||||||
@@ -33,10 +44,52 @@ ifeq ($(CC),gcc)
|
|||||||
export ASAN_OPTIONS=verify_asan_link_order=0
|
export ASAN_OPTIONS=verify_asan_link_order=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all clean builddir build-test run-test codegen build-lib full prng testing uuid core primitives
|
|
||||||
|
|
||||||
all: clean builddir codegen run-c-test full run-cc-test
|
all: clean builddir codegen run-c-test full run-cc-test
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Available build variables:"
|
||||||
|
@echo " CC C compiler to use (Default: clang)."
|
||||||
|
@echo " CXX C++ compiler to use (Default: clang++)."
|
||||||
|
@echo " AR Archiving utility to use for building static libraries (Default: ar)."
|
||||||
|
@echo " BUILD_TYPE Build type. Choose from \`Debug\`, \`RelWithDebInfo\` or \`Release\` (Default: Debug)."
|
||||||
|
@echo " BUILD_DIR Directory where build files will be written."
|
||||||
|
@echo " INSTALL_PREFIX Prefix where library and include files will be installed."
|
||||||
|
@echo
|
||||||
|
@echo "Available targets:"
|
||||||
|
@echo " make Build, install and test the full wapp library."
|
||||||
|
@echo " make full Build and install the full wapp library."
|
||||||
|
@echo " make core Build and install only the \`core\` component of the wapp library with all its dependencies."
|
||||||
|
@echo " make prng Build and install only the \`prng\` component of the wapp library with all its dependencies."
|
||||||
|
@echo " make uuid Build and install only the \`uuid\` component of the wapp library with all its dependencies."
|
||||||
|
@echo " make testing Build and install only the \`testing\` component of the wapp library with all its dependencies."
|
||||||
|
@echo " make primitives Build and install only the \`primitives\` component of the wapp library with all its dependencies."
|
||||||
|
@echo " make clean Clean build directory."
|
||||||
|
@echo " make help Print this help message and exit."
|
||||||
|
|
||||||
|
full: LIB_SRC = src/wapp.c
|
||||||
|
full: INCLUDES = common core primitives prng testing uuid
|
||||||
|
full: install
|
||||||
|
|
||||||
|
prng: LIB_SRC = src/prng/wapp_prng.c
|
||||||
|
prng: INCLUDES = common prng
|
||||||
|
prng: install
|
||||||
|
|
||||||
|
testing: LIB_SRC = src/testing/wapp_testing.c
|
||||||
|
testing: INCLUDES = common core testing
|
||||||
|
testing: install
|
||||||
|
|
||||||
|
uuid: LIB_SRC = src/uuid/wapp_uuid.c
|
||||||
|
uuid: INCLUDES = common primitives prng
|
||||||
|
uuid: install
|
||||||
|
|
||||||
|
core: LIB_SRC = src/core/wapp_core.c
|
||||||
|
core: INCLUDES = common core primitives
|
||||||
|
core: install
|
||||||
|
|
||||||
|
primitives: LIB_SRC = src/primitives/wapp_primitives.c
|
||||||
|
primitives: INCLUDES = common primitives
|
||||||
|
primitives: install
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf $(BUILD_DIR)
|
@rm -rf $(BUILD_DIR)
|
||||||
|
|
||||||
@@ -62,25 +115,16 @@ run-cc-test: build-cc-test
|
|||||||
codegen:
|
codegen:
|
||||||
python3 -m codegen
|
python3 -m codegen
|
||||||
|
|
||||||
build-lib:
|
install: build-lib
|
||||||
|
@mkdir -p $(LIB_INSTALL)
|
||||||
|
@cp -v $(LIB_OUT) $(LIB_INSTALL)
|
||||||
|
@mkdir -p $(INCLUDE_INSTALL)
|
||||||
|
@bash $(HEADER_INSTALL_CMD) $(LIB_SRC) $(INCLUDE_INSTALL) $(INCLUDES)
|
||||||
|
|
||||||
|
build-lib: builddir
|
||||||
$(CC) -c $(CSTD) $(CFLAGS) $(LIBFLAGS) $(LIB_SRC) -o $(OBJ_OUT)
|
$(CC) -c $(CSTD) $(CFLAGS) $(LIBFLAGS) $(LIB_SRC) -o $(OBJ_OUT)
|
||||||
$(AR) r $(LIB_OUT) $(OBJ_OUT)
|
$(AR) r $(LIB_OUT) $(OBJ_OUT)
|
||||||
@rm $(OBJ_OUT)
|
@rm $(OBJ_OUT)
|
||||||
|
|
||||||
full: LIB_SRC = src/wapp.c
|
ccodegen:
|
||||||
full: build-lib
|
$(CC) $(CSTD) $(CFLAGS) $(LIBFLAGS) -Isrc/core src/core/wapp_core.c ccodegen/*.c -o ccgen
|
||||||
|
|
||||||
prng: LIB_SRC = src/prng/wapp_prng.c
|
|
||||||
prng: build-lib
|
|
||||||
|
|
||||||
testing: LIB_SRC = src/testing/wapp_testing.c
|
|
||||||
testing: build-lib
|
|
||||||
|
|
||||||
uuid: LIB_SRC = src/uuid/wapp_uuid.c
|
|
||||||
uuid: build-lib
|
|
||||||
|
|
||||||
core: LIB_SRC = src/core/wapp_core.c
|
|
||||||
core: build-lib
|
|
||||||
|
|
||||||
primitives: LIB_SRC = src/core/wapp_primitives.c
|
|
||||||
primitives: build-lib
|
|
||||||
|
|||||||
67
build
67
build
@@ -1,14 +1,45 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
BUILD_TYPE="debug"
|
# Colors
|
||||||
|
RED="\033[0;31m"
|
||||||
|
BOLD="\033[1m"
|
||||||
|
NC="\033[0m" # No Color
|
||||||
|
|
||||||
|
BUILD_TYPE="Debug"
|
||||||
|
ACCEPTED_BUILD_TYPES=("Debug" "RelWithDebInfo" "Release")
|
||||||
KERNEL="$(uname -s)"
|
KERNEL="$(uname -s)"
|
||||||
ARGS=""
|
ARGS=""
|
||||||
|
|
||||||
|
join_array_elements() {
|
||||||
|
local IFS=","
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
contains() {
|
||||||
|
local item="$1"; shift
|
||||||
|
local e
|
||||||
|
for e; do
|
||||||
|
[[ "$e" == "$item" ]] && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
echo -e "Usage: build [-b build_type] ..."
|
||||||
|
echo -e " Options:"
|
||||||
|
echo -e " -b, --build-type Choose from $(join_array_elements ${ACCEPTED_BUILD_TYPES[*]}) (Default: Debug)."
|
||||||
|
echo -e " -h, --help Print this message and exit"
|
||||||
|
}
|
||||||
|
|
||||||
while [[ $# > 0 ]];do
|
while [[ $# > 0 ]];do
|
||||||
case $1 in
|
case $1 in
|
||||||
--release)
|
-b|--build-type)
|
||||||
BUILD_TYPE="release"
|
BUILD_TYPE="$2"
|
||||||
shift
|
shift 2
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
print_usage
|
||||||
|
exit 0
|
||||||
;;
|
;;
|
||||||
*|-*|--*)
|
*|-*|--*)
|
||||||
rest=("$@")
|
rest=("$@")
|
||||||
@@ -18,15 +49,21 @@ while [[ $# > 0 ]];do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if [[ $KERNEL == "Darwin" ]]; then
|
if ! contains ${BUILD_TYPE} "${ACCEPTED_BUILD_TYPES[@]}"; then
|
||||||
if [[ ! -d .venv ]]; then
|
echo -e "${RED}${BOLD}Unknown build type: ${BUILD_TYPE}${NC}\n"
|
||||||
python3 -m venv .venv
|
print_usage
|
||||||
fi
|
exit 1
|
||||||
|
fi
|
||||||
source .venv/bin/activate
|
|
||||||
pip install scan-build
|
if [[ $KERNEL == "Darwin" ]]; then
|
||||||
intercept-build make CC=intercept-cc CXX=intercept-c++ BUILD_TYPE=$BUILD_TYPE $ARGS
|
if [[ ! -d .venv ]]; then
|
||||||
deactivate
|
python3 -m venv .venv
|
||||||
else
|
fi
|
||||||
bear -- make BUILD_TYPE=$BUILD_TYPE $ARGS
|
|
||||||
|
source .venv/bin/activate
|
||||||
|
pip install scan-build
|
||||||
|
intercept-build make CC=intercept-cc CXX=intercept-c++ BUILD_TYPE=$BUILD_TYPE $ARGS
|
||||||
|
deactivate
|
||||||
|
else
|
||||||
|
bear -- make BUILD_TYPE=$BUILD_TYPE $ARGS
|
||||||
fi
|
fi
|
||||||
|
|||||||
522
ccodegen/datatypes.c
Normal file
522
ccodegen/datatypes.c
Normal file
@@ -0,0 +1,522 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#include "datatypes.h"
|
||||||
|
#include "dbl_list.h"
|
||||||
|
#include "type_enums.h"
|
||||||
|
#include "wapp_core.h"
|
||||||
|
|
||||||
|
#define ERR_MSG "Not enough capacity in dst buffer"
|
||||||
|
#define CFILE_DISCLAIMER "/**\n" \
|
||||||
|
" * THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.\n" \
|
||||||
|
" */\n\n"
|
||||||
|
|
||||||
|
void cobject_to_string(Str8 *dst, const CObject *object) {
|
||||||
|
wapp_debug_assert(dst != NULL && object != NULL, "`allocator`, `dst` and `object` should not be NULL");
|
||||||
|
|
||||||
|
switch (object->kind) {
|
||||||
|
case COBJECT_CTYPE:
|
||||||
|
ctype_to_string(dst, object->object.c_type);
|
||||||
|
break;
|
||||||
|
case COBJECT_CQUALIFIER:
|
||||||
|
cqualifier_to_string(dst, object->object.c_qualifier);
|
||||||
|
break;
|
||||||
|
case COBJECT_CPOINTERTYPE:
|
||||||
|
cpointertype_to_string(dst, object->object.c_pointertype);
|
||||||
|
break;
|
||||||
|
case COBJECT_CPOINTER:
|
||||||
|
cpointer_to_string(dst, &(object->object.c_pointer));
|
||||||
|
break;
|
||||||
|
case COBJECT_CENUMVAL:
|
||||||
|
cenumval_to_string(dst, &(object->object.c_enumval));
|
||||||
|
break;
|
||||||
|
case COBJECT_CENUM:
|
||||||
|
cenum_to_string(dst, &(object->object.c_enum));
|
||||||
|
break;
|
||||||
|
case COBJECT_CMACRO:
|
||||||
|
cmacro_to_string(dst, &(object->object.c_macro));
|
||||||
|
break;
|
||||||
|
case COBJECT_CSTRUCT:
|
||||||
|
cstruct_to_string(dst, &(object->object.c_struct));
|
||||||
|
break;
|
||||||
|
case COBJECT_CUSERTYPE:
|
||||||
|
cusertype_to_string(dst, &(object->object.c_usertype));
|
||||||
|
break;
|
||||||
|
case COBJECT_CDATATYPE:
|
||||||
|
cdatatype_to_string(dst, &(object->object.c_datatype));
|
||||||
|
break;
|
||||||
|
case COBJECT_CARG:
|
||||||
|
carg_to_string(dst, &(object->object.c_arg));
|
||||||
|
break;
|
||||||
|
case COBJECT_CFUNC:
|
||||||
|
cfunc_to_string(dst, &(object->object.c_func));
|
||||||
|
break;
|
||||||
|
case COBJECT_CINCULDE:
|
||||||
|
cinclude_to_string(dst, &(object->object.c_include));
|
||||||
|
break;
|
||||||
|
case COBJECT_CHEADER:
|
||||||
|
cheader_to_string(dst, &(object->object.c_header));
|
||||||
|
break;
|
||||||
|
case COBJECT_CSOURCE:
|
||||||
|
csource_to_string(dst, &(object->object.c_source));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ctype_to_string(Str8 *dst, CType ctype) {
|
||||||
|
wapp_runtime_assert(ctypes[ctype].size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, &ctypes[ctype]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cqualifier_to_string(Str8 *dst, CQualifier cqualifier) {
|
||||||
|
wapp_runtime_assert(cqualifiers[cqualifier].size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, &cqualifiers[cqualifier]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cpointertype_to_string(Str8 *dst, CPointerType cpointertype) {
|
||||||
|
wapp_runtime_assert(cpointertypes[cpointertype].size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, &cpointertypes[cpointertype]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cpointer_to_string(Str8 *dst, const CPointer *cpointer) {
|
||||||
|
wapp_debug_assert(dst != NULL && cpointer != NULL, "`dst` and `cpointer` should not be NULL");
|
||||||
|
|
||||||
|
u64 total_size = cpointertypes[cpointer->type].size + cqualifiers[cpointer->qualifier].size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(cpointertypes[cpointer->type]),
|
||||||
|
wapp_str8_varg(cqualifiers[cpointer->qualifier]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cenumval_to_string(Str8 *dst, const CEnumVal *cenumval) {
|
||||||
|
wapp_debug_assert(dst != NULL && cenumval != NULL, "`dst` and `cenumval` should not be NULL");
|
||||||
|
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_TINY);
|
||||||
|
u64 tmp_size = 0;
|
||||||
|
if (cenumval->value != NULL) {
|
||||||
|
wapp_str8_format(&tmp, " = %d", *(cenumval->value));
|
||||||
|
tmp_size = tmp.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total_size = cenumval->name.size + tmp_size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(cenumval->name),
|
||||||
|
wapp_str8_varg(tmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cenum_to_string(Str8 *dst, const CEnum *cenum) {
|
||||||
|
wapp_debug_assert(dst != NULL && cenum != NULL, "`dst` and `cenum` should not be NULL");
|
||||||
|
|
||||||
|
Str8 header = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 values = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
Str8 footer = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
|
||||||
|
if (cenum->add_typedef) {
|
||||||
|
wapp_str8_copy_cstr_capped(&header, "typedef enum {\n");
|
||||||
|
wapp_str8_format(&footer, "} " WAPP_STR8_SPEC ";\n", wapp_str8_varg(cenum->name));
|
||||||
|
} else {
|
||||||
|
wapp_str8_format(&header, "enum " WAPP_STR8_SPEC " {\n", wapp_str8_varg(cenum->name));
|
||||||
|
wapp_str8_copy_cstr_capped(&footer, "};\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cenum->values.node_count; ++i) {
|
||||||
|
cenumval_to_string(&tmp, wapp_cenumval_list_get(&(cenum->values), i)->item);
|
||||||
|
// Add 4 for extra characters
|
||||||
|
wapp_runtime_assert(tmp.size + 4 <= values.capacity - values.size, ERR_MSG);
|
||||||
|
wapp_str8_concat_capped(&values, &wapp_str8_lit_ro(" "));
|
||||||
|
wapp_str8_concat_capped(&values, &tmp);
|
||||||
|
wapp_str8_concat_capped(&values, &wapp_str8_lit_ro(",\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total_size = header.size + values.size + footer.size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(header),
|
||||||
|
wapp_str8_varg(values),
|
||||||
|
wapp_str8_varg(footer));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmacro_to_string(Str8 *dst, const CMacro *cmacro) {
|
||||||
|
wapp_debug_assert(dst != NULL && cmacro != NULL, "`dst` and `cmacro` should not be NULL");
|
||||||
|
|
||||||
|
Str8 def = wapp_str8_lit("#define ");
|
||||||
|
u64 total_size = def.size + cmacro->name.size + cmacro->value.size + 1; // Add 1 for newline
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC " " WAPP_STR8_SPEC "\n",
|
||||||
|
wapp_str8_varg(def),
|
||||||
|
wapp_str8_varg(cmacro->name),
|
||||||
|
wapp_str8_varg(cmacro->value));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cstruct_to_string(Str8 *dst, const CStruct *cstruct) {
|
||||||
|
wapp_debug_assert(dst != NULL && cstruct != NULL, "`dst` and `cstruct` should not be NULL");
|
||||||
|
|
||||||
|
Str8 declaration = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 definition = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
|
||||||
|
declare_cstruct(&declaration, cstruct);
|
||||||
|
define_cstruct(&definition, cstruct);
|
||||||
|
|
||||||
|
u64 total_size = declaration.size + definition.size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst, WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(declaration), wapp_str8_varg(definition));
|
||||||
|
}
|
||||||
|
|
||||||
|
void declare_cstruct(Str8 *dst, const CStruct *cstruct) {
|
||||||
|
wapp_debug_assert(dst != NULL && cstruct != NULL, "`dst` and `cstruct` should not be NULL");
|
||||||
|
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
wapp_str8_format(&tmp,
|
||||||
|
"typedef struct " WAPP_STR8_SPEC " " WAPP_STR8_SPEC ";\n",
|
||||||
|
wapp_str8_varg(cstruct->name),
|
||||||
|
wapp_str8_varg(cstruct->typedef_name.size > 0 ? cstruct->typedef_name : cstruct->name));
|
||||||
|
|
||||||
|
wapp_runtime_assert(tmp.size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void define_cstruct(Str8 *dst, const CStruct *cstruct) {
|
||||||
|
wapp_debug_assert(dst != NULL && cstruct != NULL, "`dst` and `cstruct` should not be NULL");
|
||||||
|
|
||||||
|
Str8 definition = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 args = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
Str8 footer = wapp_str8_lit_ro("};\n");
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MEDIUM);
|
||||||
|
|
||||||
|
wapp_str8_format(&definition, "struct " WAPP_STR8_SPEC " {\n", wapp_str8_varg(cstruct->name));
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cstruct->args.node_count; ++i) {
|
||||||
|
carg_to_string(&tmp, wapp_carg_list_get(&(cstruct->args), i)->item);
|
||||||
|
// Add 4 for extra characters
|
||||||
|
wapp_runtime_assert(tmp.size + 4 <= args.capacity - args.size, ERR_MSG);
|
||||||
|
wapp_str8_concat_capped(&args, &wapp_str8_lit_ro(" "));
|
||||||
|
wapp_str8_concat_capped(&args, &tmp);
|
||||||
|
wapp_str8_concat_capped(&args, &wapp_str8_lit_ro(";\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total_size = definition.size + args.size + footer.size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(definition),
|
||||||
|
wapp_str8_varg(args),
|
||||||
|
wapp_str8_varg(footer));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cusertype_to_string(Str8 *dst, const CUserType *cusertype) {
|
||||||
|
wapp_debug_assert(dst != NULL && cusertype != NULL, "`dst` and `cusertype` should not be NULL");
|
||||||
|
|
||||||
|
switch (cusertype->kind) {
|
||||||
|
case CUSERTYPE_CENUM:
|
||||||
|
cenum_to_string(dst, &(cusertype->type.c_enum));
|
||||||
|
break;
|
||||||
|
case CUSERTYPE_CSTRUCT:
|
||||||
|
cstruct_to_string(dst, &(cusertype->type.c_struct));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cdatatype_to_string(Str8 *dst, const CDataType *cdatatype) {
|
||||||
|
wapp_debug_assert(dst != NULL && cdatatype != NULL, "`dst` and `cdatatype` should not be NULL");
|
||||||
|
|
||||||
|
switch (cdatatype->kind) {
|
||||||
|
case CDATATYPE_CTYPE:
|
||||||
|
ctype_to_string(dst, cdatatype->type.c_type);
|
||||||
|
break;
|
||||||
|
case CDATATYPE_CUSERTYPE:
|
||||||
|
cusertype_to_string(dst, &(cdatatype->type.c_usertype));
|
||||||
|
break;
|
||||||
|
case CDATATYPE_STR:
|
||||||
|
wapp_runtime_assert(cdatatype->type.str.size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, &(cdatatype->type.str));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void carg_to_string(Str8 *dst, const CArg *carg) {
|
||||||
|
wapp_debug_assert(dst != NULL && carg != NULL, "`dst` and `carg` should not be NULL");
|
||||||
|
|
||||||
|
Str8 qualifier = wapp_str8_buf(CCGEN_BUF_MEDIUM);
|
||||||
|
Str8 type = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 pointer = wapp_str8_buf(CCGEN_BUF_MEDIUM);
|
||||||
|
Str8 array = wapp_str8_buf(CCGEN_BUF_MEDIUM);
|
||||||
|
|
||||||
|
cqualifier_to_string(&qualifier, carg->qualifier);
|
||||||
|
cdatatype_to_string(&type, &(carg->type));
|
||||||
|
wapp_str8_concat_capped(&type, &wapp_str8_lit_ro(" "));
|
||||||
|
cpointer_to_string(&pointer, &(carg->pointer));
|
||||||
|
if (carg->is_array) { wapp_str8_copy_cstr_capped(&array, "[]"); }
|
||||||
|
|
||||||
|
u64 total_size = qualifier.size + type.size + pointer.size + array.size + carg->name.size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst, WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC,
|
||||||
|
wapp_str8_varg(qualifier), wapp_str8_varg(type), wapp_str8_varg(pointer),
|
||||||
|
wapp_str8_varg(carg->name), wapp_str8_varg(array));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cfunc_to_string(Str8 *dst, const CFunc *cfunc) {
|
||||||
|
wapp_debug_assert(dst != NULL && cfunc != NULL, "`dst` and `cfunc` should not be NULL");
|
||||||
|
|
||||||
|
Str8 qualifiers = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 args = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
Str8 ret_type = wapp_str8_buf(CCGEN_BUF_SMALL);
|
||||||
|
Str8 pointer = wapp_str8_buf(CCGEN_BUF_SMALL);
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MEDIUM);
|
||||||
|
CQualifier *qf = NULL;
|
||||||
|
CArg *arg = NULL;
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cfunc->qualifiers.node_count; ++i) {
|
||||||
|
qf = wapp_cqualifier_list_get(&(cfunc->qualifiers), i)->item;
|
||||||
|
if (*qf == CQUALIFIER_NONE) { continue; }
|
||||||
|
|
||||||
|
cqualifier_to_string(&tmp, *qf);
|
||||||
|
|
||||||
|
wapp_runtime_assert(tmp.size + 1 <= qualifiers.capacity - qualifiers.size, ERR_MSG);
|
||||||
|
if (qualifiers.size > 0) { wapp_str8_concat_capped(&qualifiers, &wapp_str8_lit_ro(" ")); }
|
||||||
|
|
||||||
|
wapp_str8_concat_capped(&qualifiers, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cfunc->args.node_count; ++i) {
|
||||||
|
arg = wapp_carg_list_get(&(cfunc->args), i)->item;
|
||||||
|
carg_to_string(&tmp, arg);
|
||||||
|
|
||||||
|
wapp_runtime_assert(tmp.size + 2 <= args.capacity - args.size, ERR_MSG);
|
||||||
|
wapp_str8_concat_capped(&args, &tmp);
|
||||||
|
if (i + 1 < cfunc->args.node_count) { wapp_str8_concat_capped(&args, &wapp_str8_lit_ro(", ")); }
|
||||||
|
}
|
||||||
|
|
||||||
|
cdatatype_to_string(&ret_type, &(cfunc->ret_type));
|
||||||
|
cpointer_to_string(&pointer, &(cfunc->pointer));
|
||||||
|
|
||||||
|
u64 total_size = cfunc->name.size + qualifiers.size + args.size + ret_type.size + pointer.size + 4;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC " " WAPP_STR8_SPEC WAPP_STR8_SPEC "(" WAPP_STR8_SPEC ")",
|
||||||
|
wapp_str8_varg(qualifiers),
|
||||||
|
wapp_str8_varg(ret_type),
|
||||||
|
wapp_str8_varg(pointer),
|
||||||
|
wapp_str8_varg(cfunc->name),
|
||||||
|
wapp_str8_varg(args));
|
||||||
|
}
|
||||||
|
|
||||||
|
void declare_cfunc(Str8 *dst, const CFunc *cfunc) {
|
||||||
|
wapp_debug_assert(dst != NULL && cfunc != NULL, "`dst` and `cfunc` should not be NULL");
|
||||||
|
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
cfunc_to_string(&tmp, cfunc);
|
||||||
|
|
||||||
|
wapp_runtime_assert(tmp.size + 2 <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst, WAPP_STR8_SPEC ";\n", wapp_str8_varg(tmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
void define_cfunc(Str8 *dst, const CFunc *cfunc) {
|
||||||
|
wapp_debug_assert(dst != NULL && cfunc != NULL, "`dst` and `cfunc` should not be NULL");
|
||||||
|
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
cfunc_to_string(&tmp, cfunc);
|
||||||
|
|
||||||
|
wapp_runtime_assert(tmp.size + cfunc->body.size + 8 <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst, WAPP_STR8_SPEC " {\n" WAPP_STR8_SPEC "\n}\n\n",
|
||||||
|
wapp_str8_varg(tmp), wapp_str8_varg(cfunc->body));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cinclude_to_string(Str8 *dst, const CInclude *cinclude) {
|
||||||
|
wapp_debug_assert(dst != NULL && cinclude != NULL, "`dst` and `cinclude` should not be NULL");
|
||||||
|
|
||||||
|
Str8 header_str = wapp_str8_buf(CCGEN_BUF_LARGE);
|
||||||
|
if (!cheaderinclude_to_string(&header_str, &(cinclude->header))) { return; }
|
||||||
|
|
||||||
|
Str8 inc = wapp_str8_lit("#include ");
|
||||||
|
Str8 open_symbol = wapp_str8_buf(CCGEN_BUF_MIN);
|
||||||
|
Str8 close_symbol = wapp_str8_buf(CCGEN_BUF_MIN);
|
||||||
|
|
||||||
|
if (cinclude->is_local) {
|
||||||
|
wapp_str8_concat_capped(&open_symbol, &wapp_str8_lit_ro("\""));
|
||||||
|
wapp_str8_concat_capped(&close_symbol, &wapp_str8_lit_ro("\""));
|
||||||
|
if (cinclude->same_dir) { wapp_str8_concat_capped(&open_symbol, &wapp_str8_lit_ro("./")); }
|
||||||
|
} else {
|
||||||
|
wapp_str8_concat_capped(&open_symbol, &wapp_str8_lit_ro("<"));
|
||||||
|
wapp_str8_concat_capped(&close_symbol, &wapp_str8_lit_ro(">"));
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 total_size = header_str.size + inc.size + open_symbol.size + close_symbol.size;
|
||||||
|
wapp_runtime_assert(total_size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst,
|
||||||
|
WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC WAPP_STR8_SPEC "\n",
|
||||||
|
wapp_str8_varg(inc),
|
||||||
|
wapp_str8_varg(open_symbol),
|
||||||
|
wapp_str8_varg(header_str),
|
||||||
|
wapp_str8_varg(close_symbol));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cheader_to_string(Str8 *dst, const CHeader *cheader) {
|
||||||
|
wapp_debug_assert(dst != NULL && cheader != NULL, "`dst` and `cheader` should not be NULL");
|
||||||
|
|
||||||
|
Allocator arena = wapp_mem_arena_allocator_init(MB(64));
|
||||||
|
Str8 *output = wapp_str8_alloc_buf(&arena, KB(32));
|
||||||
|
wapp_runtime_assert(output != NULL, "Failed to allocate buffer");
|
||||||
|
|
||||||
|
Str8 header_guard_name = wapp_str8_buf(CCGEN_BUF_SMALL);
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
|
||||||
|
// ADD HEADER GUARD AND START C LINKAGE
|
||||||
|
wapp_str8_to_upper(&header_guard_name, &(cheader->name));
|
||||||
|
wapp_str8_concat_capped(&header_guard_name, &wapp_str8_lit_ro("_H"));
|
||||||
|
wapp_str8_format(&tmp, "#ifndef " WAPP_STR8_SPEC "\n#define " WAPP_STR8_SPEC "\n\n"
|
||||||
|
"#ifdef WAPP_PLATFORM_CPP\nBEGIN_C_LINKAGE\n#endif // !WAPP_PLATFORM_CPP\n\n",
|
||||||
|
wapp_str8_varg(header_guard_name), wapp_str8_varg(header_guard_name));
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->includes.node_count; ++i) {
|
||||||
|
cinclude_to_string(&tmp, wapp_cinclude_list_get(&(cheader->includes), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (cheader->includes.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->macros.node_count; ++i) {
|
||||||
|
cmacro_to_string(&tmp, wapp_cmacro_list_get(&(cheader->macros), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (cheader->macros.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
if (cheader->cpp_macros.node_count > 0) {
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("#ifdef WAPP_PLATFORM_CPP\n"));
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->cpp_macros.node_count; ++i) {
|
||||||
|
cmacro_to_string(&tmp, wapp_cmacro_list_get(&(cheader->cpp_macros), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("#else\n"));
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->c_macros.node_count; ++i) {
|
||||||
|
cmacro_to_string(&tmp, wapp_cmacro_list_get(&(cheader->c_macros), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("#endif // !WAPP_PLATFORM_CPP\n\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->decl_types.node_count; ++i) {
|
||||||
|
declare_cstruct(&tmp, wapp_cstruct_list_get(&(cheader->decl_types), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (cheader->decl_types.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->types.node_count; ++i) {
|
||||||
|
cusertype_to_string(&tmp, wapp_cusertype_list_get(&(cheader->types), i)->item);
|
||||||
|
wapp_str8_concat_capped(&tmp, &wapp_str8_lit_ro("\n"));
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 i = 0; i < cheader->funcs.node_count; ++i) {
|
||||||
|
declare_cfunc(&tmp, wapp_cfunc_list_get(&(cheader->funcs), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// END C LINKAGE AND CLOSE HEADER GUARD
|
||||||
|
wapp_str8_format(&tmp, "\n#ifdef WAPP_PLATFORM_CPP\nEND_C_LINKAGE\n#endif // !WAPP_PLATFORM_CPP\n\n"
|
||||||
|
"#endif // !" WAPP_STR8_SPEC "\n", wapp_str8_varg(header_guard_name));
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
|
||||||
|
wapp_runtime_assert(output->size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, output);
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&arena);
|
||||||
|
}
|
||||||
|
|
||||||
|
void csource_to_string(Str8 *dst, const CSource *csource) {
|
||||||
|
wapp_debug_assert(dst != NULL && csource != NULL, "`dst` and `csource` should not be NULL");
|
||||||
|
|
||||||
|
Allocator arena = wapp_mem_arena_allocator_init(MB(64));
|
||||||
|
Str8 *output = wapp_str8_alloc_buf(&arena, KB(32));
|
||||||
|
Str8 *internal_funcs_def = wapp_str8_alloc_buf(&arena, KB(16));
|
||||||
|
wapp_runtime_assert(output != NULL && internal_funcs_def != NULL, "Failed to allocate buffer");
|
||||||
|
|
||||||
|
Str8 tmp = wapp_str8_buf(CCGEN_BUF_MAX);
|
||||||
|
|
||||||
|
for (u64 i = 0; i < csource->includes.node_count; ++i) {
|
||||||
|
cinclude_to_string(&tmp, wapp_cinclude_list_get(&(csource->includes), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (csource->includes.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < csource->macros.node_count; ++i) {
|
||||||
|
cmacro_to_string(&tmp, wapp_cmacro_list_get(&(csource->macros), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (csource->macros.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < csource->decl_types.node_count; ++i) {
|
||||||
|
declare_cstruct(&tmp, wapp_cstruct_list_get(&(csource->decl_types), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
if (csource->decl_types.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < csource->types.node_count; ++i) {
|
||||||
|
cusertype_to_string(&tmp, wapp_cusertype_list_get(&(csource->types), i)->item);
|
||||||
|
wapp_str8_concat_capped(&tmp, &wapp_str8_lit_ro("\n"));
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8RO _wapp_intern = wapp_str8_lit_ro("wapp_intern ");
|
||||||
|
for (u64 i = 0; i < csource->internal_funcs.node_count; ++i) {
|
||||||
|
declare_cfunc(&tmp, wapp_cfunc_list_get(&(csource->internal_funcs), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &_internal);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
|
||||||
|
define_cfunc(&tmp, wapp_cfunc_list_get(&(csource->internal_funcs), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, internal_funcs_def, &_internal);
|
||||||
|
wapp_str8_alloc_concat(&arena, internal_funcs_def, &tmp);
|
||||||
|
}
|
||||||
|
if (csource->internal_funcs.node_count > 0) { wapp_str8_alloc_concat(&arena, output, &wapp_str8_lit_ro("\n")); }
|
||||||
|
|
||||||
|
for (u64 i = 0; i < csource->funcs.node_count; ++i) {
|
||||||
|
define_cfunc(&tmp, wapp_cfunc_list_get(&(csource->funcs), i)->item);
|
||||||
|
wapp_str8_alloc_concat(&arena, output, &tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_runtime_assert(output->size + internal_funcs_def->size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_copy_str8_capped(dst, output);
|
||||||
|
wapp_str8_concat_capped(dst, internal_funcs_def);
|
||||||
|
|
||||||
|
wapp_mem_arena_allocator_destroy(&arena);
|
||||||
|
}
|
||||||
|
|
||||||
|
b32 cheaderinclude_to_string(Str8 *dst, const CHeaderInclude *cheaderinclude) {
|
||||||
|
wapp_debug_assert(dst != NULL && cheaderinclude != NULL, "`dst` and `cheaderinclude` should not be NULL");
|
||||||
|
|
||||||
|
switch (cheaderinclude->kind) {
|
||||||
|
case C_HEADER_INCLUDE_STR:
|
||||||
|
wapp_runtime_assert(cheaderinclude->header.name.size <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(dst, WAPP_STR8_SPEC, wapp_str8_varg(cheaderinclude->header.name));
|
||||||
|
return true;
|
||||||
|
case C_HEADER_INCLUDE_HEADER:
|
||||||
|
// Take extension into account
|
||||||
|
wapp_runtime_assert(cheaderinclude->header.header.name.size + 2 <= dst->capacity, ERR_MSG);
|
||||||
|
wapp_str8_format(
|
||||||
|
dst,
|
||||||
|
WAPP_STR8_SPEC ".%s",
|
||||||
|
wapp_str8_varg(cheaderinclude->header.header.name),
|
||||||
|
cheaderinclude->header.header.extension == CFILE_EXT_H ? "h" : "c"
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
280
ccodegen/datatypes.h
Normal file
280
ccodegen/datatypes.h
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#ifndef DATATYPES_H
|
||||||
|
#define DATATYPES_H
|
||||||
|
|
||||||
|
#include "wapp_core.h"
|
||||||
|
#include "dbl_list.h"
|
||||||
|
#include "type_enums.h"
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_MIN
|
||||||
|
#define CCGEN_BUF_MIN 16
|
||||||
|
#endif // !CCGEN_BUF_MIN
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_TINY
|
||||||
|
#define CCGEN_BUF_TINY 32
|
||||||
|
#endif // !CCGEN_BUF_TINY
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_SMALL
|
||||||
|
#define CCGEN_BUF_SMALL 512
|
||||||
|
#endif // !CCGEN_BUF_SMALL
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_MEDIUM
|
||||||
|
#define CCGEN_BUF_MEDIUM 1024
|
||||||
|
#endif // !CCGEN_BUF_MEDIUM
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_LARGE
|
||||||
|
#define CCGEN_BUF_LARGE 4096
|
||||||
|
#endif // !CCGEN_BUF_LARGE
|
||||||
|
|
||||||
|
#ifndef CCGEN_BUF_MAX
|
||||||
|
#define CCGEN_BUF_MAX 8192
|
||||||
|
#endif // !CCGEN_BUF_MAX
|
||||||
|
|
||||||
|
#define CENUM(NAME, VALUES, TYPEDEF) ((CEnum){ .name = (NAME), .values = (VALUES), .add_typedef = (TYPEDEF) })
|
||||||
|
#define CSTRUCT(NAME, ARGS, TYPEDEF_NAME_PTR) ((CStruct){ .name = (NAME), .args = (ARGS), .typedef_name = (TYPEDEF_NAME_PTR) })
|
||||||
|
|
||||||
|
#define CUSERTYPE_ENUM(ENUM) ((CUserType){ .kind = CUSERTYPE_CENUM, .type.c_enum = ENUM })
|
||||||
|
#define CUSERTYPE_STRUCT(STRUCT) ((CUserType){ .kind = CUSERTYPE_CSTRUCT, .type.c_struct = STRUCT })
|
||||||
|
|
||||||
|
#define CDATATYPE_CTYPE(VALUE) ((CDataType){ .kind = CDATATYPE_CTYPE, .type.c_type = (VALUE) })
|
||||||
|
#define CDATATYPE_USERTYPE(USERTYPE) ((CDataType){ .kind = CDATATYPE_CUSERTYPE, .type.c_usertype = (USERTYPE) })
|
||||||
|
#define CDATATYPE_STR(STR) ((CDataType){ .kind = CDATATYPE_STR, .type.str = (STR) })
|
||||||
|
|
||||||
|
#define CHEADERINCLUDE_STR(NAME) ((CHeaderInclude){ .kind = C_HEADER_INCLUDE_STR, .header.name = (NAME) })
|
||||||
|
#define CHEADERINCLUDE_CHEADER(CHEADER) ((CHeaderInclude){ .kind = C_HEADER_INCLUDE_HEADER, .header.header = (CHEADER) })
|
||||||
|
|
||||||
|
#define COBJECT_TYPE(VALUE) \
|
||||||
|
((CObject){ .kind = COBJECT_CTYPE, .object.c_type = (VALUE) })
|
||||||
|
#define COBJECT_QUALIFIER(VALUE) \
|
||||||
|
((CObject){ .kind = COBJECT_CQUALIFIER, .object.c_qualifier = (VALUE) })
|
||||||
|
#define COBJECT_POINTERTYPE(VALUE) \
|
||||||
|
((CObject){ .kind = COBJECT_CPOINTERTYPE, .object.c_pointertype = (VALUE) })
|
||||||
|
#define COBJECT_POINTER(CPOINTER) \
|
||||||
|
((CObject){ .kind = COBJECT_CPOINTER, .object.c_pointer = (CPOINTER) })
|
||||||
|
#define COBJECT_ENUMVAL(CENUMVAL) \
|
||||||
|
((CObject){ .kind = COBJECT_CENUMVAL, .object.c_enumval = (CENUMVAL) })
|
||||||
|
#define COBJECT_ENUM(ENUM) \
|
||||||
|
((CObject){ .kind = COBJECT_CENUM, .object.c_enum = (ENUM) })
|
||||||
|
#define COBJECT_MACRO(CMACRO) \
|
||||||
|
((CObject){ .kind = COBJECT_CMACRO, .object.c_macro = (CMACRO) })
|
||||||
|
#define COBJECT_STRUCT(STRUCT) \
|
||||||
|
((CObject){ .kind = COBJECT_CSTRUCT, .object.c_struct = STRUCT })
|
||||||
|
#define COBJECT_USERTYPE(USERTYPE) \
|
||||||
|
((CObject){ .kind = COBJECT_CUSERTYPE, .object.c_usertype = (USERTYPE) })
|
||||||
|
#define COBJECT_DATATYPE(DATATYPE) \
|
||||||
|
((CObject){ .kind = COBJECT_CDATATYPE, .object.c_datatype = (DATATYPE) })
|
||||||
|
#define COBJECT_ARG(CARG) \
|
||||||
|
((CObject){ .kind = COBJECT_CARG, .object.c_arg = (CARG) })
|
||||||
|
#define COBJECT_FUNC(CFUNC) \
|
||||||
|
((CObject){ .kind = COBJECT_CFUNC, .object.c_func = (CFUNC) })
|
||||||
|
#define COBJECT_INCULDE(CINCLUDE) \
|
||||||
|
((CObject){ .kind = COBJECT_CINCULDE, .object.c_include = (CINCLUDE) })
|
||||||
|
#define COBJECT_HEADER(CHEADER) \
|
||||||
|
((CObject){ .kind = COBJECT_CHEADER, .object.c_header = (CHEADER) })
|
||||||
|
#define COBJECT_SOURCE(CSOURCE) \
|
||||||
|
((CObject){ .kind = COBJECT_CSOURCE, .object.c_source = (CSOURCE) })
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CUSERTYPE_CENUM,
|
||||||
|
CUSERTYPE_CSTRUCT,
|
||||||
|
|
||||||
|
COUNT_CUSERTYPEKIND,
|
||||||
|
} CUserTypeKind;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CDATATYPE_CTYPE,
|
||||||
|
CDATATYPE_CUSERTYPE,
|
||||||
|
CDATATYPE_STR,
|
||||||
|
|
||||||
|
COUNT_CDATATYPEKIND,
|
||||||
|
} CDataTypeKind;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CFILE_EXT_H,
|
||||||
|
CFILE_EXT_C,
|
||||||
|
|
||||||
|
COUNT_CFILE_EXT,
|
||||||
|
} CFileExtension;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
C_HEADER_INCLUDE_STR,
|
||||||
|
C_HEADER_INCLUDE_HEADER,
|
||||||
|
|
||||||
|
COUNT_CHEADERINCLUDEKIND,
|
||||||
|
} CHeaderIncludeKind;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
COBJECT_CTYPE,
|
||||||
|
COBJECT_CQUALIFIER,
|
||||||
|
COBJECT_CPOINTERTYPE,
|
||||||
|
COBJECT_CPOINTER,
|
||||||
|
COBJECT_CENUMVAL,
|
||||||
|
COBJECT_CENUM,
|
||||||
|
COBJECT_CMACRO,
|
||||||
|
COBJECT_CSTRUCT,
|
||||||
|
COBJECT_CUSERTYPE,
|
||||||
|
COBJECT_CDATATYPE,
|
||||||
|
COBJECT_CARG,
|
||||||
|
COBJECT_CFUNC,
|
||||||
|
COBJECT_CINCULDE,
|
||||||
|
COBJECT_CHEADER,
|
||||||
|
COBJECT_CSOURCE,
|
||||||
|
|
||||||
|
COUNT_COBJECTKIND,
|
||||||
|
} CObjectKind;
|
||||||
|
|
||||||
|
typedef struct cpointer CPointer;
|
||||||
|
typedef struct cenumval CEnumVal;
|
||||||
|
typedef struct cenum CEnum;
|
||||||
|
typedef struct cmacro CMacro;
|
||||||
|
typedef struct cstruct CStruct;
|
||||||
|
typedef struct cusertype CUserType;
|
||||||
|
typedef struct cdatatype CDataType;
|
||||||
|
typedef struct carg CArg;
|
||||||
|
typedef struct cfunc CFunc;
|
||||||
|
typedef struct cheader_include CHeaderInclude;
|
||||||
|
typedef struct cinclude CInclude;
|
||||||
|
typedef struct cheader CHeader;
|
||||||
|
typedef struct csource CSource;
|
||||||
|
typedef struct cobject CObject;
|
||||||
|
|
||||||
|
struct cpointer {
|
||||||
|
CPointerType type;
|
||||||
|
CQualifier qualifier;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cenumval {
|
||||||
|
Str8 name;
|
||||||
|
i32 *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cenum {
|
||||||
|
Str8 name;
|
||||||
|
CEnumValList values;
|
||||||
|
b32 add_typedef;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cmacro {
|
||||||
|
Str8 name;
|
||||||
|
Str8 value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cstruct {
|
||||||
|
Str8 name;
|
||||||
|
CArgList args;
|
||||||
|
Str8 typedef_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cusertype {
|
||||||
|
CUserTypeKind kind;
|
||||||
|
union {
|
||||||
|
CEnum c_enum;
|
||||||
|
CStruct c_struct;
|
||||||
|
} type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cdatatype {
|
||||||
|
CDataTypeKind kind;
|
||||||
|
union {
|
||||||
|
CType c_type;
|
||||||
|
CUserType c_usertype;
|
||||||
|
Str8 str;
|
||||||
|
} type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct carg {
|
||||||
|
Str8 name;
|
||||||
|
CDataType type;
|
||||||
|
CPointer pointer;
|
||||||
|
CQualifier qualifier;
|
||||||
|
b32 is_array;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cfunc {
|
||||||
|
Str8 name;
|
||||||
|
CDataType ret_type;
|
||||||
|
CArgList args;
|
||||||
|
Str8 body;
|
||||||
|
CPointer pointer;
|
||||||
|
CQualifierList qualifiers;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define CFILE_ARGS \
|
||||||
|
Str8 name; \
|
||||||
|
CFileExtension extension; \
|
||||||
|
CIncludeList includes; \
|
||||||
|
CUserTypeList types; \
|
||||||
|
CFuncList funcs; \
|
||||||
|
CStructList decl_types; \
|
||||||
|
CMacroList macros; \
|
||||||
|
CMacroList c_macros; \
|
||||||
|
CMacroList cpp_macros \
|
||||||
|
|
||||||
|
struct cheader {
|
||||||
|
CFILE_ARGS;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct csource {
|
||||||
|
CFILE_ARGS;
|
||||||
|
CFuncList internal_funcs;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cheader_include {
|
||||||
|
CHeaderIncludeKind kind;
|
||||||
|
union {
|
||||||
|
Str8 name;
|
||||||
|
CHeader header;
|
||||||
|
} header;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cinclude {
|
||||||
|
CHeaderInclude header;
|
||||||
|
b32 is_local;
|
||||||
|
b32 same_dir;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cobject {
|
||||||
|
CObjectKind kind;
|
||||||
|
union {
|
||||||
|
CType c_type;
|
||||||
|
CQualifier c_qualifier;
|
||||||
|
CPointerType c_pointertype;
|
||||||
|
CPointer c_pointer;
|
||||||
|
CEnumVal c_enumval;
|
||||||
|
CEnum c_enum;
|
||||||
|
CMacro c_macro;
|
||||||
|
CStruct c_struct;
|
||||||
|
CUserType c_usertype;
|
||||||
|
CDataType c_datatype;
|
||||||
|
CArg c_arg;
|
||||||
|
CFunc c_func;
|
||||||
|
CInclude c_include;
|
||||||
|
CHeader c_header;
|
||||||
|
CSource c_source;
|
||||||
|
} object;
|
||||||
|
};
|
||||||
|
|
||||||
|
void cobject_to_string(Str8 *dst, const CObject *object);
|
||||||
|
void ctype_to_string(Str8 *dst, CType ctype);
|
||||||
|
void cqualifier_to_string(Str8 *dst, CQualifier cqualifier);
|
||||||
|
void cpointertype_to_string(Str8 *dst, CPointerType cpointertype);
|
||||||
|
void cpointer_to_string(Str8 *dst, const CPointer *cpointer);
|
||||||
|
void cenumval_to_string(Str8 *dst, const CEnumVal *cenumval);
|
||||||
|
void cenum_to_string(Str8 *dst, const CEnum *cenum);
|
||||||
|
void cmacro_to_string(Str8 *dst, const CMacro *cmacro);
|
||||||
|
void cstruct_to_string(Str8 *dst, const CStruct *cstruct);
|
||||||
|
void declare_cstruct(Str8 *dst, const CStruct *cstruct);
|
||||||
|
void define_cstruct(Str8 *dst, const CStruct *cstruct);
|
||||||
|
void cusertype_to_string(Str8 *dst, const CUserType *cusertype);
|
||||||
|
void cdatatype_to_string(Str8 *dst, const CDataType *cdatatype);
|
||||||
|
void carg_to_string(Str8 *dst, const CArg *carg);
|
||||||
|
void cfunc_to_string(Str8 *dst, const CFunc *cfunc);
|
||||||
|
void declare_cfunc(Str8 *dst, const CFunc *cfunc);
|
||||||
|
void define_cfunc(Str8 *dst, const CFunc *cfunc);
|
||||||
|
void cinclude_to_string(Str8 *dst, const CInclude *cinclude);
|
||||||
|
void cheader_to_string(Str8 *dst, const CHeader *cheader);
|
||||||
|
void csource_to_string(Str8 *dst, const CSource *csource);
|
||||||
|
b32 cheaderinclude_to_string(Str8 *dst, const CHeaderInclude *cheaderinclude);
|
||||||
|
|
||||||
|
#endif // !DATATYPES_H
|
||||||
1526
ccodegen/dbl_list.c
Normal file
1526
ccodegen/dbl_list.c
Normal file
File diff suppressed because it is too large
Load Diff
222
ccodegen/dbl_list.h
Normal file
222
ccodegen/dbl_list.h
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#ifndef CCGEN_DBL_LIST_H
|
||||||
|
#define CCGEN_DBL_LIST_H
|
||||||
|
|
||||||
|
#include "wapp_core.h"
|
||||||
|
#include "type_enums.h"
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
BEGIN_C_LINKAGE
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
#define wapp_cenumval_list_node(ITEM_PTR) CEnumValNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_carg_list_node(ITEM_PTR) CArgNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cqualifier_list_node(ITEM_PTR) CQualifierNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cinclude_list_node(ITEM_PTR) CIncludeNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cusertype_list_node(ITEM_PTR) CUserTypeNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cfunc_list_node(ITEM_PTR) CFuncNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cstruct_list_node(ITEM_PTR) CStructNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_cmacro_list_node(ITEM_PTR) CMacroNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#else
|
||||||
|
#define wapp_cenumval_list_node(ITEM_PTR) ((CEnumValNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_carg_list_node(ITEM_PTR) ((CArgNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cqualifier_list_node(ITEM_PTR) ((CQualifierNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cinclude_list_node(ITEM_PTR) ((CIncludeNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cusertype_list_node(ITEM_PTR) ((CUserTypeNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cfunc_list_node(ITEM_PTR) ((CFuncNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cstruct_list_node(ITEM_PTR) ((CStructNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_cmacro_list_node(ITEM_PTR) ((CMacroNode){.item = ITEM_PTR})
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
typedef struct cenumval CEnumVal;
|
||||||
|
typedef struct carg CArg;
|
||||||
|
typedef struct cinclude CInclude;
|
||||||
|
typedef struct cusertype CUserType;
|
||||||
|
typedef struct cfunc CFunc;
|
||||||
|
typedef struct cstruct CStruct;
|
||||||
|
typedef struct cmacro CMacro;
|
||||||
|
|
||||||
|
typedef struct CEnumValNode CEnumValNode;
|
||||||
|
struct CEnumValNode {
|
||||||
|
CEnumVal *item;
|
||||||
|
CEnumValNode *prev;
|
||||||
|
CEnumValNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CEnumValList CEnumValList;
|
||||||
|
struct CEnumValList {
|
||||||
|
CEnumValNode *first;
|
||||||
|
CEnumValNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CArgNode CArgNode;
|
||||||
|
struct CArgNode {
|
||||||
|
CArg *item;
|
||||||
|
CArgNode *prev;
|
||||||
|
CArgNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CArgList CArgList;
|
||||||
|
struct CArgList {
|
||||||
|
CArgNode *first;
|
||||||
|
CArgNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CQualifierNode CQualifierNode;
|
||||||
|
struct CQualifierNode {
|
||||||
|
CQualifier *item;
|
||||||
|
CQualifierNode *prev;
|
||||||
|
CQualifierNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CQualifierList CQualifierList;
|
||||||
|
struct CQualifierList {
|
||||||
|
CQualifierNode *first;
|
||||||
|
CQualifierNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CIncludeNode CIncludeNode;
|
||||||
|
struct CIncludeNode {
|
||||||
|
CInclude *item;
|
||||||
|
CIncludeNode *prev;
|
||||||
|
CIncludeNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CIncludeList CIncludeList;
|
||||||
|
struct CIncludeList {
|
||||||
|
CIncludeNode *first;
|
||||||
|
CIncludeNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CUserTypeNode CUserTypeNode;
|
||||||
|
struct CUserTypeNode {
|
||||||
|
CUserType *item;
|
||||||
|
CUserTypeNode *prev;
|
||||||
|
CUserTypeNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CUserTypeList CUserTypeList;
|
||||||
|
struct CUserTypeList {
|
||||||
|
CUserTypeNode *first;
|
||||||
|
CUserTypeNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CFuncNode CFuncNode;
|
||||||
|
struct CFuncNode {
|
||||||
|
CFunc *item;
|
||||||
|
CFuncNode *prev;
|
||||||
|
CFuncNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CFuncList CFuncList;
|
||||||
|
struct CFuncList {
|
||||||
|
CFuncNode *first;
|
||||||
|
CFuncNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CStructNode CStructNode;
|
||||||
|
struct CStructNode {
|
||||||
|
CStruct *item;
|
||||||
|
CStructNode *prev;
|
||||||
|
CStructNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CStructList CStructList;
|
||||||
|
struct CStructList {
|
||||||
|
CStructNode *first;
|
||||||
|
CStructNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CMacroNode CMacroNode;
|
||||||
|
struct CMacroNode {
|
||||||
|
CMacro *item;
|
||||||
|
CMacroNode *prev;
|
||||||
|
CMacroNode *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct CMacroList CMacroList;
|
||||||
|
struct CMacroList {
|
||||||
|
CMacroNode *first;
|
||||||
|
CMacroNode *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
|
CEnumValNode *wapp_cenumval_list_get(const CEnumValList *list, u64 index);
|
||||||
|
void wapp_cenumval_list_push_front(CEnumValList *list, CEnumValNode *node);
|
||||||
|
void wapp_cenumval_list_push_back(CEnumValList *list, CEnumValNode *node);
|
||||||
|
void wapp_cenumval_list_insert(CEnumValList *list, CEnumValNode *node, u64 index);
|
||||||
|
CEnumValNode *wapp_cenumval_list_pop_front(CEnumValList *list);
|
||||||
|
CEnumValNode *wapp_cenumval_list_pop_back(CEnumValList *list);
|
||||||
|
CEnumValNode *wapp_cenumval_list_remove(CEnumValList *list, u64 index);
|
||||||
|
void wapp_cenumval_list_empty(CEnumValList *list);
|
||||||
|
CArgNode *wapp_carg_list_get(const CArgList *list, u64 index);
|
||||||
|
void wapp_carg_list_push_front(CArgList *list, CArgNode *node);
|
||||||
|
void wapp_carg_list_push_back(CArgList *list, CArgNode *node);
|
||||||
|
void wapp_carg_list_insert(CArgList *list, CArgNode *node, u64 index);
|
||||||
|
CArgNode *wapp_carg_list_pop_front(CArgList *list);
|
||||||
|
CArgNode *wapp_carg_list_pop_back(CArgList *list);
|
||||||
|
CArgNode *wapp_carg_list_remove(CArgList *list, u64 index);
|
||||||
|
void wapp_carg_list_empty(CArgList *list);
|
||||||
|
CQualifierNode *wapp_cqualifier_list_get(const CQualifierList *list, u64 index);
|
||||||
|
void wapp_cqualifier_list_push_front(CQualifierList *list, CQualifierNode *node);
|
||||||
|
void wapp_cqualifier_list_push_back(CQualifierList *list, CQualifierNode *node);
|
||||||
|
void wapp_cqualifier_list_insert(CQualifierList *list, CQualifierNode *node, u64 index);
|
||||||
|
CQualifierNode *wapp_cqualifier_list_pop_front(CQualifierList *list);
|
||||||
|
CQualifierNode *wapp_cqualifier_list_pop_back(CQualifierList *list);
|
||||||
|
CQualifierNode *wapp_cqualifier_list_remove(CQualifierList *list, u64 index);
|
||||||
|
void wapp_cqualifier_list_empty(CQualifierList *list);
|
||||||
|
CIncludeNode *wapp_cinclude_list_get(const CIncludeList *list, u64 index);
|
||||||
|
void wapp_cinclude_list_push_front(CIncludeList *list, CIncludeNode *node);
|
||||||
|
void wapp_cinclude_list_push_back(CIncludeList *list, CIncludeNode *node);
|
||||||
|
void wapp_cinclude_list_insert(CIncludeList *list, CIncludeNode *node, u64 index);
|
||||||
|
CIncludeNode *wapp_cinclude_list_pop_front(CIncludeList *list);
|
||||||
|
CIncludeNode *wapp_cinclude_list_pop_back(CIncludeList *list);
|
||||||
|
CIncludeNode *wapp_cinclude_list_remove(CIncludeList *list, u64 index);
|
||||||
|
void wapp_cinclude_list_empty(CIncludeList *list);
|
||||||
|
CUserTypeNode *wapp_cusertype_list_get(const CUserTypeList *list, u64 index);
|
||||||
|
void wapp_cusertype_list_push_front(CUserTypeList *list, CUserTypeNode *node);
|
||||||
|
void wapp_cusertype_list_push_back(CUserTypeList *list, CUserTypeNode *node);
|
||||||
|
void wapp_cusertype_list_insert(CUserTypeList *list, CUserTypeNode *node, u64 index);
|
||||||
|
CUserTypeNode *wapp_cusertype_list_pop_front(CUserTypeList *list);
|
||||||
|
CUserTypeNode *wapp_cusertype_list_pop_back(CUserTypeList *list);
|
||||||
|
CUserTypeNode *wapp_cusertype_list_remove(CUserTypeList *list, u64 index);
|
||||||
|
void wapp_cusertype_list_empty(CUserTypeList *list);
|
||||||
|
CFuncNode *wapp_cfunc_list_get(const CFuncList *list, u64 index);
|
||||||
|
void wapp_cfunc_list_push_front(CFuncList *list, CFuncNode *node);
|
||||||
|
void wapp_cfunc_list_push_back(CFuncList *list, CFuncNode *node);
|
||||||
|
void wapp_cfunc_list_insert(CFuncList *list, CFuncNode *node, u64 index);
|
||||||
|
CFuncNode *wapp_cfunc_list_pop_front(CFuncList *list);
|
||||||
|
CFuncNode *wapp_cfunc_list_pop_back(CFuncList *list);
|
||||||
|
CFuncNode *wapp_cfunc_list_remove(CFuncList *list, u64 index);
|
||||||
|
void wapp_cfunc_list_empty(CFuncList *list);
|
||||||
|
CStructNode *wapp_cstruct_list_get(const CStructList *list, u64 index);
|
||||||
|
void wapp_cstruct_list_push_front(CStructList *list, CStructNode *node);
|
||||||
|
void wapp_cstruct_list_push_back(CStructList *list, CStructNode *node);
|
||||||
|
void wapp_cstruct_list_insert(CStructList *list, CStructNode *node, u64 index);
|
||||||
|
CStructNode *wapp_cstruct_list_pop_front(CStructList *list);
|
||||||
|
CStructNode *wapp_cstruct_list_pop_back(CStructList *list);
|
||||||
|
CStructNode *wapp_cstruct_list_remove(CStructList *list, u64 index);
|
||||||
|
void wapp_cstruct_list_empty(CStructList *list);
|
||||||
|
CMacroNode *wapp_cmacro_list_get(const CMacroList *list, u64 index);
|
||||||
|
void wapp_cmacro_list_push_front(CMacroList *list, CMacroNode *node);
|
||||||
|
void wapp_cmacro_list_push_back(CMacroList *list, CMacroNode *node);
|
||||||
|
void wapp_cmacro_list_insert(CMacroList *list, CMacroNode *node, u64 index);
|
||||||
|
CMacroNode *wapp_cmacro_list_pop_front(CMacroList *list);
|
||||||
|
CMacroNode *wapp_cmacro_list_pop_back(CMacroList *list);
|
||||||
|
CMacroNode *wapp_cmacro_list_remove(CMacroList *list, u64 index);
|
||||||
|
void wapp_cmacro_list_empty(CMacroList *list);
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
END_C_LINKAGE
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
#endif // !DBL_LIST_H
|
||||||
10
ccodegen/main.c
Normal file
10
ccodegen/main.c
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#include "datatypes.h"
|
||||||
|
#include "type_enums.h"
|
||||||
|
#include "wapp_core.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
84
ccodegen/type_enums.h
Normal file
84
ccodegen/type_enums.h
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#ifndef TYPE_ENUMS_H
|
||||||
|
#define TYPE_ENUMS_H
|
||||||
|
|
||||||
|
#include "wapp_core.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CTYPE_VOID,
|
||||||
|
CTYPE_B32,
|
||||||
|
CTYPE_CHAR,
|
||||||
|
CTYPE_C8,
|
||||||
|
CTYPE_C16,
|
||||||
|
CTYPE_C32,
|
||||||
|
CTYPE_I8,
|
||||||
|
CTYPE_I16,
|
||||||
|
CTYPE_I32,
|
||||||
|
CTYPE_I64,
|
||||||
|
CTYPE_U8,
|
||||||
|
CTYPE_U16,
|
||||||
|
CTYPE_U32,
|
||||||
|
CTYPE_U64,
|
||||||
|
CTYPE_F32,
|
||||||
|
CTYPE_F64,
|
||||||
|
CTYPE_F128,
|
||||||
|
CTYPE_IPTR,
|
||||||
|
CTYPE_UPTR,
|
||||||
|
|
||||||
|
COUNT_CTYPE,
|
||||||
|
} CType;
|
||||||
|
wapp_intern Str8RO ctypes[COUNT_CTYPE] = {
|
||||||
|
[CTYPE_VOID] = wapp_str8_lit_ro("void"),
|
||||||
|
[CTYPE_B32] = wapp_str8_lit_ro("b32"),
|
||||||
|
[CTYPE_CHAR] = wapp_str8_lit_ro("char"),
|
||||||
|
[CTYPE_C8] = wapp_str8_lit_ro("c8"),
|
||||||
|
[CTYPE_C16] = wapp_str8_lit_ro("c16"),
|
||||||
|
[CTYPE_C32] = wapp_str8_lit_ro("c32"),
|
||||||
|
[CTYPE_I8] = wapp_str8_lit_ro("i8"),
|
||||||
|
[CTYPE_I16] = wapp_str8_lit_ro("i16"),
|
||||||
|
[CTYPE_I32] = wapp_str8_lit_ro("i32"),
|
||||||
|
[CTYPE_I64] = wapp_str8_lit_ro("i64"),
|
||||||
|
[CTYPE_U8] = wapp_str8_lit_ro("u8"),
|
||||||
|
[CTYPE_U16] = wapp_str8_lit_ro("u16"),
|
||||||
|
[CTYPE_U32] = wapp_str8_lit_ro("u32"),
|
||||||
|
[CTYPE_U64] = wapp_str8_lit_ro("u64"),
|
||||||
|
[CTYPE_F32] = wapp_str8_lit_ro("f32"),
|
||||||
|
[CTYPE_F64] = wapp_str8_lit_ro("f64"),
|
||||||
|
[CTYPE_F128] = wapp_str8_lit_ro("f128"),
|
||||||
|
[CTYPE_IPTR] = wapp_str8_lit_ro("iptr"),
|
||||||
|
[CTYPE_UPTR] = wapp_str8_lit_ro("uptr"),
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CQUALIFIER_NONE,
|
||||||
|
CQUALIFIER_CONST,
|
||||||
|
CQUALIFIER_EXTERNAL,
|
||||||
|
CQUALIFIER_INTERNAL,
|
||||||
|
CQUALIFIER_PERSISTENT,
|
||||||
|
|
||||||
|
COUNT_CQUALIFIER,
|
||||||
|
} CQualifier;
|
||||||
|
wapp_intern Str8RO cqualifiers[COUNT_CQUALIFIER] = {
|
||||||
|
[CQUALIFIER_NONE] = wapp_str8_lit_ro(""),
|
||||||
|
[CQUALIFIER_CONST] = wapp_str8_lit_ro("const "),
|
||||||
|
[CQUALIFIER_EXTERNAL] = wapp_str8_lit_ro("wapp_extern "),
|
||||||
|
[CQUALIFIER_INTERNAL] = wapp_str8_lit_ro("wapp_intern "),
|
||||||
|
[CQUALIFIER_PERSISTENT] = wapp_str8_lit_ro("wapp_persist "),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CPOINTERTYPE_NONE,
|
||||||
|
CPOINTERTYPE_SINGLE,
|
||||||
|
CPOINTERTYPE_DOUBLE,
|
||||||
|
|
||||||
|
COUNT_CPOINTERTYPE,
|
||||||
|
} CPointerType;
|
||||||
|
wapp_intern Str8RO cpointertypes[COUNT_CPOINTERTYPE] = {
|
||||||
|
[CPOINTERTYPE_NONE] = wapp_str8_lit_ro(""),
|
||||||
|
[CPOINTERTYPE_SINGLE] = wapp_str8_lit_ro("*"),
|
||||||
|
[CPOINTERTYPE_DOUBLE] = wapp_str8_lit_ro("**"),
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // !TYPE_ENUMS_H
|
||||||
@@ -1,23 +1,60 @@
|
|||||||
|
import json
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from codegen.datatypes import CDataType
|
from pathlib import Path
|
||||||
|
from codegen.datatypes import CDataType, CStruct
|
||||||
|
from codegen.constants import WAPP_REPO_ROOT, DBL_LIST_DATA, ARRAY_DATA
|
||||||
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
|
from codegen.dbl_list.make_dbl_list import DblListData, make_dbl_list
|
||||||
from codegen.array.make_array import ArrayData, make_array
|
from codegen.array.make_array import ArrayData, make_array
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main(types_file: Path | None):
|
||||||
gen_dbl_list()
|
dbl_list_datatypes: Dict[CDataType, DblListData] = {}
|
||||||
gen_array()
|
array_datatypes: Dict[CDataType, ArrayData] = {}
|
||||||
|
|
||||||
|
if types_file is not None:
|
||||||
|
with types_file.open("r") as infile:
|
||||||
|
datatypes = json.load(infile)
|
||||||
|
dbl_list_data = datatypes.get(DBL_LIST_DATA)
|
||||||
|
array_data = datatypes.get(ARRAY_DATA)
|
||||||
|
|
||||||
def gen_dbl_list():
|
if dbl_list_data is not None and isinstance(dbl_list_data, dict):
|
||||||
datatypes: Dict[CDataType, DblListData] = {}
|
dbl_list_datatypes = {k: DblListData.from_dict(v) for k, v in dbl_list_data.items()}
|
||||||
make_dbl_list(datatypes)
|
|
||||||
|
|
||||||
|
if array_data is not None and isinstance(array_data, dict):
|
||||||
|
array_datatypes = {k: ArrayData.from_dict(v) for k, v in array_data.items()}
|
||||||
|
|
||||||
def gen_array():
|
make_dbl_list(dbl_list_datatypes)
|
||||||
datatypes: Dict[CDataType, ArrayData] = {}
|
make_array(array_datatypes)
|
||||||
make_array(datatypes)
|
|
||||||
|
# Save example types file
|
||||||
|
custom_struct = CStruct(name="custom_type", cargs=[], typedef_name="CustomType")
|
||||||
|
example = {
|
||||||
|
DBL_LIST_DATA: {
|
||||||
|
"CustomType": DblListData(
|
||||||
|
node_typename="CustomTypeNode",
|
||||||
|
list_typename="CustomTypeList",
|
||||||
|
hdr_decl_types=[custom_struct],
|
||||||
|
).to_dict()
|
||||||
|
},
|
||||||
|
ARRAY_DATA: {
|
||||||
|
"CustomType": ArrayData(
|
||||||
|
array_typename="CustomTypeArray",
|
||||||
|
hdr_decl_types=[custom_struct],
|
||||||
|
).to_dict()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
example_file = WAPP_REPO_ROOT / "codegen_custom_data_example.json"
|
||||||
|
with example_file.open("w") as outfile:
|
||||||
|
json.dump(example, outfile, indent=2)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
parser = ArgumentParser()
|
||||||
|
parser.add_argument("-f", "--types-file", type=Path, help="JSON file containing custom types for codegen")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
main(args.types_file)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from typing import List, Dict
|
from typing import List, Dict, Any, Type
|
||||||
from codegen.constants import WAPP_SRC_ROOT
|
from codegen.constants import WAPP_SRC_ROOT
|
||||||
from codegen.utils import load_func_body_from_file, convert_to_relative
|
from codegen.utils import load_func_body_from_file, convert_to_relative
|
||||||
from codegen.datatypes import (
|
from codegen.datatypes import (
|
||||||
@@ -16,16 +16,24 @@ from codegen.datatypes import (
|
|||||||
CPointerType,
|
CPointerType,
|
||||||
CQualifier,
|
CQualifier,
|
||||||
CInclude,
|
CInclude,
|
||||||
|
SerialisableDataclass,
|
||||||
get_datatype_string,
|
get_datatype_string,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ArrayData:
|
class ArrayData(SerialisableDataclass):
|
||||||
array_typename: str
|
array_typename: str
|
||||||
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
src_decl_types: List[CStruct] = field(default_factory=list)
|
src_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["ArrayData"], d: Dict[str, Any]) -> "ArrayData":
|
||||||
|
data = ArrayData(**d)
|
||||||
|
data.hdr_decl_types = [CStruct.from_dict(v) for v in data.hdr_decl_types if isinstance(v, dict)]
|
||||||
|
data.src_decl_types = [CStruct.from_dict(v) for v in data.src_decl_types if isinstance(v, dict)]
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
||||||
def __format_func_body(
|
def __format_func_body(
|
||||||
@@ -46,10 +54,6 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
out_dir.mkdir(parents=True, exist_ok=True)
|
out_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
common_includes: List[CInclude] = [
|
common_includes: List[CInclude] = [
|
||||||
CInclude(
|
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "aliases" / "aliases.h", out_dir)).replace("\\", "/"),
|
|
||||||
local=True,
|
|
||||||
),
|
|
||||||
CInclude(
|
CInclude(
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "primitives" / "mem_allocator" / "mem_allocator.h", out_dir)).replace("\\", "/"),
|
header=str(convert_to_relative(WAPP_SRC_ROOT / "primitives" / "mem_allocator" / "mem_allocator.h", out_dir)).replace("\\", "/"),
|
||||||
local=True,
|
local=True,
|
||||||
@@ -63,6 +67,8 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
common_decl_types: List[CStruct] = []
|
common_decl_types: List[CStruct] = []
|
||||||
|
|
||||||
datatypes: dict[CDataType, ArrayData] = {
|
datatypes: dict[CDataType, ArrayData] = {
|
||||||
|
CType.VOID: ArrayData(array_typename="GenericArray"),
|
||||||
|
"void *": ArrayData(array_typename="VoidPArray"),
|
||||||
"Str8": ArrayData(
|
"Str8": ArrayData(
|
||||||
array_typename="Str8Array",
|
array_typename="Str8Array",
|
||||||
hdr_decl_types=[
|
hdr_decl_types=[
|
||||||
@@ -73,13 +79,10 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
|
|
||||||
for _type in CType:
|
for _type in CType:
|
||||||
if _type == CType.VOID:
|
if _type == CType.VOID:
|
||||||
datatypes["void *"] = ArrayData(
|
|
||||||
array_typename="VoidPArray",
|
|
||||||
)
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
type_title = _type.value.title()
|
type_title = _type.value.title()
|
||||||
datatypes[_type.value] = ArrayData(
|
datatypes[_type] = ArrayData(
|
||||||
array_typename=f"{type_title}Array",
|
array_typename=f"{type_title}Array",
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -100,11 +103,11 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
decl_types=[*common_decl_types],
|
decl_types=[*common_decl_types],
|
||||||
includes=[
|
includes=[
|
||||||
CInclude(header, local=True, same_dir=True),
|
CInclude(header, local=True, same_dir=True),
|
||||||
CInclude(header="stddef.h"),
|
|
||||||
CInclude(
|
CInclude(
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "assert" / "assert.h", out_dir)).replace("\\", "/"),
|
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "assert" / "assert.h", out_dir)).replace("\\", "/"),
|
||||||
local=True
|
local=True
|
||||||
),
|
),
|
||||||
|
CInclude(header="stddef.h"),
|
||||||
],
|
],
|
||||||
internal_funcs=[],
|
internal_funcs=[],
|
||||||
funcs=header.funcs
|
funcs=header.funcs
|
||||||
@@ -133,7 +136,7 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
if isinstance(_type, str) and _type == "void *":
|
if isinstance(_type, CType) and _type == CType.VOID:
|
||||||
alloc_capacity_func = CFunc(
|
alloc_capacity_func = CFunc(
|
||||||
name=f"_array_alloc_capacity",
|
name=f"_array_alloc_capacity",
|
||||||
ret_type=array,
|
ret_type=array,
|
||||||
@@ -152,275 +155,276 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
|
|||||||
pointer=CPointer(CPointerType.SINGLE),
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
)
|
)
|
||||||
generic_funcs.append(alloc_capacity_func)
|
generic_funcs.append(alloc_capacity_func)
|
||||||
|
else:
|
||||||
|
stack_array_cmacro = CMacro(
|
||||||
|
name=f"wapp_{type_string_lower}_array(...)",
|
||||||
|
value=__format_func_body(
|
||||||
|
filename=snippets_dir / "stack_array",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
array_typename=array_data.array_typename,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
stack_array_cppmacro = CMacro(
|
||||||
|
name=f"wapp_{type_string_lower}_array(...)",
|
||||||
|
value=__format_func_body(
|
||||||
|
filename=snippets_dir / "stack_array_cpp",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
array_typename=array_data.array_typename,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
stack_array_cmacro = CMacro(
|
stack_capacity_array_cmacro = CMacro(
|
||||||
name=f"wapp_{type_string_lower}_array(...)",
|
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
||||||
value=__format_func_body(
|
value=__format_func_body(
|
||||||
filename=snippets_dir / "stack_array",
|
filename=snippets_dir / "stack_capacity_array",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
stack_array_cppmacro = CMacro(
|
stack_capacity_array_cppmacro = CMacro(
|
||||||
name=f"wapp_{type_string_lower}_array(...)",
|
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
||||||
value=__format_func_body(
|
value=__format_func_body(
|
||||||
filename=snippets_dir / "stack_array_cpp",
|
filename=snippets_dir / "stack_capacity_array_cpp",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
stack_capacity_array_cmacro = CMacro(
|
alloc_capacity_array_macro = CMacro(
|
||||||
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
name=f"wapp_{type_string_lower}_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY)",
|
||||||
value=__format_func_body(
|
value=__format_func_body(
|
||||||
filename=snippets_dir / "stack_capacity_array",
|
filename=snippets_dir / "alloc_capacity_macro",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
stack_capacity_array_cppmacro = CMacro(
|
|
||||||
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
|
|
||||||
value=__format_func_body(
|
|
||||||
filename=snippets_dir / "stack_capacity_array_cpp",
|
|
||||||
type_string=type_string,
|
|
||||||
type_string_upper=type_string_upper,
|
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
alloc_capacity_array_macro = CMacro(
|
array_pop_cmacro = CMacro(
|
||||||
name=f"wapp_{type_string_lower}_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY)",
|
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
||||||
value=__format_func_body(
|
value=__format_func_body(
|
||||||
filename=snippets_dir / "alloc_capacity_macro",
|
filename=snippets_dir / "array_pop_macro",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
array_pop_cppmacro = CMacro(
|
||||||
|
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
||||||
|
value=__format_func_body(
|
||||||
|
filename=snippets_dir / "array_pop_macro_cpp",
|
||||||
|
type_string=type_string,
|
||||||
|
type_string_upper=type_string_upper,
|
||||||
|
type_string_lower=type_string_lower,
|
||||||
|
array_typename=array_data.array_typename,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
array_pop_cmacro = CMacro(
|
get_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
name=f"wapp_{type_string_lower}_array_get",
|
||||||
value=__format_func_body(
|
ret_type=type_string,
|
||||||
filename=snippets_dir / "array_pop_macro",
|
args=[
|
||||||
type_string=type_string,
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
type_string_upper=type_string_upper,
|
CArg(name="index", _type=CType.U64),
|
||||||
type_string_lower=type_string_lower,
|
],
|
||||||
array_typename=array_data.array_typename,
|
body=__format_func_body(
|
||||||
),
|
filename=snippets_dir / "array_get",
|
||||||
)
|
type_string=type_string,
|
||||||
array_pop_cppmacro = CMacro(
|
type_string_upper=type_string_upper,
|
||||||
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
|
type_string_lower=type_string_lower,
|
||||||
value=__format_func_body(
|
array_typename=array_data.array_typename,
|
||||||
filename=snippets_dir / "array_pop_macro_cpp",
|
),
|
||||||
type_string=type_string,
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
type_string_upper=type_string_upper,
|
)
|
||||||
type_string_lower=type_string_lower,
|
|
||||||
array_typename=array_data.array_typename,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
get_func = CFunc(
|
set_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_get",
|
name=f"wapp_{type_string_lower}_array_set",
|
||||||
ret_type=type_string,
|
ret_type=CType.VOID,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="index", _type=CType.U64),
|
CArg(name="index", _type=CType.U64),
|
||||||
],
|
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
body=__format_func_body(
|
],
|
||||||
filename=snippets_dir / "array_get",
|
body=__format_func_body(
|
||||||
type_string=type_string,
|
filename=snippets_dir / "array_set",
|
||||||
type_string_upper=type_string_upper,
|
type_string=type_string,
|
||||||
type_string_lower=type_string_lower,
|
type_string_upper=type_string_upper,
|
||||||
array_typename=array_data.array_typename,
|
type_string_lower=type_string_lower,
|
||||||
),
|
array_typename=array_data.array_typename,
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
set_func = CFunc(
|
append_capped_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_set",
|
name=f"wapp_{type_string_lower}_array_append_capped",
|
||||||
ret_type=CType.VOID,
|
ret_type=CType.VOID,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="index", _type=CType.U64),
|
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
],
|
||||||
],
|
body=__format_func_body(
|
||||||
body=__format_func_body(
|
filename=snippets_dir / "append_capped",
|
||||||
filename=snippets_dir / "array_set",
|
type_string=type_string,
|
||||||
type_string=type_string,
|
type_string_upper=type_string_upper,
|
||||||
type_string_upper=type_string_upper,
|
type_string_lower=type_string_lower,
|
||||||
type_string_lower=type_string_lower,
|
array_typename=array_data.array_typename,
|
||||||
array_typename=array_data.array_typename,
|
),
|
||||||
),
|
)
|
||||||
)
|
|
||||||
|
|
||||||
append_capped_func = CFunc(
|
extend_capped_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_append_capped",
|
name=f"wapp_{type_string_lower}_array_extend_capped",
|
||||||
ret_type=CType.VOID,
|
ret_type=CType.VOID,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
],
|
],
|
||||||
body=__format_func_body(
|
body=__format_func_body(
|
||||||
filename=snippets_dir / "append_capped",
|
filename=snippets_dir / "extend_capped",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
extend_capped_func = CFunc(
|
clear_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_extend_capped",
|
name=f"wapp_{type_string_lower}_array_clear",
|
||||||
ret_type=CType.VOID,
|
ret_type=CType.VOID,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
],
|
||||||
],
|
body=__format_func_body(
|
||||||
body=__format_func_body(
|
filename=snippets_dir / "clear",
|
||||||
filename=snippets_dir / "extend_capped",
|
type_string=type_string,
|
||||||
type_string=type_string,
|
type_string_upper=type_string_upper,
|
||||||
type_string_upper=type_string_upper,
|
type_string_lower=type_string_lower,
|
||||||
type_string_lower=type_string_lower,
|
array_typename=array_data.array_typename,
|
||||||
array_typename=array_data.array_typename,
|
),
|
||||||
),
|
)
|
||||||
)
|
|
||||||
|
|
||||||
clear_func = CFunc(
|
copy_capped_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_clear",
|
name=f"wapp_{type_string_lower}_array_copy_capped",
|
||||||
ret_type=CType.VOID,
|
ret_type=CType.VOID,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
],
|
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
body=__format_func_body(
|
],
|
||||||
filename=snippets_dir / "clear",
|
body=__format_func_body(
|
||||||
type_string=type_string,
|
filename=snippets_dir / "copy_capped",
|
||||||
type_string_upper=type_string_upper,
|
type_string=type_string,
|
||||||
type_string_lower=type_string_lower,
|
type_string_upper=type_string_upper,
|
||||||
array_typename=array_data.array_typename,
|
type_string_lower=type_string_lower,
|
||||||
),
|
array_typename=array_data.array_typename,
|
||||||
)
|
),
|
||||||
|
)
|
||||||
|
|
||||||
copy_capped_func = CFunc(
|
append_alloc_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_copy_capped",
|
name=f"wapp_{type_string_lower}_array_append_alloc",
|
||||||
ret_type=CType.VOID,
|
ret_type=array,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
],
|
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
body=__format_func_body(
|
],
|
||||||
filename=snippets_dir / "copy_capped",
|
body=__format_func_body(
|
||||||
type_string=type_string,
|
filename=snippets_dir / "append_alloc",
|
||||||
type_string_upper=type_string_upper,
|
type_string=type_string,
|
||||||
type_string_lower=type_string_lower,
|
type_string_upper=type_string_upper,
|
||||||
array_typename=array_data.array_typename,
|
type_string_lower=type_string_lower,
|
||||||
),
|
array_typename=array_data.array_typename,
|
||||||
)
|
),
|
||||||
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
|
)
|
||||||
|
|
||||||
append_alloc_func = CFunc(
|
extend_alloc_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_append_alloc",
|
name=f"wapp_{type_string_lower}_array_extend_alloc",
|
||||||
ret_type=array,
|
ret_type=array,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
],
|
],
|
||||||
body=__format_func_body(
|
body=__format_func_body(
|
||||||
filename=snippets_dir / "append_alloc",
|
filename=snippets_dir / "extend_alloc",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
)
|
)
|
||||||
|
|
||||||
extend_alloc_func = CFunc(
|
copy_alloc_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_extend_alloc",
|
name=f"wapp_{type_string_lower}_array_copy_alloc",
|
||||||
ret_type=array,
|
ret_type=array,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
||||||
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
],
|
],
|
||||||
body=__format_func_body(
|
body=__format_func_body(
|
||||||
filename=snippets_dir / "extend_alloc",
|
filename=snippets_dir / "copy_alloc",
|
||||||
type_string=type_string,
|
type_string=type_string,
|
||||||
type_string_upper=type_string_upper,
|
type_string_upper=type_string_upper,
|
||||||
type_string_lower=type_string_lower,
|
type_string_lower=type_string_lower,
|
||||||
array_typename=array_data.array_typename,
|
array_typename=array_data.array_typename,
|
||||||
),
|
),
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
)
|
)
|
||||||
|
|
||||||
copy_alloc_func = CFunc(
|
pop_func = CFunc(
|
||||||
name=f"wapp_{type_string_lower}_array_copy_alloc",
|
name=f"_{type_string_lower}_array_pop",
|
||||||
ret_type=array,
|
ret_type=type_string,
|
||||||
args=[
|
args=[
|
||||||
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
||||||
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
|
],
|
||||||
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
body=__format_func_body(
|
||||||
],
|
filename=snippets_dir / "array_pop",
|
||||||
body=__format_func_body(
|
type_string=type_string,
|
||||||
filename=snippets_dir / "copy_alloc",
|
type_string_upper=type_string_upper,
|
||||||
type_string=type_string,
|
type_string_lower=type_string_lower,
|
||||||
type_string_upper=type_string_upper,
|
array_typename=array_data.array_typename,
|
||||||
type_string_lower=type_string_lower,
|
),
|
||||||
array_typename=array_data.array_typename,
|
pointer=CPointer(CPointerType.SINGLE),
|
||||||
),
|
)
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
|
||||||
)
|
|
||||||
|
|
||||||
pop_func = CFunc(
|
header.macros.extend([
|
||||||
name=f"_{type_string_lower}_array_pop",
|
alloc_capacity_array_macro,
|
||||||
ret_type=type_string,
|
])
|
||||||
args=[
|
header.c_macros.extend([
|
||||||
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
|
stack_array_cmacro,
|
||||||
],
|
stack_capacity_array_cmacro,
|
||||||
body=__format_func_body(
|
array_pop_cmacro,
|
||||||
filename=snippets_dir / "array_pop",
|
])
|
||||||
type_string=type_string,
|
header.cpp_macros.extend([
|
||||||
type_string_upper=type_string_upper,
|
stack_array_cppmacro,
|
||||||
type_string_lower=type_string_lower,
|
stack_capacity_array_cppmacro,
|
||||||
array_typename=array_data.array_typename,
|
array_pop_cppmacro,
|
||||||
),
|
])
|
||||||
pointer=CPointer(CPointerType.SINGLE),
|
header.funcs.extend([
|
||||||
)
|
get_func,
|
||||||
|
set_func,
|
||||||
|
append_capped_func,
|
||||||
|
extend_capped_func,
|
||||||
|
clear_func,
|
||||||
|
copy_capped_func,
|
||||||
|
append_alloc_func,
|
||||||
|
extend_alloc_func,
|
||||||
|
copy_alloc_func,
|
||||||
|
pop_func,
|
||||||
|
])
|
||||||
|
|
||||||
header.decl_types.extend(array_data.hdr_decl_types)
|
header.decl_types.extend(array_data.hdr_decl_types)
|
||||||
header.macros.extend([
|
|
||||||
alloc_capacity_array_macro,
|
|
||||||
])
|
|
||||||
header.c_macros.extend([
|
|
||||||
stack_array_cmacro,
|
|
||||||
stack_capacity_array_cmacro,
|
|
||||||
array_pop_cmacro,
|
|
||||||
])
|
|
||||||
header.cpp_macros.extend([
|
|
||||||
stack_array_cppmacro,
|
|
||||||
stack_capacity_array_cppmacro,
|
|
||||||
array_pop_cppmacro,
|
|
||||||
])
|
|
||||||
header.types.extend([array])
|
header.types.extend([array])
|
||||||
header.funcs.extend([
|
|
||||||
get_func,
|
|
||||||
set_func,
|
|
||||||
append_capped_func,
|
|
||||||
extend_capped_func,
|
|
||||||
clear_func,
|
|
||||||
copy_capped_func,
|
|
||||||
append_alloc_func,
|
|
||||||
extend_alloc_func,
|
|
||||||
copy_alloc_func,
|
|
||||||
pop_func,
|
|
||||||
])
|
|
||||||
|
|
||||||
source.decl_types.extend(array_data.src_decl_types)
|
source.decl_types.extend(array_data.src_decl_types)
|
||||||
source.funcs = header.funcs
|
source.funcs = header.funcs
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
wapp_debug_assert(allocator != NULL, "`array` should not be NULL");
|
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL");
|
||||||
|
|
||||||
u64 allocation_size = sizeof({ArrayType}) + item_size * capacity;
|
u64 allocation_size = sizeof({ArrayType}) + item_size * capacity;
|
||||||
{ArrayType} *array = wapp_mem_allocator_alloc(allocator, allocation_size);
|
{ArrayType} *array = wapp_mem_allocator_alloc(allocator, allocation_size);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
([&]() {{ \
|
([&]() {{ \
|
||||||
persistent {T} buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2)] = {{__VA_ARGS__}}; \
|
wapp_persist {T} buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count({T}, __VA_ARGS__) * 2)] = {{__VA_ARGS__}}; \
|
||||||
return {ArrayType}{{ \
|
return {ArrayType}{{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count({T}, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count({T}, __VA_ARGS__), \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
([&]() {{ \
|
([&]() {{ \
|
||||||
persistent {T} buf[CAPACITY] = {{}}; \
|
wapp_persist {T} buf[CAPACITY] = {{}}; \
|
||||||
return {ArrayType}{{buf, 0, CAPACITY, sizeof({T})}}; \
|
return {ArrayType}{{buf, 0, CAPACITY, sizeof({T})}}; \
|
||||||
}}())
|
}}())
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Paths
|
||||||
PACKAGE_DIR = Path(__file__).parent.resolve()
|
PACKAGE_DIR = Path(__file__).parent.resolve()
|
||||||
WAPP_SRC_ROOT = PACKAGE_DIR.parent / "src"
|
WAPP_REPO_ROOT = PACKAGE_DIR.parent
|
||||||
|
WAPP_SRC_ROOT = WAPP_REPO_ROOT / "src"
|
||||||
|
|
||||||
|
# Dictionary Keys
|
||||||
|
DBL_LIST_DATA = "dbl_list_data"
|
||||||
|
ARRAY_DATA = "array_data"
|
||||||
|
|||||||
@@ -1,11 +1,69 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional, Union, List
|
from typing import Optional, Union, List, Dict, Type, Any, TypeVar, cast
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, asdict, field, fields
|
||||||
|
|
||||||
from codegen.constants import WAPP_SRC_ROOT
|
from codegen.constants import WAPP_SRC_ROOT
|
||||||
from codegen.utils import convert_to_relative
|
from codegen.utils import convert_to_relative
|
||||||
|
|
||||||
|
E = TypeVar("E", bound="Enum")
|
||||||
|
S = TypeVar("S", bound="SerialisableDataclass")
|
||||||
|
F = TypeVar("F", bound="CFile")
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SerialisableDataclass:
|
||||||
|
def to_dict(self) -> Dict[str, Any]:
|
||||||
|
d = asdict(self)
|
||||||
|
for f in fields(self):
|
||||||
|
member = getattr(self, f.name)
|
||||||
|
|
||||||
|
if isinstance(member, list):
|
||||||
|
d[f.name] = [self.__serialise_member(i) for i in member]
|
||||||
|
else:
|
||||||
|
d[f.name] = self.__serialise_member(member)
|
||||||
|
|
||||||
|
return d
|
||||||
|
|
||||||
|
def __serialise_member(self, member: Any) -> Any:
|
||||||
|
if isinstance(member, Enum):
|
||||||
|
return member.value
|
||||||
|
elif isinstance(member, SerialisableDataclass):
|
||||||
|
return member.to_dict()
|
||||||
|
|
||||||
|
return member
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def to_enum_value(value: Any, _type: Type[E]) -> "E":
|
||||||
|
if isinstance(value, _type):
|
||||||
|
return value
|
||||||
|
|
||||||
|
return _type(value)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def to_c_usertype(value: dict[str, Any]) -> "CUserType":
|
||||||
|
try:
|
||||||
|
output = CStruct.from_dict(value)
|
||||||
|
except TypeError:
|
||||||
|
output = CEnum.from_dict(value)
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def to_cdatatype(value: Any) -> "CDataType":
|
||||||
|
if isinstance(value, dict):
|
||||||
|
output = SerialisableDataclass.to_c_usertype(value)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
output = CType(value)
|
||||||
|
except ValueError:
|
||||||
|
output = value
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type[S], d: Dict[str, Any]) -> "S":
|
||||||
|
return cls(**d)
|
||||||
|
|
||||||
|
|
||||||
class CType(Enum):
|
class CType(Enum):
|
||||||
VOID = "void"
|
VOID = "void"
|
||||||
@@ -35,9 +93,9 @@ class CType(Enum):
|
|||||||
class CQualifier(Enum):
|
class CQualifier(Enum):
|
||||||
NONE = ""
|
NONE = ""
|
||||||
CONST = "const "
|
CONST = "const "
|
||||||
EXTERNAL = "external "
|
EXTERNAL = "wapp_extern "
|
||||||
INTERNAL = "internal "
|
INTERNAL = "wapp_intern "
|
||||||
PERSISTENT = "persistent "
|
PERSISTENT = "wapp_persist "
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.value
|
return self.value
|
||||||
@@ -53,16 +111,23 @@ class CPointerType(Enum):
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CPointer:
|
class CPointer(SerialisableDataclass):
|
||||||
_type: CPointerType = CPointerType.NONE
|
_type: CPointerType = CPointerType.NONE
|
||||||
qualifier: CQualifier = CQualifier.NONE
|
qualifier: CQualifier = CQualifier.NONE
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return str(self._type) + str(self.qualifier)
|
return str(self._type) + str(self.qualifier)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CPointer"], d: Dict[str, Any]) -> "CPointer":
|
||||||
|
ptr = CPointer(**d)
|
||||||
|
ptr._type = CPointer.to_enum_value(ptr._type, CPointerType)
|
||||||
|
ptr.qualifier = CPointer.to_enum_value(ptr.qualifier, CQualifier)
|
||||||
|
return ptr
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CEnumVal:
|
class CEnumVal(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
value: Optional[int] = None
|
value: Optional[int] = None
|
||||||
|
|
||||||
@@ -71,7 +136,7 @@ class CEnumVal:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CEnum:
|
class CEnum(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
values: List[CEnumVal]
|
values: List[CEnumVal]
|
||||||
typedef: bool = False
|
typedef: bool = False
|
||||||
@@ -90,9 +155,15 @@ class CEnum:
|
|||||||
|
|
||||||
return header + values + footer
|
return header + values + footer
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CEnum"], d: Dict[str, Any]) -> "CEnum":
|
||||||
|
e = CEnum(**d)
|
||||||
|
e.values = [CEnumVal.from_dict(v) for v in e.values if isinstance(v, dict)]
|
||||||
|
return e
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CMacro:
|
class CMacro(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
value: str
|
value: str
|
||||||
|
|
||||||
@@ -101,7 +172,7 @@ class CMacro:
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CStruct:
|
class CStruct(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
cargs: List["CArg"]
|
cargs: List["CArg"]
|
||||||
typedef_name: Optional[str] = None
|
typedef_name: Optional[str] = None
|
||||||
@@ -122,13 +193,19 @@ class CStruct:
|
|||||||
|
|
||||||
return definition + args + footer;
|
return definition + args + footer;
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CStruct"], d: Dict[str, Any]) -> "CStruct":
|
||||||
|
s = CStruct(**d)
|
||||||
|
s.cargs = [CArg.from_dict(v) for v in s.cargs if isinstance(v, dict)]
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
CUserType = Union[CStruct, CEnum]
|
CUserType = Union[CStruct, CEnum]
|
||||||
CDataType = Union[CType, CUserType, str]
|
CDataType = Union[CType, CUserType, str]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CArg:
|
class CArg(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
_type: CDataType
|
_type: CDataType
|
||||||
array: bool = False
|
array: bool = False
|
||||||
@@ -143,9 +220,21 @@ class CArg:
|
|||||||
|
|
||||||
return qualifier + _type + pointer + self.name + array
|
return qualifier + _type + pointer + self.name + array
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CArg"], d: Dict[str, Any]) -> "CArg":
|
||||||
|
arg = CArg(**d)
|
||||||
|
arg._type = CArg.to_cdatatype(arg._type)
|
||||||
|
|
||||||
|
if isinstance(arg.pointer, dict):
|
||||||
|
arg.pointer = CPointer.from_dict(arg.pointer)
|
||||||
|
|
||||||
|
arg.qualifier = CArg.to_enum_value(arg.qualifier, CQualifier)
|
||||||
|
|
||||||
|
return arg
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CFunc:
|
class CFunc(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
ret_type: CDataType
|
ret_type: CDataType
|
||||||
args: List[CArg]
|
args: List[CArg]
|
||||||
@@ -176,9 +265,21 @@ class CFunc:
|
|||||||
def define(self) -> str:
|
def define(self) -> str:
|
||||||
return f"{str(self)} {{\n{self.body}\n}}\n\n"
|
return f"{str(self)} {{\n{self.body}\n}}\n\n"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CFunc"], d: Dict[str, Any]) -> "CFunc":
|
||||||
|
f = CFunc(**d)
|
||||||
|
f.ret_type = CFunc.to_cdatatype(f.ret_type)
|
||||||
|
f.args = [CArg.from_dict(v) for v in f.args if isinstance(v, dict)]
|
||||||
|
f.qualifiers = [CFunc.to_enum_value(v, CQualifier) for v in f.qualifiers]
|
||||||
|
|
||||||
|
if isinstance(f.pointer, dict):
|
||||||
|
f.pointer = CPointer.from_dict(f.pointer)
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CInclude:
|
class CInclude(SerialisableDataclass):
|
||||||
header: Union[str, "CHeader"]
|
header: Union[str, "CHeader"]
|
||||||
local: bool = False
|
local: bool = False
|
||||||
same_dir: bool = False
|
same_dir: bool = False
|
||||||
@@ -201,9 +302,18 @@ class CInclude:
|
|||||||
|
|
||||||
return f"#include {open_symbol}{name}{close_symbol}\n"
|
return f"#include {open_symbol}{name}{close_symbol}\n"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CInclude"], d: Dict[str, Any]) -> "CInclude":
|
||||||
|
inc = CInclude(**d)
|
||||||
|
|
||||||
|
if isinstance(inc.header, dict):
|
||||||
|
inc.header = CHeader.from_dict(inc.header)
|
||||||
|
|
||||||
|
return inc
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CFile:
|
class CFile(SerialisableDataclass):
|
||||||
name: str
|
name: str
|
||||||
extension: str
|
extension: str
|
||||||
includes: List[CInclude] = field(default_factory=list)
|
includes: List[CInclude] = field(default_factory=list)
|
||||||
@@ -234,11 +344,27 @@ class CFile:
|
|||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return """\
|
return """\
|
||||||
/**
|
/**
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CFile"], d: Dict[str, Any]) -> "CFile":
|
||||||
|
f = CFile(**d)
|
||||||
|
f.deserialise_c_file_data()
|
||||||
|
|
||||||
|
return f
|
||||||
|
|
||||||
|
def deserialise_c_file_data(self) -> None:
|
||||||
|
self.includes = [CInclude.from_dict(v) for v in self.includes if isinstance(v, dict)]
|
||||||
|
self.types = [CFile.to_c_usertype(v) for v in self.types if isinstance(v, dict)]
|
||||||
|
self.funcs = [CFunc.from_dict(v) for v in self.funcs if isinstance(v, dict)]
|
||||||
|
self.decl_types = [CStruct.from_dict(v) for v in self.decl_types if isinstance(v, dict)]
|
||||||
|
self.macros = [CMacro.from_dict(v) for v in self.macros if isinstance(v, dict)]
|
||||||
|
self.c_macros = [CMacro.from_dict(v) for v in self.c_macros if isinstance(v, dict)]
|
||||||
|
self.cpp_macros = [CMacro.from_dict(v) for v in self.cpp_macros if isinstance(v, dict)]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CHeader(CFile):
|
class CHeader(CFile):
|
||||||
@@ -297,6 +423,10 @@ class CHeader(CFile):
|
|||||||
header_guard_close
|
header_guard_close
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CHeader"], d: Dict[str, Any]) -> "CHeader":
|
||||||
|
return cast("CHeader", super().from_dict(d))
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CSource(CFile):
|
class CSource(CFile):
|
||||||
@@ -346,6 +476,13 @@ class CSource(CFile):
|
|||||||
internal_funcs_def
|
internal_funcs_def
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["CSource"], d: Dict[str, Any]) -> "CSource":
|
||||||
|
s = CSource(**d)
|
||||||
|
s.deserialise_c_file_data()
|
||||||
|
s.internal_funcs = [CFunc.from_dict(v) for v in s.funcs if isinstance(v, dict)]
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
def get_datatype_string(_type: CDataType) -> str:
|
def get_datatype_string(_type: CDataType) -> str:
|
||||||
if isinstance(_type, CType):
|
if isinstance(_type, CType):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from typing import List, Dict
|
from typing import List, Dict, Any, Type
|
||||||
from codegen.constants import WAPP_SRC_ROOT
|
from codegen.constants import WAPP_SRC_ROOT
|
||||||
from codegen.utils import load_func_body_from_file, convert_to_relative
|
from codegen.utils import load_func_body_from_file, convert_to_relative
|
||||||
from codegen.datatypes import (
|
from codegen.datatypes import (
|
||||||
@@ -16,17 +16,25 @@ from codegen.datatypes import (
|
|||||||
CPointerType,
|
CPointerType,
|
||||||
CQualifier,
|
CQualifier,
|
||||||
CInclude,
|
CInclude,
|
||||||
|
SerialisableDataclass,
|
||||||
get_datatype_string,
|
get_datatype_string,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class DblListData:
|
class DblListData(SerialisableDataclass):
|
||||||
node_typename: str
|
node_typename: str
|
||||||
list_typename: str
|
list_typename: str
|
||||||
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
hdr_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
src_decl_types: List[CStruct] = field(default_factory=list)
|
src_decl_types: List[CStruct] = field(default_factory=list)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls: Type["DblListData"], d: Dict[str, Any]) -> "DblListData":
|
||||||
|
data = DblListData(**d)
|
||||||
|
data.hdr_decl_types = [CStruct.from_dict(v) for v in data.hdr_decl_types if isinstance(v, dict)]
|
||||||
|
data.src_decl_types = [CStruct.from_dict(v) for v in data.src_decl_types if isinstance(v, dict)]
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
||||||
def __format_func_body(
|
def __format_func_body(
|
||||||
@@ -48,16 +56,11 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
out_dir = WAPP_SRC_ROOT / "primitives" / "dbl_list"
|
out_dir = WAPP_SRC_ROOT / "primitives" / "dbl_list"
|
||||||
out_dir.mkdir(parents=True, exist_ok=True)
|
out_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
common_includes: List[CInclude] = [
|
|
||||||
CInclude(
|
|
||||||
header=str(convert_to_relative(WAPP_SRC_ROOT / "common" / "aliases" / "aliases.h", out_dir)).replace("\\", "/"),
|
|
||||||
local=True,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
common_decl_types: List[CStruct] = []
|
common_decl_types: List[CStruct] = []
|
||||||
|
|
||||||
datatypes: dict[CDataType, DblListData] = {
|
datatypes: dict[CDataType, DblListData] = {
|
||||||
|
CType.VOID: DblListData(node_typename="GenericNode", list_typename="GenericList"),
|
||||||
|
"void *": DblListData(node_typename="VoidPNode", list_typename="VoidPList"),
|
||||||
"Str8": DblListData(
|
"Str8": DblListData(
|
||||||
node_typename="Str8Node",
|
node_typename="Str8Node",
|
||||||
list_typename="Str8List",
|
list_typename="Str8List",
|
||||||
@@ -69,14 +72,10 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
|
|
||||||
for _type in CType:
|
for _type in CType:
|
||||||
if _type == CType.VOID:
|
if _type == CType.VOID:
|
||||||
datatypes["void *"] = DblListData(
|
|
||||||
node_typename="VoidPNode",
|
|
||||||
list_typename="VoidPList",
|
|
||||||
)
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
type_title = _type.value.title()
|
type_title = _type.value.title()
|
||||||
datatypes[_type.value] = DblListData(
|
datatypes[_type] = DblListData(
|
||||||
node_typename=f"{type_title}Node",
|
node_typename=f"{type_title}Node",
|
||||||
list_typename=f"{type_title}List",
|
list_typename=f"{type_title}List",
|
||||||
)
|
)
|
||||||
@@ -103,16 +102,11 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
local=True
|
local=True
|
||||||
),
|
),
|
||||||
CInclude(header="stddef.h"),
|
CInclude(header="stddef.h"),
|
||||||
CInclude(header="assert.h"),
|
|
||||||
],
|
],
|
||||||
internal_funcs=[],
|
internal_funcs=[],
|
||||||
funcs=header.funcs
|
funcs=header.funcs
|
||||||
)
|
)
|
||||||
|
|
||||||
if len(common_includes) > 0:
|
|
||||||
header.includes.extend(common_includes)
|
|
||||||
source.includes.extend(common_includes)
|
|
||||||
|
|
||||||
for _type, dbl_list_data in datatypes.items():
|
for _type, dbl_list_data in datatypes.items():
|
||||||
type_string = get_datatype_string(_type)
|
type_string = get_datatype_string(_type)
|
||||||
clean_type_string = type_string.replace(" ", "").replace("*", "_ptr")
|
clean_type_string = type_string.replace(" ", "").replace("*", "_ptr")
|
||||||
@@ -139,6 +133,13 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
header.types.extend([node, dl_list])
|
||||||
|
header.decl_types.extend(dbl_list_data.hdr_decl_types)
|
||||||
|
source.decl_types.extend(dbl_list_data.src_decl_types)
|
||||||
|
if isinstance(_type, CType) and _type == CType.VOID:
|
||||||
|
# Don't define any functions for the generic node and list
|
||||||
|
continue
|
||||||
|
|
||||||
node_cmacro = CMacro(
|
node_cmacro = CMacro(
|
||||||
name=f"wapp_{type_string_lower}_list_node(ITEM_PTR)",
|
name=f"wapp_{type_string_lower}_list_node(ITEM_PTR)",
|
||||||
value=__format_func_body(
|
value=__format_func_body(
|
||||||
@@ -318,10 +319,8 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
qualifiers=[CQualifier.INTERNAL],
|
qualifiers=[CQualifier.INTERNAL],
|
||||||
)
|
)
|
||||||
|
|
||||||
header.decl_types.extend(dbl_list_data.hdr_decl_types)
|
|
||||||
header.c_macros.append(node_cmacro)
|
header.c_macros.append(node_cmacro)
|
||||||
header.cpp_macros.append(node_cppmacro)
|
header.cpp_macros.append(node_cppmacro)
|
||||||
header.types.extend([node, dl_list])
|
|
||||||
header.funcs.extend([
|
header.funcs.extend([
|
||||||
get_func,
|
get_func,
|
||||||
push_front_func,
|
push_front_func,
|
||||||
@@ -333,7 +332,6 @@ def make_dbl_list(user_datatypes: Dict[CDataType, DblListData] = {}):
|
|||||||
empty_func,
|
empty_func,
|
||||||
])
|
])
|
||||||
|
|
||||||
source.decl_types.extend(dbl_list_data.src_decl_types)
|
|
||||||
source.internal_funcs.append(node_to_list_func)
|
source.internal_funcs.append(node_to_list_func)
|
||||||
source.funcs = header.funcs
|
source.funcs = header.funcs
|
||||||
|
|
||||||
|
|||||||
29
codegen_custom_data_example.json
Normal file
29
codegen_custom_data_example.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"dbl_list_data": {
|
||||||
|
"CustomType": {
|
||||||
|
"node_typename": "CustomTypeNode",
|
||||||
|
"list_typename": "CustomTypeList",
|
||||||
|
"hdr_decl_types": [
|
||||||
|
{
|
||||||
|
"name": "custom_type",
|
||||||
|
"cargs": [],
|
||||||
|
"typedef_name": "CustomType"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src_decl_types": []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"array_data": {
|
||||||
|
"CustomType": {
|
||||||
|
"array_typename": "CustomTypeArray",
|
||||||
|
"hdr_decl_types": [
|
||||||
|
{
|
||||||
|
"name": "custom_type",
|
||||||
|
"cargs": [],
|
||||||
|
"typedef_name": "CustomType"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src_decl_types": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
scripts/header_install.sh
Normal file
21
scripts/header_install.sh
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(dirname $0)"
|
||||||
|
LIB_SRC="$1"
|
||||||
|
INSTALL_PREFIX="$2"
|
||||||
|
shift 2
|
||||||
|
INCLUDES="$@"
|
||||||
|
|
||||||
|
mkdir -p "$INSTALL_PREFIX"
|
||||||
|
|
||||||
|
BASE_INCLUDE_DIR="$(dirname "$LIB_SRC")"
|
||||||
|
find $BASE_INCLUDE_DIR -maxdepth 1 -type f -name "*.h" -exec cp -v {} "$INSTALL_PREFIX" \;
|
||||||
|
|
||||||
|
cd "$SCRIPT_DIR/../src"
|
||||||
|
for INCLUDE in $INCLUDES; do
|
||||||
|
for f in $(find "$INCLUDE" -type f -name "*.h"); do
|
||||||
|
DST="$INSTALL_PREFIX/$(dirname $f)"
|
||||||
|
mkdir -p "$DST"
|
||||||
|
cp -v "$f" "$DST"
|
||||||
|
done
|
||||||
|
done
|
||||||
@@ -54,12 +54,12 @@
|
|||||||
#define uptr uintptr_t
|
#define uptr uintptr_t
|
||||||
#define iptr intptr_t
|
#define iptr intptr_t
|
||||||
|
|
||||||
#define external extern
|
#define wapp_extern extern
|
||||||
#define internal static
|
#define wapp_intern static
|
||||||
#define persistent static
|
#define wapp_persist static
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
#define class_mem static
|
#define wapp_class_mem static
|
||||||
#define BEGIN_C_LINKAGE extern "C" {
|
#define BEGIN_C_LINKAGE extern "C" {
|
||||||
#define END_C_LINKAGE }
|
#define END_C_LINKAGE }
|
||||||
#endif // WAPP_PLATFORM_CPP
|
#endif // WAPP_PLATFORM_CPP
|
||||||
|
|||||||
103
src/core/file/file.c
Normal file
103
src/core/file/file.c
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#include "file.h"
|
||||||
|
#include "../os/cpath/cpath.h"
|
||||||
|
#include "../../common/assert/assert.h"
|
||||||
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../primitives/array/array.h"
|
||||||
|
#include "../../primitives/strings/str8/str8.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
File *wapp_file_open(Str8RO *filepath, FileAccessMode mode) {
|
||||||
|
wapp_persist const char *modes[FILE_ACCESS_MODE_COUNT] = {
|
||||||
|
[WAPP_FA_MODE_R] = "r",
|
||||||
|
[WAPP_FA_MODE_W] = "w",
|
||||||
|
[WAPP_FA_MODE_A] = "a",
|
||||||
|
[WAPP_FA_MODE_R_EX] = "r+",
|
||||||
|
[WAPP_FA_MODE_W_EX] = "w+",
|
||||||
|
[WAPP_FA_MODE_A_EX] = "a+",
|
||||||
|
[WAPP_FA_MODE_RB] = "rb",
|
||||||
|
[WAPP_FA_MODE_WB] = "wb",
|
||||||
|
[WAPP_FA_MODE_AB] = "ab",
|
||||||
|
[WAPP_FA_MODE_RB_EX] = "rb+",
|
||||||
|
[WAPP_FA_MODE_WB_EX] = "wb+",
|
||||||
|
[WAPP_FA_MODE_AB_EX] = "ab+",
|
||||||
|
[WAPP_FA_MODE_WX] = "wx",
|
||||||
|
[WAPP_FA_MODE_WX_EX] = "wx+",
|
||||||
|
[WAPP_FA_MODE_WBX] = "wbx",
|
||||||
|
[WAPP_FA_MODE_WBX_EX] = "wbx+",
|
||||||
|
};
|
||||||
|
wapp_persist c8 tmp[WAPP_PATH_MAX] = {0};
|
||||||
|
wapp_debug_assert(filepath->size < WAPP_PATH_MAX, "`filepath` exceeds max path limit.");
|
||||||
|
|
||||||
|
memset(tmp, 0, WAPP_PATH_MAX);
|
||||||
|
memcpy(tmp, filepath->buf, filepath->size);
|
||||||
|
|
||||||
|
return fopen((const char *)tmp, modes[mode]);
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 wapp_file_get_current_position(File *file) {
|
||||||
|
wapp_debug_assert(file != NULL, "`file` should not be NULL.");
|
||||||
|
return (u64)ftell(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 wapp_file_seek(File *file, u64 offset, FileSeekOrigin origin) {
|
||||||
|
wapp_debug_assert(file != NULL, "`file` should not be NULL.");
|
||||||
|
return fseek(file, offset, origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 wapp_file_get_length(File *file) {
|
||||||
|
wapp_debug_assert(file != NULL, "`file` should not be NULL.");
|
||||||
|
|
||||||
|
u64 current = wapp_file_get_current_position(file);
|
||||||
|
|
||||||
|
wapp_file_seek(file, 0, WAPP_SEEK_END);
|
||||||
|
|
||||||
|
u64 output = ftell(file);
|
||||||
|
|
||||||
|
// Restore position
|
||||||
|
wapp_file_seek(file, current, WAPP_SEEK_START);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 wapp_file_read(GenericArray *dst, File *file, u64 item_count) {
|
||||||
|
wapp_debug_assert(dst != NULL && dst->items != NULL && file != NULL,
|
||||||
|
"`dst`, `dst->items` and `file` should not be NULL.");
|
||||||
|
|
||||||
|
u64 file_length = wapp_file_get_length(file);
|
||||||
|
u64 dst_byte_capacity = dst->item_size * dst->capacity;
|
||||||
|
u64 req_byte_count = item_count * dst->item_size;
|
||||||
|
u64 copy_byte_count = 0;
|
||||||
|
|
||||||
|
if (req_byte_count <= file_length && req_byte_count <= dst_byte_capacity) {
|
||||||
|
copy_byte_count = req_byte_count;
|
||||||
|
} else {
|
||||||
|
copy_byte_count = file_length <= dst_byte_capacity ? file_length : dst_byte_capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst->count = fread(dst->items, sizeof(u8), copy_byte_count, file) / dst->item_size;
|
||||||
|
|
||||||
|
return dst->count;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 wapp_file_write(const GenericArray *src, File *file, u64 item_count) {
|
||||||
|
wapp_debug_assert(src != NULL && src->items != NULL && file != NULL,
|
||||||
|
"`src`, `src->items` and `file` should not be NULL.");
|
||||||
|
|
||||||
|
u64 src_byte_count = src->count * src->item_size;
|
||||||
|
u64 req_byte_count = item_count * src->item_size;
|
||||||
|
u64 to_copy = req_byte_count <= src_byte_count ? req_byte_count : src_byte_count;
|
||||||
|
|
||||||
|
return fwrite(src->items, sizeof(u8), to_copy, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 wapp_file_flush(File *file) {
|
||||||
|
wapp_debug_assert(file != NULL, "`file` should not be NULL.");
|
||||||
|
return fflush(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
i32 wapp_file_close(File *file) {
|
||||||
|
wapp_debug_assert(file != NULL, "`file` should not be NULL.");
|
||||||
|
return fclose(file);
|
||||||
|
}
|
||||||
72
src/core/file/file.h
Normal file
72
src/core/file/file.h
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#ifndef FILE_H
|
||||||
|
#define FILE_H
|
||||||
|
|
||||||
|
#include "../../common/aliases/aliases.h"
|
||||||
|
#include "../../primitives/array/array.h"
|
||||||
|
#include "../../primitives/strings/str8/str8.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
BEGIN_C_LINKAGE
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
#define wapp_file_item_to_array(ITEM) (GenericArray{&(ITEM), 1, 1, sizeof(ITEM)})
|
||||||
|
#define wapp_file_array_to_item(TYPE, ARRAY) (sizeof(TYPE) == (ARRAY).item_size && (ARRAY).count == 1 ? \
|
||||||
|
*((TYPE *)((ARRAY).items)) : \
|
||||||
|
TYPE{})
|
||||||
|
#else
|
||||||
|
#define wapp_file_item_to_array(ITEM) ((GenericArray){.items = &(ITEM), \
|
||||||
|
.count = 1, \
|
||||||
|
.capacity = 1, \
|
||||||
|
.item_size = sizeof(ITEM)})
|
||||||
|
#define wapp_file_array_to_item(TYPE, ARRAY) (sizeof(TYPE) == (ARRAY).item_size && (ARRAY).count == 1 ? \
|
||||||
|
*((TYPE *)((ARRAY).items)) : \
|
||||||
|
(TYPE){0})
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
typedef FILE File;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WAPP_FA_MODE_R, // Equivalent to r
|
||||||
|
WAPP_FA_MODE_W, // Equivalent to w
|
||||||
|
WAPP_FA_MODE_A, // Equivalent to a
|
||||||
|
WAPP_FA_MODE_R_EX, // Equivalent to r+
|
||||||
|
WAPP_FA_MODE_W_EX, // Equivalent to w+
|
||||||
|
WAPP_FA_MODE_A_EX, // Equivalent to a+
|
||||||
|
WAPP_FA_MODE_RB, // Equivalent to rb
|
||||||
|
WAPP_FA_MODE_WB, // Equivalent to wb
|
||||||
|
WAPP_FA_MODE_AB, // Equivalent to ab
|
||||||
|
WAPP_FA_MODE_RB_EX, // Equivalent to rb+
|
||||||
|
WAPP_FA_MODE_WB_EX, // Equivalent to wb+
|
||||||
|
WAPP_FA_MODE_AB_EX, // Equivalent to ab+
|
||||||
|
WAPP_FA_MODE_WX, // Equivalent to wx
|
||||||
|
WAPP_FA_MODE_WX_EX, // Equivalent to wx+
|
||||||
|
WAPP_FA_MODE_WBX, // Equivalent to wbx
|
||||||
|
WAPP_FA_MODE_WBX_EX, // Equivalent to wbx+
|
||||||
|
|
||||||
|
FILE_ACCESS_MODE_COUNT,
|
||||||
|
} FileAccessMode;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
WAPP_SEEK_START = SEEK_SET,
|
||||||
|
WAPP_SEEK_CURRENT = SEEK_CUR,
|
||||||
|
WAPP_SEEK_END = SEEK_END,
|
||||||
|
} FileSeekOrigin;
|
||||||
|
|
||||||
|
File *wapp_file_open(Str8RO *filename, FileAccessMode mode);
|
||||||
|
u64 wapp_file_get_current_position(File *file);
|
||||||
|
i32 wapp_file_seek(File *file, u64 offset, FileSeekOrigin origin);
|
||||||
|
u64 wapp_file_get_length(File *file);
|
||||||
|
u64 wapp_file_read(GenericArray *dst, File *file, u64 item_count);
|
||||||
|
u64 wapp_file_write(const GenericArray *src, File *file, u64 item_count);
|
||||||
|
i32 wapp_file_flush(File *file);
|
||||||
|
i32 wapp_file_close(File *file);
|
||||||
|
|
||||||
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
|
END_C_LINKAGE
|
||||||
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
|
#endif // !FILE_H
|
||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "../../../common/assert/assert.h"
|
#include "../../../common/assert/assert.h"
|
||||||
#include "../../../common/misc/misc_utils.h"
|
#include "../../../common/misc/misc_utils.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -22,14 +21,14 @@ struct arena {
|
|||||||
u8 *buf;
|
u8 *buf;
|
||||||
u8 *offset;
|
u8 *offset;
|
||||||
u64 capacity;
|
u64 capacity;
|
||||||
bool committed;
|
b32 committed;
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
wapp_misc_utils_padding_size(sizeof(u8 *) * 2 + sizeof(u64) + sizeof(bool));
|
wapp_misc_utils_padding_size(sizeof(u8 *) * 2 + sizeof(u64) + sizeof(b32));
|
||||||
#endif // ifdef WAPP_PLATFORM_WINDOWS
|
#endif // ifdef WAPP_PLATFORM_WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, bool zero_buffer) {
|
b32 wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, b32 zero_buffer) {
|
||||||
if (!arena || *arena || base_capacity == 0) {
|
if (!arena || *arena || base_capacity == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
@@ -28,7 +27,7 @@ typedef struct arena Arena;
|
|||||||
* control over how the Arena is initialised. Wrapper macros are provided for
|
* control over how the Arena is initialised. Wrapper macros are provided for
|
||||||
* easier use.
|
* easier use.
|
||||||
*/
|
*/
|
||||||
bool wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, bool zero_buffer);
|
b32 wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, b32 zero_buffer);
|
||||||
void *wapp_mem_arena_alloc(Arena *arena, u64 size);
|
void *wapp_mem_arena_alloc(Arena *arena, u64 size);
|
||||||
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment);
|
void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment);
|
||||||
void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size);
|
void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size);
|
||||||
|
|||||||
@@ -5,16 +5,16 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
|
|
||||||
internal inline void *mem_arena_alloc(u64 size, void *alloc_obj);
|
wapp_intern inline void *mem_arena_alloc(u64 size, void *alloc_obj);
|
||||||
internal inline void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj);
|
wapp_intern inline void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj);
|
||||||
internal inline void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
|
wapp_intern inline void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
|
||||||
internal inline void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
wapp_intern inline void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
||||||
void *alloc_obj);
|
void *alloc_obj);
|
||||||
|
|
||||||
|
|
||||||
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, bool zero_buffer) {
|
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, b32 zero_buffer) {
|
||||||
Allocator allocator = {0};
|
Allocator allocator = {0};
|
||||||
bool initialised = wapp_mem_arena_init_custom((Arena **)(&allocator.obj), base_capacity, flags, zero_buffer);
|
b32 initialised = wapp_mem_arena_init_custom((Arena **)(&allocator.obj), base_capacity, flags, zero_buffer);
|
||||||
if (!initialised) {
|
if (!initialised) {
|
||||||
return allocator;
|
return allocator;
|
||||||
}
|
}
|
||||||
@@ -37,22 +37,22 @@ void wapp_mem_arena_allocator_destroy(Allocator *allocator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal inline void *mem_arena_alloc(u64 size, void *alloc_obj) {
|
wapp_intern inline void *mem_arena_alloc(u64 size, void *alloc_obj) {
|
||||||
Arena *arena = (Arena *)alloc_obj;
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
return wapp_mem_arena_alloc(arena, size);
|
return wapp_mem_arena_alloc(arena, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inline void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) {
|
wapp_intern inline void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) {
|
||||||
Arena *arena = (Arena *)alloc_obj;
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
return wapp_mem_arena_alloc_aligned(arena, size, alignment);
|
return wapp_mem_arena_alloc_aligned(arena, size, alignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inline void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj) {
|
wapp_intern inline void *mem_arena_realloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj) {
|
||||||
Arena *arena = (Arena *)alloc_obj;
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
return wapp_mem_arena_realloc(arena, ptr, old_size, new_size);
|
return wapp_mem_arena_realloc(arena, ptr, old_size, new_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inline void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
wapp_intern inline void *mem_arena_realloc_aligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
||||||
void *alloc_obj) {
|
void *alloc_obj) {
|
||||||
Arena *arena = (Arena *)alloc_obj;
|
Arena *arena = (Arena *)alloc_obj;
|
||||||
return wapp_mem_arena_realloc_aligned(arena, ptr, old_size, new_size, alignment);
|
return wapp_mem_arena_realloc_aligned(arena, ptr, old_size, new_size, alignment);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
#include "../../os/mem/mem_os.h"
|
#include "../../os/mem/mem_os.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
@@ -33,7 +32,7 @@ BEGIN_C_LINKAGE
|
|||||||
* The `wapp_mem_arena_allocator_init_custom` provides the most control over how
|
* The `wapp_mem_arena_allocator_init_custom` provides the most control over how
|
||||||
* the Arena is initialised. Wrapper macros are provided for easier use.
|
* the Arena is initialised. Wrapper macros are provided for easier use.
|
||||||
*/
|
*/
|
||||||
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, bool zero_buffer);
|
Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, MemAllocFlags flags, b32 zero_buffer);
|
||||||
void wapp_mem_arena_allocator_clear(Allocator *allocator);
|
void wapp_mem_arena_allocator_clear(Allocator *allocator);
|
||||||
void wapp_mem_arena_allocator_destroy(Allocator *allocator);
|
void wapp_mem_arena_allocator_destroy(Allocator *allocator);
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,9 @@
|
|||||||
#include "mem_utils.h"
|
#include "mem_utils.h"
|
||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/assert/assert.h"
|
#include "../../../common/assert/assert.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
internal bool is_power_of_two(u64 num) { return (num & (num - 1)) == 0; }
|
wapp_intern b32 is_power_of_two(u64 num) { return (num & (num - 1)) == 0; }
|
||||||
|
|
||||||
void *wapp_mem_util_align_forward(void *ptr, u64 alignment) {
|
void *wapp_mem_util_align_forward(void *ptr, u64 alignment) {
|
||||||
wapp_debug_assert(ptr != NULL, "`ptr` should not be NULL");
|
wapp_debug_assert(ptr != NULL, "`ptr` should not be NULL");
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
#include "../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
#include "../../../primitives/strings/str8/str8.h"
|
#include "../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Str8 separator = wapp_str8_buf(4);
|
Str8 separator = wapp_str8_buf(4);
|
||||||
wapp_str8_push_back(&separator, PATH_SEP);
|
wapp_str8_push_back(&separator, WAPP_PATH_SEP);
|
||||||
|
|
||||||
u64 required_capacity = parts->node_count * separator.size + wapp_str8_list_total_size(parts);
|
u64 required_capacity = parts->node_count * separator.size + wapp_str8_list_total_size(parts);
|
||||||
if (dst->capacity < required_capacity) {
|
if (dst->capacity < required_capacity) {
|
||||||
@@ -37,7 +36,7 @@ u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) {
|
|||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
const Str8Node *node = first_node;
|
const Str8Node *node = first_node;
|
||||||
u64 node_index = 1;
|
u64 node_index = 1;
|
||||||
bool running = node_index < parts->node_count;
|
b32 running = node_index < parts->node_count;
|
||||||
while (running && node->next) {
|
while (running && node->next) {
|
||||||
node = node->next;
|
node = node->next;
|
||||||
if (node->item->size == 0) {
|
if (node->item->size == 0) {
|
||||||
@@ -45,9 +44,9 @@ u32 wapp_cpath_join_path(Str8 *dst, const Str8List *parts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dst->size > 0) {
|
if (dst->size > 0) {
|
||||||
char dst_last = wapp_str8_get(dst, dst->size - 1);
|
char dst_last = wapp_str8_get(dst, dst->size - 1);
|
||||||
char node_start = wapp_str8_get(node->item, 0);
|
char node_start = wapp_str8_get(node->item, 0);
|
||||||
bool add_path_sep = dst_last != PATH_SEP && node_start != PATH_SEP;
|
b32 add_path_sep = dst_last != WAPP_PATH_SEP && node_start != WAPP_PATH_SEP;
|
||||||
|
|
||||||
if (add_path_sep) {
|
if (add_path_sep) {
|
||||||
wapp_str8_concat_capped(dst, &separator);
|
wapp_str8_concat_capped(dst, &separator);
|
||||||
@@ -69,9 +68,9 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
goto RETURN_DIRUP;
|
goto RETURN_DIRUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool absolute = wapp_str8_get(path, 0) == PATH_SEP;
|
b32 absolute = wapp_str8_get(path, 0) == WAPP_PATH_SEP;
|
||||||
Str8 separator = wapp_str8_buf(4);
|
Str8 separator = wapp_str8_buf(4);
|
||||||
wapp_str8_push_back(&separator, PATH_SEP);
|
wapp_str8_push_back(&separator, WAPP_PATH_SEP);
|
||||||
|
|
||||||
if (path->size == 0) {
|
if (path->size == 0) {
|
||||||
output = wapp_str8_alloc_buf(allocator, 16);
|
output = wapp_str8_alloc_buf(allocator, 16);
|
||||||
@@ -79,7 +78,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
goto RETURN_DIRUP;
|
goto RETURN_DIRUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
wapp_str8_push_back(output, absolute ? PATH_SEP : '.');
|
wapp_str8_push_back(output, absolute ? WAPP_PATH_SEP : '.');
|
||||||
goto RETURN_DIRUP;
|
goto RETURN_DIRUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +103,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
goto LIST_CLEANUP_DIRUP;
|
goto LIST_CLEANUP_DIRUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
wapp_str8_push_back(output, absolute ? PATH_SEP : '.');
|
wapp_str8_push_back(output, absolute ? WAPP_PATH_SEP : '.');
|
||||||
} else {
|
} else {
|
||||||
for (u64 i = 0; i < levels; ++i) {
|
for (u64 i = 0; i < levels; ++i) {
|
||||||
wapp_str8_list_pop_back(parts);
|
wapp_str8_list_pop_back(parts);
|
||||||
@@ -118,7 +117,7 @@ Str8 *dirup(const Allocator *allocator, Str8RO *path, u64 levels) {
|
|||||||
output = wapp_str8_alloc_buf(allocator, alloc_size);
|
output = wapp_str8_alloc_buf(allocator, alloc_size);
|
||||||
if (output) {
|
if (output) {
|
||||||
if (absolute) {
|
if (absolute) {
|
||||||
wapp_str8_push_back(output, PATH_SEP);
|
wapp_str8_push_back(output, WAPP_PATH_SEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
Str8 *joined = wapp_str8_join(&tmp_arena, parts, &separator);
|
Str8 *joined = wapp_str8_join(&tmp_arena, parts, &separator);
|
||||||
|
|||||||
@@ -13,9 +13,13 @@ BEGIN_C_LINKAGE
|
|||||||
#endif // !WAPP_PLATFORM_CPP
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_POSIX
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
#define PATH_SEP '/'
|
#include <limits.h>
|
||||||
|
#define WAPP_PATH_SEP '/'
|
||||||
|
#define WAPP_PATH_MAX PATH_MAX
|
||||||
#elif defined(WAPP_PLATFORM_WINDOWS)
|
#elif defined(WAPP_PLATFORM_WINDOWS)
|
||||||
#define PATH_SEP '\\'
|
#include <windows.h>
|
||||||
|
#define WAPP_PATH_SEP '\\'
|
||||||
|
#define WAPP_PATH_MAX MAX_PATH
|
||||||
#else
|
#else
|
||||||
#error "Unrecognised platform"
|
#error "Unrecognised platform"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(WAPP_PLATFORM_WINDOWS)
|
#if defined(WAPP_PLATFORM_WINDOWS)
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ BEGIN_C_LINKAGE
|
|||||||
void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
||||||
void wapp_mem_util_free(void *ptr, u64 size);
|
void wapp_mem_util_free(void *ptr, u64 size);
|
||||||
|
|
||||||
external void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
wapp_extern void *mem_util_allocate(void *addr, u64 size, MemAccess access, MemAllocFlags flags, MemInitType type);
|
||||||
external void mem_util_free(void *ptr, u64 size);
|
wapp_extern void mem_util_free(void *ptr, u64 size);
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
END_C_LINKAGE
|
END_C_LINKAGE
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "../mem_os_ops.h"
|
#include "../mem_os_ops.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
internal const i32 access_types[] = {
|
wapp_intern const i32 access_types[] = {
|
||||||
[WAPP_MEM_ACCESS_NONE] = PROT_NONE,
|
[WAPP_MEM_ACCESS_NONE] = PROT_NONE,
|
||||||
[WAPP_MEM_ACCESS_READ_ONLY] = PROT_READ,
|
[WAPP_MEM_ACCESS_READ_ONLY] = PROT_READ,
|
||||||
[WAPP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC,
|
[WAPP_MEM_ACCESS_EXEC_ONLY] = PROT_EXEC,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <memoryapi.h>
|
#include <memoryapi.h>
|
||||||
|
|
||||||
internal const i32 access_types[] = {
|
wapp_intern const i32 access_types[] = {
|
||||||
[WAPP_MEM_ACCESS_NONE] = PAGE_NOACCESS,
|
[WAPP_MEM_ACCESS_NONE] = PAGE_NOACCESS,
|
||||||
[WAPP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY,
|
[WAPP_MEM_ACCESS_READ_ONLY] = PAGE_READONLY,
|
||||||
[WAPP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE,
|
[WAPP_MEM_ACCESS_EXEC_ONLY] = PAGE_EXECUTE,
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
#include "../../../../primitives/mem_allocator/mem_allocator.h"
|
#include "../../../../primitives/mem_allocator/mem_allocator.h"
|
||||||
#include "../../../../primitives/strings/str8/str8.h"
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -18,8 +17,8 @@
|
|||||||
#define CMD_BUF_LEN 8192
|
#define CMD_BUF_LEN 8192
|
||||||
#define OUT_BUF_LEN 4096
|
#define OUT_BUF_LEN 4096
|
||||||
|
|
||||||
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf);
|
wapp_intern inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf);
|
||||||
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf);
|
wapp_intern inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf);
|
||||||
|
|
||||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd) {
|
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd) {
|
||||||
if (!cmd) {
|
if (!cmd) {
|
||||||
@@ -44,7 +43,7 @@ CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_bu
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf) {
|
wapp_intern inline CMDResult execute_command(Str8RO *cmd, CMDOutHandling out_handling, Str8 *out_buf) {
|
||||||
char cmd_buf[CMD_BUF_LEN] = {0};
|
char cmd_buf[CMD_BUF_LEN] = {0};
|
||||||
wapp_str8_copy_to_cstr(cmd_buf, cmd, CMD_BUF_LEN);
|
wapp_str8_copy_to_cstr(cmd_buf, cmd, CMD_BUF_LEN);
|
||||||
|
|
||||||
@@ -84,7 +83,7 @@ EXECUTE_COMMAND_CLOSE:
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf) {
|
wapp_intern inline CMDError get_command_output(FILE *fp, CMDOutHandling out_handling, Str8 *out_buf) {
|
||||||
Str8 out = wapp_str8_buf(OUT_BUF_LEN);
|
Str8 out = wapp_str8_buf(OUT_BUF_LEN);
|
||||||
|
|
||||||
out.size = fread((void *)out.buf, sizeof(u8), out.capacity, fp);
|
out.size = fread((void *)out.buf, sizeof(u8), out.capacity, fp);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include "../../../../common/aliases/aliases.h"
|
#include "../../../../common/aliases/aliases.h"
|
||||||
#include "../../../../common/platform/platform.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
#include "../../../../primitives/strings/str8/str8.h"
|
#include "../../../../primitives/strings/str8/str8.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
@@ -19,7 +18,7 @@ BEGIN_C_LINKAGE
|
|||||||
|
|
||||||
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd);
|
CMDResult wapp_shell_commander_execute(CMDOutHandling out_handling, Str8 *out_buf, const Str8List *cmd);
|
||||||
|
|
||||||
external CMDError get_output_status(FILE *fp, i32 *status_out);
|
wapp_extern CMDError get_output_status(FILE *fp, i32 *status_out);
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
END_C_LINKAGE
|
END_C_LINKAGE
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include "../../../../common/aliases/aliases.h"
|
#include "../../../../common/aliases/aliases.h"
|
||||||
#include "../../../../common/platform/platform.h"
|
#include "../../../../common/platform/platform.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
@@ -30,11 +29,11 @@ typedef struct commander_result CMDResult;
|
|||||||
struct commander_result {
|
struct commander_result {
|
||||||
i32 exit_code;
|
i32 exit_code;
|
||||||
CMDError error;
|
CMDError error;
|
||||||
bool exited;
|
b32 exited;
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
#include "../../../../common/misc/misc_utils.h"
|
#include "../../../../common/misc/misc_utils.h"
|
||||||
wapp_misc_utils_padding_size(sizeof(bool) + sizeof(i32) + sizeof(CMDError));
|
wapp_misc_utils_padding_size(sizeof(b32) + sizeof(i32) + sizeof(CMDError));
|
||||||
#endif // !WAPP_PLATFORM_WINDOWS
|
#endif // !WAPP_PLATFORM_WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
#include "../terminal_colours.h"
|
#include "../terminal_colours.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
internal Str8RO colours[COUNT_TERM_COLOUR] = {
|
wapp_intern Str8RO colours[COUNT_TERM_COLOUR] = {
|
||||||
[WAPP_TERM_COLOUR_FG_BLACK] = wapp_str8_lit_ro_initialiser_list("\033[30m"),
|
[WAPP_TERM_COLOUR_FG_BLACK] = wapp_str8_lit_ro_initialiser_list("\033[30m"),
|
||||||
[WAPP_TERM_COLOUR_FG_RED] = wapp_str8_lit_ro_initialiser_list("\033[31m"),
|
[WAPP_TERM_COLOUR_FG_RED] = wapp_str8_lit_ro_initialiser_list("\033[31m"),
|
||||||
[WAPP_TERM_COLOUR_FG_GREEN] = wapp_str8_lit_ro_initialiser_list("\033[32m"),
|
[WAPP_TERM_COLOUR_FG_GREEN] = wapp_str8_lit_ro_initialiser_list("\033[32m"),
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ BEGIN_C_LINKAGE
|
|||||||
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour);
|
void wapp_shell_termcolour_print_text(Str8RO *text, TerminalColour colour);
|
||||||
void wapp_shell_termcolour_clear_colour(void);
|
void wapp_shell_termcolour_clear_colour(void);
|
||||||
|
|
||||||
external void print_coloured_text(Str8RO *text, TerminalColour colour);
|
wapp_extern void print_coloured_text(Str8RO *text, TerminalColour colour);
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
END_C_LINKAGE
|
END_C_LINKAGE
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ struct termcolour_data {
|
|||||||
wapp_misc_utils_padding_size(sizeof(HANDLE) + sizeof(WORD) + sizeof(WORD));
|
wapp_misc_utils_padding_size(sizeof(HANDLE) + sizeof(WORD) + sizeof(WORD));
|
||||||
};
|
};
|
||||||
|
|
||||||
internal void init_data(TermcolourData *data);
|
wapp_intern void init_data(TermcolourData *data);
|
||||||
|
|
||||||
internal WORD colours[COUNT_TERM_COLOUR] = {
|
wapp_intern WORD colours[COUNT_TERM_COLOUR] = {
|
||||||
[WAPP_TERM_COLOUR_FG_BLACK] = 0,
|
[WAPP_TERM_COLOUR_FG_BLACK] = 0,
|
||||||
[WAPP_TERM_COLOUR_FG_RED] = FOREGROUND_RED,
|
[WAPP_TERM_COLOUR_FG_RED] = FOREGROUND_RED,
|
||||||
[WAPP_TERM_COLOUR_FG_GREEN] = FOREGROUND_GREEN,
|
[WAPP_TERM_COLOUR_FG_GREEN] = FOREGROUND_GREEN,
|
||||||
@@ -44,7 +44,7 @@ internal WORD colours[COUNT_TERM_COLOUR] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void print_coloured_text(Str8RO *text, TerminalColour colour) {
|
void print_coloured_text(Str8RO *text, TerminalColour colour) {
|
||||||
persistent TermcolourData data = {0};
|
wapp_persist TermcolourData data = {0};
|
||||||
if (data.handle == 0) {
|
if (data.handle == 0) {
|
||||||
init_data(&data);
|
init_data(&data);
|
||||||
}
|
}
|
||||||
@@ -59,7 +59,7 @@ void print_coloured_text(Str8RO *text, TerminalColour colour) {
|
|||||||
printf(WAPP_STR8_SPEC, wapp_str8_varg((*text)));
|
printf(WAPP_STR8_SPEC, wapp_str8_varg((*text)));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void init_data(TermcolourData *data) {
|
wapp_intern void init_data(TermcolourData *data) {
|
||||||
// create handle
|
// create handle
|
||||||
data->handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
data->handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#define WAPP_CORE_C
|
#define WAPP_CORE_C
|
||||||
|
|
||||||
#include "wapp_core.h"
|
#include "wapp_core.h"
|
||||||
|
#include "file/file.c"
|
||||||
#include "os/shell/termcolour/posix/termcolour_posix.c"
|
#include "os/shell/termcolour/posix/termcolour_posix.c"
|
||||||
#include "os/shell/termcolour/win/termcolour_win.c"
|
#include "os/shell/termcolour/win/termcolour_win.c"
|
||||||
#include "os/shell/termcolour/termcolour.c"
|
#include "os/shell/termcolour/termcolour.c"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#ifndef WAPP_CORE_H
|
#ifndef WAPP_CORE_H
|
||||||
#define WAPP_CORE_H
|
#define WAPP_CORE_H
|
||||||
|
|
||||||
|
#include "file/file.h"
|
||||||
#include "os/shell/termcolour/termcolour.h"
|
#include "os/shell/termcolour/termcolour.h"
|
||||||
#include "os/shell/termcolour/terminal_colours.h"
|
#include "os/shell/termcolour/terminal_colours.h"
|
||||||
#include "os/shell/commander/commander.h"
|
#include "os/shell/commander/commander.h"
|
||||||
|
|||||||
@@ -1,165 +1,15 @@
|
|||||||
/**
|
/**
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "./array.h"
|
#include "./array.h"
|
||||||
#include "../../common/assert/assert.h"
|
#include "../../common/assert/assert.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
#include "../mem_allocator/mem_allocator.h"
|
#include "../mem_allocator/mem_allocator.h"
|
||||||
#include "../../common/misc/misc_utils.h"
|
#include "../../common/misc/misc_utils.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
Str8 *wapp_str8_array_get(const Str8Array *array, u64 index) {
|
|
||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
|
||||||
|
|
||||||
u8 *ptr = (u8 *)(array->items) + (array->item_size * index);
|
|
||||||
return (Str8 *)ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_array_set(Str8Array *array, u64 index, Str8 *item) {
|
|
||||||
Str8 *ptr = wapp_str8_array_get(array, index);
|
|
||||||
|
|
||||||
memcpy((void *)ptr, (void *)item, array->item_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_array_append_capped(Str8Array *array, Str8 *item) {
|
|
||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
wapp_runtime_assert(array->count < array->capacity, "`array` is full");
|
|
||||||
|
|
||||||
u64 index = (array->count)++;
|
|
||||||
wapp_str8_array_set(array, index, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_array_extend_capped(Str8Array *array, const Str8Array *other) {
|
|
||||||
wapp_debug_assert(array != NULL && other != NULL, "`array` and `other` should not be NULL");
|
|
||||||
|
|
||||||
u64 remaining_capacity = array->capacity - array->count;
|
|
||||||
wapp_runtime_assert(other->count < remaining_capacity, "`array` does not have enough capacity");
|
|
||||||
|
|
||||||
Str8 *item;
|
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
|
||||||
// MSVC Spectre mitigation warnings
|
|
||||||
u64 items_to_add = other->count;
|
|
||||||
u64 item_index = 0;
|
|
||||||
b32 running = true;
|
|
||||||
while (running) {
|
|
||||||
item = wapp_str8_array_get(other, item_index);
|
|
||||||
++item_index;
|
|
||||||
running = item_index < items_to_add;
|
|
||||||
|
|
||||||
if (!item) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_str8_array_append_capped(array, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_array_clear(Str8Array *array) {
|
|
||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
|
||||||
array->count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_array_copy_capped(const Str8Array *src, Str8Array *dst) {
|
|
||||||
wapp_debug_assert(src != NULL && dst != NULL, "`src` and `dst` should not be NULL");
|
|
||||||
|
|
||||||
wapp_str8_array_clear(dst);
|
|
||||||
|
|
||||||
Str8 *item;
|
|
||||||
|
|
||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
|
||||||
// MSVC Spectre mitigation warnings
|
|
||||||
u64 to_copy = src->count < dst->capacity ? src->count : dst->capacity;
|
|
||||||
u64 item_index = 0;
|
|
||||||
b32 running = true;
|
|
||||||
while (running) {
|
|
||||||
item = wapp_str8_array_get(src, item_index);
|
|
||||||
++item_index;
|
|
||||||
running = item_index < to_copy;
|
|
||||||
|
|
||||||
if (!item) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_str8_array_append_capped(dst, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *array, Str8 *item) {
|
|
||||||
wapp_debug_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
|
|
||||||
|
|
||||||
Str8Array *output = array;
|
|
||||||
|
|
||||||
if (array->count >= array->capacity) {
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
|
||||||
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
|
||||||
if (!output) {
|
|
||||||
output = array;
|
|
||||||
goto RETURN_STR8_ARRAY_APPEND_ALLOC;
|
|
||||||
}
|
|
||||||
wapp_str8_array_copy_capped(array, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_str8_array_append_capped(output, item);
|
|
||||||
|
|
||||||
RETURN_STR8_ARRAY_APPEND_ALLOC:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other) {
|
|
||||||
wapp_debug_assert(allocator != NULL && array != NULL && other != NULL, "`allocator`, `array` and `other` should not be NULL");
|
|
||||||
|
|
||||||
Str8Array *output = array;
|
|
||||||
|
|
||||||
u64 remaining_capacity = array->capacity - array->count;
|
|
||||||
if (other->count >= remaining_capacity) {
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
|
||||||
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
|
||||||
if (!output) {
|
|
||||||
output = array;
|
|
||||||
goto RETURN_STR8_ARRAY_EXTEND_ALLOC;
|
|
||||||
}
|
|
||||||
wapp_str8_array_copy_capped(array, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_str8_array_extend_capped(output, other);
|
|
||||||
|
|
||||||
RETURN_STR8_ARRAY_EXTEND_ALLOC:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst) {
|
|
||||||
wapp_debug_assert(allocator != NULL && src != NULL && dst != NULL, "`allocator`, `src` and `dst` should not be NULL");
|
|
||||||
|
|
||||||
Str8Array *output = dst;
|
|
||||||
|
|
||||||
if (src->count >= dst->capacity) {
|
|
||||||
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
|
|
||||||
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, src->item_size);
|
|
||||||
if (!output) {
|
|
||||||
output = dst;
|
|
||||||
goto RETURN_STR8_ARRAY_COPY_ALLOC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wapp_str8_array_clear(output);
|
|
||||||
wapp_str8_array_copy_capped(src, output);
|
|
||||||
|
|
||||||
RETURN_STR8_ARRAY_COPY_ALLOC:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8 *_str8_array_pop(Str8Array *array) {
|
|
||||||
u64 index = array->count - 1;
|
|
||||||
Str8 *out = wapp_str8_array_get(array, index);
|
|
||||||
--(array->count);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index) {
|
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index) {
|
||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
||||||
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
||||||
@@ -309,6 +159,155 @@ void * *_void_ptr_array_pop(VoidPArray *array) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Str8 *wapp_str8_array_get(const Str8Array *array, u64 index) {
|
||||||
|
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
||||||
|
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
||||||
|
|
||||||
|
u8 *ptr = (u8 *)(array->items) + (array->item_size * index);
|
||||||
|
return (Str8 *)ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_array_set(Str8Array *array, u64 index, Str8 *item) {
|
||||||
|
Str8 *ptr = wapp_str8_array_get(array, index);
|
||||||
|
|
||||||
|
memcpy((void *)ptr, (void *)item, array->item_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_array_append_capped(Str8Array *array, Str8 *item) {
|
||||||
|
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
||||||
|
wapp_runtime_assert(array->count < array->capacity, "`array` is full");
|
||||||
|
|
||||||
|
u64 index = (array->count)++;
|
||||||
|
wapp_str8_array_set(array, index, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_array_extend_capped(Str8Array *array, const Str8Array *other) {
|
||||||
|
wapp_debug_assert(array != NULL && other != NULL, "`array` and `other` should not be NULL");
|
||||||
|
|
||||||
|
u64 remaining_capacity = array->capacity - array->count;
|
||||||
|
wapp_runtime_assert(other->count < remaining_capacity, "`array` does not have enough capacity");
|
||||||
|
|
||||||
|
Str8 *item;
|
||||||
|
|
||||||
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
|
// MSVC Spectre mitigation warnings
|
||||||
|
u64 items_to_add = other->count;
|
||||||
|
u64 item_index = 0;
|
||||||
|
b32 running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_str8_array_get(other, item_index);
|
||||||
|
++item_index;
|
||||||
|
running = item_index < items_to_add;
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_array_append_capped(array, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_array_clear(Str8Array *array) {
|
||||||
|
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
||||||
|
array->count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_array_copy_capped(const Str8Array *src, Str8Array *dst) {
|
||||||
|
wapp_debug_assert(src != NULL && dst != NULL, "`src` and `dst` should not be NULL");
|
||||||
|
|
||||||
|
wapp_str8_array_clear(dst);
|
||||||
|
|
||||||
|
Str8 *item;
|
||||||
|
|
||||||
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
|
// MSVC Spectre mitigation warnings
|
||||||
|
u64 to_copy = src->count < dst->capacity ? src->count : dst->capacity;
|
||||||
|
u64 item_index = 0;
|
||||||
|
b32 running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_str8_array_get(src, item_index);
|
||||||
|
++item_index;
|
||||||
|
running = item_index < to_copy;
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_array_append_capped(dst, item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *array, Str8 *item) {
|
||||||
|
wapp_debug_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
|
||||||
|
|
||||||
|
Str8Array *output = array;
|
||||||
|
|
||||||
|
if (array->count >= array->capacity) {
|
||||||
|
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
||||||
|
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
||||||
|
if (!output) {
|
||||||
|
output = array;
|
||||||
|
goto RETURN_STR8_ARRAY_APPEND_ALLOC;
|
||||||
|
}
|
||||||
|
wapp_str8_array_copy_capped(array, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_array_append_capped(output, item);
|
||||||
|
|
||||||
|
RETURN_STR8_ARRAY_APPEND_ALLOC:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other) {
|
||||||
|
wapp_debug_assert(allocator != NULL && array != NULL && other != NULL, "`allocator`, `array` and `other` should not be NULL");
|
||||||
|
|
||||||
|
Str8Array *output = array;
|
||||||
|
|
||||||
|
u64 remaining_capacity = array->capacity - array->count;
|
||||||
|
if (other->count >= remaining_capacity) {
|
||||||
|
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
|
||||||
|
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
|
||||||
|
if (!output) {
|
||||||
|
output = array;
|
||||||
|
goto RETURN_STR8_ARRAY_EXTEND_ALLOC;
|
||||||
|
}
|
||||||
|
wapp_str8_array_copy_capped(array, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_array_extend_capped(output, other);
|
||||||
|
|
||||||
|
RETURN_STR8_ARRAY_EXTEND_ALLOC:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst) {
|
||||||
|
wapp_debug_assert(allocator != NULL && src != NULL && dst != NULL, "`allocator`, `src` and `dst` should not be NULL");
|
||||||
|
|
||||||
|
Str8Array *output = dst;
|
||||||
|
|
||||||
|
if (src->count >= dst->capacity) {
|
||||||
|
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
|
||||||
|
output = (Str8Array *)_array_alloc_capacity(allocator, new_capacity, src->item_size);
|
||||||
|
if (!output) {
|
||||||
|
output = dst;
|
||||||
|
goto RETURN_STR8_ARRAY_COPY_ALLOC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_str8_array_clear(output);
|
||||||
|
wapp_str8_array_copy_capped(src, output);
|
||||||
|
|
||||||
|
RETURN_STR8_ARRAY_COPY_ALLOC:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8 *_str8_array_pop(Str8Array *array) {
|
||||||
|
u64 index = array->count - 1;
|
||||||
|
Str8 *out = wapp_str8_array_get(array, index);
|
||||||
|
--(array->count);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
b32 *wapp_b32_array_get(const B32Array *array, u64 index) {
|
b32 *wapp_b32_array_get(const B32Array *array, u64 index) {
|
||||||
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
wapp_debug_assert(array != NULL, "`array` should not be NULL");
|
||||||
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
|
||||||
@@ -2991,16 +2990,16 @@ uptr *_uptr_array_pop(UptrArray *array) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
VoidPArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size) {
|
GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size) {
|
||||||
wapp_debug_assert(allocator != NULL, "`array` should not be NULL");
|
wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL");
|
||||||
|
|
||||||
u64 allocation_size = sizeof(VoidPArray) + item_size * capacity;
|
u64 allocation_size = sizeof(GenericArray) + item_size * capacity;
|
||||||
VoidPArray *array = wapp_mem_allocator_alloc(allocator, allocation_size);
|
GenericArray *array = wapp_mem_allocator_alloc(allocator, allocation_size);
|
||||||
if (!array) {
|
if (!array) {
|
||||||
goto RETURN_GENERIC_ARRAY_ALLOC;
|
goto RETURN_GENERIC_ARRAY_ALLOC;
|
||||||
}
|
}
|
||||||
|
|
||||||
array->items = (void * *)((u8 *)array + sizeof(VoidPArray));
|
array->items = (void *)((u8 *)array + sizeof(GenericArray));
|
||||||
array->count = 0;
|
array->count = 0;
|
||||||
array->capacity = capacity;
|
array->capacity = capacity;
|
||||||
array->item_size = item_size;
|
array->item_size = item_size;
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ARRAY_H
|
#ifndef ARRAY_H
|
||||||
#define ARRAY_H
|
#define ARRAY_H
|
||||||
|
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
#include "../mem_allocator/mem_allocator.h"
|
#include "../mem_allocator/mem_allocator.h"
|
||||||
#include "../../common/misc/misc_utils.h"
|
#include "../../common/misc/misc_utils.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
@@ -15,8 +14,8 @@
|
|||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
#endif // !WAPP_PLATFORM_CPP
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
#define wapp_str8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((Str8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(Str8)))
|
|
||||||
#define wapp_void_ptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((VoidPArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(void *)))
|
#define wapp_void_ptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((VoidPArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(void *)))
|
||||||
|
#define wapp_str8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((Str8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(Str8)))
|
||||||
#define wapp_b32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((B32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(b32)))
|
#define wapp_b32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((B32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(b32)))
|
||||||
#define wapp_char_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((CharArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(char)))
|
#define wapp_char_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((CharArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(char)))
|
||||||
#define wapp_c8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c8)))
|
#define wapp_c8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c8)))
|
||||||
@@ -37,25 +36,8 @@ BEGIN_C_LINKAGE
|
|||||||
#define wapp_uptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((UptrArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(uptr)))
|
#define wapp_uptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((UptrArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(uptr)))
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
#define wapp_str8_array(...) ([&]() { \
|
|
||||||
persistent Str8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
|
||||||
return Str8Array{ \
|
|
||||||
buf, \
|
|
||||||
wapp_misc_utils_va_args_count(Str8, __VA_ARGS__), \
|
|
||||||
wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2), \
|
|
||||||
sizeof(Str8) \
|
|
||||||
}; \
|
|
||||||
}())
|
|
||||||
#define wapp_str8_array_with_capacity(CAPACITY) ([&]() { \
|
|
||||||
persistent Str8 buf[CAPACITY] = {}; \
|
|
||||||
return Str8Array{buf, 0, CAPACITY, sizeof(Str8)}; \
|
|
||||||
}())
|
|
||||||
#define wapp_str8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
|
||||||
*_str8_array_pop(ARRAY_PTR) : \
|
|
||||||
Str8{} \
|
|
||||||
)
|
|
||||||
#define wapp_void_ptr_array(...) ([&]() { \
|
#define wapp_void_ptr_array(...) ([&]() { \
|
||||||
persistent void * buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist void * buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return VoidPArray{ \
|
return VoidPArray{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
|
||||||
@@ -64,15 +46,32 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_void_ptr_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_void_ptr_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent void * buf[CAPACITY] = {}; \
|
wapp_persist void * buf[CAPACITY] = {}; \
|
||||||
return VoidPArray{buf, 0, CAPACITY, sizeof(void *)}; \
|
return VoidPArray{buf, 0, CAPACITY, sizeof(void *)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_void_ptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_void_ptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
*_void_ptr_array_pop(ARRAY_PTR) : \
|
*_void_ptr_array_pop(ARRAY_PTR) : \
|
||||||
void *{} \
|
void *{} \
|
||||||
)
|
)
|
||||||
|
#define wapp_str8_array(...) ([&]() { \
|
||||||
|
wapp_persist Str8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
|
return Str8Array{ \
|
||||||
|
buf, \
|
||||||
|
wapp_misc_utils_va_args_count(Str8, __VA_ARGS__), \
|
||||||
|
wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2), \
|
||||||
|
sizeof(Str8) \
|
||||||
|
}; \
|
||||||
|
}())
|
||||||
|
#define wapp_str8_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
|
wapp_persist Str8 buf[CAPACITY] = {}; \
|
||||||
|
return Str8Array{buf, 0, CAPACITY, sizeof(Str8)}; \
|
||||||
|
}())
|
||||||
|
#define wapp_str8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_str8_array_pop(ARRAY_PTR) : \
|
||||||
|
Str8{} \
|
||||||
|
)
|
||||||
#define wapp_b32_array(...) ([&]() { \
|
#define wapp_b32_array(...) ([&]() { \
|
||||||
persistent b32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist b32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return B32Array{ \
|
return B32Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \
|
||||||
@@ -81,7 +80,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_b32_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_b32_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent b32 buf[CAPACITY] = {}; \
|
wapp_persist b32 buf[CAPACITY] = {}; \
|
||||||
return B32Array{buf, 0, CAPACITY, sizeof(b32)}; \
|
return B32Array{buf, 0, CAPACITY, sizeof(b32)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_b32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_b32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -89,7 +88,7 @@ BEGIN_C_LINKAGE
|
|||||||
b32{} \
|
b32{} \
|
||||||
)
|
)
|
||||||
#define wapp_char_array(...) ([&]() { \
|
#define wapp_char_array(...) ([&]() { \
|
||||||
persistent char buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(char, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist char buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(char, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return CharArray{ \
|
return CharArray{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(char, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(char, __VA_ARGS__), \
|
||||||
@@ -98,7 +97,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_char_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_char_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent char buf[CAPACITY] = {}; \
|
wapp_persist char buf[CAPACITY] = {}; \
|
||||||
return CharArray{buf, 0, CAPACITY, sizeof(char)}; \
|
return CharArray{buf, 0, CAPACITY, sizeof(char)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_char_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_char_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -106,7 +105,7 @@ BEGIN_C_LINKAGE
|
|||||||
char{} \
|
char{} \
|
||||||
)
|
)
|
||||||
#define wapp_c8_array(...) ([&]() { \
|
#define wapp_c8_array(...) ([&]() { \
|
||||||
persistent c8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist c8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return C8Array{ \
|
return C8Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(c8, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(c8, __VA_ARGS__), \
|
||||||
@@ -115,7 +114,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c8_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_c8_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent c8 buf[CAPACITY] = {}; \
|
wapp_persist c8 buf[CAPACITY] = {}; \
|
||||||
return C8Array{buf, 0, CAPACITY, sizeof(c8)}; \
|
return C8Array{buf, 0, CAPACITY, sizeof(c8)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_c8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -123,7 +122,7 @@ BEGIN_C_LINKAGE
|
|||||||
c8{} \
|
c8{} \
|
||||||
)
|
)
|
||||||
#define wapp_c16_array(...) ([&]() { \
|
#define wapp_c16_array(...) ([&]() { \
|
||||||
persistent c16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist c16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return C16Array{ \
|
return C16Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(c16, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(c16, __VA_ARGS__), \
|
||||||
@@ -132,7 +131,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c16_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_c16_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent c16 buf[CAPACITY] = {}; \
|
wapp_persist c16 buf[CAPACITY] = {}; \
|
||||||
return C16Array{buf, 0, CAPACITY, sizeof(c16)}; \
|
return C16Array{buf, 0, CAPACITY, sizeof(c16)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_c16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -140,7 +139,7 @@ BEGIN_C_LINKAGE
|
|||||||
c16{} \
|
c16{} \
|
||||||
)
|
)
|
||||||
#define wapp_c32_array(...) ([&]() { \
|
#define wapp_c32_array(...) ([&]() { \
|
||||||
persistent c32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist c32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(c32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return C32Array{ \
|
return C32Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(c32, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(c32, __VA_ARGS__), \
|
||||||
@@ -149,7 +148,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c32_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_c32_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent c32 buf[CAPACITY] = {}; \
|
wapp_persist c32 buf[CAPACITY] = {}; \
|
||||||
return C32Array{buf, 0, CAPACITY, sizeof(c32)}; \
|
return C32Array{buf, 0, CAPACITY, sizeof(c32)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_c32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_c32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -157,7 +156,7 @@ BEGIN_C_LINKAGE
|
|||||||
c32{} \
|
c32{} \
|
||||||
)
|
)
|
||||||
#define wapp_i8_array(...) ([&]() { \
|
#define wapp_i8_array(...) ([&]() { \
|
||||||
persistent i8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist i8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return I8Array{ \
|
return I8Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(i8, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(i8, __VA_ARGS__), \
|
||||||
@@ -166,7 +165,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i8_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_i8_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent i8 buf[CAPACITY] = {}; \
|
wapp_persist i8 buf[CAPACITY] = {}; \
|
||||||
return I8Array{buf, 0, CAPACITY, sizeof(i8)}; \
|
return I8Array{buf, 0, CAPACITY, sizeof(i8)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_i8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -174,7 +173,7 @@ BEGIN_C_LINKAGE
|
|||||||
i8{} \
|
i8{} \
|
||||||
)
|
)
|
||||||
#define wapp_i16_array(...) ([&]() { \
|
#define wapp_i16_array(...) ([&]() { \
|
||||||
persistent i16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist i16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return I16Array{ \
|
return I16Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(i16, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(i16, __VA_ARGS__), \
|
||||||
@@ -183,7 +182,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i16_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_i16_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent i16 buf[CAPACITY] = {}; \
|
wapp_persist i16 buf[CAPACITY] = {}; \
|
||||||
return I16Array{buf, 0, CAPACITY, sizeof(i16)}; \
|
return I16Array{buf, 0, CAPACITY, sizeof(i16)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_i16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -191,7 +190,7 @@ BEGIN_C_LINKAGE
|
|||||||
i16{} \
|
i16{} \
|
||||||
)
|
)
|
||||||
#define wapp_i32_array(...) ([&]() { \
|
#define wapp_i32_array(...) ([&]() { \
|
||||||
persistent i32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist i32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return I32Array{ \
|
return I32Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(i32, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(i32, __VA_ARGS__), \
|
||||||
@@ -200,7 +199,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i32_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_i32_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent i32 buf[CAPACITY] = {}; \
|
wapp_persist i32 buf[CAPACITY] = {}; \
|
||||||
return I32Array{buf, 0, CAPACITY, sizeof(i32)}; \
|
return I32Array{buf, 0, CAPACITY, sizeof(i32)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_i32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -208,7 +207,7 @@ BEGIN_C_LINKAGE
|
|||||||
i32{} \
|
i32{} \
|
||||||
)
|
)
|
||||||
#define wapp_i64_array(...) ([&]() { \
|
#define wapp_i64_array(...) ([&]() { \
|
||||||
persistent i64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist i64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(i64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return I64Array{ \
|
return I64Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(i64, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(i64, __VA_ARGS__), \
|
||||||
@@ -217,7 +216,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i64_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_i64_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent i64 buf[CAPACITY] = {}; \
|
wapp_persist i64 buf[CAPACITY] = {}; \
|
||||||
return I64Array{buf, 0, CAPACITY, sizeof(i64)}; \
|
return I64Array{buf, 0, CAPACITY, sizeof(i64)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_i64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_i64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -225,7 +224,7 @@ BEGIN_C_LINKAGE
|
|||||||
i64{} \
|
i64{} \
|
||||||
)
|
)
|
||||||
#define wapp_u8_array(...) ([&]() { \
|
#define wapp_u8_array(...) ([&]() { \
|
||||||
persistent u8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist u8 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u8, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return U8Array{ \
|
return U8Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(u8, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(u8, __VA_ARGS__), \
|
||||||
@@ -234,7 +233,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u8_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_u8_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent u8 buf[CAPACITY] = {}; \
|
wapp_persist u8 buf[CAPACITY] = {}; \
|
||||||
return U8Array{buf, 0, CAPACITY, sizeof(u8)}; \
|
return U8Array{buf, 0, CAPACITY, sizeof(u8)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_u8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -242,7 +241,7 @@ BEGIN_C_LINKAGE
|
|||||||
u8{} \
|
u8{} \
|
||||||
)
|
)
|
||||||
#define wapp_u16_array(...) ([&]() { \
|
#define wapp_u16_array(...) ([&]() { \
|
||||||
persistent u16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist u16 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u16, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return U16Array{ \
|
return U16Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(u16, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(u16, __VA_ARGS__), \
|
||||||
@@ -251,7 +250,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u16_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_u16_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent u16 buf[CAPACITY] = {}; \
|
wapp_persist u16 buf[CAPACITY] = {}; \
|
||||||
return U16Array{buf, 0, CAPACITY, sizeof(u16)}; \
|
return U16Array{buf, 0, CAPACITY, sizeof(u16)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_u16_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -259,7 +258,7 @@ BEGIN_C_LINKAGE
|
|||||||
u16{} \
|
u16{} \
|
||||||
)
|
)
|
||||||
#define wapp_u32_array(...) ([&]() { \
|
#define wapp_u32_array(...) ([&]() { \
|
||||||
persistent u32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist u32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return U32Array{ \
|
return U32Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(u32, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(u32, __VA_ARGS__), \
|
||||||
@@ -268,7 +267,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u32_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_u32_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent u32 buf[CAPACITY] = {}; \
|
wapp_persist u32 buf[CAPACITY] = {}; \
|
||||||
return U32Array{buf, 0, CAPACITY, sizeof(u32)}; \
|
return U32Array{buf, 0, CAPACITY, sizeof(u32)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_u32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -276,7 +275,7 @@ BEGIN_C_LINKAGE
|
|||||||
u32{} \
|
u32{} \
|
||||||
)
|
)
|
||||||
#define wapp_u64_array(...) ([&]() { \
|
#define wapp_u64_array(...) ([&]() { \
|
||||||
persistent u64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist u64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(u64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return U64Array{ \
|
return U64Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(u64, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(u64, __VA_ARGS__), \
|
||||||
@@ -285,7 +284,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u64_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_u64_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent u64 buf[CAPACITY] = {}; \
|
wapp_persist u64 buf[CAPACITY] = {}; \
|
||||||
return U64Array{buf, 0, CAPACITY, sizeof(u64)}; \
|
return U64Array{buf, 0, CAPACITY, sizeof(u64)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_u64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_u64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -293,7 +292,7 @@ BEGIN_C_LINKAGE
|
|||||||
u64{} \
|
u64{} \
|
||||||
)
|
)
|
||||||
#define wapp_f32_array(...) ([&]() { \
|
#define wapp_f32_array(...) ([&]() { \
|
||||||
persistent f32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist f32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return F32Array{ \
|
return F32Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(f32, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(f32, __VA_ARGS__), \
|
||||||
@@ -302,7 +301,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f32_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_f32_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent f32 buf[CAPACITY] = {}; \
|
wapp_persist f32 buf[CAPACITY] = {}; \
|
||||||
return F32Array{buf, 0, CAPACITY, sizeof(f32)}; \
|
return F32Array{buf, 0, CAPACITY, sizeof(f32)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_f32_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -310,7 +309,7 @@ BEGIN_C_LINKAGE
|
|||||||
f32{} \
|
f32{} \
|
||||||
)
|
)
|
||||||
#define wapp_f64_array(...) ([&]() { \
|
#define wapp_f64_array(...) ([&]() { \
|
||||||
persistent f64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist f64 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f64, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return F64Array{ \
|
return F64Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(f64, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(f64, __VA_ARGS__), \
|
||||||
@@ -319,7 +318,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f64_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_f64_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent f64 buf[CAPACITY] = {}; \
|
wapp_persist f64 buf[CAPACITY] = {}; \
|
||||||
return F64Array{buf, 0, CAPACITY, sizeof(f64)}; \
|
return F64Array{buf, 0, CAPACITY, sizeof(f64)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_f64_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -327,7 +326,7 @@ BEGIN_C_LINKAGE
|
|||||||
f64{} \
|
f64{} \
|
||||||
)
|
)
|
||||||
#define wapp_f128_array(...) ([&]() { \
|
#define wapp_f128_array(...) ([&]() { \
|
||||||
persistent f128 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f128, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist f128 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(f128, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return F128Array{ \
|
return F128Array{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(f128, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(f128, __VA_ARGS__), \
|
||||||
@@ -336,7 +335,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f128_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_f128_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent f128 buf[CAPACITY] = {}; \
|
wapp_persist f128 buf[CAPACITY] = {}; \
|
||||||
return F128Array{buf, 0, CAPACITY, sizeof(f128)}; \
|
return F128Array{buf, 0, CAPACITY, sizeof(f128)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_f128_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_f128_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -344,7 +343,7 @@ BEGIN_C_LINKAGE
|
|||||||
f128{} \
|
f128{} \
|
||||||
)
|
)
|
||||||
#define wapp_iptr_array(...) ([&]() { \
|
#define wapp_iptr_array(...) ([&]() { \
|
||||||
persistent iptr buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(iptr, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist iptr buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(iptr, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return IptrArray{ \
|
return IptrArray{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(iptr, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(iptr, __VA_ARGS__), \
|
||||||
@@ -353,7 +352,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_iptr_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_iptr_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent iptr buf[CAPACITY] = {}; \
|
wapp_persist iptr buf[CAPACITY] = {}; \
|
||||||
return IptrArray{buf, 0, CAPACITY, sizeof(iptr)}; \
|
return IptrArray{buf, 0, CAPACITY, sizeof(iptr)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_iptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_iptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -361,7 +360,7 @@ BEGIN_C_LINKAGE
|
|||||||
iptr{} \
|
iptr{} \
|
||||||
)
|
)
|
||||||
#define wapp_uptr_array(...) ([&]() { \
|
#define wapp_uptr_array(...) ([&]() { \
|
||||||
persistent uptr buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(uptr, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
wapp_persist uptr buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(uptr, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
|
||||||
return UptrArray{ \
|
return UptrArray{ \
|
||||||
buf, \
|
buf, \
|
||||||
wapp_misc_utils_va_args_count(uptr, __VA_ARGS__), \
|
wapp_misc_utils_va_args_count(uptr, __VA_ARGS__), \
|
||||||
@@ -370,7 +369,7 @@ BEGIN_C_LINKAGE
|
|||||||
}; \
|
}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_uptr_array_with_capacity(CAPACITY) ([&]() { \
|
#define wapp_uptr_array_with_capacity(CAPACITY) ([&]() { \
|
||||||
persistent uptr buf[CAPACITY] = {}; \
|
wapp_persist uptr buf[CAPACITY] = {}; \
|
||||||
return UptrArray{buf, 0, CAPACITY, sizeof(uptr)}; \
|
return UptrArray{buf, 0, CAPACITY, sizeof(uptr)}; \
|
||||||
}())
|
}())
|
||||||
#define wapp_uptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
#define wapp_uptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
@@ -378,17 +377,6 @@ BEGIN_C_LINKAGE
|
|||||||
uptr{} \
|
uptr{} \
|
||||||
)
|
)
|
||||||
#else
|
#else
|
||||||
#define wapp_str8_array(...) ((Str8Array){ \
|
|
||||||
.items = (Str8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
|
||||||
.count = wapp_misc_utils_va_args_count(Str8, __VA_ARGS__), \
|
|
||||||
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2), \
|
|
||||||
.item_size = sizeof(Str8) \
|
|
||||||
})
|
|
||||||
#define wapp_str8_array_with_capacity(CAPACITY) ((Str8Array){.items = (Str8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(Str8)})
|
|
||||||
#define wapp_str8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
|
||||||
*_str8_array_pop(ARRAY_PTR) : \
|
|
||||||
(Str8){0} \
|
|
||||||
)
|
|
||||||
#define wapp_void_ptr_array(...) ((VoidPArray){ \
|
#define wapp_void_ptr_array(...) ((VoidPArray){ \
|
||||||
.items = (void *[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
.items = (void *[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
.count = wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
|
.count = wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
|
||||||
@@ -400,6 +388,17 @@ BEGIN_C_LINKAGE
|
|||||||
*_void_ptr_array_pop(ARRAY_PTR) : \
|
*_void_ptr_array_pop(ARRAY_PTR) : \
|
||||||
(void *){0} \
|
(void *){0} \
|
||||||
)
|
)
|
||||||
|
#define wapp_str8_array(...) ((Str8Array){ \
|
||||||
|
.items = (Str8[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
|
.count = wapp_misc_utils_va_args_count(Str8, __VA_ARGS__), \
|
||||||
|
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(Str8, __VA_ARGS__) * 2), \
|
||||||
|
.item_size = sizeof(Str8) \
|
||||||
|
})
|
||||||
|
#define wapp_str8_array_with_capacity(CAPACITY) ((Str8Array){.items = (Str8[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(Str8)})
|
||||||
|
#define wapp_str8_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
|
||||||
|
*_str8_array_pop(ARRAY_PTR) : \
|
||||||
|
(Str8){0} \
|
||||||
|
)
|
||||||
#define wapp_b32_array(...) ((B32Array){ \
|
#define wapp_b32_array(...) ((B32Array){ \
|
||||||
.items = (b32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
.items = (b32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
|
||||||
.count = wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \
|
.count = wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \
|
||||||
@@ -602,9 +601,9 @@ BEGIN_C_LINKAGE
|
|||||||
|
|
||||||
typedef struct str8 Str8;
|
typedef struct str8 Str8;
|
||||||
|
|
||||||
typedef struct Str8Array Str8Array;
|
typedef struct GenericArray GenericArray;
|
||||||
struct Str8Array {
|
struct GenericArray {
|
||||||
Str8 *items;
|
void *items;
|
||||||
u64 count;
|
u64 count;
|
||||||
u64 capacity;
|
u64 capacity;
|
||||||
u64 item_size;
|
u64 item_size;
|
||||||
@@ -618,6 +617,14 @@ struct VoidPArray {
|
|||||||
u64 item_size;
|
u64 item_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct Str8Array Str8Array;
|
||||||
|
struct Str8Array {
|
||||||
|
Str8 *items;
|
||||||
|
u64 count;
|
||||||
|
u64 capacity;
|
||||||
|
u64 item_size;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct B32Array B32Array;
|
typedef struct B32Array B32Array;
|
||||||
struct B32Array {
|
struct B32Array {
|
||||||
b32 *items;
|
b32 *items;
|
||||||
@@ -762,16 +769,6 @@ struct UptrArray {
|
|||||||
u64 item_size;
|
u64 item_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
Str8 *wapp_str8_array_get(const Str8Array *array, u64 index);
|
|
||||||
void wapp_str8_array_set(Str8Array *array, u64 index, Str8 *item);
|
|
||||||
void wapp_str8_array_append_capped(Str8Array *array, Str8 *item);
|
|
||||||
void wapp_str8_array_extend_capped(Str8Array *array, const Str8Array *other);
|
|
||||||
void wapp_str8_array_clear(Str8Array *array);
|
|
||||||
void wapp_str8_array_copy_capped(const Str8Array *src, Str8Array *dst);
|
|
||||||
Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *array, Str8 *item);
|
|
||||||
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other);
|
|
||||||
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst);
|
|
||||||
Str8 *_str8_array_pop(Str8Array *array);
|
|
||||||
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index);
|
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index);
|
||||||
void wapp_void_ptr_array_set(VoidPArray *array, u64 index, void * *item);
|
void wapp_void_ptr_array_set(VoidPArray *array, u64 index, void * *item);
|
||||||
void wapp_void_ptr_array_append_capped(VoidPArray *array, void * *item);
|
void wapp_void_ptr_array_append_capped(VoidPArray *array, void * *item);
|
||||||
@@ -782,6 +779,16 @@ VoidPArray *wapp_void_ptr_array_append_alloc(const Allocator *allocator, VoidPAr
|
|||||||
VoidPArray *wapp_void_ptr_array_extend_alloc(const Allocator *allocator, VoidPArray *array, const VoidPArray *other);
|
VoidPArray *wapp_void_ptr_array_extend_alloc(const Allocator *allocator, VoidPArray *array, const VoidPArray *other);
|
||||||
VoidPArray *wapp_void_ptr_array_copy_alloc(const Allocator *allocator, const VoidPArray *src, VoidPArray *dst);
|
VoidPArray *wapp_void_ptr_array_copy_alloc(const Allocator *allocator, const VoidPArray *src, VoidPArray *dst);
|
||||||
void * *_void_ptr_array_pop(VoidPArray *array);
|
void * *_void_ptr_array_pop(VoidPArray *array);
|
||||||
|
Str8 *wapp_str8_array_get(const Str8Array *array, u64 index);
|
||||||
|
void wapp_str8_array_set(Str8Array *array, u64 index, Str8 *item);
|
||||||
|
void wapp_str8_array_append_capped(Str8Array *array, Str8 *item);
|
||||||
|
void wapp_str8_array_extend_capped(Str8Array *array, const Str8Array *other);
|
||||||
|
void wapp_str8_array_clear(Str8Array *array);
|
||||||
|
void wapp_str8_array_copy_capped(const Str8Array *src, Str8Array *dst);
|
||||||
|
Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *array, Str8 *item);
|
||||||
|
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other);
|
||||||
|
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst);
|
||||||
|
Str8 *_str8_array_pop(Str8Array *array);
|
||||||
b32 *wapp_b32_array_get(const B32Array *array, u64 index);
|
b32 *wapp_b32_array_get(const B32Array *array, u64 index);
|
||||||
void wapp_b32_array_set(B32Array *array, u64 index, b32 *item);
|
void wapp_b32_array_set(B32Array *array, u64 index, b32 *item);
|
||||||
void wapp_b32_array_append_capped(B32Array *array, b32 *item);
|
void wapp_b32_array_append_capped(B32Array *array, b32 *item);
|
||||||
@@ -962,7 +969,7 @@ UptrArray *wapp_uptr_array_append_alloc(const Allocator *allocator, UptrArray *a
|
|||||||
UptrArray *wapp_uptr_array_extend_alloc(const Allocator *allocator, UptrArray *array, const UptrArray *other);
|
UptrArray *wapp_uptr_array_extend_alloc(const Allocator *allocator, UptrArray *array, const UptrArray *other);
|
||||||
UptrArray *wapp_uptr_array_copy_alloc(const Allocator *allocator, const UptrArray *src, UptrArray *dst);
|
UptrArray *wapp_uptr_array_copy_alloc(const Allocator *allocator, const UptrArray *src, UptrArray *dst);
|
||||||
uptr *_uptr_array_pop(UptrArray *array);
|
uptr *_uptr_array_pop(UptrArray *array);
|
||||||
VoidPArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size);
|
GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size);
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
END_C_LINKAGE
|
END_C_LINKAGE
|
||||||
|
|||||||
@@ -1,208 +1,33 @@
|
|||||||
/**
|
/**
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "./dbl_list.h"
|
#include "./dbl_list.h"
|
||||||
#include "../../common/assert/assert.h"
|
#include "../../common/assert/assert.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
internal Str8List str8_node_to_list(Str8Node *node);
|
wapp_intern VoidPList void_ptr_node_to_list(VoidPNode *node);
|
||||||
internal VoidPList void_ptr_node_to_list(VoidPNode *node);
|
wapp_intern Str8List str8_node_to_list(Str8Node *node);
|
||||||
internal B32List b32_node_to_list(B32Node *node);
|
wapp_intern B32List b32_node_to_list(B32Node *node);
|
||||||
internal CharList char_node_to_list(CharNode *node);
|
wapp_intern CharList char_node_to_list(CharNode *node);
|
||||||
internal C8List c8_node_to_list(C8Node *node);
|
wapp_intern C8List c8_node_to_list(C8Node *node);
|
||||||
internal C16List c16_node_to_list(C16Node *node);
|
wapp_intern C16List c16_node_to_list(C16Node *node);
|
||||||
internal C32List c32_node_to_list(C32Node *node);
|
wapp_intern C32List c32_node_to_list(C32Node *node);
|
||||||
internal I8List i8_node_to_list(I8Node *node);
|
wapp_intern I8List i8_node_to_list(I8Node *node);
|
||||||
internal I16List i16_node_to_list(I16Node *node);
|
wapp_intern I16List i16_node_to_list(I16Node *node);
|
||||||
internal I32List i32_node_to_list(I32Node *node);
|
wapp_intern I32List i32_node_to_list(I32Node *node);
|
||||||
internal I64List i64_node_to_list(I64Node *node);
|
wapp_intern I64List i64_node_to_list(I64Node *node);
|
||||||
internal U8List u8_node_to_list(U8Node *node);
|
wapp_intern U8List u8_node_to_list(U8Node *node);
|
||||||
internal U16List u16_node_to_list(U16Node *node);
|
wapp_intern U16List u16_node_to_list(U16Node *node);
|
||||||
internal U32List u32_node_to_list(U32Node *node);
|
wapp_intern U32List u32_node_to_list(U32Node *node);
|
||||||
internal U64List u64_node_to_list(U64Node *node);
|
wapp_intern U64List u64_node_to_list(U64Node *node);
|
||||||
internal F32List f32_node_to_list(F32Node *node);
|
wapp_intern F32List f32_node_to_list(F32Node *node);
|
||||||
internal F64List f64_node_to_list(F64Node *node);
|
wapp_intern F64List f64_node_to_list(F64Node *node);
|
||||||
internal F128List f128_node_to_list(F128Node *node);
|
wapp_intern F128List f128_node_to_list(F128Node *node);
|
||||||
internal IptrList iptr_node_to_list(IptrNode *node);
|
wapp_intern IptrList iptr_node_to_list(IptrNode *node);
|
||||||
internal UptrList uptr_node_to_list(UptrNode *node);
|
wapp_intern UptrList uptr_node_to_list(UptrNode *node);
|
||||||
|
|
||||||
Str8Node *wapp_str8_list_get(const Str8List *list, u64 index) {
|
|
||||||
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
|
||||||
|
|
||||||
Str8Node *output = NULL;
|
|
||||||
Str8Node *current = list->first;
|
|
||||||
for (u64 i = 1; i <= index; ++i) {
|
|
||||||
current = current->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = current;
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_list_push_front(Str8List *list, Str8Node *node) {
|
|
||||||
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
|
||||||
|
|
||||||
Str8List node_list = str8_node_to_list(node);
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
*list = node_list;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
Str8Node *first = list->first;
|
|
||||||
if (first) {
|
|
||||||
first->prev = node_list.last;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->first = node_list.first;
|
|
||||||
node_list.last->next = first;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_list_push_back(Str8List *list, Str8Node *node) {
|
|
||||||
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
|
||||||
|
|
||||||
Str8List node_list = str8_node_to_list(node);
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
*list = node_list;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
Str8Node *last = list->last;
|
|
||||||
if (last) {
|
|
||||||
last->next = node_list.first;
|
|
||||||
}
|
|
||||||
|
|
||||||
list->last = node_list.last;
|
|
||||||
node_list.first->prev = last;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index) {
|
|
||||||
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
|
||||||
|
|
||||||
if (index == 0) {
|
|
||||||
wapp_str8_list_push_front(list, node);
|
|
||||||
return;
|
|
||||||
} else if (index == list->node_count) {
|
|
||||||
wapp_str8_list_push_back(list, node);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Node *dst_node = wapp_str8_list_get(list, index);
|
|
||||||
if (!dst_node) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8List node_list = str8_node_to_list(node);
|
|
||||||
|
|
||||||
list->node_count += node_list.node_count;
|
|
||||||
|
|
||||||
Str8Node *prev = dst_node->prev;
|
|
||||||
|
|
||||||
dst_node->prev = node_list.last;
|
|
||||||
prev->next = node_list.first;
|
|
||||||
|
|
||||||
node_list.first->prev = prev;
|
|
||||||
node_list.last->next = dst_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Node *wapp_str8_list_pop_front(Str8List *list) {
|
|
||||||
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
|
||||||
|
|
||||||
Str8Node *output = NULL;
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
goto RETURN_STR8_LIST_POP_FRONT;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = list->first;
|
|
||||||
|
|
||||||
if (list->node_count == 1) {
|
|
||||||
*list = (Str8List){0};
|
|
||||||
goto RETURN_STR8_LIST_POP_FRONT;
|
|
||||||
}
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
list->first = output->next;
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_POP_FRONT:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Node *wapp_str8_list_pop_back(Str8List *list) {
|
|
||||||
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
|
||||||
|
|
||||||
Str8Node *output = NULL;
|
|
||||||
|
|
||||||
if (list->node_count == 0) {
|
|
||||||
goto RETURN_STR8_LIST_POP_BACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = list->last;
|
|
||||||
|
|
||||||
if (list->node_count == 1) {
|
|
||||||
*list = (Str8List){0};
|
|
||||||
goto RETURN_STR8_LIST_POP_BACK;
|
|
||||||
}
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
list->last = output->prev;
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_POP_BACK:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
Str8Node *wapp_str8_list_remove(Str8List *list, u64 index) {
|
|
||||||
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
|
||||||
|
|
||||||
Str8Node *output = NULL;
|
|
||||||
|
|
||||||
if (index == 0) {
|
|
||||||
output = wapp_str8_list_pop_front(list);
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
} else if (index == list->node_count) {
|
|
||||||
output = wapp_str8_list_pop_back(list);
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
output = wapp_str8_list_get(list, index);
|
|
||||||
if (!output) {
|
|
||||||
goto RETURN_STR8_LIST_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
output->prev->next = output->next;
|
|
||||||
output->next->prev = output->prev;
|
|
||||||
|
|
||||||
--(list->node_count);
|
|
||||||
|
|
||||||
output->prev = output->next = NULL;
|
|
||||||
|
|
||||||
RETURN_STR8_LIST_REMOVE:
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wapp_str8_list_empty(Str8List *list) {
|
|
||||||
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
|
||||||
|
|
||||||
u64 count = list->node_count;
|
|
||||||
for (u64 i = 0; i < count; ++i) {
|
|
||||||
wapp_str8_list_pop_back(list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index) {
|
VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index) {
|
||||||
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
||||||
@@ -377,6 +202,179 @@ void wapp_void_ptr_list_empty(VoidPList *list) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Str8Node *wapp_str8_list_get(const Str8List *list, u64 index) {
|
||||||
|
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
||||||
|
|
||||||
|
Str8Node *output = NULL;
|
||||||
|
Str8Node *current = list->first;
|
||||||
|
for (u64 i = 1; i <= index; ++i) {
|
||||||
|
current = current->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = current;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_list_push_front(Str8List *list, Str8Node *node) {
|
||||||
|
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
||||||
|
|
||||||
|
Str8List node_list = str8_node_to_list(node);
|
||||||
|
|
||||||
|
if (list->node_count == 0) {
|
||||||
|
*list = node_list;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
Str8Node *first = list->first;
|
||||||
|
if (first) {
|
||||||
|
first->prev = node_list.last;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->first = node_list.first;
|
||||||
|
node_list.last->next = first;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_list_push_back(Str8List *list, Str8Node *node) {
|
||||||
|
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
||||||
|
|
||||||
|
Str8List node_list = str8_node_to_list(node);
|
||||||
|
|
||||||
|
if (list->node_count == 0) {
|
||||||
|
*list = node_list;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
Str8Node *last = list->last;
|
||||||
|
if (last) {
|
||||||
|
last->next = node_list.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
list->last = node_list.last;
|
||||||
|
node_list.first->prev = last;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index) {
|
||||||
|
wapp_debug_assert(list != NULL && node != NULL && (node->item) != NULL, "`list`, `node` and `node->item` should not be NULL");
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
wapp_str8_list_push_front(list, node);
|
||||||
|
return;
|
||||||
|
} else if (index == list->node_count) {
|
||||||
|
wapp_str8_list_push_back(list, node);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Node *dst_node = wapp_str8_list_get(list, index);
|
||||||
|
if (!dst_node) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8List node_list = str8_node_to_list(node);
|
||||||
|
|
||||||
|
list->node_count += node_list.node_count;
|
||||||
|
|
||||||
|
Str8Node *prev = dst_node->prev;
|
||||||
|
|
||||||
|
dst_node->prev = node_list.last;
|
||||||
|
prev->next = node_list.first;
|
||||||
|
|
||||||
|
node_list.first->prev = prev;
|
||||||
|
node_list.last->next = dst_node;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Node *wapp_str8_list_pop_front(Str8List *list) {
|
||||||
|
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
||||||
|
|
||||||
|
Str8Node *output = NULL;
|
||||||
|
|
||||||
|
if (list->node_count == 0) {
|
||||||
|
goto RETURN_STR8_LIST_POP_FRONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = list->first;
|
||||||
|
|
||||||
|
if (list->node_count == 1) {
|
||||||
|
*list = (Str8List){0};
|
||||||
|
goto RETURN_STR8_LIST_POP_FRONT;
|
||||||
|
}
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
list->first = output->next;
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_STR8_LIST_POP_FRONT:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Node *wapp_str8_list_pop_back(Str8List *list) {
|
||||||
|
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
||||||
|
|
||||||
|
Str8Node *output = NULL;
|
||||||
|
|
||||||
|
if (list->node_count == 0) {
|
||||||
|
goto RETURN_STR8_LIST_POP_BACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = list->last;
|
||||||
|
|
||||||
|
if (list->node_count == 1) {
|
||||||
|
*list = (Str8List){0};
|
||||||
|
goto RETURN_STR8_LIST_POP_BACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
list->last = output->prev;
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_STR8_LIST_POP_BACK:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str8Node *wapp_str8_list_remove(Str8List *list, u64 index) {
|
||||||
|
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
||||||
|
|
||||||
|
Str8Node *output = NULL;
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
output = wapp_str8_list_pop_front(list);
|
||||||
|
goto RETURN_STR8_LIST_REMOVE;
|
||||||
|
} else if (index == list->node_count) {
|
||||||
|
output = wapp_str8_list_pop_back(list);
|
||||||
|
goto RETURN_STR8_LIST_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
output = wapp_str8_list_get(list, index);
|
||||||
|
if (!output) {
|
||||||
|
goto RETURN_STR8_LIST_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
output->prev->next = output->next;
|
||||||
|
output->next->prev = output->prev;
|
||||||
|
|
||||||
|
--(list->node_count);
|
||||||
|
|
||||||
|
output->prev = output->next = NULL;
|
||||||
|
|
||||||
|
RETURN_STR8_LIST_REMOVE:
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_list_empty(Str8List *list) {
|
||||||
|
wapp_debug_assert(list != NULL, "`list` should not be NULL");
|
||||||
|
|
||||||
|
u64 count = list->node_count;
|
||||||
|
for (u64 i = 0; i < count; ++i) {
|
||||||
|
wapp_str8_list_pop_back(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
B32Node *wapp_b32_list_get(const B32List *list, u64 index) {
|
B32Node *wapp_b32_list_get(const B32List *list, u64 index) {
|
||||||
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
wapp_runtime_assert(index < list->node_count, "`index` is out of bounds");
|
||||||
|
|
||||||
@@ -3491,23 +3489,7 @@ void wapp_uptr_list_empty(UptrList *list) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Str8List str8_node_to_list(Str8Node *node) {
|
wapp_intern VoidPList void_ptr_node_to_list(VoidPNode *node) {
|
||||||
Str8List output = {.first = node, .last = node, .node_count = 1};
|
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
|
||||||
output.first = output.first->prev;
|
|
||||||
++(output.node_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (output.last->next != NULL) {
|
|
||||||
output.last = output.last->next;
|
|
||||||
++(output.node_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal VoidPList void_ptr_node_to_list(VoidPNode *node) {
|
|
||||||
VoidPList output = {.first = node, .last = node, .node_count = 1};
|
VoidPList output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3523,7 +3505,23 @@ internal VoidPList void_ptr_node_to_list(VoidPNode *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal B32List b32_node_to_list(B32Node *node) {
|
wapp_intern Str8List str8_node_to_list(Str8Node *node) {
|
||||||
|
Str8List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
|
while (output.first->prev != NULL) {
|
||||||
|
output.first = output.first->prev;
|
||||||
|
++(output.node_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (output.last->next != NULL) {
|
||||||
|
output.last = output.last->next;
|
||||||
|
++(output.node_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
wapp_intern B32List b32_node_to_list(B32Node *node) {
|
||||||
B32List output = {.first = node, .last = node, .node_count = 1};
|
B32List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3539,7 +3537,7 @@ internal B32List b32_node_to_list(B32Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal CharList char_node_to_list(CharNode *node) {
|
wapp_intern CharList char_node_to_list(CharNode *node) {
|
||||||
CharList output = {.first = node, .last = node, .node_count = 1};
|
CharList output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3555,7 +3553,7 @@ internal CharList char_node_to_list(CharNode *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal C8List c8_node_to_list(C8Node *node) {
|
wapp_intern C8List c8_node_to_list(C8Node *node) {
|
||||||
C8List output = {.first = node, .last = node, .node_count = 1};
|
C8List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3571,7 +3569,7 @@ internal C8List c8_node_to_list(C8Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal C16List c16_node_to_list(C16Node *node) {
|
wapp_intern C16List c16_node_to_list(C16Node *node) {
|
||||||
C16List output = {.first = node, .last = node, .node_count = 1};
|
C16List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3587,7 +3585,7 @@ internal C16List c16_node_to_list(C16Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal C32List c32_node_to_list(C32Node *node) {
|
wapp_intern C32List c32_node_to_list(C32Node *node) {
|
||||||
C32List output = {.first = node, .last = node, .node_count = 1};
|
C32List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3603,7 +3601,7 @@ internal C32List c32_node_to_list(C32Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal I8List i8_node_to_list(I8Node *node) {
|
wapp_intern I8List i8_node_to_list(I8Node *node) {
|
||||||
I8List output = {.first = node, .last = node, .node_count = 1};
|
I8List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3619,7 +3617,7 @@ internal I8List i8_node_to_list(I8Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal I16List i16_node_to_list(I16Node *node) {
|
wapp_intern I16List i16_node_to_list(I16Node *node) {
|
||||||
I16List output = {.first = node, .last = node, .node_count = 1};
|
I16List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3635,7 +3633,7 @@ internal I16List i16_node_to_list(I16Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal I32List i32_node_to_list(I32Node *node) {
|
wapp_intern I32List i32_node_to_list(I32Node *node) {
|
||||||
I32List output = {.first = node, .last = node, .node_count = 1};
|
I32List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3651,7 +3649,7 @@ internal I32List i32_node_to_list(I32Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal I64List i64_node_to_list(I64Node *node) {
|
wapp_intern I64List i64_node_to_list(I64Node *node) {
|
||||||
I64List output = {.first = node, .last = node, .node_count = 1};
|
I64List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3667,7 +3665,7 @@ internal I64List i64_node_to_list(I64Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U8List u8_node_to_list(U8Node *node) {
|
wapp_intern U8List u8_node_to_list(U8Node *node) {
|
||||||
U8List output = {.first = node, .last = node, .node_count = 1};
|
U8List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3683,7 +3681,7 @@ internal U8List u8_node_to_list(U8Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U16List u16_node_to_list(U16Node *node) {
|
wapp_intern U16List u16_node_to_list(U16Node *node) {
|
||||||
U16List output = {.first = node, .last = node, .node_count = 1};
|
U16List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3699,7 +3697,7 @@ internal U16List u16_node_to_list(U16Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U32List u32_node_to_list(U32Node *node) {
|
wapp_intern U32List u32_node_to_list(U32Node *node) {
|
||||||
U32List output = {.first = node, .last = node, .node_count = 1};
|
U32List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3715,7 +3713,7 @@ internal U32List u32_node_to_list(U32Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U64List u64_node_to_list(U64Node *node) {
|
wapp_intern U64List u64_node_to_list(U64Node *node) {
|
||||||
U64List output = {.first = node, .last = node, .node_count = 1};
|
U64List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3731,7 +3729,7 @@ internal U64List u64_node_to_list(U64Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal F32List f32_node_to_list(F32Node *node) {
|
wapp_intern F32List f32_node_to_list(F32Node *node) {
|
||||||
F32List output = {.first = node, .last = node, .node_count = 1};
|
F32List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3747,7 +3745,7 @@ internal F32List f32_node_to_list(F32Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal F64List f64_node_to_list(F64Node *node) {
|
wapp_intern F64List f64_node_to_list(F64Node *node) {
|
||||||
F64List output = {.first = node, .last = node, .node_count = 1};
|
F64List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3763,7 +3761,7 @@ internal F64List f64_node_to_list(F64Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal F128List f128_node_to_list(F128Node *node) {
|
wapp_intern F128List f128_node_to_list(F128Node *node) {
|
||||||
F128List output = {.first = node, .last = node, .node_count = 1};
|
F128List output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3779,7 +3777,7 @@ internal F128List f128_node_to_list(F128Node *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IptrList iptr_node_to_list(IptrNode *node) {
|
wapp_intern IptrList iptr_node_to_list(IptrNode *node) {
|
||||||
IptrList output = {.first = node, .last = node, .node_count = 1};
|
IptrList output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
@@ -3795,7 +3793,7 @@ internal IptrList iptr_node_to_list(IptrNode *node) {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UptrList uptr_node_to_list(UptrNode *node) {
|
wapp_intern UptrList uptr_node_to_list(UptrNode *node) {
|
||||||
UptrList output = {.first = node, .last = node, .node_count = 1};
|
UptrList output = {.first = node, .last = node, .node_count = 1};
|
||||||
|
|
||||||
while (output.first->prev != NULL) {
|
while (output.first->prev != NULL) {
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
/**
|
/**
|
||||||
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN
|
* THIS FILE IS AUTOMATICALLY GENERATED. ANY MODIFICATIONS TO IT WILL BE OVERWRITTEN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DBL_LIST_H
|
#ifndef DBL_LIST_H
|
||||||
#define DBL_LIST_H
|
#define DBL_LIST_H
|
||||||
|
|
||||||
#include "../../common/aliases/aliases.h"
|
|
||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
|
|
||||||
@@ -14,8 +13,8 @@ BEGIN_C_LINKAGE
|
|||||||
#endif // !WAPP_PLATFORM_CPP
|
#endif // !WAPP_PLATFORM_CPP
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
#define wapp_str8_list_node(ITEM_PTR) Str8Node{ITEM_PTR, nullptr, nullptr}
|
|
||||||
#define wapp_void_ptr_list_node(ITEM_PTR) VoidPNode{ITEM_PTR, nullptr, nullptr}
|
#define wapp_void_ptr_list_node(ITEM_PTR) VoidPNode{ITEM_PTR, nullptr, nullptr}
|
||||||
|
#define wapp_str8_list_node(ITEM_PTR) Str8Node{ITEM_PTR, nullptr, nullptr}
|
||||||
#define wapp_b32_list_node(ITEM_PTR) B32Node{ITEM_PTR, nullptr, nullptr}
|
#define wapp_b32_list_node(ITEM_PTR) B32Node{ITEM_PTR, nullptr, nullptr}
|
||||||
#define wapp_char_list_node(ITEM_PTR) CharNode{ITEM_PTR, nullptr, nullptr}
|
#define wapp_char_list_node(ITEM_PTR) CharNode{ITEM_PTR, nullptr, nullptr}
|
||||||
#define wapp_c8_list_node(ITEM_PTR) C8Node{ITEM_PTR, nullptr, nullptr}
|
#define wapp_c8_list_node(ITEM_PTR) C8Node{ITEM_PTR, nullptr, nullptr}
|
||||||
@@ -35,8 +34,8 @@ BEGIN_C_LINKAGE
|
|||||||
#define wapp_iptr_list_node(ITEM_PTR) IptrNode{ITEM_PTR, nullptr, nullptr}
|
#define wapp_iptr_list_node(ITEM_PTR) IptrNode{ITEM_PTR, nullptr, nullptr}
|
||||||
#define wapp_uptr_list_node(ITEM_PTR) UptrNode{ITEM_PTR, nullptr, nullptr}
|
#define wapp_uptr_list_node(ITEM_PTR) UptrNode{ITEM_PTR, nullptr, nullptr}
|
||||||
#else
|
#else
|
||||||
#define wapp_str8_list_node(ITEM_PTR) ((Str8Node){.item = ITEM_PTR})
|
|
||||||
#define wapp_void_ptr_list_node(ITEM_PTR) ((VoidPNode){.item = ITEM_PTR})
|
#define wapp_void_ptr_list_node(ITEM_PTR) ((VoidPNode){.item = ITEM_PTR})
|
||||||
|
#define wapp_str8_list_node(ITEM_PTR) ((Str8Node){.item = ITEM_PTR})
|
||||||
#define wapp_b32_list_node(ITEM_PTR) ((B32Node){.item = ITEM_PTR})
|
#define wapp_b32_list_node(ITEM_PTR) ((B32Node){.item = ITEM_PTR})
|
||||||
#define wapp_char_list_node(ITEM_PTR) ((CharNode){.item = ITEM_PTR})
|
#define wapp_char_list_node(ITEM_PTR) ((CharNode){.item = ITEM_PTR})
|
||||||
#define wapp_c8_list_node(ITEM_PTR) ((C8Node){.item = ITEM_PTR})
|
#define wapp_c8_list_node(ITEM_PTR) ((C8Node){.item = ITEM_PTR})
|
||||||
@@ -59,17 +58,17 @@ BEGIN_C_LINKAGE
|
|||||||
|
|
||||||
typedef struct str8 Str8;
|
typedef struct str8 Str8;
|
||||||
|
|
||||||
typedef struct Str8Node Str8Node;
|
typedef struct GenericNode GenericNode;
|
||||||
struct Str8Node {
|
struct GenericNode {
|
||||||
Str8 *item;
|
void *item;
|
||||||
Str8Node *prev;
|
GenericNode *prev;
|
||||||
Str8Node *next;
|
GenericNode *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Str8List Str8List;
|
typedef struct GenericList GenericList;
|
||||||
struct Str8List {
|
struct GenericList {
|
||||||
Str8Node *first;
|
GenericNode *first;
|
||||||
Str8Node *last;
|
GenericNode *last;
|
||||||
u64 node_count;
|
u64 node_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,6 +86,20 @@ struct VoidPList {
|
|||||||
u64 node_count;
|
u64 node_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct Str8Node Str8Node;
|
||||||
|
struct Str8Node {
|
||||||
|
Str8 *item;
|
||||||
|
Str8Node *prev;
|
||||||
|
Str8Node *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct Str8List Str8List;
|
||||||
|
struct Str8List {
|
||||||
|
Str8Node *first;
|
||||||
|
Str8Node *last;
|
||||||
|
u64 node_count;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct B32Node B32Node;
|
typedef struct B32Node B32Node;
|
||||||
struct B32Node {
|
struct B32Node {
|
||||||
b32 *item;
|
b32 *item;
|
||||||
@@ -339,14 +352,6 @@ struct UptrList {
|
|||||||
u64 node_count;
|
u64 node_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
Str8Node *wapp_str8_list_get(const Str8List *list, u64 index);
|
|
||||||
void wapp_str8_list_push_front(Str8List *list, Str8Node *node);
|
|
||||||
void wapp_str8_list_push_back(Str8List *list, Str8Node *node);
|
|
||||||
void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index);
|
|
||||||
Str8Node *wapp_str8_list_pop_front(Str8List *list);
|
|
||||||
Str8Node *wapp_str8_list_pop_back(Str8List *list);
|
|
||||||
Str8Node *wapp_str8_list_remove(Str8List *list, u64 index);
|
|
||||||
void wapp_str8_list_empty(Str8List *list);
|
|
||||||
VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index);
|
VoidPNode *wapp_void_ptr_list_get(const VoidPList *list, u64 index);
|
||||||
void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node);
|
void wapp_void_ptr_list_push_front(VoidPList *list, VoidPNode *node);
|
||||||
void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node);
|
void wapp_void_ptr_list_push_back(VoidPList *list, VoidPNode *node);
|
||||||
@@ -355,6 +360,14 @@ VoidPNode *wapp_void_ptr_list_pop_front(VoidPList *list);
|
|||||||
VoidPNode *wapp_void_ptr_list_pop_back(VoidPList *list);
|
VoidPNode *wapp_void_ptr_list_pop_back(VoidPList *list);
|
||||||
VoidPNode *wapp_void_ptr_list_remove(VoidPList *list, u64 index);
|
VoidPNode *wapp_void_ptr_list_remove(VoidPList *list, u64 index);
|
||||||
void wapp_void_ptr_list_empty(VoidPList *list);
|
void wapp_void_ptr_list_empty(VoidPList *list);
|
||||||
|
Str8Node *wapp_str8_list_get(const Str8List *list, u64 index);
|
||||||
|
void wapp_str8_list_push_front(Str8List *list, Str8Node *node);
|
||||||
|
void wapp_str8_list_push_back(Str8List *list, Str8Node *node);
|
||||||
|
void wapp_str8_list_insert(Str8List *list, Str8Node *node, u64 index);
|
||||||
|
Str8Node *wapp_str8_list_pop_front(Str8List *list);
|
||||||
|
Str8Node *wapp_str8_list_pop_back(Str8List *list);
|
||||||
|
Str8Node *wapp_str8_list_remove(Str8List *list, u64 index);
|
||||||
|
void wapp_str8_list_empty(Str8List *list);
|
||||||
B32Node *wapp_b32_list_get(const B32List *list, u64 index);
|
B32Node *wapp_b32_list_get(const B32List *list, u64 index);
|
||||||
void wapp_b32_list_push_front(B32List *list, B32Node *node);
|
void wapp_b32_list_push_front(B32List *list, B32Node *node);
|
||||||
void wapp_b32_list_push_back(B32List *list, B32Node *node);
|
void wapp_b32_list_push_back(B32List *list, B32Node *node);
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/assert/assert.h"
|
#include "../../../common/assert/assert.h"
|
||||||
#include "../../mem_allocator/mem_allocator.h"
|
#include "../../mem_allocator/mem_allocator.h"
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(Str8) + sizeof(c8) * CAPACITY)
|
#define STR8_BUF_ALLOC_SIZE(CAPACITY) (sizeof(Str8) + sizeof(c8) * CAPACITY)
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ void wapp_str8_push_back(Str8 *str, c8 c) {
|
|||||||
wapp_str8_set(str, index, c);
|
wapp_str8_set(str, index, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wapp_str8_equal(Str8RO *s1, Str8RO *s2) {
|
b32 wapp_str8_equal(Str8RO *s1, Str8RO *s2) {
|
||||||
if (s1->size != s2->size) {
|
if (s1->size != s2->size) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -131,7 +131,7 @@ bool wapp_str8_equal(Str8RO *s1, Str8RO *s2) {
|
|||||||
return wapp_str8_equal_to_count(s1, s2, s1->size);
|
return wapp_str8_equal_to_count(s1, s2, s1->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) {
|
b32 wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count) {
|
||||||
if (!s1 || !s2) {
|
if (!s1 || !s2) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -163,7 +163,7 @@ Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src)
|
|||||||
u64 remaining = dst->capacity - dst->size;
|
u64 remaining = dst->capacity - dst->size;
|
||||||
if (src->size <= remaining) {
|
if (src->size <= remaining) {
|
||||||
output = dst;
|
output = dst;
|
||||||
goto COPY_STRING_STR8_CONCAT;
|
goto SOURCE_STRING_STR8_CONCAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 capacity = dst->capacity + src->size;
|
u64 capacity = dst->capacity + src->size;
|
||||||
@@ -175,7 +175,7 @@ Str8 *wapp_str8_alloc_concat(const Allocator *allocator, Str8 *dst, Str8RO *src)
|
|||||||
|
|
||||||
wapp_str8_concat_capped(output, dst);
|
wapp_str8_concat_capped(output, dst);
|
||||||
|
|
||||||
COPY_STRING_STR8_CONCAT:
|
SOURCE_STRING_STR8_CONCAT:
|
||||||
wapp_str8_concat_capped(output, src);
|
wapp_str8_concat_capped(output, src);
|
||||||
|
|
||||||
RETURN_STR8_CONCAT:
|
RETURN_STR8_CONCAT:
|
||||||
@@ -240,6 +240,36 @@ void wapp_str8_format(Str8 *dst, const char *format, ...) {
|
|||||||
va_end(args2);
|
va_end(args2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wapp_str8_to_lower(Str8 *dst, Str8RO *src) {
|
||||||
|
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
|
||||||
|
wapp_debug_assert(dst->capacity >= src->capacity, "`dst` does not have enough capacity");
|
||||||
|
|
||||||
|
dst->size = src->size;
|
||||||
|
for (u64 i = 0; i < src->size; ++i) {
|
||||||
|
wapp_str8_set(dst, i, tolower(wapp_str8_get(src, i)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_to_upper(Str8 *dst, Str8RO *src) {
|
||||||
|
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
|
||||||
|
wapp_debug_assert(dst->capacity >= src->capacity, "`dst` does not have enough capacity");
|
||||||
|
|
||||||
|
dst->size = src->size;
|
||||||
|
for (u64 i = 0; i < src->size; ++i) {
|
||||||
|
wapp_str8_set(dst, i, toupper(wapp_str8_get(src, i)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wapp_str8_from_bytes(Str8 *dst, const U8Array *src) {
|
||||||
|
u64 size = src->count * src->item_size;
|
||||||
|
|
||||||
|
wapp_debug_assert(src != NULL && dst != NULL, "`dst` and `src` should not be NULL");
|
||||||
|
wapp_debug_assert(dst->capacity >= size, "`dst` does not have enough capacity");
|
||||||
|
|
||||||
|
dst->size = size;
|
||||||
|
memcpy(dst->buf, src->items, size);
|
||||||
|
}
|
||||||
|
|
||||||
i64 wapp_str8_find(Str8RO *str, Str8RO substr) {
|
i64 wapp_str8_find(Str8RO *str, Str8RO substr) {
|
||||||
if (!str || substr.size > str->size) {
|
if (!str || substr.size > str->size) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -248,7 +278,7 @@ i64 wapp_str8_find(Str8RO *str, Str8RO substr) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
u64 char_index = 0;
|
u64 char_index = 0;
|
||||||
bool running = char_index < str->size;
|
b32 running = char_index < str->size;
|
||||||
while (running) {
|
while (running) {
|
||||||
const c8 *sub = str->buf + char_index;
|
const c8 *sub = str->buf + char_index;
|
||||||
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
||||||
@@ -270,7 +300,7 @@ i64 wapp_str8_rfind(Str8RO *str, Str8RO substr) {
|
|||||||
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
i64 char_index = str->size - substr.size;
|
i64 char_index = str->size - substr.size;
|
||||||
bool running = char_index >= 0;
|
b32 running = char_index >= 0;
|
||||||
while (running) {
|
while (running) {
|
||||||
const c8 *sub = str->buf + char_index;
|
const c8 *sub = str->buf + char_index;
|
||||||
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
if (memcmp(sub, substr.buf, substr.size) == 0) {
|
||||||
@@ -397,7 +427,7 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *d
|
|||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
Str8Node *node;
|
Str8Node *node;
|
||||||
u64 node_index = 0;
|
u64 node_index = 0;
|
||||||
bool running = node_index < list->node_count;
|
b32 running = node_index < list->node_count;
|
||||||
while (running) {
|
while (running) {
|
||||||
node = wapp_str8_list_get(list, node_index);
|
node = wapp_str8_list_get(list, node_index);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
@@ -408,7 +438,7 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8RO *d
|
|||||||
|
|
||||||
// NOTE (Abdelrahman): Comparison extracted to variable to silence
|
// NOTE (Abdelrahman): Comparison extracted to variable to silence
|
||||||
// MSVC Spectre mitigation warnings
|
// MSVC Spectre mitigation warnings
|
||||||
bool not_last = node_index + 1 < list->node_count;
|
b32 not_last = node_index + 1 < list->node_count;
|
||||||
if (not_last) {
|
if (not_last) {
|
||||||
wapp_str8_concat_capped(output, delimiter);
|
wapp_str8_concat_capped(output, delimiter);
|
||||||
}
|
}
|
||||||
@@ -430,7 +460,7 @@ u64 wapp_str8_list_total_size(const Str8List *list) {
|
|||||||
Str8Node* node;
|
Str8Node* node;
|
||||||
u64 node_index = 0;
|
u64 node_index = 0;
|
||||||
u64 output = 0;
|
u64 output = 0;
|
||||||
bool running = node_index < list->node_count;
|
b32 running = node_index < list->node_count;
|
||||||
while (running) {
|
while (running) {
|
||||||
node = wapp_str8_list_get(list, node_index);
|
node = wapp_str8_list_get(list, node_index);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
#include "../../../common/aliases/aliases.h"
|
#include "../../../common/aliases/aliases.h"
|
||||||
#include "../../../common/assert/assert.h"
|
#include "../../../common/assert/assert.h"
|
||||||
#include "../../../common/platform/platform.h"
|
#include "../../../common/platform/platform.h"
|
||||||
|
#include "../../../primitives/array/array.h"
|
||||||
#include "../../../primitives/dbl_list/dbl_list.h"
|
#include "../../../primitives/dbl_list/dbl_list.h"
|
||||||
#include "../../mem_allocator/mem_allocator.h"
|
#include "../../mem_allocator/mem_allocator.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
@@ -37,14 +37,14 @@ typedef const Str8 Str8RO;
|
|||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
// Uses a lambda to achieve the same behaviour achieved by the C macro
|
// Uses a lambda to achieve the same behaviour achieved by the C macro
|
||||||
#define wapp_str8_buf(CAPACITY) ([&](){ \
|
#define wapp_str8_buf(CAPACITY) ([&](){ \
|
||||||
persistent c8 buf[CAPACITY] = {}; \
|
wapp_persist c8 buf[CAPACITY] = {}; \
|
||||||
memset(buf, 0, CAPACITY); \
|
memset(buf, 0, CAPACITY); \
|
||||||
return Str8{CAPACITY, 0, buf}; \
|
return Str8{CAPACITY, 0, buf}; \
|
||||||
}())
|
}())
|
||||||
|
|
||||||
// Uses a lambda to achieve the same behaviour achieved by the C macro
|
// Uses a lambda to achieve the same behaviour achieved by the C macro
|
||||||
#define wapp_str8_lit(STRING) ([&]() { \
|
#define wapp_str8_lit(STRING) ([&]() { \
|
||||||
persistent c8 buf[sizeof(STRING) * 2] = {}; \
|
wapp_persist c8 buf[sizeof(STRING) * 2] = {}; \
|
||||||
memcpy(buf, STRING, sizeof(STRING)); \
|
memcpy(buf, STRING, sizeof(STRING)); \
|
||||||
return Str8{(sizeof(STRING) - 1) * 2, sizeof(STRING) - 1, buf}; \
|
return Str8{(sizeof(STRING) - 1) * 2, sizeof(STRING) - 1, buf}; \
|
||||||
}())
|
}())
|
||||||
@@ -89,14 +89,17 @@ void wapp_str8_dealloc_buf(const Allocator *allocator, Str8 **str);
|
|||||||
c8 wapp_str8_get(Str8RO *str, u64 index);
|
c8 wapp_str8_get(Str8RO *str, u64 index);
|
||||||
void wapp_str8_set(Str8 *str, u64 index, c8 c);
|
void wapp_str8_set(Str8 *str, u64 index, c8 c);
|
||||||
void wapp_str8_push_back(Str8 *str, c8 c);
|
void wapp_str8_push_back(Str8 *str, c8 c);
|
||||||
bool wapp_str8_equal(Str8RO *s1, Str8RO *s2);
|
b32 wapp_str8_equal(Str8RO *s1, Str8RO *s2);
|
||||||
bool wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count);
|
b32 wapp_str8_equal_to_count(Str8RO* s1, Str8RO* s2, u64 count);
|
||||||
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end);
|
Str8 wapp_str8_slice(Str8RO *str, u64 start, u64 end);
|
||||||
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src);
|
void wapp_str8_concat_capped(Str8 *dst, Str8RO *src);
|
||||||
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src);
|
void wapp_str8_copy_cstr_capped(Str8 *dst, const char *src);
|
||||||
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src);
|
void wapp_str8_copy_str8_capped(Str8 *dst, Str8RO *src);
|
||||||
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity);
|
void wapp_str8_copy_to_cstr(char *dst, Str8RO *src, u64 dst_capacity);
|
||||||
void wapp_str8_format(Str8 *dst, const char *format, ...);
|
void wapp_str8_format(Str8 *dst, const char *format, ...);
|
||||||
|
void wapp_str8_to_lower(Str8 *dst, Str8RO *src);
|
||||||
|
void wapp_str8_to_upper(Str8 *dst, Str8RO *src);
|
||||||
|
void wapp_str8_from_bytes(Str8 *dst, const U8Array *src);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Str8 find functions
|
* Str8 find functions
|
||||||
@@ -118,11 +121,11 @@ Str8 *wapp_str8_join(const Allocator *allocator, const Str8List *list, Str8R
|
|||||||
*/
|
*/
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
#define wapp_str8_node_from_cstr(STRING) wapp_str8_list_node([&]() { \
|
#define wapp_str8_node_from_cstr(STRING) wapp_str8_list_node([&]() { \
|
||||||
persistent Str8 str = wapp_str8_lit(STRING); \
|
wapp_persist Str8 str = wapp_str8_lit(STRING); \
|
||||||
return &str; \
|
return &str; \
|
||||||
}())
|
}())
|
||||||
#define wapp_str8_node_from_str8(STRING) wapp_str8_list_node([&]() { \
|
#define wapp_str8_node_from_str8(STRING) wapp_str8_list_node([&]() { \
|
||||||
persistent Str8 str = STRING; \
|
wapp_persist Str8 str = STRING; \
|
||||||
return &str; \
|
return &str; \
|
||||||
}())
|
}())
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "../../common/aliases/aliases.h"
|
#include "../../common/aliases/aliases.h"
|
||||||
#include "../../common/assert/assert.h"
|
#include "../../common/assert/assert.h"
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@@ -13,13 +12,13 @@ struct split_mix_64_state {
|
|||||||
u64 seed;
|
u64 seed;
|
||||||
};
|
};
|
||||||
|
|
||||||
internal u64 rol64(u64 x, u64 bits);
|
wapp_intern u64 rol64(u64 x, u64 bits);
|
||||||
internal u64 split_mix_64(SplitMix64State *state);
|
wapp_intern u64 split_mix_64(SplitMix64State *state);
|
||||||
internal void seed_os_generator(void);
|
wapp_intern void seed_os_generator(void);
|
||||||
internal u64 generate_random_number(void);
|
wapp_intern u64 generate_random_number(void);
|
||||||
|
|
||||||
XOR256State wapp_prng_xorshift_init_state(void) {
|
XOR256State wapp_prng_xorshift_init_state(void) {
|
||||||
persistent bool seeded = false;
|
wapp_persist b32 seeded = false;
|
||||||
if (!seeded) {
|
if (!seeded) {
|
||||||
seeded = true;
|
seeded = true;
|
||||||
seed_os_generator();
|
seed_os_generator();
|
||||||
@@ -76,11 +75,11 @@ u64 wapp_prng_xorshift_256p(XOR256State *state) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 rol64(u64 x, u64 bits) {
|
wapp_intern u64 rol64(u64 x, u64 bits) {
|
||||||
return (x << bits) | (x >> (64 - bits));
|
return (x << bits) | (x >> (64 - bits));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 split_mix_64(SplitMix64State *state) {
|
wapp_intern u64 split_mix_64(SplitMix64State *state) {
|
||||||
state->seed += 0x9E3779B97f4A7C15;
|
state->seed += 0x9E3779B97f4A7C15;
|
||||||
|
|
||||||
u64 result = state->seed;
|
u64 result = state->seed;
|
||||||
@@ -92,7 +91,7 @@ internal u64 split_mix_64(SplitMix64State *state) {
|
|||||||
|
|
||||||
#if defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION
|
#if defined(WAPP_PLATFORM_C) && WAPP_PLATFORM_C_VERSION >= WAPP_PLATFORM_C11_VERSION
|
||||||
#ifdef WAPP_PLATFORM_POSIX
|
#ifdef WAPP_PLATFORM_POSIX
|
||||||
internal void seed_os_generator(void) {
|
wapp_intern void seed_os_generator(void) {
|
||||||
struct timespec ts = {0};
|
struct timespec ts = {0};
|
||||||
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
int result = clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
|
||||||
wapp_runtime_assert(result == 0, "Invalid seed value");
|
wapp_runtime_assert(result == 0, "Invalid seed value");
|
||||||
@@ -100,11 +99,11 @@ internal void seed_os_generator(void) {
|
|||||||
srand48(ts.tv_nsec);
|
srand48(ts.tv_nsec);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 generate_random_number(void) {
|
wapp_intern u64 generate_random_number(void) {
|
||||||
return lrand48();
|
return lrand48();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
internal void seed_os_generator(void) {
|
wapp_intern void seed_os_generator(void) {
|
||||||
struct timespec ts = {0};
|
struct timespec ts = {0};
|
||||||
int result = timespec_get(&ts, TIME_UTC);
|
int result = timespec_get(&ts, TIME_UTC);
|
||||||
wapp_runtime_assert(result != 0, "Invalid seed value");
|
wapp_runtime_assert(result != 0, "Invalid seed value");
|
||||||
@@ -112,7 +111,7 @@ internal void seed_os_generator(void) {
|
|||||||
srand(ts.tv_nsec);
|
srand(ts.tv_nsec);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 generate_random_number(void) {
|
wapp_intern u64 generate_random_number(void) {
|
||||||
i32 n1 = rand();
|
i32 n1 = rand();
|
||||||
i32 n2 = rand();
|
i32 n2 = rand();
|
||||||
|
|
||||||
@@ -120,14 +119,14 @@ internal u64 generate_random_number(void) {
|
|||||||
}
|
}
|
||||||
#endif // !WAPP_PLATFORM_POSIX
|
#endif // !WAPP_PLATFORM_POSIX
|
||||||
#else
|
#else
|
||||||
internal void seed_os_generator(void) {
|
wapp_intern void seed_os_generator(void) {
|
||||||
time_t result = time(NULL);
|
time_t result = time(NULL);
|
||||||
wapp_runtime_assert(result != (time_t)(-1), "Invalid seed value");
|
wapp_runtime_assert(result != (time_t)(-1), "Invalid seed value");
|
||||||
|
|
||||||
srand(result);
|
srand(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal u64 generate_random_number(void) {
|
wapp_intern u64 generate_random_number(void) {
|
||||||
i32 n1 = rand();
|
i32 n1 = rand();
|
||||||
i32 n2 = rand();
|
i32 n2 = rand();
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
internal void handle_test_result(TestFuncResult result);
|
wapp_intern void handle_test_result(TestFuncResult result);
|
||||||
|
|
||||||
void run_tests(TestFunc *func1, ...) {
|
void run_tests(TestFunc *func1, ...) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@@ -32,7 +32,7 @@ void run_tests(TestFunc *func1, ...) {
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void handle_test_result(TestFuncResult result) {
|
wapp_intern void handle_test_result(TestFuncResult result) {
|
||||||
TerminalColour colour;
|
TerminalColour colour;
|
||||||
Str8 result_text = wapp_str8_buf(64);
|
Str8 result_text = wapp_str8_buf(64);
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "../../common/misc/misc_utils.h"
|
#include "../../common/misc/misc_utils.h"
|
||||||
#include "../../common/platform/platform.h"
|
#include "../../common/platform/platform.h"
|
||||||
#include "../../primitives/strings/str8/str8.h"
|
#include "../../primitives/strings/str8/str8.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_CPP
|
#ifdef WAPP_PLATFORM_CPP
|
||||||
BEGIN_C_LINKAGE
|
BEGIN_C_LINKAGE
|
||||||
@@ -23,10 +22,10 @@ BEGIN_C_LINKAGE
|
|||||||
typedef struct test_func_result TestFuncResult;
|
typedef struct test_func_result TestFuncResult;
|
||||||
struct test_func_result {
|
struct test_func_result {
|
||||||
Str8RO name;
|
Str8RO name;
|
||||||
bool passed;
|
b32 passed;
|
||||||
|
|
||||||
#ifdef WAPP_PLATFORM_WINDOWS
|
#ifdef WAPP_PLATFORM_WINDOWS
|
||||||
wapp_misc_utils_padding_size(sizeof(Str8RO) + sizeof(bool));
|
wapp_misc_utils_padding_size(sizeof(Str8RO) + sizeof(b32));
|
||||||
#endif // WAPP_PLATFORM_WINDOWS
|
#endif // WAPP_PLATFORM_WINDOWS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
#include "../common/assert/assert.h"
|
#include "../common/assert/assert.h"
|
||||||
#include "../primitives/strings/str8/str8.h"
|
#include "../primitives/strings/str8/str8.h"
|
||||||
#include "../prng/xorshift/xorshift.h"
|
#include "../prng/xorshift/xorshift.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#define UUID_STR_FORMAT ("%.8" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.12" PRIx64)
|
#define UUID_STR_FORMAT ("%.8" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.12" PRIx64)
|
||||||
@@ -16,8 +15,8 @@ struct uuid4 {
|
|||||||
u64 low;
|
u64 low;
|
||||||
};
|
};
|
||||||
|
|
||||||
internal UUID4 generate_uuid4(void);
|
wapp_intern UUID4 generate_uuid4(void);
|
||||||
internal void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid);
|
wapp_intern void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid);
|
||||||
|
|
||||||
UUID *wapp_uuid_init_uuid4(UUID *uuid) {
|
UUID *wapp_uuid_init_uuid4(UUID *uuid) {
|
||||||
wapp_debug_assert(uuid != NULL, "`uuid` should not be NULL");
|
wapp_debug_assert(uuid != NULL, "`uuid` should not be NULL");
|
||||||
@@ -28,9 +27,9 @@ UUID *wapp_uuid_init_uuid4(UUID *uuid) {
|
|||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UUID4 generate_uuid4(void) {
|
wapp_intern UUID4 generate_uuid4(void) {
|
||||||
persistent XOR256State state = {0};
|
wapp_persist XOR256State state = {0};
|
||||||
persistent bool initialised = false;
|
wapp_persist b32 initialised = false;
|
||||||
|
|
||||||
if (!initialised) {
|
if (!initialised) {
|
||||||
initialised = true;
|
initialised = true;
|
||||||
@@ -48,7 +47,7 @@ internal UUID4 generate_uuid4(void) {
|
|||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid) {
|
wapp_intern void uuid4_to_uuid(const UUID4* uuid4, UUID *uuid) {
|
||||||
u64 grp1 = uuid4->high >> 32;
|
u64 grp1 = uuid4->high >> 32;
|
||||||
u64 grp2 = (uuid4->high << 32) >> 48;
|
u64 grp2 = (uuid4->high << 32) >> 48;
|
||||||
u64 grp3 = (uuid4->high << 48) >> 48;
|
u64 grp3 = (uuid4->high << 48) >> 48;
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#include "test_allocator.h"
|
#include "test_allocator.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
TestFuncResult test_arena_allocator(void) {
|
TestFuncResult test_arena_allocator(void) {
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(4096);
|
Allocator allocator = wapp_mem_arena_allocator_init(4096);
|
||||||
bool result = allocator.obj != NULL && allocator.alloc != NULL &&
|
b32 result = allocator.obj != NULL && allocator.alloc != NULL &&
|
||||||
allocator.alloc_aligned != NULL &&
|
allocator.alloc_aligned != NULL &&
|
||||||
allocator.realloc != NULL && allocator.realloc_aligned != NULL &&
|
allocator.realloc != NULL && allocator.realloc_aligned != NULL &&
|
||||||
allocator.free == NULL;
|
allocator.free == NULL;
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#include "test_allocator.h"
|
#include "test_allocator.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
TestFuncResult test_arena_allocator(void) {
|
TestFuncResult test_arena_allocator(void) {
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(4096);
|
Allocator allocator = wapp_mem_arena_allocator_init(4096);
|
||||||
bool result = allocator.obj != nullptr && allocator.alloc != nullptr &&
|
b32 result = allocator.obj != nullptr && allocator.alloc != nullptr &&
|
||||||
allocator.alloc_aligned != nullptr &&
|
allocator.alloc_aligned != nullptr &&
|
||||||
allocator.realloc != nullptr && allocator.realloc_aligned != nullptr &&
|
allocator.realloc != nullptr && allocator.realloc_aligned != nullptr &&
|
||||||
allocator.free == nullptr;
|
allocator.free == nullptr;
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
#include "test_arena.h"
|
#include "test_arena.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ARENA_CAPACITY KB(16)
|
#define ARENA_CAPACITY KB(16)
|
||||||
|
|
||||||
internal Arena *arena = NULL;
|
wapp_intern Arena *arena = NULL;
|
||||||
internal i32 count = 20;
|
wapp_intern i32 count = 20;
|
||||||
internal i32 *array = NULL;
|
wapp_intern i32 *array = NULL;
|
||||||
|
|
||||||
TestFuncResult test_arena_init(void) {
|
TestFuncResult test_arena_init(void) {
|
||||||
bool result = wapp_mem_arena_init(&arena, ARENA_CAPACITY);
|
b32 result = wapp_mem_arena_init(&arena, ARENA_CAPACITY);
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
@@ -18,7 +17,7 @@ TestFuncResult test_arena_init(void) {
|
|||||||
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
||||||
Arena *large_arena = NULL;
|
Arena *large_arena = NULL;
|
||||||
u64 capacity = GB(512);
|
u64 capacity = GB(512);
|
||||||
bool result = wapp_mem_arena_init(&large_arena, capacity);
|
b32 result = wapp_mem_arena_init(&large_arena, capacity);
|
||||||
if (result) {
|
if (result) {
|
||||||
wapp_mem_arena_destroy(&large_arena);
|
wapp_mem_arena_destroy(&large_arena);
|
||||||
}
|
}
|
||||||
@@ -28,7 +27,7 @@ TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
||||||
array = wapp_mem_arena_alloc(arena, count * sizeof(i32));
|
array = wapp_mem_arena_alloc(arena, count * sizeof(i32));
|
||||||
bool result = array != NULL;
|
b32 result = array != NULL;
|
||||||
|
|
||||||
for (i32 i = 0; i < count; ++i) {
|
for (i32 i = 0; i < count; ++i) {
|
||||||
array[i] = i * 10;
|
array[i] = i * 10;
|
||||||
@@ -39,7 +38,7 @@ TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
|
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
|
||||||
u8 *bytes = wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2);
|
u8 *bytes = wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2);
|
||||||
bool result = bytes == NULL;
|
b32 result = bytes == NULL;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
@@ -92,7 +91,7 @@ TestFuncResult test_arena_realloc_smaller_size(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_clear(void) {
|
TestFuncResult test_arena_clear(void) {
|
||||||
wapp_mem_arena_clear(arena);
|
wapp_mem_arena_clear(arena);
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
for (i32 i = 0; i < count; ++i) {
|
for (i32 i = 0; i < count; ++i) {
|
||||||
if (array[i] != 0) {
|
if (array[i] != 0) {
|
||||||
@@ -106,7 +105,7 @@ TestFuncResult test_arena_clear(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_destroy(void) {
|
TestFuncResult test_arena_destroy(void) {
|
||||||
wapp_mem_arena_destroy(&arena);
|
wapp_mem_arena_destroy(&arena);
|
||||||
bool result = arena == NULL;
|
b32 result = arena == NULL;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
#include "test_arena.h"
|
#include "test_arena.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define ARENA_CAPACITY KB(16)
|
#define ARENA_CAPACITY KB(16)
|
||||||
|
|
||||||
internal Arena *arena = nullptr;
|
wapp_intern Arena *arena = nullptr;
|
||||||
internal i32 count = 20;
|
wapp_intern i32 count = 20;
|
||||||
internal i32 *array = nullptr;
|
wapp_intern i32 *array = nullptr;
|
||||||
|
|
||||||
TestFuncResult test_arena_init(void) {
|
TestFuncResult test_arena_init(void) {
|
||||||
bool result = wapp_mem_arena_init(&arena, ARENA_CAPACITY);
|
b32 result = wapp_mem_arena_init(&arena, ARENA_CAPACITY);
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
@@ -18,7 +17,7 @@ TestFuncResult test_arena_init(void) {
|
|||||||
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
||||||
Arena *large_arena = nullptr;
|
Arena *large_arena = nullptr;
|
||||||
u64 capacity = GB(512);
|
u64 capacity = GB(512);
|
||||||
bool result = wapp_mem_arena_init(&large_arena, capacity);
|
b32 result = wapp_mem_arena_init(&large_arena, capacity);
|
||||||
if (result) {
|
if (result) {
|
||||||
wapp_mem_arena_destroy(&large_arena);
|
wapp_mem_arena_destroy(&large_arena);
|
||||||
}
|
}
|
||||||
@@ -28,7 +27,7 @@ TestFuncResult test_arena_init_succeeds_when_reserving_very_large_size(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
||||||
array = (i32 *)wapp_mem_arena_alloc(arena, count * sizeof(i32));
|
array = (i32 *)wapp_mem_arena_alloc(arena, count * sizeof(i32));
|
||||||
bool result = array != nullptr;
|
b32 result = array != nullptr;
|
||||||
|
|
||||||
for (i32 i = 0; i < count; ++i) {
|
for (i32 i = 0; i < count; ++i) {
|
||||||
array[i] = i * 10;
|
array[i] = i * 10;
|
||||||
@@ -39,7 +38,7 @@ TestFuncResult test_arena_alloc_succeeds_when_within_capacity(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
|
TestFuncResult test_arena_alloc_fails_when_over_capacity(void) {
|
||||||
u8 *bytes = (u8 *)wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2);
|
u8 *bytes = (u8 *)wapp_mem_arena_alloc(arena, ARENA_CAPACITY * 2);
|
||||||
bool result = bytes == nullptr;
|
b32 result = bytes == nullptr;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
@@ -92,7 +91,7 @@ TestFuncResult test_arena_realloc_smaller_size(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_clear(void) {
|
TestFuncResult test_arena_clear(void) {
|
||||||
wapp_mem_arena_clear(arena);
|
wapp_mem_arena_clear(arena);
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
for (i32 i = 0; i < count; ++i) {
|
for (i32 i = 0; i < count; ++i) {
|
||||||
if (array[i] != 0) {
|
if (array[i] != 0) {
|
||||||
@@ -106,7 +105,7 @@ TestFuncResult test_arena_clear(void) {
|
|||||||
|
|
||||||
TestFuncResult test_arena_destroy(void) {
|
TestFuncResult test_arena_destroy(void) {
|
||||||
wapp_mem_arena_destroy(&arena);
|
wapp_mem_arena_destroy(&arena);
|
||||||
bool result = arena == nullptr;
|
b32 result = arena == nullptr;
|
||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
#include "test_i32_array.h"
|
#include "test_i32_array.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
TestFuncResult test_i32_array(void) {
|
TestFuncResult test_i32_array(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(1, 2, 3, 4, 5, 6, 7);
|
I32Array array = wapp_i32_array(1, 2, 3, 4, 5, 6, 7);
|
||||||
result = array.count == 7 && array.capacity == 16;
|
result = array.count == 7 && array.capacity == 16;
|
||||||
@@ -11,7 +10,7 @@ TestFuncResult test_i32_array(void) {
|
|||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
item = wapp_i32_array_get(&array, index);
|
item = wapp_i32_array_get(&array, index);
|
||||||
result = result && item && (*item == (i32)(index + 1));
|
result = result && item && (*item == (i32)(index + 1));
|
||||||
@@ -24,7 +23,7 @@ TestFuncResult test_i32_array(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_with_capacity(void) {
|
TestFuncResult test_i32_array_with_capacity(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array_with_capacity(64);
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
result = array.count == 0 && array.capacity == 64;
|
result = array.count == 0 && array.capacity == 64;
|
||||||
@@ -33,14 +32,14 @@ TestFuncResult test_i32_array_with_capacity(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_get(void) {
|
TestFuncResult test_i32_array_get(void) {
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
item = wapp_i32_array_get(&array, index);
|
item = wapp_i32_array_get(&array, index);
|
||||||
result = result && item && (*item == (i32)index);
|
result = result && item && (*item == (i32)index);
|
||||||
@@ -53,14 +52,14 @@ TestFuncResult test_i32_array_get(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_set(void) {
|
TestFuncResult test_i32_array_set(void) {
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
i32 num = (i32)(index * 2);
|
i32 num = (i32)(index * 2);
|
||||||
wapp_i32_array_set(&array, index, &num);
|
wapp_i32_array_set(&array, index, &num);
|
||||||
@@ -75,7 +74,7 @@ TestFuncResult test_i32_array_set(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_append_capped(void) {
|
TestFuncResult test_i32_array_append_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array_with_capacity(64);
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
wapp_i32_array_append_capped(&array, &((i32){10}));
|
wapp_i32_array_append_capped(&array, &((i32){10}));
|
||||||
@@ -93,7 +92,7 @@ TestFuncResult test_i32_array_append_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_extend_capped(void) {
|
TestFuncResult test_i32_array_extend_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4);
|
||||||
I32Array array2 = wapp_i32_array(10, 20);
|
I32Array array2 = wapp_i32_array(10, 20);
|
||||||
@@ -108,7 +107,7 @@ TestFuncResult test_i32_array_extend_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_clear(void) {
|
TestFuncResult test_i32_array_clear(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
result = array.count == 9;
|
result = array.count == 9;
|
||||||
@@ -121,7 +120,7 @@ TestFuncResult test_i32_array_clear(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_pop(void) {
|
TestFuncResult test_i32_array_pop(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array1 = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
I32Array array2 = wapp_i32_array_with_capacity(32);
|
I32Array array2 = wapp_i32_array_with_capacity(32);
|
||||||
@@ -135,7 +134,7 @@ TestFuncResult test_i32_array_pop(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_copy_capped(void) {
|
TestFuncResult test_i32_array_copy_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
||||||
@@ -146,7 +145,7 @@ TestFuncResult test_i32_array_copy_capped(void) {
|
|||||||
result = dst1.count == expected_count;
|
result = dst1.count == expected_count;
|
||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst1, index));
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst1, index));
|
||||||
|
|
||||||
@@ -171,7 +170,7 @@ TestFuncResult test_i32_array_copy_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_alloc_capacity(void) {
|
TestFuncResult test_i32_array_alloc_capacity(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
u64 capacity = 32;
|
u64 capacity = 32;
|
||||||
@@ -185,7 +184,7 @@ TestFuncResult test_i32_array_alloc_capacity(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_append_alloc(void) {
|
TestFuncResult test_i32_array_append_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
@@ -196,7 +195,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
|
|||||||
|
|
||||||
u64 count = 4;
|
u64 count = 4;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
i32 num = (i32)index;
|
i32 num = (i32)index;
|
||||||
arr_ptr = wapp_i32_array_append_alloc(&allocator, &array2, &num);
|
arr_ptr = wapp_i32_array_append_alloc(&allocator, &array2, &num);
|
||||||
@@ -212,7 +211,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_extend_alloc(void) {
|
TestFuncResult test_i32_array_extend_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
@@ -231,7 +230,7 @@ TestFuncResult test_i32_array_extend_alloc(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_copy_alloc(void) {
|
TestFuncResult test_i32_array_copy_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
@@ -244,7 +243,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
|
|||||||
result = array_ptr->count == expected_count && array_ptr == &dst1;
|
result = array_ptr->count == expected_count && array_ptr == &dst1;
|
||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
#include "test_i32_array.h"
|
#include "test_i32_array.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
TestFuncResult test_i32_array(void) {
|
TestFuncResult test_i32_array(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(1, 2, 3, 4, 5, 6, 7);
|
I32Array array = wapp_i32_array(1, 2, 3, 4, 5, 6, 7);
|
||||||
result = array.count == 7 && array.capacity == 16;
|
result = array.count == 7 && array.capacity == 16;
|
||||||
@@ -11,7 +10,7 @@ TestFuncResult test_i32_array(void) {
|
|||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
item = wapp_i32_array_get(&array, index);
|
item = wapp_i32_array_get(&array, index);
|
||||||
result = result && item && (*item == (i32)(index + 1));
|
result = result && item && (*item == (i32)(index + 1));
|
||||||
@@ -24,7 +23,7 @@ TestFuncResult test_i32_array(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_with_capacity(void) {
|
TestFuncResult test_i32_array_with_capacity(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array_with_capacity(64);
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
result = array.count == 0 && array.capacity == 64;
|
result = array.count == 0 && array.capacity == 64;
|
||||||
@@ -33,14 +32,14 @@ TestFuncResult test_i32_array_with_capacity(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_get(void) {
|
TestFuncResult test_i32_array_get(void) {
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
item = wapp_i32_array_get(&array, index);
|
item = wapp_i32_array_get(&array, index);
|
||||||
result = result && item && (*item == (i32)index);
|
result = result && item && (*item == (i32)index);
|
||||||
@@ -53,14 +52,14 @@ TestFuncResult test_i32_array_get(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_set(void) {
|
TestFuncResult test_i32_array_set(void) {
|
||||||
bool result = true;
|
b32 result = true;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
|
|
||||||
i32 *item;
|
i32 *item;
|
||||||
u64 count = array.count;
|
u64 count = array.count;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
i32 num = (i32)(index * 2);
|
i32 num = (i32)(index * 2);
|
||||||
wapp_i32_array_set(&array, index, &num);
|
wapp_i32_array_set(&array, index, &num);
|
||||||
@@ -75,7 +74,7 @@ TestFuncResult test_i32_array_set(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_append_capped(void) {
|
TestFuncResult test_i32_array_append_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array_with_capacity(64);
|
I32Array array = wapp_i32_array_with_capacity(64);
|
||||||
i32 item1 = 10;
|
i32 item1 = 10;
|
||||||
@@ -95,7 +94,7 @@ TestFuncResult test_i32_array_append_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_extend_capped(void) {
|
TestFuncResult test_i32_array_extend_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4);
|
||||||
I32Array array2 = wapp_i32_array(10, 20);
|
I32Array array2 = wapp_i32_array(10, 20);
|
||||||
@@ -110,7 +109,7 @@ TestFuncResult test_i32_array_extend_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_clear(void) {
|
TestFuncResult test_i32_array_clear(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
result = array.count == 9;
|
result = array.count == 9;
|
||||||
@@ -123,7 +122,7 @@ TestFuncResult test_i32_array_clear(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_pop(void) {
|
TestFuncResult test_i32_array_pop(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array array1 = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(0, 1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
I32Array array2 = wapp_i32_array_with_capacity(32);
|
I32Array array2 = wapp_i32_array_with_capacity(32);
|
||||||
@@ -137,7 +136,7 @@ TestFuncResult test_i32_array_pop(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_copy_capped(void) {
|
TestFuncResult test_i32_array_copy_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
I32Array dst1 = wapp_i32_array(1, 2, 3, 4, 5, 6);
|
||||||
@@ -148,7 +147,7 @@ TestFuncResult test_i32_array_copy_capped(void) {
|
|||||||
result = dst1.count == expected_count;
|
result = dst1.count == expected_count;
|
||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst1, index));
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(&dst1, index));
|
||||||
|
|
||||||
@@ -173,7 +172,7 @@ TestFuncResult test_i32_array_copy_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_alloc_capacity(void) {
|
TestFuncResult test_i32_array_alloc_capacity(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
u64 capacity = 32;
|
u64 capacity = 32;
|
||||||
@@ -187,7 +186,7 @@ TestFuncResult test_i32_array_alloc_capacity(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_append_alloc(void) {
|
TestFuncResult test_i32_array_append_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
@@ -199,7 +198,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
|
|||||||
|
|
||||||
u64 count = 4;
|
u64 count = 4;
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
i32 num = (i32)index;
|
i32 num = (i32)index;
|
||||||
arr_ptr = wapp_i32_array_append_alloc(&allocator, &array2, &num);
|
arr_ptr = wapp_i32_array_append_alloc(&allocator, &array2, &num);
|
||||||
@@ -215,7 +214,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_extend_alloc(void) {
|
TestFuncResult test_i32_array_extend_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
I32Array array1 = wapp_i32_array(1, 2, 3, 4, 5, 6, 7, 8);
|
||||||
@@ -234,7 +233,7 @@ TestFuncResult test_i32_array_extend_alloc(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_i32_array_copy_alloc(void) {
|
TestFuncResult test_i32_array_copy_alloc(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
Allocator allocator = wapp_mem_arena_allocator_init(MB(4));
|
||||||
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
I32Array src = wapp_i32_array(1, 2, 3, 4, 5);
|
||||||
@@ -247,7 +246,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
|
|||||||
result = array_ptr->count == expected_count && array_ptr == &dst1;
|
result = array_ptr->count == expected_count && array_ptr == &dst1;
|
||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
while (running) {
|
while (running) {
|
||||||
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
result = result && (*wapp_i32_array_get(&src, index) == *wapp_i32_array_get(array_ptr, index));
|
||||||
|
|
||||||
|
|||||||
25
tests/array/test_str8_array.c
Normal file
25
tests/array/test_str8_array.c
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#include "test_str8_array.h"
|
||||||
|
|
||||||
|
TestFuncResult test_str8_array(void) {
|
||||||
|
b32 result;
|
||||||
|
|
||||||
|
Str8 expected[] = {wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye")};
|
||||||
|
Str8Array array = wapp_str8_array(wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye"));
|
||||||
|
result = array.count == 3 && array.capacity == 8;
|
||||||
|
|
||||||
|
Str8 *item;
|
||||||
|
u64 count = array.count;
|
||||||
|
u64 index = 0;
|
||||||
|
b32 running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_str8_array_get(&array, index);
|
||||||
|
result = result && item && (wapp_str8_equal(item, &expected[index]));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
30
tests/array/test_str8_array.cc
Normal file
30
tests/array/test_str8_array.cc
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#include "test_str8_array.h"
|
||||||
|
|
||||||
|
TestFuncResult test_str8_array(void) {
|
||||||
|
b32 result;
|
||||||
|
|
||||||
|
Str8 expected[] = {wapp_str8_lit("Hello"), wapp_str8_lit("Hi"), wapp_str8_lit("Bye")};
|
||||||
|
|
||||||
|
Str8 str1 = wapp_str8_lit("Hello");
|
||||||
|
Str8 str2 = wapp_str8_lit("Hi");
|
||||||
|
Str8 str3 = wapp_str8_lit("Bye");
|
||||||
|
Str8Array array = wapp_str8_array(str1, str2, str3);
|
||||||
|
|
||||||
|
result = array.count == 3 && array.capacity == 8;
|
||||||
|
|
||||||
|
Str8 *item;
|
||||||
|
u64 count = array.count;
|
||||||
|
u64 index = 0;
|
||||||
|
b32 running = true;
|
||||||
|
while (running) {
|
||||||
|
item = wapp_str8_array_get(&array, index);
|
||||||
|
result = result && item && (wapp_str8_equal(item, &expected[index]));
|
||||||
|
|
||||||
|
++index;
|
||||||
|
running = index < count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
10
tests/array/test_str8_array.h
Normal file
10
tests/array/test_str8_array.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// vim:fileencoding=utf-8:foldmethod=marker
|
||||||
|
|
||||||
|
#ifndef TEST_STR8_ARRAY_H
|
||||||
|
#define TEST_STR8_ARRAY_H
|
||||||
|
|
||||||
|
#include "wapp.h"
|
||||||
|
|
||||||
|
TestFuncResult test_str8_array(void);
|
||||||
|
|
||||||
|
#endif // !TEST_STR8_ARRAY_H
|
||||||
@@ -2,20 +2,19 @@
|
|||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define MAIN_BUF_SIZE 4096
|
#define MAIN_BUF_SIZE 4096
|
||||||
#define TMP_BUF_SIZE 1024
|
#define TMP_BUF_SIZE 1024
|
||||||
|
|
||||||
TestFuncResult test_cpath_join_path(void) {
|
TestFuncResult test_cpath_join_path(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
Str8List parts = {0};
|
Str8List parts = {0};
|
||||||
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
@@ -28,7 +27,7 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
|
|
||||||
wapp_str8_list_pop_front(&parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
@@ -37,27 +36,27 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
wapp_str8_list_pop_front(&parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "home%c", PATH_SEP);
|
wapp_str8_format(&tmp, "home%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_list_pop_front(&parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_cstr("home"));
|
wapp_str8_list_push_front(&parts, &wapp_str8_node_from_cstr("home"));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_list_empty(&parts);
|
wapp_str8_list_empty(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "%chome", PATH_SEP);
|
wapp_str8_format(&tmp, "%chome", WAPP_PATH_SEP);
|
||||||
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_str8(tmp));
|
||||||
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
wapp_str8_list_push_back(&parts, &wapp_str8_node_from_cstr(""));
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
@@ -87,15 +86,15 @@ TestFuncResult test_cpath_dirname(void) {
|
|||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 *output = NULL;
|
Str8 *output = NULL;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
// CASE 1
|
// CASE 1
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = output != NULL && wapp_str8_equal(output, &expected);
|
result = output != NULL && wapp_str8_equal(output, &expected);
|
||||||
@@ -111,15 +110,15 @@ TestFuncResult test_cpath_dirname(void) {
|
|||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 4
|
// CASE 4
|
||||||
wapp_str8_format(&tmp, "%chome%ctest", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%ctest", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 5
|
// CASE 5
|
||||||
wapp_str8_format(&tmp, "%chome%ctest%c", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%ctest%c", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
@@ -135,42 +134,42 @@ TestFuncResult test_cpath_dirup(void) {
|
|||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 *output = NULL;
|
Str8 *output = NULL;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
// CASE 1
|
// CASE 1
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = output != NULL && wapp_str8_equal(output, &expected);
|
result = output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 2
|
// CASE 2
|
||||||
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 3
|
// CASE 3
|
||||||
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_copy_cstr_capped(&expected, ".");
|
wapp_str8_copy_cstr_capped(&expected, ".");
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 4
|
// CASE 4
|
||||||
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
||||||
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
result = result && output != NULL && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 5
|
// CASE 5
|
||||||
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_copy_cstr_capped(&expected, "home");
|
wapp_str8_copy_cstr_capped(&expected, "home");
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
||||||
|
|||||||
@@ -2,20 +2,19 @@
|
|||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define MAIN_BUF_SIZE 4096
|
#define MAIN_BUF_SIZE 4096
|
||||||
#define TMP_BUF_SIZE 1024
|
#define TMP_BUF_SIZE 1024
|
||||||
|
|
||||||
TestFuncResult test_cpath_join_path(void) {
|
TestFuncResult test_cpath_join_path(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 out = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
Str8List parts = {};
|
Str8List parts = {};
|
||||||
|
|
||||||
@@ -36,7 +35,7 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
|
|
||||||
wapp_str8_list_pop_front(&parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
@@ -48,25 +47,25 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
Str8Node tmp_node_2 = wapp_str8_node_from_str8(tmp);
|
Str8Node tmp_node_2 = wapp_str8_node_from_str8(tmp);
|
||||||
wapp_str8_list_push_front(&parts, &tmp_node_2);
|
wapp_str8_list_push_front(&parts, &tmp_node_2);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "home%c", PATH_SEP);
|
wapp_str8_format(&tmp, "home%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_list_pop_front(&parts);
|
wapp_str8_list_pop_front(&parts);
|
||||||
|
|
||||||
Str8Node home_node_2 = wapp_str8_node_from_cstr("home");
|
Str8Node home_node_2 = wapp_str8_node_from_cstr("home");
|
||||||
wapp_str8_list_push_front(&parts, &home_node_2);
|
wapp_str8_list_push_front(&parts, &home_node_2);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&expected, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
|
|
||||||
wapp_str8_list_empty(&parts);
|
wapp_str8_list_empty(&parts);
|
||||||
|
|
||||||
wapp_str8_format(&tmp, "%chome", PATH_SEP);
|
wapp_str8_format(&tmp, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
Str8Node tmp_node_3 = wapp_str8_node_from_str8(tmp);
|
Str8Node tmp_node_3 = wapp_str8_node_from_str8(tmp);
|
||||||
wapp_str8_list_push_back(&parts, &tmp_node_3);
|
wapp_str8_list_push_back(&parts, &tmp_node_3);
|
||||||
@@ -74,7 +73,7 @@ TestFuncResult test_cpath_join_path(void) {
|
|||||||
Str8Node empty_node = wapp_str8_node_from_cstr("");
|
Str8Node empty_node = wapp_str8_node_from_cstr("");
|
||||||
wapp_str8_list_push_back(&parts, &empty_node);
|
wapp_str8_list_push_back(&parts, &empty_node);
|
||||||
|
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
wapp_cpath_join_path(&out, &parts);
|
wapp_cpath_join_path(&out, &parts);
|
||||||
result = result && wapp_str8_equal(&out, &expected);
|
result = result && wapp_str8_equal(&out, &expected);
|
||||||
@@ -108,15 +107,15 @@ TestFuncResult test_cpath_dirname(void) {
|
|||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 *output = nullptr;
|
Str8 *output = nullptr;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
// CASE 1
|
// CASE 1
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = output != nullptr && wapp_str8_equal(output, &expected);
|
result = output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
@@ -134,15 +133,15 @@ TestFuncResult test_cpath_dirname(void) {
|
|||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 4
|
// CASE 4
|
||||||
wapp_str8_format(&tmp, "%chome%ctest", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%ctest", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 5
|
// CASE 5
|
||||||
wapp_str8_format(&tmp, "%chome%ctest%c", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%ctest%c", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirname(&arena, &tmp);
|
output = wapp_cpath_dirname(&arena, &tmp);
|
||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
@@ -158,42 +157,42 @@ TestFuncResult test_cpath_dirup(void) {
|
|||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 *output = nullptr;
|
Str8 *output = nullptr;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
Str8 expected = wapp_str8_buf(MAIN_BUF_SIZE);
|
||||||
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
Str8 tmp = wapp_str8_buf(TMP_BUF_SIZE);
|
||||||
|
|
||||||
// CASE 1
|
// CASE 1
|
||||||
wapp_str8_format(&tmp, "%c", PATH_SEP);
|
wapp_str8_format(&tmp, "%c", WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = output != nullptr && wapp_str8_equal(output, &expected);
|
result = output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 2
|
// CASE 2
|
||||||
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%c", PATH_SEP);
|
wapp_str8_format(&expected, "%c", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 3
|
// CASE 3
|
||||||
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_copy_cstr_capped(&expected, ".");
|
wapp_str8_copy_cstr_capped(&expected, ".");
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
output = wapp_cpath_dirup(&arena, &tmp, 3);
|
||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 4
|
// CASE 4
|
||||||
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "%chome%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_format(&expected, "%chome", PATH_SEP);
|
wapp_str8_format(&expected, "%chome", WAPP_PATH_SEP);
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
||||||
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
result = result && output != nullptr && wapp_str8_equal(output, &expected);
|
||||||
|
|
||||||
// CASE 5
|
// CASE 5
|
||||||
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
|
wapp_str8_format(&tmp, "home%cabdelrahman%cDocuments", WAPP_PATH_SEP, WAPP_PATH_SEP);
|
||||||
wapp_str8_copy_cstr_capped(&expected, "home");
|
wapp_str8_copy_cstr_capped(&expected, "home");
|
||||||
|
|
||||||
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
output = wapp_cpath_dirup(&arena, &tmp, 2);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "test_shell_commander.h"
|
#include "test_shell_commander.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -11,7 +10,7 @@ TestFuncResult test_commander_cmd_success(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("hello world"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("hello world"));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
b32 succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR;
|
result.error == SHELL_ERR_NO_ERROR;
|
||||||
|
|
||||||
return wapp_tester_result(succeeded);
|
return wapp_tester_result(succeeded);
|
||||||
@@ -22,7 +21,7 @@ TestFuncResult test_commander_cmd_failure(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("grep"));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("grep"));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
|
||||||
bool failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
b32 failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR;
|
result.error == SHELL_ERR_NO_ERROR;
|
||||||
|
|
||||||
return wapp_tester_result(failed);
|
return wapp_tester_result(failed);
|
||||||
@@ -39,7 +38,7 @@ TestFuncResult test_commander_cmd_out_buf_success(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
b32 succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR && wapp_str8_equal_to_count(&buf, &expected, strlen(msg));
|
result.error == SHELL_ERR_NO_ERROR && wapp_str8_equal_to_count(&buf, &expected, strlen(msg));
|
||||||
|
|
||||||
return wapp_tester_result(succeeded);
|
return wapp_tester_result(succeeded);
|
||||||
@@ -56,7 +55,7 @@ TestFuncResult test_commander_cmd_out_buf_failure(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
b32 failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_OUT_BUF_FULL && !wapp_str8_equal(&buf, &expected);
|
result.error == SHELL_ERR_OUT_BUF_FULL && !wapp_str8_equal(&buf, &expected);
|
||||||
|
|
||||||
return wapp_tester_result(failed);
|
return wapp_tester_result(failed);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#include "test_shell_commander.h"
|
#include "test_shell_commander.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -13,7 +12,7 @@ TestFuncResult test_commander_cmd_success(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &msg);
|
wapp_str8_list_push_back(&cmd, &msg);
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, nullptr, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, nullptr, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
b32 succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR;
|
result.error == SHELL_ERR_NO_ERROR;
|
||||||
|
|
||||||
return wapp_tester_result(succeeded);
|
return wapp_tester_result(succeeded);
|
||||||
@@ -25,7 +24,7 @@ TestFuncResult test_commander_cmd_failure(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &grep);
|
wapp_str8_list_push_back(&cmd, &grep);
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, nullptr, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, nullptr, &cmd);
|
||||||
bool failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
b32 failed = result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR;
|
result.error == SHELL_ERR_NO_ERROR;
|
||||||
|
|
||||||
return wapp_tester_result(failed);
|
return wapp_tester_result(failed);
|
||||||
@@ -44,7 +43,7 @@ TestFuncResult test_commander_cmd_out_buf_success(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &arg);
|
wapp_str8_list_push_back(&cmd, &arg);
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
b32 succeeded = result.exited && result.exit_code == EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_NO_ERROR && wapp_str8_equal_to_count(&buf, &expected, strlen(msg));
|
result.error == SHELL_ERR_NO_ERROR && wapp_str8_equal_to_count(&buf, &expected, strlen(msg));
|
||||||
|
|
||||||
return wapp_tester_result(succeeded);
|
return wapp_tester_result(succeeded);
|
||||||
@@ -63,7 +62,7 @@ TestFuncResult test_commander_cmd_out_buf_failure(void) {
|
|||||||
wapp_str8_list_push_back(&cmd, &arg);
|
wapp_str8_list_push_back(&cmd, &arg);
|
||||||
|
|
||||||
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
|
||||||
bool failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
b32 failed = !result.exited && result.exit_code != EXIT_SUCCESS &&
|
||||||
result.error == SHELL_ERR_OUT_BUF_FULL && !wapp_str8_equal(&buf, &expected);
|
result.error == SHELL_ERR_OUT_BUF_FULL && !wapp_str8_equal(&buf, &expected);
|
||||||
|
|
||||||
return wapp_tester_result(failed);
|
return wapp_tester_result(failed);
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#include "test_str8.h"
|
#include "test_str8.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define ARRLEN(ARR) (sizeof(ARR) / sizeof(ARR[0]))
|
#define ARRLEN(ARR) (sizeof(ARR) / sizeof(ARR[0]))
|
||||||
|
|
||||||
TestFuncResult test_str8_lit(void) {
|
TestFuncResult test_str8_lit(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
result = s1.capacity == 22 && s1.capacity != s1.size;
|
result = s1.capacity == 22 && s1.capacity != s1.size;
|
||||||
@@ -32,7 +31,7 @@ TestFuncResult test_str8_lit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_lit_ro(void) {
|
TestFuncResult test_str8_lit_ro(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
||||||
result = s1.capacity == 11 && s1.capacity == s1.size;
|
result = s1.capacity == 11 && s1.capacity == s1.size;
|
||||||
@@ -59,7 +58,7 @@ TestFuncResult test_str8_lit_ro(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_buf(void) {
|
TestFuncResult test_str8_buf(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_buf(1024);
|
Str8 s1 = wapp_str8_buf(1024);
|
||||||
result = s1.capacity == 1024 && s1.size == 0;
|
result = s1.capacity == 1024 && s1.size == 0;
|
||||||
@@ -77,7 +76,7 @@ TestFuncResult test_str8_buf(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_buf(void) {
|
TestFuncResult test_str8_alloc_buf(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -105,7 +104,7 @@ TEST_ALLOC_BUF_CLEANUP:
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_cstr(void) {
|
TestFuncResult test_str8_alloc_cstr(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -126,7 +125,7 @@ TestFuncResult test_str8_alloc_cstr(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_str8(void) {
|
TestFuncResult test_str8_alloc_str8(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -146,7 +145,7 @@ TestFuncResult test_str8_alloc_str8(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_substr(void) {
|
TestFuncResult test_str8_alloc_substr(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -166,7 +165,7 @@ TestFuncResult test_str8_alloc_substr(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_get_index_within_bounds(void) {
|
TestFuncResult test_str8_get_index_within_bounds(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
||||||
result = wapp_str8_get(&s1, 4) == 'o';
|
result = wapp_str8_get(&s1, 4) == 'o';
|
||||||
@@ -194,12 +193,12 @@ TestFuncResult test_str8_get_index_within_bounds(void) {
|
|||||||
|
|
||||||
TestFuncResult test_str8_get_index_out_of_bounds(void) {
|
TestFuncResult test_str8_get_index_out_of_bounds(void) {
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
bool result = wapp_str8_get(&s1, 20) == '\0';
|
b32 result = wapp_str8_get(&s1, 20) == '\0';
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_set(void) {
|
TestFuncResult test_str8_set(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
wapp_str8_set(&s1, 4, 'f');
|
wapp_str8_set(&s1, 4, 'f');
|
||||||
@@ -233,7 +232,7 @@ TestFuncResult test_str8_set(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_push_back(void) {
|
TestFuncResult test_str8_push_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_lit("Abdelrahman");
|
Str8 expected = wapp_str8_lit("Abdelrahman");
|
||||||
Str8 buf = wapp_str8_buf(64);
|
Str8 buf = wapp_str8_buf(64);
|
||||||
@@ -255,7 +254,7 @@ TestFuncResult test_str8_push_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_equal(void) {
|
TestFuncResult test_str8_equal(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("hello");
|
Str8RO s1 = wapp_str8_lit_ro("hello");
|
||||||
Str8RO s2 = wapp_str8_lit_ro("hell");
|
Str8RO s2 = wapp_str8_lit_ro("hell");
|
||||||
@@ -270,7 +269,7 @@ TestFuncResult test_str8_equal(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_slice(void) {
|
TestFuncResult test_str8_slice(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 s = wapp_str8_lit("Different strokes for different folks");
|
Str8 s = wapp_str8_lit("Different strokes for different folks");
|
||||||
|
|
||||||
Str8RO sub1 = wapp_str8_slice(&s, 3, 9);
|
Str8RO sub1 = wapp_str8_slice(&s, 3, 9);
|
||||||
@@ -289,7 +288,7 @@ TestFuncResult test_str8_slice(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_concat(void) {
|
TestFuncResult test_str8_alloc_concat(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("Hello world");
|
Str8 str = wapp_str8_lit("Hello world");
|
||||||
@@ -312,7 +311,7 @@ TestFuncResult test_str8_alloc_concat(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_concat_capped(void) {
|
TestFuncResult test_str8_concat_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("Hello world");
|
Str8 str = wapp_str8_lit("Hello world");
|
||||||
Str8 suffix1 = wapp_str8_lit(" from me.");
|
Str8 suffix1 = wapp_str8_lit(" from me.");
|
||||||
@@ -330,7 +329,7 @@ TestFuncResult test_str8_concat_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_copy_cstr_capped(void) {
|
TestFuncResult test_str8_copy_cstr_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(32);
|
Str8 buf = wapp_str8_buf(32);
|
||||||
const char *src1 = "Hello world";
|
const char *src1 = "Hello world";
|
||||||
@@ -348,7 +347,7 @@ TestFuncResult test_str8_copy_cstr_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_copy_str8_capped(void) {
|
TestFuncResult test_str8_copy_str8_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(32);
|
Str8 buf = wapp_str8_buf(32);
|
||||||
Str8RO src1 = wapp_str8_lit_ro("Hello world");
|
Str8RO src1 = wapp_str8_lit_ro("Hello world");
|
||||||
@@ -365,7 +364,7 @@ TestFuncResult test_str8_copy_str8_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_format(void) {
|
TestFuncResult test_str8_format(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(128);
|
Str8 buf = wapp_str8_buf(128);
|
||||||
Str8 expected = wapp_str8_lit("My name is Abdelrahman and I am 35 years old");
|
Str8 expected = wapp_str8_lit("My name is Abdelrahman and I am 35 years old");
|
||||||
@@ -378,7 +377,7 @@ TestFuncResult test_str8_format(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_find(void) {
|
TestFuncResult test_str8_find(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
||||||
|
|
||||||
result = wapp_str8_find(&s, wapp_str8_lit_ro("d")) != -1;
|
result = wapp_str8_find(&s, wapp_str8_lit_ro("d")) != -1;
|
||||||
@@ -394,7 +393,7 @@ TestFuncResult test_str8_find(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rfind(void) {
|
TestFuncResult test_str8_rfind(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
||||||
|
|
||||||
result = wapp_str8_rfind(&s, wapp_str8_lit_ro("d")) != -1;
|
result = wapp_str8_rfind(&s, wapp_str8_lit_ro("d")) != -1;
|
||||||
@@ -410,7 +409,7 @@ TestFuncResult test_str8_rfind(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_split(void) {
|
TestFuncResult test_str8_split(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -432,11 +431,11 @@ TestFuncResult test_str8_split(void) {
|
|||||||
|
|
||||||
u64 index1 = 0;
|
u64 index1 = 0;
|
||||||
u64 count1 = ARRLEN(splits1);
|
u64 count1 = ARRLEN(splits1);
|
||||||
bool running1 = true;
|
b32 running1 = true;
|
||||||
|
|
||||||
u64 index2 = 0;
|
u64 index2 = 0;
|
||||||
u64 count2 = ARRLEN(splits2);
|
u64 count2 = ARRLEN(splits2);
|
||||||
bool running2 = true;
|
b32 running2 = true;
|
||||||
|
|
||||||
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
||||||
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
||||||
@@ -467,7 +466,7 @@ TestFuncResult test_str8_split(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_split_with_max(void) {
|
TestFuncResult test_str8_split_with_max(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -482,7 +481,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
u64 count = ARRLEN(splits);
|
u64 count = ARRLEN(splits);
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
|
|
||||||
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
||||||
|
|
||||||
@@ -502,7 +501,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rsplit(void) {
|
TestFuncResult test_str8_rsplit(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -524,11 +523,11 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
|
|
||||||
u64 index1 = 0;
|
u64 index1 = 0;
|
||||||
u64 count1 = ARRLEN(splits1);
|
u64 count1 = ARRLEN(splits1);
|
||||||
bool running1 = true;
|
b32 running1 = true;
|
||||||
|
|
||||||
u64 index2 = 0;
|
u64 index2 = 0;
|
||||||
u64 count2 = ARRLEN(splits2);
|
u64 count2 = ARRLEN(splits2);
|
||||||
bool running2 = true;
|
b32 running2 = true;
|
||||||
|
|
||||||
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
||||||
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
||||||
@@ -559,7 +558,7 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rsplit_with_max(void) {
|
TestFuncResult test_str8_rsplit_with_max(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -574,7 +573,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
u64 count = ARRLEN(splits);
|
u64 count = ARRLEN(splits);
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
|
|
||||||
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
||||||
|
|
||||||
@@ -594,7 +593,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_join(void) {
|
TestFuncResult test_str8_join(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -612,3 +611,16 @@ TestFuncResult test_str8_join(void) {
|
|||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_str8_from_bytes(void) {
|
||||||
|
b32 result;
|
||||||
|
|
||||||
|
Str8 str = wapp_str8_buf(1024);
|
||||||
|
U8Array bytes = wapp_u8_array('W', 'A', 'P', 'P');
|
||||||
|
wapp_str8_from_bytes(&str, &bytes);
|
||||||
|
|
||||||
|
result = str.size == bytes.count * bytes.item_size;
|
||||||
|
result = result && wapp_str8_equal(&str, &wapp_str8_lit_ro("WAPP"));
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
#include "test_str8.h"
|
#include "test_str8.h"
|
||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define ARRLEN(ARR) (sizeof(ARR) / sizeof(ARR[0]))
|
#define ARRLEN(ARR) (sizeof(ARR) / sizeof(ARR[0]))
|
||||||
|
|
||||||
TestFuncResult test_str8_lit(void) {
|
TestFuncResult test_str8_lit(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
result = s1.capacity == 22 && s1.capacity != s1.size;
|
result = s1.capacity == 22 && s1.capacity != s1.size;
|
||||||
@@ -32,7 +31,7 @@ TestFuncResult test_str8_lit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_lit_ro(void) {
|
TestFuncResult test_str8_lit_ro(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
||||||
result = s1.capacity == 11 && s1.capacity == s1.size;
|
result = s1.capacity == 11 && s1.capacity == s1.size;
|
||||||
@@ -59,7 +58,7 @@ TestFuncResult test_str8_lit_ro(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_buf(void) {
|
TestFuncResult test_str8_buf(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_buf(1024);
|
Str8 s1 = wapp_str8_buf(1024);
|
||||||
result = s1.capacity == 1024 && s1.size == 0;
|
result = s1.capacity == 1024 && s1.size == 0;
|
||||||
@@ -77,7 +76,7 @@ TestFuncResult test_str8_buf(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_buf(void) {
|
TestFuncResult test_str8_alloc_buf(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -105,7 +104,7 @@ TestFuncResult test_str8_alloc_buf(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_cstr(void) {
|
TestFuncResult test_str8_alloc_cstr(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -126,7 +125,7 @@ TestFuncResult test_str8_alloc_cstr(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_str8(void) {
|
TestFuncResult test_str8_alloc_str8(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -146,7 +145,7 @@ TestFuncResult test_str8_alloc_str8(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_substr(void) {
|
TestFuncResult test_str8_alloc_substr(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
Allocator allocator = wapp_mem_arena_allocator_init(KB(100));
|
||||||
if (wapp_mem_allocator_invalid(&allocator)) {
|
if (wapp_mem_allocator_invalid(&allocator)) {
|
||||||
return wapp_tester_result(false);
|
return wapp_tester_result(false);
|
||||||
@@ -166,7 +165,7 @@ TestFuncResult test_str8_alloc_substr(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_get_index_within_bounds(void) {
|
TestFuncResult test_str8_get_index_within_bounds(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
Str8RO s1 = wapp_str8_lit_ro("Hello world");
|
||||||
result = wapp_str8_get(&s1, 4) == 'o';
|
result = wapp_str8_get(&s1, 4) == 'o';
|
||||||
@@ -194,12 +193,12 @@ TestFuncResult test_str8_get_index_within_bounds(void) {
|
|||||||
|
|
||||||
TestFuncResult test_str8_get_index_out_of_bounds(void) {
|
TestFuncResult test_str8_get_index_out_of_bounds(void) {
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
bool result = wapp_str8_get(&s1, 20) == '\0';
|
b32 result = wapp_str8_get(&s1, 20) == '\0';
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_set(void) {
|
TestFuncResult test_str8_set(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("Hello world");
|
Str8 s1 = wapp_str8_lit("Hello world");
|
||||||
wapp_str8_set(&s1, 4, 'f');
|
wapp_str8_set(&s1, 4, 'f');
|
||||||
@@ -233,7 +232,7 @@ TestFuncResult test_str8_set(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_push_back(void) {
|
TestFuncResult test_str8_push_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 expected = wapp_str8_lit("Abdelrahman");
|
Str8 expected = wapp_str8_lit("Abdelrahman");
|
||||||
Str8 buf = wapp_str8_buf(64);
|
Str8 buf = wapp_str8_buf(64);
|
||||||
@@ -255,7 +254,7 @@ TestFuncResult test_str8_push_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_equal(void) {
|
TestFuncResult test_str8_equal(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8RO s1 = wapp_str8_lit_ro("hello");
|
Str8RO s1 = wapp_str8_lit_ro("hello");
|
||||||
Str8RO s2 = wapp_str8_lit_ro("hell");
|
Str8RO s2 = wapp_str8_lit_ro("hell");
|
||||||
@@ -270,7 +269,7 @@ TestFuncResult test_str8_equal(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_slice(void) {
|
TestFuncResult test_str8_slice(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8 s = wapp_str8_lit("Different strokes for different folks");
|
Str8 s = wapp_str8_lit("Different strokes for different folks");
|
||||||
|
|
||||||
Str8RO sub1 = wapp_str8_slice(&s, 3, 9);
|
Str8RO sub1 = wapp_str8_slice(&s, 3, 9);
|
||||||
@@ -289,7 +288,7 @@ TestFuncResult test_str8_slice(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_alloc_concat(void) {
|
TestFuncResult test_str8_alloc_concat(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("Hello world");
|
Str8 str = wapp_str8_lit("Hello world");
|
||||||
@@ -312,7 +311,7 @@ TestFuncResult test_str8_alloc_concat(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_concat_capped(void) {
|
TestFuncResult test_str8_concat_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("Hello world");
|
Str8 str = wapp_str8_lit("Hello world");
|
||||||
Str8 suffix1 = wapp_str8_lit(" from me.");
|
Str8 suffix1 = wapp_str8_lit(" from me.");
|
||||||
@@ -330,7 +329,7 @@ TestFuncResult test_str8_concat_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_copy_cstr_capped(void) {
|
TestFuncResult test_str8_copy_cstr_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(32);
|
Str8 buf = wapp_str8_buf(32);
|
||||||
const char *src1 = "Hello world";
|
const char *src1 = "Hello world";
|
||||||
@@ -348,7 +347,7 @@ TestFuncResult test_str8_copy_cstr_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_copy_str8_capped(void) {
|
TestFuncResult test_str8_copy_str8_capped(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(32);
|
Str8 buf = wapp_str8_buf(32);
|
||||||
Str8RO src1 = wapp_str8_lit_ro("Hello world");
|
Str8RO src1 = wapp_str8_lit_ro("Hello world");
|
||||||
@@ -365,7 +364,7 @@ TestFuncResult test_str8_copy_str8_capped(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_format(void) {
|
TestFuncResult test_str8_format(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 buf = wapp_str8_buf(128);
|
Str8 buf = wapp_str8_buf(128);
|
||||||
Str8 expected = wapp_str8_lit("My name is Abdelrahman and I am 35 years old");
|
Str8 expected = wapp_str8_lit("My name is Abdelrahman and I am 35 years old");
|
||||||
@@ -378,7 +377,7 @@ TestFuncResult test_str8_format(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_find(void) {
|
TestFuncResult test_str8_find(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
||||||
|
|
||||||
result = wapp_str8_find(&s, wapp_str8_lit_ro("d")) != -1;
|
result = wapp_str8_find(&s, wapp_str8_lit_ro("d")) != -1;
|
||||||
@@ -394,7 +393,7 @@ TestFuncResult test_str8_find(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rfind(void) {
|
TestFuncResult test_str8_rfind(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
Str8RO s = wapp_str8_lit("Do as I say, not as I do");
|
||||||
|
|
||||||
result = wapp_str8_rfind(&s, wapp_str8_lit_ro("d")) != -1;
|
result = wapp_str8_rfind(&s, wapp_str8_lit_ro("d")) != -1;
|
||||||
@@ -410,7 +409,7 @@ TestFuncResult test_str8_rfind(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_split(void) {
|
TestFuncResult test_str8_split(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -432,11 +431,11 @@ TestFuncResult test_str8_split(void) {
|
|||||||
|
|
||||||
u64 index1 = 0;
|
u64 index1 = 0;
|
||||||
u64 count1 = ARRLEN(splits1);
|
u64 count1 = ARRLEN(splits1);
|
||||||
bool running1 = true;
|
b32 running1 = true;
|
||||||
|
|
||||||
u64 index2 = 0;
|
u64 index2 = 0;
|
||||||
u64 count2 = ARRLEN(splits2);
|
u64 count2 = ARRLEN(splits2);
|
||||||
bool running2 = true;
|
b32 running2 = true;
|
||||||
|
|
||||||
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
||||||
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
||||||
@@ -467,7 +466,7 @@ TestFuncResult test_str8_split(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_split_with_max(void) {
|
TestFuncResult test_str8_split_with_max(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -482,7 +481,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
u64 count = ARRLEN(splits);
|
u64 count = ARRLEN(splits);
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
|
|
||||||
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
||||||
|
|
||||||
@@ -502,7 +501,7 @@ TestFuncResult test_str8_split_with_max(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rsplit(void) {
|
TestFuncResult test_str8_rsplit(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -524,11 +523,11 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
|
|
||||||
u64 index1 = 0;
|
u64 index1 = 0;
|
||||||
u64 count1 = ARRLEN(splits1);
|
u64 count1 = ARRLEN(splits1);
|
||||||
bool running1 = true;
|
b32 running1 = true;
|
||||||
|
|
||||||
u64 index2 = 0;
|
u64 index2 = 0;
|
||||||
u64 count2 = ARRLEN(splits2);
|
u64 count2 = ARRLEN(splits2);
|
||||||
bool running2 = true;
|
b32 running2 = true;
|
||||||
|
|
||||||
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
result = list1->node_count == count1 && wapp_str8_list_total_size(list1) == str.size - 3;
|
||||||
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
result = result && list2->node_count == count2 && wapp_str8_list_total_size(list2) == str.size - 4;
|
||||||
@@ -559,7 +558,7 @@ TestFuncResult test_str8_rsplit(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_rsplit_with_max(void) {
|
TestFuncResult test_str8_rsplit_with_max(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -574,7 +573,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
|
|
||||||
u64 index = 0;
|
u64 index = 0;
|
||||||
u64 count = ARRLEN(splits);
|
u64 count = ARRLEN(splits);
|
||||||
bool running = true;
|
b32 running = true;
|
||||||
|
|
||||||
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
result = list->node_count == count && wapp_str8_list_total_size(list) == str.size - 2;
|
||||||
|
|
||||||
@@ -594,7 +593,7 @@ TestFuncResult test_str8_rsplit_with_max(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_join(void) {
|
TestFuncResult test_str8_join(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
Allocator arena = wapp_mem_arena_allocator_init(KB(100));
|
||||||
|
|
||||||
Str8 str = wapp_str8_lit("hello world from me");
|
Str8 str = wapp_str8_lit("hello world from me");
|
||||||
@@ -612,3 +611,17 @@ TestFuncResult test_str8_join(void) {
|
|||||||
|
|
||||||
return wapp_tester_result(result);
|
return wapp_tester_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestFuncResult test_str8_from_bytes(void) {
|
||||||
|
b32 result;
|
||||||
|
|
||||||
|
Str8 str = wapp_str8_buf(1024);
|
||||||
|
Str8 expected = wapp_str8_lit_ro("WAPP");
|
||||||
|
U8Array bytes = wapp_u8_array('W', 'A', 'P', 'P');
|
||||||
|
wapp_str8_from_bytes(&str, &bytes);
|
||||||
|
|
||||||
|
result = str.size == bytes.count * bytes.item_size;
|
||||||
|
result = result && wapp_str8_equal(&str, &expected);
|
||||||
|
|
||||||
|
return wapp_tester_result(result);
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,5 +28,6 @@ TestFuncResult test_str8_split_with_max(void);
|
|||||||
TestFuncResult test_str8_rsplit(void);
|
TestFuncResult test_str8_rsplit(void);
|
||||||
TestFuncResult test_str8_rsplit_with_max(void);
|
TestFuncResult test_str8_rsplit_with_max(void);
|
||||||
TestFuncResult test_str8_join(void);
|
TestFuncResult test_str8_join(void);
|
||||||
|
TestFuncResult test_str8_from_bytes(void);
|
||||||
|
|
||||||
#endif // !TEST_STR8_H
|
#endif // !TEST_STR8_H
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
TestFuncResult test_str8_list_get(void) {
|
TestFuncResult test_str8_list_get(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -42,7 +42,7 @@ TestFuncResult test_str8_list_get(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_push_front(void) {
|
TestFuncResult test_str8_list_push_front(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -66,7 +66,7 @@ TestFuncResult test_str8_list_push_front(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_push_back(void) {
|
TestFuncResult test_str8_list_push_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -90,7 +90,7 @@ TestFuncResult test_str8_list_push_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_insert(void) {
|
TestFuncResult test_str8_list_insert(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -127,7 +127,7 @@ TestFuncResult test_str8_list_insert(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_pop_front(void) {
|
TestFuncResult test_str8_list_pop_front(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -167,7 +167,7 @@ TestFuncResult test_str8_list_pop_front(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_pop_back(void) {
|
TestFuncResult test_str8_list_pop_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -207,7 +207,7 @@ TestFuncResult test_str8_list_pop_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_remove(void) {
|
TestFuncResult test_str8_list_remove(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -247,7 +247,7 @@ TestFuncResult test_str8_list_remove(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_empty(void) {
|
TestFuncResult test_str8_list_empty(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8List list = {0};
|
Str8List list = {0};
|
||||||
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("Hello"));
|
wapp_str8_list_push_back(&list, &wapp_str8_node_from_cstr("Hello"));
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "wapp.h"
|
#include "wapp.h"
|
||||||
|
|
||||||
TestFuncResult test_str8_list_get(void) {
|
TestFuncResult test_str8_list_get(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -42,7 +42,7 @@ TestFuncResult test_str8_list_get(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_push_front(void) {
|
TestFuncResult test_str8_list_push_front(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -66,7 +66,7 @@ TestFuncResult test_str8_list_push_front(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_push_back(void) {
|
TestFuncResult test_str8_list_push_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -90,7 +90,7 @@ TestFuncResult test_str8_list_push_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_insert(void) {
|
TestFuncResult test_str8_list_insert(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -127,7 +127,7 @@ TestFuncResult test_str8_list_insert(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_pop_front(void) {
|
TestFuncResult test_str8_list_pop_front(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -167,7 +167,7 @@ TestFuncResult test_str8_list_pop_front(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_pop_back(void) {
|
TestFuncResult test_str8_list_pop_back(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -207,7 +207,7 @@ TestFuncResult test_str8_list_pop_back(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_remove(void) {
|
TestFuncResult test_str8_list_remove(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8 s1 = wapp_str8_lit("1");
|
Str8 s1 = wapp_str8_lit("1");
|
||||||
Str8 s2 = wapp_str8_lit("2");
|
Str8 s2 = wapp_str8_lit("2");
|
||||||
@@ -247,7 +247,7 @@ TestFuncResult test_str8_list_remove(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TestFuncResult test_str8_list_empty(void) {
|
TestFuncResult test_str8_list_empty(void) {
|
||||||
bool result;
|
b32 result;
|
||||||
|
|
||||||
Str8List list = {};
|
Str8List list = {};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "test_str8_list.h"
|
#include "test_str8_list.h"
|
||||||
#include "test_allocator.h"
|
#include "test_allocator.h"
|
||||||
#include "test_arena.h"
|
#include "test_arena.h"
|
||||||
|
#include "test_str8_array.h"
|
||||||
#include "test_i32_array.h"
|
#include "test_i32_array.h"
|
||||||
#include "test_cpath.h"
|
#include "test_cpath.h"
|
||||||
#include "test_shell_commander.h"
|
#include "test_shell_commander.h"
|
||||||
@@ -19,6 +20,7 @@ int main(void) {
|
|||||||
test_arena_realloc_smaller_size,
|
test_arena_realloc_smaller_size,
|
||||||
test_arena_clear,
|
test_arena_clear,
|
||||||
test_arena_destroy,
|
test_arena_destroy,
|
||||||
|
test_str8_array,
|
||||||
test_i32_array,
|
test_i32_array,
|
||||||
test_i32_array_with_capacity,
|
test_i32_array_with_capacity,
|
||||||
test_i32_array_get,
|
test_i32_array_get,
|
||||||
@@ -56,6 +58,7 @@ int main(void) {
|
|||||||
test_str8_rsplit,
|
test_str8_rsplit,
|
||||||
test_str8_rsplit_with_max,
|
test_str8_rsplit_with_max,
|
||||||
test_str8_join,
|
test_str8_join,
|
||||||
|
test_str8_from_bytes,
|
||||||
test_str8_list_get,
|
test_str8_list_get,
|
||||||
test_str8_list_push_front,
|
test_str8_list_push_front,
|
||||||
test_str8_list_push_back,
|
test_str8_list_push_back,
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "test_str8_list.h"
|
#include "test_str8_list.h"
|
||||||
#include "test_allocator.h"
|
#include "test_allocator.h"
|
||||||
#include "test_arena.h"
|
#include "test_arena.h"
|
||||||
|
#include "test_str8_array.h"
|
||||||
#include "test_i32_array.h"
|
#include "test_i32_array.h"
|
||||||
#include "test_cpath.h"
|
#include "test_cpath.h"
|
||||||
#include "test_shell_commander.h"
|
#include "test_shell_commander.h"
|
||||||
@@ -19,6 +20,7 @@ int main(void) {
|
|||||||
test_arena_realloc_smaller_size,
|
test_arena_realloc_smaller_size,
|
||||||
test_arena_clear,
|
test_arena_clear,
|
||||||
test_arena_destroy,
|
test_arena_destroy,
|
||||||
|
test_str8_array,
|
||||||
test_i32_array,
|
test_i32_array,
|
||||||
test_i32_array_with_capacity,
|
test_i32_array_with_capacity,
|
||||||
test_i32_array_get,
|
test_i32_array_get,
|
||||||
@@ -56,6 +58,7 @@ int main(void) {
|
|||||||
test_str8_rsplit,
|
test_str8_rsplit,
|
||||||
test_str8_rsplit_with_max,
|
test_str8_rsplit_with_max,
|
||||||
test_str8_join,
|
test_str8_join,
|
||||||
|
test_str8_from_bytes,
|
||||||
test_str8_list_get,
|
test_str8_list_get,
|
||||||
test_str8_list_push_front,
|
test_str8_list_push_front,
|
||||||
test_str8_list_push_back,
|
test_str8_list_push_back,
|
||||||
|
|||||||
Reference in New Issue
Block a user