Branch
Hash :
a16819fb
Author :
Thomas de Grivel
Date :
2025-04-29T21:16:54
refactor: rename block into do_block
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
/* kc3
* Copyright from 2022 to 2025 kmx.io <contact@kmx.io>
*
* Permission is hereby granted to use this software 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.
*/
#include "kc3.h"
#include "buf_inspect.h"
#include "buf_parse.h"
#include "sym.h"
#include "tag_type.h"
#include "ratio.h"
bool tag_type_size (e_tag_type type, uw *dest)
{
switch (type) {
case TAG_VOID: *dest = 0; return true;
case TAG_ARRAY: *dest = sizeof(s_array); return true;
case TAG_DO_BLOCK: *dest = sizeof(s_do_block); return true;
case TAG_BOOL: *dest = sizeof(bool); return true;
case TAG_CALL: *dest = sizeof(s_call); return true;
case TAG_CHARACTER: *dest = sizeof(character); return true;
case TAG_COMPLEX: *dest = sizeof(s_complex *); return true;
case TAG_COW: *dest = sizeof(s_cow *); return true;
case TAG_F32: *dest = sizeof(f32); return true;
case TAG_F64: *dest = sizeof(f64); return true;
case TAG_F128: *dest = sizeof(f128); return true;
case TAG_FACT: *dest = sizeof(s_fact); return true;
case TAG_IDENT: *dest = sizeof(s_ident); return true;
case TAG_INTEGER: *dest = sizeof(s_integer); return true;
case TAG_LIST: *dest = sizeof(s_list *); return true;
case TAG_MAP: *dest = sizeof(s_map); return true;
case TAG_PCALLABLE: *dest = sizeof(p_callable); return true;
case TAG_PSTRUCT: *dest = sizeof(p_struct); return true;
case TAG_PSTRUCT_TYPE: *dest = sizeof(p_struct_type); return true;
case TAG_PTAG: *dest = sizeof(p_tag); return true;
case TAG_PTR:
case TAG_PTR_FREE: *dest = sizeof(void *); return true;
case TAG_QUOTE: *dest = sizeof(s_quote); return true;
case TAG_RATIO: *dest = sizeof(s_ratio); return true;
case TAG_S8: *dest = sizeof(s8); return true;
case TAG_S16: *dest = sizeof(s16); return true;
case TAG_S32: *dest = sizeof(s32); return true;
case TAG_S64: *dest = sizeof(s64); return true;
case TAG_STR: *dest = sizeof(s_str); return true;
case TAG_SW: *dest = sizeof(sw); return true;
case TAG_SYM: *dest = sizeof(s_sym *); return true;
case TAG_TIME: *dest = sizeof(s_time); return true;
case TAG_TUPLE: *dest = sizeof(s_tuple); return true;
case TAG_U8: *dest = sizeof(u8); return true;
case TAG_U16: *dest = sizeof(u16); return true;
case TAG_U32: *dest = sizeof(u32); return true;
case TAG_U64: *dest = sizeof(u64); return true;
case TAG_UNQUOTE: *dest = sizeof(s_unquote); return true;
case TAG_UW: *dest = sizeof(uw); return true;
case TAG_VAR: *dest = sizeof(s_tag); return true;
}
err_puts("tag_type_size: invalid tag type");
assert(! "tag_type_size: invalid tag type");
return false;
}
bool tag_type_to_ffi_type (e_tag_type type, ffi_type **dest)
{
switch (type) {
case TAG_ARRAY: *dest = &ffi_type_pointer; return true;
case TAG_DO_BLOCK: *dest = &ffi_type_pointer; return true;
case TAG_BOOL: *dest = &ffi_type_uint8; return true;
case TAG_CALL: *dest = &ffi_type_pointer; return true;
case TAG_CHARACTER: *dest = &ffi_type_uint32; return true;
case TAG_COMPLEX: *dest = &ffi_type_pointer; return true;
case TAG_COW: *dest = &ffi_type_pointer; return true;
case TAG_F32: *dest = &ffi_type_float; return true;
case TAG_F64: *dest = &ffi_type_double; return true;
case TAG_F128: *dest = &ffi_type_longdouble; return true;
case TAG_FACT: *dest = &ffi_type_pointer; return true;
case TAG_IDENT: *dest = &ffi_type_pointer; return true;
case TAG_INTEGER: *dest = &ffi_type_pointer; return true;
case TAG_LIST: *dest = &ffi_type_pointer; return true;
case TAG_MAP: *dest = &ffi_type_pointer; return true;
case TAG_PCALLABLE: *dest = &ffi_type_pointer; return true;
case TAG_PSTRUCT: *dest = &ffi_type_pointer; return true;
case TAG_PSTRUCT_TYPE: *dest = &ffi_type_pointer; return true;
case TAG_PTAG: *dest = &ffi_type_pointer; return true;
case TAG_PTR: *dest = &ffi_type_pointer; return true;
case TAG_PTR_FREE: *dest = &ffi_type_pointer; return true;
case TAG_QUOTE: *dest = &ffi_type_pointer; return true;
case TAG_RATIO: *dest = &ffi_type_pointer; return true;
case TAG_S8: *dest = &ffi_type_sint8; return true;
case TAG_S16: *dest = &ffi_type_sint16; return true;
case TAG_S32: *dest = &ffi_type_sint32; return true;
case TAG_S64: *dest = &ffi_type_sint64; return true;
case TAG_SW: *dest = &ffi_type_slong; return true;
case TAG_STR: *dest = &ffi_type_pointer; return true;
case TAG_SYM: *dest = &ffi_type_pointer; return true;
case TAG_TIME : *dest = &ffi_type_pointer; return true;
case TAG_TUPLE: *dest = &ffi_type_pointer; return true;
case TAG_U8: *dest = &ffi_type_uint8; return true;
case TAG_U16: *dest = &ffi_type_uint16; return true;
case TAG_U32: *dest = &ffi_type_uint32; return true;
case TAG_U64: *dest = &ffi_type_uint64; return true;
case TAG_UNQUOTE: *dest = &ffi_type_pointer; return true;
case TAG_UW: *dest = &ffi_type_ulong; return true;
case TAG_VAR: *dest = &ffi_type_pointer; return true;
case TAG_VOID: *dest = &ffi_type_void; return true;
}
err_puts("tag_type_to_ffi_type: invalid tag type");
assert(! "tag_type_to_ffi_type: invalid tag type");
return false;
}
const char * tag_type_to_string (e_tag_type tag_type)
{
switch (tag_type) {
case TAG_VOID: return "Void";
case TAG_ARRAY: return "Array";
case TAG_DO_BLOCK: return "Block";
case TAG_BOOL: return "Bool";
case TAG_CALL: return "Call";
case TAG_CHARACTER: return "Character";
case TAG_COMPLEX: return "Complex";
case TAG_COW: return "Cow";
case TAG_F32: return "F32";
case TAG_F64: return "F64";
case TAG_F128: return "F128";
case TAG_FACT: return "Fact";
case TAG_IDENT: return "Ident";
case TAG_INTEGER: return "Integer";
case TAG_LIST: return "List";
case TAG_MAP: return "Map";
case TAG_PCALLABLE: return "Callable";
case TAG_PSTRUCT: return "Struct";
case TAG_PSTRUCT_TYPE: return "StructType";
case TAG_PTAG: return "Ptag";
case TAG_PTR: return "Ptr";
case TAG_PTR_FREE: return "PtrFree";
case TAG_QUOTE: return "Quote";
case TAG_RATIO: return "Ratio";
case TAG_S8: return "S8";
case TAG_S16: return "S16";
case TAG_S32: return "S32";
case TAG_S64: return "S64";
case TAG_STR: return "Str";
case TAG_SW: return "Sw";
case TAG_SYM: return "Sym";
case TAG_TIME: return "Time";
case TAG_TUPLE: return "Tuple";
case TAG_U8: return "U8";
case TAG_U16: return "U16";
case TAG_U32: return "U32";
case TAG_U64: return "U64";
case TAG_UNQUOTE: return "Unquote";
case TAG_UW: return "Uw";
case TAG_VAR: return "Var";
}
err_puts("tag_type_to_string: invalid tag type");
assert(! "tag_type_to_string: invalid tag type");
return NULL;
}