#include "symbols.h" #include #include #include #include void mascInit_Table(Symbols *symbols) { memset(symbols, 0, sizeof(Symbols)); sprintf(symbols->rootobj.name,"%s","#@ROOTOBJ@#"); } void mascFree_Table(Symbols *symbols) { mascFree_Object(&symbols->rootobj); } masc_Object *mascInit_Object(Symbols *symbols, const char *name) { masc_Object *p = &symbols->rootobj, **ptr = &p; while ( (p = *ptr) != 0 ) { int cmp = strcmp(p->name, name); if(cmp == 0) return p; ptr = &p->next; } p = ( masc_Object * ) calloc ( 1, sizeof( masc_Object ) ); sprintf(p->name, "%s", name); p->next = 0; *ptr = p; p->var.rootvar.name="#@ROOTVAR@#"; sprintf(p->methods.name, "%s", "#@ROOTMETHOD@#"); return p; } static void mascFree_iObject(masc_iObject *n) { if(n && n->next) mascFree_iObject(n->next); if(n) free(n); } void mascFree_Object(masc_Object *m) { if(m->next) mascFree_Object(m->next); if(m && strcmp(m->name, "#@ROOTOBJ@#") != 0) { // free methods mascFree_Methods(&m->methods); // free varaibles mascFree_Variables(&m->var.rootvar); mascFree_iObject(m->uses_obj); // free object free(m); } } masc_Object *mascFind_Object(Symbols *symbols, const char *name) { masc_Object *p = &symbols->rootobj, **ptr = &p; while ( (p = *ptr) != 0 ) { int cmp = strcmp(p->name, name); if(cmp == 0) return p; ptr = &p->next; } return 0; } masc_Object *mascFind_DriverObject(Symbols *symbols) { masc_Object *o = &symbols->rootobj, **oo = &o; while ( (o = *oo) != 0 ) { if(o->driver_object == 1) return o; oo = &o->next; } return 0; } void mascInsert_Object(masc_Object *object, masc_Object *objectx) { masc_iObject *ix = object->uses_obj; masc_iObject **pointer = &ix; while ( (ix = *pointer) != 0) { pointer = &ix->next; } ix = ( masc_iObject * ) calloc( 1, sizeof( masc_iObject ) ); ix->glued_object = (void*) objectx; ix->name = objectx->name; ix->next = 0; *pointer = ix; } masc_Expr *mascExpr_Insert(masc_Expr *head, masc_List *token) { masc_Expr *h = head, **hh = &h; while ( (h = *hh) != 0) { hh = &h->next; } h = (masc_Expr *) calloc ( 1, sizeof(masc_Expr)); h->next = 0; h->token = token; *hh = h; return h; } masc_Var *mascSet_Variable(masc_Object *m, const char *name, const char *value, float f, int type) { printf(" - object variable %s value %s \n", name, value); masc_Object *m_u = m, **ms = &m_u; masc_Var *depth = 0, *v = 0, **vv = 0; // scan object for inherited variables so no duplicates while ( (m_u = *ms) != 0 ) { v = &m_u->var.rootvar; vv = &v; while ( (v = *vv) != 0 ) { int cmp = strcmp(v->name, name); if(cmp == 0) { if(v->value) free(v->value); v->value = strdup(value); v->fval = f; v->type = type; v->array = 0; v->expr.next = 0; v->expr.id="#@ROOTEXPR@#"; return v; } vv = &v->next; } if(m_u == m) depth = v; ms = (masc_Object **)&m_u->uses_obj->glued_object; } v = depth; v = ( masc_Var *) calloc ( 1, sizeof( masc_Var ) ); v->name = strdup(name); v->value = strdup(value); v->fval = f; v->type = type; v->array = 0; v->expr.next = 0; v->expr.id="#@ROOTEXPR@#"; *vv = v; return v; } masc_Var *mascGet_Variable(masc_Object *m, const char *name) { masc_Object *m_u = m; while ( m_u != 0) { masc_Var *v = &m_u->var.rootvar, **vv = &v; while( (v = *vv) != 0) { int cmp = strcmp(v->name, name); if(cmp == 0) return v; vv = &v->next; } m_u = (masc_Object*) m_u->uses_obj->glued_object; } return 0; } static void freeExpr(masc_Expr *e) { if(e->next) freeExpr(e->next); if(e) { if(e->id) free(e->id); if(e->obj) free(e->obj); free(e); } } void mascFree_Variables(masc_Var *vars) { if(vars->next) mascFree_Variables(vars->next); if(vars && strcmp(vars->name, "#@ROOTVAR@#") != 0) { if( vars->name ) free(vars->name); if( vars->value ) free(vars->value); if(vars->expr.next != 0) freeExpr(vars->expr.next); if( vars ) free(vars); vars->name = 0; vars->value = 0; vars = 0; } } masc_Method *mascAdd_Method(masc_Object *m, char *name) { masc_Method *v = &m->methods, **vv = &v; while ( (v = *vv) != 0 ) { int cmp = strcmp(v->name, name); if(cmp == 0) return v; vv = (cmp == 0) ? &v->left : &v->right; } v = (masc_Method *) calloc (1, sizeof(masc_Method)); sprintf(v->name, "%s", name); *vv = v; return v; } masc_Method *mascGet_Method(masc_Object *m, char *name) { masc_Object *m_u = m; while ( m_u != 0) { masc_Method *v = &m->methods, **vv = &v; while ( (v = *vv) != 0 ) { int cmp = strcmp(v->name, name); if(cmp == 0) return v; vv = (cmp == 0) ? &v->left : &v->right; } m_u = (masc_Object *)m_u->uses_obj->glued_object; } return 0; } void mascFree_Methods(masc_Method *method) { if(method->left) mascFree_Methods(method->left); if(method->right) mascFree_Methods(method->right); if(method && strcmp(method->name,"#@ROOTMETHOD@#") != 0) { masc_Inc *r = method->start_of_code; while ( r != 0 ) { masc_Inc *f = r; r = r->next; if(f) { if(f->operand1.id != 0) free(f->operand1.id); if(f->operand1.obj != 0) free(f->operand1.obj); if(f->operand1.next) freeExpr(f->operand1.next); if(f->operand2.next) freeExpr(f->operand2.next); if(f->arg_list.next) freeExpr(f->arg_list.next); free(f); } } free(method); } }