00001 #pragma once
00002 #ifndef _SEXP_VALUE_H
00003 #define _SEXP_VALUE_H
00004
00005 #include <stddef.h>
00006 #include <stdint.h>
00007 #include <stdbool.h>
00008 #include "_sexp-types.h"
00009 #include "../../../common/util.h"
00010
00011 OSCAP_HIDDEN_START;
00012
00013 typedef uint8_t SEXP_valtype_t;
00014
00015 #define SEXP_VALTYPE_EMPTY 0
00016 #define SEXP_VALTYPE_STRING 1
00017 #define SEXP_VALTYPE_NUMBER 2
00018 #define SEXP_VALTYPE_LIST 3
00019
00020 typedef struct {
00021 uint32_t refs;
00022 size_t size;
00023 } __attribute__ ((packed)) SEXP_valhdr_t;
00024
00025 typedef struct {
00026 uintptr_t ptr;
00027 SEXP_valhdr_t *hdr;
00028 void *mem;
00029 SEXP_valtype_t type;
00030 } SEXP_val_t;
00031
00032 #define SEXP_VALP_ALIGN sizeof (void *)
00033 #define SEXP_VALP_MASK (UINTPTR_MAX << 2)
00034 #define SEXP_VALT_MASK 3
00035 #define SEXP_VALP_HDR(p) ((SEXP_valhdr_t *)(((uintptr_t)(p)) & SEXP_VALP_MASK))
00036
00037 int SEXP_val_new (SEXP_val_t *dst, size_t vmemsize, SEXP_valtype_t type);
00038 void SEXP_val_dsc (SEXP_val_t *dst, uintptr_t ptr);
00039 uintptr_t SEXP_val_ptr (SEXP_val_t *dsc);
00040
00041 uintptr_t SEXP_rawval_incref (uintptr_t valp);
00042 int SEXP_rawval_decref (uintptr_t valp);
00043
00044 #define SEXP_DEFNUM(s,T) struct SEXP_val_num_##s { T n; SEXP_numtype_t t; } __attribute__ ((packed))
00045 #define SEXP_NCASTP(s,p) ((struct SEXP_val_num_##s *)(p))
00046 #define SEXP_NTYPEP(sz,p) *((SEXP_numtype_t *)(((uint8_t *)(p)) + (sz) - sizeof (SEXP_numtype_t)))
00047
00048 SEXP_numtype_t SEXP_rawval_number_type (SEXP_val_t *dsc);
00049
00050 SEXP_DEFNUM(b, bool);
00051 SEXP_DEFNUM(f, double);
00052 SEXP_DEFNUM(i8, int8_t);
00053 SEXP_DEFNUM(u8, uint8_t);
00054 SEXP_DEFNUM(i16, int16_t);
00055 SEXP_DEFNUM(u16, uint16_t);
00056 SEXP_DEFNUM(i32, int32_t);
00057 SEXP_DEFNUM(u32, uint32_t);
00058 SEXP_DEFNUM(i64, int64_t);
00059 SEXP_DEFNUM(u64, uint64_t);
00060
00061
00062
00063
00064
00065 struct SEXP_val_list {
00066 void *b_addr;
00067 uint16_t offset;
00068 } __attribute__ ((packed));
00069
00070 #define SEXP_LCASTP(p) ((struct SEXP_val_list *)(p))
00071
00072 struct SEXP_val_lblk {
00073 uintptr_t nxsz;
00074 uint16_t real;
00075 uint16_t refs;
00076 SEXP_t memb[];
00077 } __attribute__ ((packed));
00078
00079 size_t SEXP_rawval_list_length (struct SEXP_val_list *list);
00080 uintptr_t SEXP_rawval_list_copy (uintptr_t lblkp, uint16_t n_skip);
00081
00082 uintptr_t SEXP_rawval_lblk_new (uint8_t sz);
00083 uintptr_t SEXP_rawval_lblk_incref (uintptr_t lblkp);
00084 int SEXP_rawval_lblk_decref (uintptr_t lblkp);
00085
00086 uintptr_t SEXP_rawval_lblk_fill (uintptr_t lblkp, SEXP_t *s_exp[], uint16_t s_exp_count);
00087 uintptr_t SEXP_rawval_lblk_add (uintptr_t lblkp, const SEXP_t *s_exp);
00088 uintptr_t SEXP_rawval_lblk_add1 (uintptr_t lblkp, const SEXP_t *s_exp);
00089 uintptr_t SEXP_rawval_lblk_last (uintptr_t lblkp);
00090 SEXP_t *SEXP_rawval_lblk_nth (uintptr_t lblkp, uint32_t n);
00091 uintptr_t SEXP_rawval_lblk_replace (uintptr_t lblkp, uint32_t n, const SEXP_t *n_val, SEXP_t **o_val);
00092 int SEXP_rawval_lblk_cb (uintptr_t lblkp, int (*func) (SEXP_t *, void *), void *arg, uint32_t n);
00093 void SEXP_rawval_lblk_free (uintptr_t lblkp, void (*func) (SEXP_t *));
00094 void SEXP_rawval_lblk_free1 (uintptr_t lblkp, void (*func) (SEXP_t *));
00095
00096 #define SEXP_LBLK_ALIGN 16
00097 #define SEXP_LBLKP_MASK (UINTPTR_MAX << 4)
00098 #define SEXP_LBLKS_MASK 0x0f
00099
00100 #define SEXP_VALP_LBLK(valp) ((struct SEXP_val_lblk *)((uintptr_t)(valp) & SEXP_LBLKP_MASK))
00101
00102 OSCAP_HIDDEN_END;
00103
00104 #endif