void prim_event_send(PRIM_PROTOTYPE) { struct frame *destfr; stk_array *arr; struct inst temp1; CHECKOP(3); oper3 = POP(); /* any: data to pass */ oper2 = POP(); /* string: event id */ oper1 = POP(); /* int: process id to send to */ if (mlev < 3) abort_interp("Requires Mucker level 3 or better."); if (oper1->type != PROG_INTEGER) abort_interp("Expected an integer process id. (1)"); if (oper2->type != PROG_STRING) abort_interp("Expected a string event id. (2)"); if (oper1->data.number == fr->pid) destfr = fr; else destfr = timequeue_pid_frame(oper1->data.number); if (destfr) { stk_array_active_list = &destfr->array_active_list; struct inst data_copy; deep_copyinst(oper3, &data_copy, destfr->pinning); arr = new_array_dictionary(destfr->pinning); array_set_strkey(&arr, "data", &data_copy); array_set_strkey_intval(&arr, "caller_pid", fr->pid); array_set_strkey_intval(&arr, "descr", fr->descr); array_set_strkey_refval(&arr, "caller_prog", program); array_set_strkey_refval(&arr, "trigger", fr->trig); array_set_strkey_refval(&arr, "prog_uid", ProgUID); array_set_strkey_refval(&arr, "player", player); temp1.type = PROG_ARRAY; temp1.data.array = arr; snprintf(buf, sizeof(buf), "USER.%.32s", DoNullInd(oper2->data.string)); muf_event_add(destfr, buf, &temp1, 0); stk_array_active_list = &fr->array_active_list; CLEAR(&temp1); CLEAR(&data_copy); } CLEAR(oper1); CLEAR(oper2); CLEAR(oper3); }
int array_set_strkey_refval(stk_array **harr, const char *key, dbref val) { struct inst value; int result; value.type = PROG_OBJECT; value.data.objref = val; result = array_set_strkey(harr, key, &value); CLEAR(&value); return result; }
int array_set_strkey_strval(stk_array **harr, const char *key, const char *val) { struct inst value; int result; value.type = PROG_STRING; value.data.string = alloc_prog_string(val); result = array_set_strkey(harr, key, &value); CLEAR(&value); return result; }
int array_set_strkey_intval(stk_array **arr, const char *key, int val) { struct inst value; int result; value.type = PROG_INTEGER; value.data.number = val; result = array_set_strkey(arr, key, &value); CLEAR(&value); return result; }
void prim_event_send(PRIM_PROTOTYPE) { struct frame *destfr; stk_array *arr; struct inst temp1; CHECKOP(3); oper3 = POP(); /* any: data to pass */ oper2 = POP(); /* string: event id */ oper1 = POP(); /* int: process id to send to */ if (mlev < 3) abort_interp("Requires Mucker level 3 or better."); if (oper1->type != PROG_INTEGER) abort_interp("Expected an integer process id. (1)"); if (oper2->type != PROG_STRING) abort_interp("Expected a string event id. (2)"); destfr = (struct frame*) timequeue_pid_frame(oper1->data.number); if (destfr) { arr = new_array_dictionary(); array_set_strkey(&arr, "data", oper3); array_set_strkey_intval(&arr, "caller_pid", fr->pid); array_set_strkey_refval(&arr, "caller_prog", program); temp1.type = PROG_ARRAY; temp1.data.array = arr; sprintf(buf, "USER.%.32s", DoNullInd(oper2->data.string)); muf_event_add(destfr, buf, oper3); } CLEAR(oper1); CLEAR(oper2); CLEAR(oper3); }