/************************************************************************ MxAsp Copyright (C) 1998 Michael Garland. See "COPYING.txt" for details. $Id: MxAsp.cxx,v 1.7 1999/01/22 21:50:45 garland Exp $ ************************************************************************/ #include "stdmix.h" #include "MxAsp.h" #define MXASP_OWN_MEMORY 0x1 void MxAspVar::own_memory(bool t) { if( t ) flags |= MXASP_OWN_MEMORY; else flags &= ~MXASP_OWN_MEMORY; } bool MxAspVar::is_memory_owned() { return flags & MXASP_OWN_MEMORY; } void MxAspVar::clear() { type = MXASP_NULL; size = 0; flags = 0; as.any = NULL; name = NULL; } void MxAspVar::bind(const char *n, MxAspType t, void *v, uint len) { unbind(); name = strdup(n); type = t; as.any = v; size = len; } void MxAspVar::unbind() { if( is_memory_owned() && as.any ) free(as.any); if( name ) free(name); clear(); } #define asprint(V)\ out<< *as.V##_var; \ for(i=1; i"; break; default: out << "#"; break; } return out; } #undef asprint #define defset(V, T) \ bool MxAspVar::set_##V(V val, uint i) \ {\ if( type==T && i=size ) return false; switch( type ) { case MXASP_BOOL: as.bool_var[i] = atoi(str)&1; break; case MXASP_INT: as.int_var[i] = atoi(str); break; case MXASP_UINT: as.uint_var[i] = atoi(str); break; case MXASP_FLOAT: as.float_var[i] = atof(str); break; case MXASP_DOUBLE: as.double_var[i] = atof(str); break; default: return false; } return true; } bool MxAspVar::apply(int argc, const char **argv, MxAspStore *store) { if( type==MXASP_PROC && argc>=as.proc_var->args_expected ) { if( as.proc_var->args_expected==0 ) { apply(NULL, store); } else { void *value = mxasp_alloc_value(as.proc_var->arg_type, as.proc_var->args_expected); MxAspVar arg("{frame}", as.proc_var->arg_type, value, as.proc_var->args_expected); arg.own_memory(true); for(uint i=0; iproc)(arg, store); return true; } return false; } MxAspStore::MxAspStore() : vars(8) { } MxAspVar *MxAspStore::lookup(const char *name) const { for(uint i=0; iproc = proc; defn->arg_type = type; defn->args_expected = expects; return defvar(name, MXASP_PROC, defn, 1); } bool MxAspStore::execute_command(int argc, const char *cmd, const char **argv) { const char *varname = argc?argv[0]:(const char*)NULL; MxAspVar *avar = varname?lookup(varname):(MxAspVar*)NULL; if( streq(cmd, "set") ) { if( avar ) { for(uint i=1; iread_from(argv[i], i-1); } else mxmsg_signal(MXMSG_WARN, "Tried to SET undefined Asp variable", varname); } else if( streq(cmd, "print") ) { if( avar ) { cout << " : " << varname << " = "; avar->print(cout) << endl; } else mxmsg_signal(MXMSG_WARN, "Tried to PRINT undefined Asp variable", varname); } else if( streq(cmd, "defvar") ) { if( avar ) mxmsg_signal(MXMSG_WARN, "Can't redefine Asp variable", varname); else { MxAspType type = mxasp_type_from_name(argv[1]); uint size = (argc>2)?atoi(argv[2]):1; void *value = mxasp_alloc_value(type, size); avar = defvar(varname, type, value, size); avar->own_memory(true); } } else if( (avar=lookup(cmd)) ) { avar->apply(argc, argv, this); } else return false; return true; } void MxAspStore::write(ostream& out) { out << "# ASP automatic state dump" << endl; for(uint i=0; iMXASP_NULL && t