int fetch_propvals(dbref obj, const char *dir) { PropPtr p, pptr; int cnt = 0; char buf[BUFFER_LEN]; char name[BUFFER_LEN]; p = first_prop_nofetch(obj, dir, &pptr, name, sizeof(name)); while (p) { cnt = (cnt || propfetch(obj, p)); if (PropDir(p) || (PropFlags(p) & PROP_DIRUNLOADED)) { strcpyn(buf, sizeof(buf), dir); strcatn(buf, sizeof(buf), name); strcatn(buf, sizeof(buf), "/"); if (PropFlags(p) & PROP_DIRUNLOADED) { SetPFlags(p, (PropFlags(p) & ~PROP_DIRUNLOADED)); getproperties(input_file, obj, buf); } fetch_propvals(obj, buf); } p = next_prop(pptr, p, name, sizeof(name)); } return cnt; }
void untouchprop_rec(PropPtr p) { if (!p) return; SetPFlags(p, (PropFlags(p) & ~PROP_TOUCHED)); untouchprop_rec(AVL_LF(p)); untouchprop_rec(AVL_RT(p)); untouchprop_rec(PropDir(p)); }
int propfetch(dbref obj, PropPtr p) { if (!p) return 0; SetPFlags(p, (PropFlags(p) | PROP_TOUCHED)); if (PropFlags(p) & PROP_ISUNLOADED) { db_get_single_prop(input_file, obj, (long) PropDataVal(p), p, NULL); return 1; } return 0; }
int propfetch(dbref obj, PropPtr p) { FILE *f; if (!p) return 0; SetPFlags(p, (PropFlags(p) | PROP_TOUCHED)); if (PropFlags(p) & PROP_ISUNLOADED) { f = (FLAGS(obj) & SAVED_DELTA) ? delta_infile : input_file; db_get_single_prop(f, obj, (long) PropDataVal(p), p, NULL); return 1; } return 0; }
void clear_propnode(PropPtr p) { if (!(PropFlags(p) & PROP_ISUNLOADED)) { if (PropType(p) == PROP_STRTYP) { free((void *) PropDataStr(p)); PropDataStr(p) = NULL; } if (PropType(p) == PROP_LOKTYP) free_boolexp(PropDataLok(p)); } SetPDataVal(p, 0); SetPFlags(p, (PropFlags(p) & ~PROP_ISUNLOADED)); SetPType(p, PROP_DIRTYP); }
/* 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)); */ } }
/* path is the name of the propdir to find */ const char * propdir_unloaded(PropPtr root, const char *path) { PropPtr p; const char *n; char *o, *l; static char buf[BUFFER_LEN]; if (!root) return NULL; n = path; o = buf; while (*n == PROPDIR_DELIMITER) n++; if (!*n) return NULL; while (*n) { *o++ = '/'; l = o; while (*n && *n != PROPDIR_DELIMITER) *o++ = *n++; while (*n == PROPDIR_DELIMITER) n++; *o = '\0'; p = locate_prop(root, l); if (!p) { return NULL; } if (PropFlags(p) & PROP_DIRUNLOADED) { SetPFlags(p, (PropFlags(p) & ~PROP_DIRUNLOADED)); return buf + 1; } root = PropDir(p); } return NULL; }