-PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error)
-{
- size_t i, j;
- PSI_Data T;
-
- if (!C) {
- C = malloc(sizeof(*C));
- }
- memset(C, 0, sizeof(*C));
-
- C->error = error;
- C->ops = ops;
- ops->init(C);
-
- /* build up predefs in a temporary PSI_Data for validation */
- memset(&T, 0, sizeof(T));
- T.error = error;
-
- for (i = 0; i < psi_predef_type_count(); ++i) {
- const psi_predef_type *pre = &psi_predef_types[i];
- decl_type *type = init_decl_type(pre->type_tag, pre->type_name);
- decl_typedef *def = init_decl_typedef(pre->alias, type);
-
- T.defs = add_decl_typedef(T.defs, def);
- }
- for (i = 0; i < psi_predef_const_count(); ++i) {
- const psi_predef_const *pre = &psi_predef_consts[i];
- impl_def_val *val = init_impl_def_val(pre->val_type_tag, pre->val_text);
- const_type *type = init_const_type(pre->type_tag, pre->type_name);
- constant *constant = init_constant(type, pre->name, val);
-
- T.consts = add_constant(T.consts, constant);
- }
- for (i = 0; i < psi_predef_struct_count(); ++i) {
- const psi_predef_struct *pre = &psi_predef_structs[i];
- decl_args *dargs = init_decl_args(NULL);
- decl_struct *dstruct;
-
- for (j = 0; j < PSI_PREDEF_STRUCT_MEMBERS; ++j) {
- const psi_predef_struct_member *member = &pre->members[j];
- decl_type *type;
- decl_var *dvar;
- decl_arg *darg;
-
- if (!member->name) {
- break;
- }
-
- type = init_decl_type(member->type_tag, member->type_name);
- dvar = init_decl_var(member->name, member->pointer_level, member->array_size);
- darg = init_decl_arg(type, dvar);
- darg->layout = init_decl_struct_layout(member->off, member->len);
- dargs = add_decl_arg(dargs, darg);
- }
-
- dstruct = init_decl_struct(pre->name, dargs);
- dstruct->size = pre->size;
- T.structs = add_decl_struct(T.structs, dstruct);
- }
-
- for (i = 0; i < psi_predef_type_count(); ++i) {
- decl_typedef *def = T.defs->list[i];
-
- if (validate_decl_typedef(&T, def)) {
- C->defs = add_decl_typedef(C->defs, def);
- }
- }
-
- for (i = 0; i < psi_predef_const_count(); ++i) {
- constant *constant = T.consts->list[i];
-
- if (validate_constant(&T, constant)) {
- C->consts = add_constant(C->consts, constant);