#define _POSIX_C_SOURCE 200809L #include "runtime.h" #include #include #define RAVA_MAX_ARRAY_LENGTH 1000000 RavaArray_t* rava_array_create(RavaValueType_e element_type, size_t length) { if (length > RAVA_MAX_ARRAY_LENGTH) { fprintf(stderr, "Warning: Array size %zu exceeds maximum %d, clamping\n", length, RAVA_MAX_ARRAY_LENGTH); length = RAVA_MAX_ARRAY_LENGTH; } RavaArray_t *array = malloc(sizeof(RavaArray_t)); if (!array) return NULL; array->element_type = element_type; array->length = length; array->data = NULL; switch (element_type) { case RAVA_VAL_INT: array->data = calloc(length, sizeof(int32_t)); break; case RAVA_VAL_LONG: array->data = calloc(length, sizeof(int64_t)); break; case RAVA_VAL_DOUBLE: array->data = calloc(length, sizeof(double)); break; case RAVA_VAL_BOOLEAN: array->data = calloc(length, sizeof(bool)); break; case RAVA_VAL_ARRAY: case RAVA_VAL_OBJECT: array->data = calloc(length, sizeof(RavaValue_t)); break; default: array->data = calloc(length, sizeof(void*)); break; } if (!array->data && length > 0) { free(array); return NULL; } return array; } void rava_array_destroy(RavaArray_t *array) { if (!array) return; free(array->data); free(array); } void rava_array_set_int(RavaArray_t *array, size_t index, int32_t value) { if (!array || !array->data || index >= array->length) return; ((int32_t*)array->data)[index] = value; } int32_t rava_array_get_int(RavaArray_t *array, size_t index) { if (!array || !array->data || index >= array->length) return 0; return ((int32_t*)array->data)[index]; } void rava_array_set_long(RavaArray_t *array, size_t index, int64_t value) { if (!array || !array->data || index >= array->length) return; ((int64_t*)array->data)[index] = value; } int64_t rava_array_get_long(RavaArray_t *array, size_t index) { if (!array || !array->data || index >= array->length) return 0; return ((int64_t*)array->data)[index]; } void rava_array_set_double(RavaArray_t *array, size_t index, double value) { if (!array || !array->data || index >= array->length) return; ((double*)array->data)[index] = value; } double rava_array_get_double(RavaArray_t *array, size_t index) { if (!array || !array->data || index >= array->length) return 0.0; return ((double*)array->data)[index]; } void rava_array_set_value(RavaArray_t *array, size_t index, RavaValue_t value) { if (!array || !array->data || index >= array->length) return; ((RavaValue_t*)array->data)[index] = value; } RavaValue_t rava_array_get_value(RavaArray_t *array, size_t index) { if (!array || !array->data || index >= array->length) return rava_value_null(); return ((RavaValue_t*)array->data)[index]; } size_t rava_array_length(RavaArray_t *array) { if (!array) return 0; return array->length; }