Edit

kc3-lang/kc3/libc3/types.h

Branch :

  • libc3/types.h
  • /* c3
     * Copyright 2022 kmx.io <contact@kmx.io>
     *
     * Permission is hereby granted to use this software excepted
     * on Apple computers granted the above copyright notice and
     * this permission paragraph are included in all copies and
     * substantial portions of this software.
     *
     * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
     * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
     * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
     * THIS SOFTWARE.
     */
    #ifndef TYPES_H
    #define TYPES_H
    
    #include <limits.h>
    #include <setjmp.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include "../libtommath/tommath.h"
    
    /* Basic integer types. */
    typedef char          s8;
    typedef int16_t       s16;
    typedef int32_t       s32;
    typedef long          sw;
    typedef int64_t       s64;
    typedef uint8_t       u8;
    typedef uint16_t      u16;
    typedef uint32_t      u32;
    typedef unsigned long uw;
    typedef uint64_t      u64;
    
    #define S32_MAX LONG_MAX
    #define S64_MAX LLONG_MAX
    #define U64_MAX ULLONG_MAX
    
    /* IEEE 754 floating point numbers. */
    typedef float               f32;
    typedef double              f64;
    
    /* Boolean : true or false. */
    typedef s8 bool;
    
    /* enums */
    typedef enum {
      false = 0,
      true = 1
    } e_bool;
    
    typedef enum {
      TAG_VOID = 0,
      TAG_BOOL = 1,
      TAG_CALL,
      TAG_CALL_FN,
      TAG_CALL_MACRO,
      TAG_CHARACTER,
      TAG_F32,
      TAG_F64,
      TAG_FN,
      TAG_IDENT,
      TAG_INTEGER,
      TAG_S64,
      TAG_S32,
      TAG_S16,
      TAG_S8,
      TAG_U8,
      TAG_U16,
      TAG_U32,
      TAG_U64,
      TAG_LIST,
      TAG_PTAG,
      TAG_QUOTE,
      TAG_STR,
      TAG_SYM,
      TAG_TUPLE,
      TAG_VAR
    } e_tag_type;
    
    /* structs */
    typedef struct arg                     s_arg;
    typedef struct binding                 s_binding;
    typedef struct buf                     s_buf;
    typedef struct buf_save                s_buf_save;
    typedef struct call                    s_call;
    typedef struct env                     s_env;
    typedef struct error_handler           s_error_handler;
    typedef struct fact                    s_fact;
    typedef struct facts                   s_facts;
    typedef struct facts_cursor            s_facts_cursor;
    typedef struct facts_spec_cursor       s_facts_spec_cursor;
    typedef struct facts_with_cursor       s_facts_with_cursor;
    typedef struct facts_with_cursor_level s_facts_with_cursor_level;
    typedef struct fn                      s_fn;
    typedef struct frame                   s_frame;
    typedef struct ident                   s_ident;
    typedef struct integer                 s_integer;
    typedef struct list                    s_list;
    typedef struct list                    s_list_map;
    typedef struct module                  s_module;
    typedef struct str                     s_str;
    typedef struct sym                     s_sym;
    typedef struct sym_list                s_sym_list;
    typedef struct tag                     s_tag;
    typedef struct tuple                   s_tuple;
    typedef struct unwind_protect          s_unwind_protect;
    
    /* unions */
    typedef union ptr      u_ptr;
    typedef union ptr_w    u_ptr_w;
    typedef union tag_data u_tag_data;
    typedef union tag_type u_tag_type;
    
    /* typedefs */
    typedef s32          character;
    typedef s_tag      **p_facts_spec;
    typedef s_tag       *p_quote;
    typedef const s_tag *p_tag;
    typedef const s_tag *p_var;
    typedef u64          t_skiplist_height;
    
    #define CHARACTER_MAX S32_MAX
    #define SKIPLIST_HEIGHT_MAX U64_MAX
    
    /* 1 */
    struct buf_save {
      s_buf_save *next;
      uw rpos;
      uw wpos;
    };
    
    struct fact {
      const s_tag *subject;
      const s_tag *predicate;
      const s_tag *object;
      uw id; /* XXX random without collision */
    };
    
    struct frame {
      s_binding *bindings;
      s_frame *next;
    };
    
    struct fn {
      uw arity;
      s_arg *args;
      s_binding *bindings;
      s_list *algo;
    };
    
    struct ident {
      const s_sym *module;
      const s_sym *sym;
    };
    
    struct module {
      const s_sym *name;
      s_facts *facts;
    };
    
    union ptr {
      const void *p;
      const s8   *ps8;
      const u8   *pu8;
    };
    
    union ptr_w {
      void *p;
      s8   *ps8;
      u8   *pu8;
    };
    
    struct sym_list {
      s_sym *sym;
      s_sym_list *next;
    };
    
    union tag_type {
      e_tag_type type;
    };
    
    struct tuple {
      uw count;
      s_tag *tag;
    };
    
    struct unwind_protect {
      jmp_buf buf;
      jmp_buf *jmp;
      s_unwind_protect *next;
    };
    
    /* 2 */
    struct arg {
      const s_sym *name;
      s_ident type;
      s_arg *next;
    };
    
    struct binding {
      const s_sym *name;
      const s_tag *value;
      s_binding *next;
    };
    
    struct buf {
      sw          column;
      sw        (*flush) (s_buf *buf);
      bool        free;
      sw          line;
      u_ptr_w     ptr;
      sw        (*refill) (s_buf *buf);
      uw          rpos;
      s_buf_save *save;
      uw          size;
      void       *user_ptr;
      u64         wpos;
    };
    
    struct call {
      /* key */
      s_ident ident;
      s_list *arguments;
      s_list_map *keyword;
      /* value */
      s_fn *fn;
    };
    
    struct facts_spec_cursor {
      p_facts_spec spec;
      const s_tag *subject;
      uw pos;
    };
    
    struct integer {
      mp_int mp_int;
    };
    
    struct str {
      u_ptr_w free;        /**< Pointer to free or NULL. */
      uw      size;        /**< Size in bytes. */
      u_ptr   ptr;         /**< Pointer to memory. */
    };
    
    /* 3 */
    struct env {
      s_list           *backtrace;
      s_error_handler  *error_handler;
      s_frame          *frame;
      s_buf             err;
      s_buf             in;
      s_buf             out;
      s_unwind_protect *unwind_protect;
    };
    
    struct sym {
      s_str str;
    };
    
    union tag_data {
      bool         bool;
      s_call       call;
      character    character;
      f32          f32;
      f64          f64;
      s_fn         fn;
      s_ident      ident;
      s_integer    integer;
      s_list      *list;
      p_tag        ptag;
      p_quote      quote;
      s_str        str;
      const s_sym *sym;
      s8           s8;
      s16          s16;
      s32          s32;
      s64          s64;
      s_tuple      tuple;
      u8           u8;
      u16          u16;
      u32          u32;
      u64          u64;
      p_var        var;
    };
    
    /* 4 */
    struct tag {
      u_tag_type type;
      u_tag_data data;
    };
    
    /* 5 */
    struct error_handler
    {
      s_list *backtrace;
      jmp_buf jmp_buf;
      s_error_handler *next;
      s_tag tag;
    };
    
    struct list {
      s_tag tag;
      s_tag next;
    };
    
    #define TYPEDEF_SET_ITEM(name, type)                                   \
      typedef struct set_item__##name s_set_item__##name;                  \
                                                                           \
      struct set_item__##name {                                            \
        type data;                                                         \
        uw hash;                                                           \
        s_set_item__##name *next;                                          \
        uw usage;                                                          \
      }
    
    TYPEDEF_SET_ITEM(tag, s_tag);
    TYPEDEF_SET_ITEM(fact, s_fact);
    
    #define TYPEDEF_SET(name, type)                                        \
      typedef struct set__##name {                                         \
        uw collisions;                                                     \
        uw count;                                                          \
        s_set_item__##name **items;                                        \
        uw max;                                                            \
      } s_set__##name
    
    TYPEDEF_SET(tag, s_tag);
    TYPEDEF_SET(fact, s_fact);
    
    #define TYPEDEF_SET_CURSOR(name)                                       \
      typedef struct set_cursor__##name {                                  \
        s_set__##name *set;                                                \
        uw i;                                                          \
        s_set_item__##name *item;                                          \
        uw count;                                                      \
      } s_set_cursor__##name
    
    TYPEDEF_SET_CURSOR(tag);
    TYPEDEF_SET_CURSOR(fact);
    
    #define TYPEDEF_SKIPLIST_NODE(name, type)                              \
      typedef struct skiplist_node__##name {                               \
        type name;                                                         \
        u8 height;                                                         \
      } s_skiplist_node__##name
    
    TYPEDEF_SKIPLIST_NODE(fact, s_fact *);
    
    #define TYPEDEF_SKIPLIST(name, type)                                   \
      typedef struct skiplist__##name {                                    \
        s_skiplist_node__##name *head;                                     \
        s8 (*compare) (const type a, const type b);                        \
        uw length;                                                         \
        u8 max_height;                                                     \
      } s_skiplist__##name
    
    TYPEDEF_SKIPLIST(fact, s_fact *);
    
    /* 5 */
    struct facts {
      s_set__tag        tags;
      s_set__fact       facts;
      s_skiplist__fact *index_spo;
      s_skiplist__fact *index_pos;
      s_skiplist__fact *index_osp;
      s_buf            *log;
    };
    
    struct facts_cursor {
      s_skiplist__fact *index;
      s_skiplist_node__fact *node;
      s_fact start;
      s_fact end;
      s_tag *var_subject;
      s_tag *var_predicate;
      s_tag *var_object;
    };
    
    /* 6 */
    struct facts_with_cursor_level {
      s_facts_cursor cursor;
      s_fact *fact;
      p_facts_spec spec;
    };
    
    /* 7 */
    struct facts_with_cursor {
      const s_facts *facts;
      s_binding *bindings;
      size_t facts_count;
      s_facts_with_cursor_level *levels;
      size_t level;
      p_facts_spec spec;
    };
    
    #endif /* TYPES_H */