#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <asdf/core/ndarray.h>
#include <asdf/error.h>
#include <asdf/log.h>
#define ASDF_SHIM_MSG_MAX 1024
extern const char *asdf_shim_error_format(int code);
extern void asdf_shim_error_set(
void *obj, int is_value, int code, const char *src_file, int lineno, const char *msg);
extern void asdf_shim_log_message(
const void *file, int level, const char *src_file, int lineno, const char *msg);
extern uint16_t asdf_shim_ndarray_read_float16_bits_at(
void *ndarray, const uint64_t *indices, int *err);
static void shim_format_error(
void *obj, int is_value, int code, const char *src_file, int lineno, va_list args) {
const char *fmt = asdf_shim_error_format(code);
char msg[ASDF_SHIM_MSG_MAX];
if (fmt == NULL) {
msg[0] = '\0';
} else {
vsnprintf(msg, sizeof(msg), fmt, args);
}
asdf_shim_error_set(obj, is_value, code, src_file, lineno, msg);
}
ASDF_LOCAL void asdf_shim_file_error_common(
asdf_file_t *file, asdf_error_code_t code, const char *src_file, int lineno, ...) {
va_list args;
va_start(args, lineno);
shim_format_error((void *)file, 0, (int)code, src_file, lineno, args);
va_end(args);
}
ASDF_LOCAL void asdf_shim_value_error_common(
asdf_value_t *value, asdf_error_code_t code, const char *src_file, int lineno, ...) {
va_list args;
va_start(args, lineno);
shim_format_error((void *)value, 1, (int)code, src_file, lineno, args);
va_end(args);
}
ASDF_LOCAL void asdf_shim_file_log_v(
const asdf_file_t *file,
asdf_log_level_t level,
const char *src_file,
int lineno,
const char *fmt,
...) {
char msg[ASDF_SHIM_MSG_MAX];
va_list args;
va_start(args, fmt);
vsnprintf(msg, sizeof(msg), fmt == NULL ? "" : fmt, args);
va_end(args);
asdf_shim_log_message((const void *)file, (int)level, src_file, lineno, msg);
}
#ifdef ASDF_HAVE_FLOAT16
ASDF_LOCAL _Float16 asdf_shim_read_float16_at(
asdf_ndarray_t *ndarray, const uint64_t *indices, asdf_ndarray_err_t *err) {
int local_err = 0;
uint16_t bits = asdf_shim_ndarray_read_float16_bits_at((void *)ndarray, indices, &local_err);
_Float16 out;
memcpy(&out, &bits, sizeof(out));
if (err != NULL)
*err = (asdf_ndarray_err_t)local_err;
return out;
}
#endif
extern void asdf_shim_register_core_extensions(void);
static void asdf_shim_register_core(void) {
asdf_shim_register_core_extensions();
}
#if defined(_MSC_VER)
#pragma section(".CRT$XCU", read)
__declspec(allocate(".CRT$XCU")) void (*asdf_shim_register_core_ptr)(void) =
asdf_shim_register_core;
#pragma comment(linker, "/include:asdf_shim_register_core_ptr")
#else
__attribute__((constructor)) static void asdf_shim_register_core_ctor(void) {
asdf_shim_register_core();
}
#endif