void data_table_create(void) { data_hash_table_create(); data_patricia_trie_create(); data_double_array_trie_create(); data_array_create(); data_view_create(); }
data_t * _file_open(char *name) { data_t *dummy = data_create(Bool, 0); array_t *args = data_array_create(1); data_t *f; array_push(args, data_create(String, "file.txt")); f = data_execute(dummy, "open", args, NULL); array_free(args); data_free(dummy); return f; }
data_t * execute(data_t *self, char *name, int numargs, ...) { va_list arglist; array_t *args; data_t *ret; data_t *d; int ix; int type; long intval; double dblval; char *ptr; args = data_array_create(numargs); va_start(arglist, numargs); for (ix = 0; ix < numargs; ix++) { type = va_arg(arglist, int); d = NULL; switch (type) { case Int: intval = va_arg(arglist, long); d = int_to_data(intval); break; case Float: intval = va_arg(arglist, double); d = data_create(Float, dblval); break; case String: ptr = va_arg(arglist, char *); d = data_create(String, ptr); break; case Bool: intval = va_arg(arglist, long); d = data_create(Bool, intval); break; default: debug("Cannot do type %d. Ignored", type); ptr = va_arg(arglist, char *); break; } if (d) { array_push(args, d); } } va_end(arglist); ret = data_execute(self, name, args, NULL); if (ret && data_is_exception(ret)) { debug("Error executing '%s'.'%s': %s", data_tostring(self), name, data_tostring(ret)); } array_free(args); return ret; }
void data_new_address(TTPtr self, t_symbol *relativeAddress) { WrappedModularInstancePtr x = (WrappedModularInstancePtr)self; long argc = 0; t_atom *argv = NULL; TTUInt32 number; TTUInt32 i; TTAddress newAddress = relativeAddress->s_name; TTAddress returnedAddress; TTNodePtr returnedNode = NULL; TTNodePtr returnedContextNode = NULL; t_symbol *instanceAddress; TTObject anObject; TTObject aSubscriber; TTValue v; x->useInternals = YES; x->internals->clear(); x->internals->setThreadProtection(YES); x->cursor = kTTSymEmpty; x->arrayAddress = newAddress; if (x->arrayAddress.getType() == kAddressRelative) { number = jamoma_parse_bracket(relativeAddress, x->arrayFormatInteger, x->arrayFormatString); // don't resize to 0 if (number && number <= MAX_ARRAY_SIZE) { // Starts iteration on internals x->iterateInternals = YES; x->arraySize = number; EXTRA->objectsSorted->clear(); for (i = 1; i <= x->arraySize; i++) { jamoma_edit_numeric_instance(x->arrayFormatInteger, &instanceAddress, i); // create a data #ifdef JMOD_MESSAGE data_array_create(self, anObject, kTTSym_message, i); #endif #if JMOD_RETURN data_array_create(self, anObject, kTTSym_return, i); #endif #ifndef JMOD_MESSAGE #ifndef JMOD_RETURN data_array_create(self, anObject, kTTSym_parameter, i); #endif #endif if (!jamoma_subscriber_create((t_object*)x, anObject, TTAddress(instanceAddress->s_name), aSubscriber, returnedAddress, &returnedNode, &returnedContextNode)) { if (aSubscriber.valid()) { // append the data to the internals table v = TTValue(anObject); v.append(TTSymbol(instanceAddress->s_name)); v.append(aSubscriber); x->internals->append(TTSymbol(instanceAddress->s_name), v); // inverse objects order for iteration purpose (see in data_array_return_value : array mode) EXTRA->objectsSorted->insert(0, anObject); } } } // Ends iteration on internals x->iterateInternals = NO; // handle args jamoma_ttvalue_to_Atom(x->arrayArgs, &argc, &argv); if (argc && argv) attr_args_process(x, argc, argv); // select all datas wrappedModularClass_ArraySelect(self, gensym("*"), 0, NULL); #ifndef JMOD_MESSAGE // init all datas created dynamically if (!EXTRA->firstArray) defer((t_object*)x, (method)wrappedModularClass_anything, _sym_init, 0, NULL); #endif } else if (number > MAX_ARRAY_SIZE) object_error((t_object*)x, "the size is greater than the maximum array size (%d)", MAX_ARRAY_SIZE); EXTRA->firstArray = NO; } else object_error((t_object*)x, "can't register because %s is not a relative address", relativeAddress->s_name); }