Remove typeof dependency
Some checks failed
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=OFF (push) Successful in 16s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=OFF (push) Successful in 15s
CMake / ubuntu-latest - shared=OFF, pthread=OFF, posix=ON (push) Failing after 14s
CMake / ubuntu-latest - shared=ON, pthread=OFF, posix=ON (push) Failing after 15s
CMake / ubuntu-latest - shared=OFF, pthread=ON, posix=ON (push) Failing after 13s
CMake / ubuntu-latest - shared=ON, pthread=ON, posix=ON (push) Failing after 8s

Signed-off-by: Slendi <slendi@socopon.com>
This commit is contained in:
2025-07-27 23:23:34 +03:00
parent a8ea92dd5c
commit f1e4804167
5 changed files with 72 additions and 97 deletions

View File

@@ -4,7 +4,7 @@ project(DCFG C)
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON) # Would've done OFF but I need typeof (for now) set(CMAKE_C_EXTENSIONS OFF)
option(DCFG_PTHREAD_SUPPORT "Enable pthreads support" ON) option(DCFG_PTHREAD_SUPPORT "Enable pthreads support" ON)
option(DCFG_POSIX_SUPPORT "Enable POSIX support" ON) option(DCFG_POSIX_SUPPORT "Enable POSIX support" ON)

View File

@@ -4,7 +4,7 @@ set -e
BUILD_DIR="BUILD" BUILD_DIR="BUILD"
INSTALL_DIR="$(pwd)/install" INSTALL_DIR="$(pwd)/install"
CFLAGS="-std=gnu99 -Wall -Wextra -pedantic -Werror -Wno-newline-eof -Wno-language-extension-token" CFLAGS="-std=c99 -Wall -Wextra -pedantic -Werror -Wno-newline-eof -Wno-language-extension-token"
BUILD_SHARED=1 BUILD_SHARED=1
PTHREAD_SUPPORT=1 PTHREAD_SUPPORT=1
POSIX_SUPPORT=1 POSIX_SUPPORT=1

View File

@@ -788,7 +788,7 @@ AST *parser_parse_dot_access(Parser *parser, StringView *current)
return NULL; return NULL;
} }
if (current) { if (current) {
vector_add(&accessv, *current); vector_add(&accessv, StringView, *current);
} }
SourceLocation loc = parser->cur.location; SourceLocation loc = parser->cur.location;
@@ -800,7 +800,7 @@ AST *parser_parse_dot_access(Parser *parser, StringView *current)
} }
last_loc = parser->cur.location; last_loc = parser->cur.location;
vector_add(&accessv, parser->cur.v.s); vector_add(&accessv, StringView, parser->cur.v.s);
if (!Parser_next(parser)) { if (!Parser_next(parser)) {
strcpy(parser->instance->last_error, strcpy(parser->instance->last_error,
@@ -881,7 +881,7 @@ AST *parser_parse_value(Parser *parser)
return NULL; return NULL;
} }
vector_add(&ast->v.f.argv, parser->cur.v.s); vector_add(&ast->v.f.argv, StringView, parser->cur.v.s);
if (!Parser_next(parser)) { if (!Parser_next(parser)) {
vector_free(ast->v.f.argv); vector_free(ast->v.f.argv);
FREE(ast); FREE(ast);
@@ -933,7 +933,7 @@ AST *parser_parse_value(Parser *parser)
FREE(ast); FREE(ast);
return NULL; return NULL;
} }
vector_add(&ast->v.a.childv, value); vector_add(&ast->v.a.childv, AST *, value);
} }
ast->location.range.end = rbracket_loc.range.end; ast->location.range.end = rbracket_loc.range.end;
return ast; return ast;
@@ -991,7 +991,7 @@ AST *parser_parse_value(Parser *parser)
.k = key, .k = key,
.v = value, .v = value,
}; };
vector_add(&ast->v.bl.entryv, entry); vector_add(&ast->v.bl.entryv, ASTBlock_Entry, entry);
} }
return ast; return ast;
} else if (Parser_accept(parser, TokenType_LParen, NULL)) { } else if (Parser_accept(parser, TokenType_LParen, NULL)) {
@@ -1020,7 +1020,7 @@ AST *parser_parse_value(Parser *parser)
return NULL; return NULL;
} }
vector_add(&ast->v.fc.argv, value); vector_add(&ast->v.fc.argv, AST *, value);
} }
ast->location.range.end = rparen_loc.range.end; ast->location.range.end = rparen_loc.range.end;
@@ -1069,7 +1069,7 @@ static Value *ensure_child_obj(Instance *inst, Value *parent, StringView key)
child->v.o.entryv = vector_create(); child->v.o.entryv = vector_create();
ValueObjectEntry e = { .k = key, .v = child }; ValueObjectEntry e = { .k = key, .v = child };
vector_add(&obj->entryv, e); vector_add(&obj->entryv, ValueObjectEntry, e);
return child; return child;
} }
@@ -1150,7 +1150,7 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
if (!replaced) { if (!replaced) {
ValueObjectEntry new_e = { .k = field, .v = rhs }; ValueObjectEntry new_e = { .k = field, .v = rhs };
vector_add(&obj->entryv, new_e); vector_add(&obj->entryv, ValueObjectEntry, new_e);
} }
} }
} else if (root->kind == ASTKind_Array) { } else if (root->kind == ASTKind_Array) {
@@ -1166,14 +1166,14 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
FREE(value); FREE(value);
return NULL; return NULL;
} }
vector_add(&value->v.a.valuev, v); vector_add(&value->v.a.valuev, Value *, v);
} }
} else if (root->kind == ASTKind_Function) { } else if (root->kind == ASTKind_Function) {
value->type = dcfg_ValueType_Function; value->type = dcfg_ValueType_Function;
value->v.f.is_builtin = false; value->v.f.is_builtin = false;
value->v.f.v.f.argv = vector_create(); value->v.f.v.f.argv = vector_create();
for (size_t i = 0; i < vector_size(root->v.f.argv); i++) { for (size_t i = 0; i < vector_size(root->v.f.argv); i++) {
vector_add(&value->v.f.v.f.argv, root->v.f.argv[i]); vector_add(&value->v.f.v.f.argv, StringView, root->v.f.argv[i]);
} }
Value *v = ast_to_value(instance, root->v.f.body); Value *v = ast_to_value(instance, root->v.f.body);
if (!v) { if (!v) {
@@ -1206,7 +1206,7 @@ Value *ast_to_value(dcfg_Instance *instance, AST *root)
FREE(value); FREE(value);
return NULL; return NULL;
} }
vector_add(&value->v.c.argv, arg); vector_add(&value->v.c.argv, Value *, arg);
} }
} }
return value; return value;
@@ -1313,10 +1313,10 @@ dcfg_Value *dcfg_parse(dcfg_Instance *instance, dcfg_StringView const file_path)
} }
instance->last_error[0] = '\0'; instance->last_error[0] = '\0';
vector_add(&instance->sourcev, str); vector_add(&instance->sourcev, StringView, str);
v->i_sourcev_idx = vector_size(instance->sourcev) - 1; v->i_sourcev_idx = vector_size(instance->sourcev) - 1;
vector_add(&instance->source_pathv, abs_sv); vector_add(&instance->source_pathv, StringView, abs_sv);
v->i_source_pathv_idx = vector_size(instance->source_pathv) - 1; v->i_source_pathv_idx = vector_size(instance->source_pathv) - 1;
return v; return v;

74
src/vendor/vec.c vendored
View File

@@ -33,18 +33,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "vec.h" #include "vec.h"
#include <string.h> #include <string.h>
typedef struct typedef struct {
{
vec_size_t size; vec_size_t size;
vec_size_t capacity; vec_size_t capacity;
unsigned char data[]; unsigned char data[];
} vector_header; } vector_header;
vector_header* vector_get_header(vector vec) { return &((vector_header*)vec)[-1]; } vector_header *vector_get_header(vector vec)
{
return &((vector_header *)vec)[-1];
}
vector vector_create(void) vector vector_create(void)
{ {
vector_header* h = (vector_header*)malloc(sizeof(vector_header)); vector_header *h = (vector_header *)malloc(sizeof(vector_header));
h->capacity = 0; h->capacity = 0;
h->size = 0; h->size = 0;
@@ -55,28 +57,28 @@ void vector_free(vector vec) { free(vector_get_header(vec)); }
vec_size_t vector_size(vector vec) { return vector_get_header(vec)->size; } vec_size_t vector_size(vector vec) { return vector_get_header(vec)->size; }
vec_size_t vector_capacity(vector vec) { return vector_get_header(vec)->capacity; } vec_size_t vector_capacity(vector vec)
{
return vector_get_header(vec)->capacity;
}
vector_header* vector_realloc(vector_header* h, vec_type_t type_size) vector_header *vector_realloc(vector_header *h, vec_type_t type_size)
{ {
vec_size_t new_capacity = (h->capacity == 0) ? 1 : h->capacity * 2; vec_size_t new_capacity = (h->capacity == 0) ? 1 : h->capacity * 2;
vector_header* new_h = (vector_header*)realloc(h, sizeof(vector_header) + new_capacity * type_size); vector_header *new_h = (vector_header *)realloc(
h, sizeof(vector_header) + new_capacity * type_size);
new_h->capacity = new_capacity; new_h->capacity = new_capacity;
return new_h; return new_h;
} }
bool vector_has_space(vector_header* h) bool vector_has_space(vector_header *h) { return h->capacity - h->size > 0; }
{
return h->capacity - h->size > 0;
}
void* _vector_add_dst(vector* vec_addr, vec_type_t type_size) void *_vector_add_dst(vector *vec_addr, vec_type_t type_size)
{ {
vector_header* h = vector_get_header(*vec_addr); vector_header *h = vector_get_header(*vec_addr);
if (!vector_has_space(h)) if (!vector_has_space(h)) {
{
h = vector_realloc(h, type_size); h = vector_realloc(h, type_size);
*vec_addr = h->data; *vec_addr = h->data;
} }
@@ -84,34 +86,32 @@ void* _vector_add_dst(vector* vec_addr, vec_type_t type_size)
return &h->data[type_size * h->size++]; return &h->data[type_size * h->size++];
} }
void* _vector_insert_dst(vector* vec_addr, vec_type_t type_size, vec_size_t pos) void *_vector_insert_dst(vector *vec_addr, vec_type_t type_size, vec_size_t pos)
{ {
vector_header* h = vector_get_header(*vec_addr); vector_header *h = vector_get_header(*vec_addr);
vec_size_t new_length = h->size + 1; vec_size_t new_length = h->size + 1;
// make sure there is enough room for the new element // make sure there is enough room for the new element
if (!vector_has_space(h)) if (!vector_has_space(h)) {
{
h = vector_realloc(h, type_size); h = vector_realloc(h, type_size);
*vec_addr = h->data; *vec_addr = h->data;
} }
// move trailing elements // move trailing elements
memmove(&h->data[(pos + 1) * type_size], memmove(&h->data[(pos + 1) * type_size], &h->data[pos * type_size],
&h->data[pos * type_size], (h->size - pos) * type_size);
(h->size - pos) * type_size);
h->size = new_length; h->size = new_length;
return &h->data[pos * type_size]; return &h->data[pos * type_size];
} }
void _vector_erase(vector vec, vec_type_t type_size, vec_size_t pos, vec_size_t len) void _vector_erase(
vector vec, vec_type_t type_size, vec_size_t pos, vec_size_t len)
{ {
vector_header* h = vector_get_header(vec); vector_header *h = vector_get_header(vec);
memmove(&h->data[pos * type_size], memmove(&h->data[pos * type_size], &h->data[(pos + len) * type_size],
&h->data[(pos + len) * type_size], (h->size - pos - len) * type_size);
(h->size - pos - len) * type_size);
h->size -= len; h->size -= len;
} }
@@ -123,26 +123,28 @@ void _vector_remove(vector vec, vec_type_t type_size, vec_size_t pos)
void vector_pop(vector vec) { --vector_get_header(vec)->size; } void vector_pop(vector vec) { --vector_get_header(vec)->size; }
void _vector_reserve(vector* vec_addr, vec_type_t type_size, vec_size_t capacity) void _vector_reserve(
vector *vec_addr, vec_type_t type_size, vec_size_t capacity)
{ {
vector_header* h = vector_get_header(*vec_addr); vector_header *h = vector_get_header(*vec_addr);
if (h->capacity >= capacity) if (h->capacity >= capacity) {
{
return; return;
} }
h = (vector_header*)realloc(h, sizeof(vector_header) + capacity * type_size); h = (vector_header *)realloc(
h, sizeof(vector_header) + capacity * type_size);
h->capacity = capacity; h->capacity = capacity;
*vec_addr = &h->data; *vec_addr = &h->data;
} }
vector _vector_copy(vector vec, vec_type_t type_size) vector _vector_copy(vector vec, vec_type_t type_size)
{ {
vector_header* h = vector_get_header(vec); vector_header *h = vector_get_header(vec);
size_t alloc_size = sizeof(vector_header) + h->size * type_size; size_t alloc_size = sizeof(vector_header) + h->size * type_size;
vector_header* copy_h = (vector_header*)malloc(alloc_size); vector_header *copy_h = (vector_header *)malloc(alloc_size);
memcpy(copy_h, h, alloc_size); memcpy(copy_h, h, alloc_size);
copy_h->capacity = copy_h->size; copy_h->capacity = copy_h->size;
return &copy_h->data; return &copy_h->data;
} }

65
src/vendor/vec.h vendored
View File

@@ -33,11 +33,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef vec_h #ifndef vec_h
#define vec_h #define vec_h
#ifdef __cpp_decltype
#include <type_traits>
#define typeof(T) std::remove_reference<std::add_lvalue_reference<decltype(T)>::type>::type
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@@ -46,72 +41,50 @@ extern "C" {
#include <stdlib.h> #include <stdlib.h>
// generic type for internal use // generic type for internal use
typedef void* vector; typedef void *vector;
// number of elements in a vector // number of elements in a vector
typedef size_t vec_size_t; typedef size_t vec_size_t;
// number of bytes for a type // number of bytes for a type
typedef size_t vec_type_t; typedef size_t vec_type_t;
// TODO: more rigorous check for typeof support with different compilers #define vector_add_dst(vec_addr, type) \
#if _MSC_VER == 0 || __STDC_VERSION__ >= 202311L || defined __cpp_decltype ((type *)_vector_add_dst((vector *)vec_addr, sizeof(type)))
#define vector_insert_dst(vec_addr, type, pos) \
((type *)_vector_insert_dst((vector *)vec_addr, sizeof(type), pos))
// shortcut defines #define vector_add(vec_addr, type, value) \
// vec_addr is a vector* (aka type**)
#define vector_add_dst(vec_addr)\
((typeof(*vec_addr))(\
_vector_add_dst((vector*)vec_addr, sizeof(**vec_addr))\
))
#define vector_insert_dst(vec_addr, pos)\
((typeof(*vec_addr))(\
_vector_insert_dst((vector*)vec_addr, sizeof(**vec_addr), pos)))
#define vector_add(vec_addr, value)\
(*vector_add_dst(vec_addr) = value)
#define vector_insert(vec_addr, pos, value)\
(*vector_insert_dst(vec_addr, pos) = value)
#else
#define vector_add_dst(vec_addr, type)\
((type*)_vector_add_dst((vector*)vec_addr, sizeof(type)))
#define vector_insert_dst(vec_addr, type, pos)\
((type*)_vector_insert_dst((vector*)vec_addr, sizeof(type), pos))
#define vector_add(vec_addr, type, value)\
(*vector_add_dst(vec_addr, type) = value) (*vector_add_dst(vec_addr, type) = value)
#define vector_insert(vec_addr, type, pos, value)\ #define vector_insert(vec_addr, type, pos, value) \
(*vector_insert_dst(vec_addr, type, pos) = value) (*vector_insert_dst(vec_addr, type, pos) = value)
#endif
// vec is a vector (aka type*) // vec is a vector (aka type*)
#define vector_erase(vec, pos, len)\ #define vector_erase(vec, pos, len) \
(_vector_erase((vector)vec, sizeof(*vec), pos, len)) (_vector_erase((vector)vec, sizeof(*vec), pos, len))
#define vector_remove(vec, pos)\ #define vector_remove(vec, pos) (_vector_remove((vector)vec, sizeof(*vec), pos))
(_vector_remove((vector)vec, sizeof(*vec), pos))
#define vector_reserve(vec_addr, capacity)\ #define vector_reserve(vec_addr, capacity) \
(_vector_reserve((vector*)vec_addr, sizeof(**vec_addr), capacity)) (_vector_reserve((vector *)vec_addr, sizeof(**vec_addr), capacity))
#define vector_copy(vec)\ #define vector_copy(vec) (_vector_copy((vector)vec, sizeof(*vec)))
(_vector_copy((vector)vec, sizeof(*vec)))
vector vector_create(void); vector vector_create(void);
void vector_free(vector vec); void vector_free(vector vec);
void* _vector_add_dst(vector* vec_addr, vec_type_t type_size); void *_vector_add_dst(vector *vec_addr, vec_type_t type_size);
void* _vector_insert_dst(vector* vec_addr, vec_type_t type_size, vec_size_t pos); void *_vector_insert_dst(
vector *vec_addr, vec_type_t type_size, vec_size_t pos);
void _vector_erase(vector vec_addr, vec_type_t type_size, vec_size_t pos, vec_size_t len); void _vector_erase(
vector vec_addr, vec_type_t type_size, vec_size_t pos, vec_size_t len);
void _vector_remove(vector vec_addr, vec_type_t type_size, vec_size_t pos); void _vector_remove(vector vec_addr, vec_type_t type_size, vec_size_t pos);
void vector_pop(vector vec); void vector_pop(vector vec);
void _vector_reserve(vector* vec_addr, vec_type_t type_size, vec_size_t capacity); void _vector_reserve(
vector *vec_addr, vec_type_t type_size, vec_size_t capacity);
vector _vector_copy(vector vec, vec_type_t type_size); vector _vector_copy(vector vec, vec_type_t type_size);