Files
2026-09-30 19:27:45 -04:00

60 lines
2.0 KiB
C

#ifndef ENFILADE_H
#define ENFILADE_H
#define ENSIFER_VERSION "0.1.20"
#include <stddef.h>
#include <stdint.h>
typedef struct enfilade enfilade_t;
typedef enum {
ENF_OK = 0,
ENF_ERR_NULL,
ENF_ERR_ADDR,
ENF_ERR_NOT_FOUND,
ENF_ERR_NOMEM
} enf_error_t;
typedef struct {
enf_error_t code;
const char *msg;
} enf_result_t;
enfilade_t *create_enfilade(void);
void destroy_enfilade(enfilade_t *enf);
/* Store datum at a dotted tumbler address. Missing intermediate children are
* created automatically. Replacing the final datum is allowed. */
enf_result_t put_enfilade(enfilade_t *enf, const char *tumbler, void *datum);
/* Remove only the datum stored at the exact final key. A child subtree at the
* same key is retained. Empty intermediate child nodes are pruned. */
enf_result_t remove_enfilade(enfilade_t *enf, const char *tumbler);
/* Exact terminal value, without descendant traversal. */
void *getXtumbler_enfilade(enfilade_t *enf, const char *tumbler);
/* Resolve a tumbler using the Enfilade.py getByTumbler/get semantics.
* Returns a newly allocated array of datum pointers. Caller frees the array;
* the datum pointers remain owned by the application/S7. */
enf_result_t getXtumbler_values_enfilade(enfilade_t *enf,
const char *tumbler,
void ***items,
size_t *count);
/* Flatten all values in numeric key order for the inclusive range. A negative
* end means "everything", matching the Python default end=-1. */
enf_result_t getXrange_values_enfilade(enfilade_t *enf,
int64_t start,
int64_t end,
void ***items,
size_t *count);
typedef void (*enfilade_datum_visitor)(void *datum, void *context);
void enfilade_visit_data(enfilade_t *enf,
enfilade_datum_visitor visitor,
void *context);
#endif /* ENFILADE_H */