use b_plain use cz/vars # TODO parse declarations properly in parse.b not like this cz_meta() new(mtype_buf, buffer, 128) boolean some_meta = 0 for_vec(i, structs_unions_classes_templates, vec*) cstr l = *(cstr*)vec0(*i) int n = veclen(*i) - 1 cstr type cstr name if (name = cstr_begins_with_word(l, "struct")) type = "STRUCT" eif (name = cstr_begins_with_word(l, "union")) type = "UNION" else continue char *p = strchr(name, ' ') if p name = tofree(Strndup(name, p-name)) New(v, vec, cstr, 16) vec_push(v, fformat("type__struct_union struct__t_%s =", name)) vec_push(v, fformat("\t{ TYPE_%s, \"%s\", sizeof(%s) }, %d,", type, name, name, n)) for(j, 0, n) l = *(cstr*)v(*i, j+1) + 1 cstr mname = strrchr(l, ' ') if !mname error("cz_meta: struct %s member lacks name", name) ++mname while *mname == '*' ++mname bufclr(mtype_buf) buffer_cat_range(mtype_buf, l, mname - (mname[-1] == ' ')) for_buffer(p, mtype_buf) which *p ' ' *p = '_' '*' *p = 'p' p = mname + strlen(mname)-1 while *p == ']' char *q = p while p >= mname+2 && p[-1] != '[' --p if p < mname+2 error("cz_meta: unmatched [] in array type: %s", l) buffer_cat_cstr(mtype_buf, "_a") buffer_cat_range(mtype_buf, p, q) p -= 2 p++ vec_push(v, fformat("\t\t{ (type*)t_%s, \"%.*s\", offsetof(%s, %.*s) }%s", buffer_to_cstr(mtype_buf), p-mname, mname, name, p-mname, mname, j==n-1 ? "" : ",")) vec_push(var_assignments, v) vec_push(defines, vec1(fformat("def t_%s &struct__t_%s", name, name))) # vec_push(v1, fformat("type__struct_union *t_%s = &struct__t_%s", name, name)) # vec_push(var_assignments, v1) some_meta = 1 if some_meta vec_push(includes, (cstr)"use ") buffer_free(mtype_buf)