/* copies properties */ void copy_proplist(dbref obj, PropPtr * nu, PropPtr old) { PropPtr p; if (old) { #ifdef DISKBASE propfetch(obj, old); #endif p = new_prop(nu, PropName(old)); SetPFlagsRaw(p, PropFlagsRaw(old)); switch (PropType(old)) { case PROP_STRTYP: SetPDataStr(p, alloc_string(PropDataStr(old))); break; case PROP_LOKTYP: if (PropFlags(old) & PROP_ISUNLOADED) { SetPDataLok(p, TRUE_BOOLEXP); SetPFlags(p, (PropFlags(p) & ~PROP_ISUNLOADED)); } else { SetPDataLok(p, copy_bool(PropDataLok(old))); } break; case PROP_DIRTYP: SetPDataVal(p, 0); break; case PROP_FLTTYP: SetPDataFVal(p, PropDataFVal(old)); break; default: SetPDataVal(p, PropDataVal(old)); break; } copy_proplist(obj, &PropDir(p), PropDir(old)); copy_proplist(obj, &AVL_LF(p), AVL_LF(old)); copy_proplist(obj, &AVL_RT(p), AVL_RT(old)); /* copy_proplist(obj, nu, AVL_LF(old)); copy_proplist(obj, nu, AVL_RT(old)); */ } }
void copyinst(struct inst *from, struct inst *to) { assert(from && to); int j, varcnt; *to = *from; switch(from->type) { case PROG_FUNCTION: if (from->data.mufproc) { to->data.mufproc = (struct muf_proc_data*)malloc(sizeof(struct muf_proc_data)); to->data.mufproc->procname = string_dup(from->data.mufproc->procname); to->data.mufproc->vars = varcnt = from->data.mufproc->vars; to->data.mufproc->args = from->data.mufproc->args; to->data.mufproc->varnames = (const char**)calloc(varcnt, sizeof(const char*)); for (j = 0; j < varcnt; j++) { to->data.mufproc->varnames[j] = string_dup(from->data.mufproc->varnames[j]); } } break; case PROG_STRING: if (from->data.string) { from->data.string->links++; } break; case PROG_ARRAY: if (from->data.array) { from->data.array->links++; } break; case PROG_ADD: from->data.addr->links++; PROGRAM_INC_INSTANCES(from->data.addr->progref); break; case PROG_LOCK: if (from->data.lock != TRUE_BOOLEXP) { to->data.lock = copy_bool(from->data.lock); } break; } }
void prim_setprop(PRIM_PROTOTYPE) { CHECKOP(3); oper1 = POP(); oper2 = POP(); oper3 = POP(); if ((oper1->type != PROG_STRING) && (oper1->type != PROG_INTEGER) && (oper1->type != PROG_LOCK) && (oper1->type != PROG_OBJECT) && (oper1->type != PROG_FLOAT)) abort_interp("Invalid argument type (3)"); if (oper2->type != PROG_STRING) abort_interp("Non-string argument (2)"); if (!oper2->data.string) abort_interp("Empty string argument (2)"); if (!valid_object(oper3)) abort_interp("Non-object argument (1)"); CHECKREMOTE(oper3->data.objref); if ((mlev < 2) && (!permissions(ProgUID, oper3->data.objref))) abort_interp("Permission denied."); if (!prop_write_perms(ProgUID, oper3->data.objref, oper2->data.string->data, mlev)) abort_interp("Permission denied."); { char *tmpe; char tname[BUFFER_LEN]; PData propdat; int len = oper2->data.string->length; tmpe = oper2->data.string->data; while (*tmpe && *tmpe != '\r' && *tmpe != ':') tmpe++; if (*tmpe) abort_interp("Illegal propname"); strcpyn(tname, sizeof(tname), oper2->data.string->data); while (len-- > 0 && tname[len] == PROPDIR_DELIMITER) { tname[len] = '\0'; } switch (oper1->type) { case PROG_STRING: propdat.flags = PROP_STRTYP; propdat.data.str = oper1->data.string ? oper1->data.string->data : 0; break; case PROG_INTEGER: propdat.flags = PROP_INTTYP; propdat.data.val = oper1->data.number; break; case PROG_FLOAT: propdat.flags = PROP_FLTTYP; propdat.data.fval = oper1->data.fnumber; break; case PROG_OBJECT: propdat.flags = PROP_REFTYP; propdat.data.ref = oper1->data.objref; break; case PROG_LOCK: propdat.flags = PROP_LOKTYP; propdat.data.lok = copy_bool(oper1->data.lock); break; } set_property(oper3->data.objref, tname, &propdat); #ifdef LOG_PROPS log2file("props.log", "#%d (%d) SETPROP: o=%d n=\"%s\"", program, pc->line, oper3->data.objref, tname); #endif ts_modifyobject(oper3->data.objref); } CLEAR(oper1); CLEAR(oper2); CLEAR(oper3); }