T *sT_(SemTable *sem,Symbol sym,int num_params,...){ va_list params; T *set = _t_newr(0,sym); va_start(params,num_params); int i; for(i=0;i<num_params;i++) { T * t = va_arg(params,T *); if (semeq(_t_symbol(t),STRUCTURE_SYMBOL)) { Symbol ss = *(Symbol *)_t_surface(t); if (is_structure(ss)) { T *structures = _sem_get_defs(G_sem,ss); T *st = _t_child(structures,ss.id); if (!st) { raise_error("Structure used in %s definition is undefined!",G_label); } else { _t_free(t); t = _t_clone(_t_child(st,2)); } } else if (ss.id == -1) {raise_error("Symbol used in %s definition is undefined!",G_label);} } _t_add(set,t); } va_end(params); return set; }
// create a TREE_DELTA tree T *makeDelta(Symbol sym,int *path,T *t,int count) { T *d = _t_new_root(sym); _t_new(d,TREE_DELTA_PATH,path,sizeof(int)*(_t_path_depth(path)+1)); _t_add(_t_newr(d,TREE_DELTA_VALUE),_t_clone(t)); if (count) _t_newi(d,TREE_DELTA_COUNT,count); return d; }
/** * @brief Creates a new receptor from a receptor package * * allocates all the memory needed in the heap, cloning the various parts from the package * and binding the new receptor to the provided bindings * * @param[in] s symbol for this receptor * @returns pointer to a newly allocated Receptor * @todo implement bindings */ Receptor *_r_new_receptor_from_package(SemTable *sem,Symbol s,T *p,T *bindings) { T *defs = _t_clone(_t_child(p,3)); // T *aspects = _t_clone(_t_child(p,4)); @todo this should be inside the defs allready raise_error("fix receptor address"); Receptor *r = _r_new(sem,s); //@todo fix this because it relies on SemanticTypes value matching the index order in the definitions. // DO_KIDS(defs,__r_set_labels(r,_t_child(defs,i),i)); return r; }