Commit cb5b2ef3c1140462332660adcba41413edfada2f

Thomas de Grivel 2023-04-03T00:37:10

wip array

diff --git a/libc3/buf_inspect.c b/libc3/buf_inspect.c
index a978135..913ef1d 100644
--- a/libc3/buf_inspect.c
+++ b/libc3/buf_inspect.c
@@ -33,7 +33,70 @@ sw buf_inspect_array (s_buf *buf, const s_array *a)
   sw result = 0;
   assert(a);
   assert(buf);
-  address = calloc(a->dimension, sizeof(uw));
+  switch (a->type) {
+  case TAG_VOID:
+    assert(! "void array");
+    errx(1, "void array");
+    return -1;
+  case TAG_ARRAY:
+    inspect = (f_buf_inspect) buf_inspect_array;
+    break;
+  case TAG_BOOL:
+    inspect = (f_buf_inspect) buf_inspect_bool;
+    break;
+  case TAG_CALL:
+  case TAG_CALL_FN:
+  case TAG_CALL_MACRO:
+    inspect = (f_buf_inspect) buf_inspect_call;
+  case TAG_CFN:
+    inspect = (f_buf_inspect) buf_inspect_cfn;
+  case TAG_CHARACTER:
+    inspect = (f_buf_inspect) buf_inspect_character;
+  case TAG_F32:
+    inspect = (f_buf_inspect) buf_inspect_f32;
+  case TAG_F64:
+    inspect = (f_buf_inspect) buf_inspect_f64;
+  case TAG_FN:
+    inspect = (f_buf_inspect) buf_inspect_fn;
+  case TAG_IDENT:
+    inspect = (f_buf_inspect) buf_inspect_ident;
+  case TAG_INTEGER:
+    inspect = (f_buf_inspect) buf_inspect_integer;
+  case TAG_S64:
+    inspect = (f_buf_inspect) buf_inspect_s64;
+  case TAG_S32:
+    inspect = (f_buf_inspect) buf_inspect_s32;
+  case TAG_S16:
+    inspect = (f_buf_inspect) buf_inspect_s16;
+  case TAG_S8:
+    inspect = (f_buf_inspect) buf_inspect_s8;
+  case TAG_U8:
+    inspect = (f_buf_inspect) buf_inspect_u8;
+  case TAG_U16:
+    inspect = (f_buf_inspect) buf_inspect_u16;
+  case TAG_U32:
+    inspect = (f_buf_inspect) buf_inspect_u32;
+  case TAG_U64:
+    inspect = (f_buf_inspect) buf_inspect_u64;
+  case TAG_LIST:
+    inspect = (f_buf_inspect) buf_inspect_list;
+  case TAG_PTAG:
+    inspect = (f_buf_inspect) buf_inspect_ptag;
+  case TAG_QUOTE:
+    inspect = (f_buf_inspect) buf_inspect_quote;
+  case TAG_STR:
+    inspect = (f_buf_inspect) buf_inspect_str;
+  case TAG_SYM:
+    inspect = (f_buf_inspect) buf_inspect_sym;
+  case TAG_TUPLE:
+    inspect = (f_buf_inspect) buf_inspect_tuple;
+  case TAG_VAR:
+    inspect = (f_buf_inspect) buf_inspect_var;
+  }
+  if (! (address = calloc(a->dimension, sizeof(uw)))) {
+    err(1, "buf_inspect_array");
+    return -1;
+  }
   while (i < a->dimension) {
     if (i < a->dimension - 1) {
       if (! address[i]) {
@@ -43,66 +106,6 @@ sw buf_inspect_array (s_buf *buf, const s_array *a)
       }
     }
     if (i == a->dimension - 1) {
-      switch (a->type) {
-      case TAG_VOID:
-        assert(! "void array");
-        errx(1, "void array");
-        return -1;
-      case TAG_ARRAY:
-        inspect = (f_buf_inspect) buf_inspect_array;
-        break;
-      case TAG_BOOL:
-        inspect = (f_buf_inspect) buf_inspect_bool;
-        break;
-      case TAG_CALL:
-      case TAG_CALL_FN:
-      case TAG_CALL_MACRO:
-        inspect = (f_buf_inspect) buf_inspect_call;
-      case TAG_CFN:
-        inspect = (f_buf_inspect) buf_inspect_cfn;
-      case TAG_CHARACTER:
-        inspect = (f_buf_inspect) buf_inspect_character;
-      case TAG_F32:
-        inspect = (f_buf_inspect) buf_inspect_f32;
-      case TAG_F64:
-        inspect = (f_buf_inspect) buf_inspect_f64;
-      case TAG_FN:
-        inspect = (f_buf_inspect) buf_inspect_fn;
-      case TAG_IDENT:
-        inspect = (f_buf_inspect) buf_inspect_ident;
-      case TAG_INTEGER:
-        inspect = (f_buf_inspect) buf_inspect_integer;
-      case TAG_S64:
-        inspect = (f_buf_inspect) buf_inspect_s64;
-      case TAG_S32:
-        inspect = (f_buf_inspect) buf_inspect_s32;
-      case TAG_S16:
-        inspect = (f_buf_inspect) buf_inspect_s16;
-      case TAG_S8:
-        inspect = (f_buf_inspect) buf_inspect_s8;
-      case TAG_U8:
-        inspect = (f_buf_inspect) buf_inspect_u8;
-      case TAG_U16:
-        inspect = (f_buf_inspect) buf_inspect_u16;
-      case TAG_U32:
-        inspect = (f_buf_inspect) buf_inspect_u32;
-      case TAG_U64:
-        inspect = (f_buf_inspect) buf_inspect_u64;
-      case TAG_LIST:
-        inspect = (f_buf_inspect) buf_inspect_list;
-      case TAG_PTAG:
-        inspect = (f_buf_inspect) buf_inspect_ptag;
-      case TAG_QUOTE:
-        inspect = (f_buf_inspect) buf_inspect_quote;
-      case TAG_STR:
-        inspect = (f_buf_inspect) buf_inspect_str;
-      case TAG_SYM:
-        inspect = (f_buf_inspect) buf_inspect_sym;
-      case TAG_TUPLE:
-        inspect = (f_buf_inspect) buf_inspect_tuple;
-      case TAG_VAR:
-        inspect = (f_buf_inspect) buf_inspect_var;
-      }
       if ((r = inspect(buf, array_data(a, address))) < 0)
         return r;
       result += r;
diff --git a/libc3/buf_parse.c b/libc3/buf_parse.c
index ff707cf..4e9a7ab 100644
--- a/libc3/buf_parse.c
+++ b/libc3/buf_parse.c
@@ -19,6 +19,156 @@
 
 sw buf_parse_cfn_arg_types (s_buf *buf, s_list **dest);
 
+sw buf_parse_array (s_buf *buf, s_array *a)
+{
+  uw *address;
+  uw i = 0;
+  void *item;
+  sw item_size;
+  f_buf_parse parse = 0;
+  sw r;
+  sw result = 0;
+  s_buf_save save;
+  s_array tmp;
+  const s_sym *type;
+  assert(buf);
+  assert(a);
+  buf_save_init(buf, &save);
+  if ((r = buf_read_1(buf, "(")) < 0)
+    goto clean;
+  result += r;
+  if ((r = buf_ignore_spaces(buf)) < 0)
+    goto clean;
+  result += r;
+  if ((r = buf_parse_sym(buf, &type)) < 0)
+    goto restore;
+  result += r;
+  tmp.type = sym_to_e_tag_type(type);
+  item_size = tag_type_size(tmp.type);
+  if (! (item = calloc(1, item_size))) {
+    buf_save_clean(buf, &save);
+    err(1, "buf_parse_array");
+    return -1;
+  }
+  if ((r = buf_ignore_spaces(buf)) < 0)
+    goto clean;
+  result += r;
+  if ((r = buf_read_1(buf, ")")) < 0)
+    goto clean;
+  result += r;
+  if ((r = buf_ignore_spaces(buf)) < 0)
+    goto clean;
+  result += r;
+  tmp.dimension = 0;
+  while ((r = buf_read_1(buf, "[")) > 0) {
+    result += r;
+    tmp.dimension++;
+    if ((r = buf_ignore_spaces(buf)) < 0)
+      goto restore;
+    result += r;
+  }
+  if (r < 0)
+    goto restore;
+  i = tmp.dimension;
+  tmp.dimension++;
+  if (! (address = calloc(tmp.dimension, sizeof(uw))))
+    err(1, "buf_parse_array");
+  if (! (tmp.sizes = calloc(tmp.dimension, sizeof(uw))))
+    err(1, "buf_parse_array");
+  switch (tmp.type) {
+  case TAG_VOID:
+    buf_save_clean(buf, &save);
+    errx(1, "void array element type");
+    return -1;
+  case TAG_ARRAY:
+    parse = (f_buf_parse) buf_parse_array;
+    break;
+  case TAG_BOOL:
+    parse = (f_buf_parse) buf_parse_bool;
+    break;
+  case TAG_CALL:
+  case TAG_CALL_FN:
+  case TAG_CALL_MACRO:
+    parse = (f_buf_parse) buf_parse_call;
+    break;
+  case TAG_CFN:
+    parse = (f_buf_parse) buf_parse_cfn;
+    break;
+  case TAG_CHARACTER:
+    parse = (f_buf_parse) buf_parse_character;
+    break;
+  case TAG_F32:
+    parse = (f_buf_parse) buf_parse_f32;
+    break;
+  case TAG_F64:
+    parse = (f_buf_parse) buf_parse_f64;
+    break;
+  case TAG_FN:
+    parse = (f_buf_parse) buf_parse_fn;
+    break;
+  case TAG_IDENT:
+    parse = (f_buf_parse) buf_parse_ident;
+    break;
+  case TAG_INTEGER:
+    parse = (f_buf_parse) buf_parse_integer;
+    break;
+  case TAG_S64:
+    parse = (f_buf_parse) buf_parse_s64;
+    break;
+  case TAG_S32:
+    parse = (f_buf_parse) buf_parse_s32;
+    break;
+  case TAG_S16:
+    parse = (f_buf_parse) buf_parse_s16;
+    break;
+  case TAG_S8:
+    parse = (f_buf_parse) buf_parse_s8;
+    break;
+  case TAG_U8:
+    parse = (f_buf_parse) buf_parse_u8;
+    break;
+  case TAG_U16:
+    parse = (f_buf_parse) buf_parse_u16;
+    break;
+  case TAG_U32:
+    parse = (f_buf_parse) buf_parse_32;
+    break;
+  case TAG_U64:
+    parse = (f_buf_parse) buf_parse_u64;
+    break;
+  case TAG_LIST:
+    parse = (f_buf_parse) buf_parse_list;
+    break;
+  case TAG_PTAG:
+    parse = (f_buf_parse) buf_parse_ptag;
+    break;
+  case TAG_QUOTE:
+    parse = (f_buf_parse) buf_parse_quote;
+    break;
+  case TAG_STR:
+    parse = (f_buf_parse) buf_parse_str;
+    break;
+  case TAG_SYM:
+    parse = (f_buf_parse) buf_parse_sym;
+    break;
+  case TAG_TUPLE:
+    parse = (f_buf_parse) buf_parse_tuple;
+    break;
+  case TAG_VAR:
+    parse = (f_buf_parse) buf_parse_var;
+    break;
+  while (i < tmp.dimension) {
+    if (i == tmp.dimension - 1) {
+      if ((r = parse(buf, 
+    i++;
+  }
+ restore:
+  buf_save_restore_rpos(buf, &save);
+ clean:
+  buf_save_clean(buf, &save);
+  return r;
+}
+
 sw buf_parse_bool (s_buf *buf, bool *p)
 {
   character c;
@@ -1288,6 +1438,21 @@ sw buf_parse_quote (s_buf *buf, s_quote *dest)
   return r;
 }
 
+sw buf_parse_s (s_buf *buf, void *s, u8 size, const s_str *base)
+{
+  character c;
+  sw i;
+  sw r;
+  sw result = 0;
+  s_buf_save save;
+  assert(buf);
+  assert(s);
+  assert(size);
+  buf_save_init(buf, &save);
+  while ((r = buf_parse_character_from_str(buf, base, &c)) > 0)
+    i = str_character_index(base, c);
+}
+
 sw buf_parse_str (s_buf *buf, s_str *dest)
 {
   u8 b;
diff --git a/libc3/buf_parse.h b/libc3/buf_parse.h
index 796fffe..fc4972f 100644
--- a/libc3/buf_parse.h
+++ b/libc3/buf_parse.h
@@ -30,6 +30,8 @@
  * dest is untouched.
  */
 
+typedef sw (* f_buf_parse) (s_buf *buf, void *dest);
+
 sw buf_parse_bool (s_buf *buf, bool *dest);
 sw buf_parse_call (s_buf *buf, s_call *dest);
 sw buf_parse_call_args_paren (s_buf *buf, s_call *dest);
diff --git a/libc3/hash.c b/libc3/hash.c
index e928d29..e415c2e 100644
--- a/libc3/hash.c
+++ b/libc3/hash.c
@@ -23,7 +23,6 @@
   {                                                                    \
     const s8 t[] = #type;                                              \
     assert(hash);                                                      \
-    assert(x);                                                         \
     hash_update(hash, t, sizeof(t));                                   \
     hash_update(hash, &x, sizeof(x));                                  \
   }