# include <kernel/kernel.h> # include <kernel/objreg.h> # include <kernel/rsrc.h> mapping links; /* owner : first object */ mapping editors; /* editor : TRUE */ /* * NAME: create() * DESCRIPTION: initialize global vars */ static void create() { links = ([ "System" : this_object() ]); editors = ([ ]); _F_prev(this_object()); _F_next(this_object()); } /* * NAME: link() * DESCRIPTION: link in a new object in per-owner linked list */ void link(object obj, string owner) { if (previous_program() == AUTO) { object link, next; link = links[owner]; if (!link) { /* first object for this owner */ links[owner] = obj; obj->_F_prev(obj); obj->_F_next(obj); } else { /* add to list */ next = link->_Q_next(); link->_F_next(obj); next->_F_prev(obj); obj->_F_prev(link); obj->_F_next(next); } } } /* * NAME: unlink() * DESCRIPTION: remove object from per-owner linked list */ void unlink(object obj, string owner) { if (previous_program() == AUTO) { object prev, next; prev = obj->_Q_prev(); if (prev == obj) { links[owner] = nil; /* no more objects left */ } else { next = obj->_Q_next(); prev->_F_next(next); next->_F_prev(prev); if (obj == links[owner]) { links[owner] = next; /* replace reference object */ } } } } /* * NAME: add_editor() * DESCRIPTION: register an editor object */ void add_editor(object obj) { if (previous_program() == AUTO) { if (!editors) { editors = ([ ]); } editors[obj] = TRUE; } } /* * NAME: remove_editor() * DESCRIPTION: unregister an editor object */ void remove_editor(object obj) { if (previous_program() == AUTO) { if (editors) { editors[obj] = nil; } } } /* * NAME: remove_editors() * DESCRIPTION: unregister all editor objects, and return them in an array */ object *remove_editors() { if (previous_program() == RSRCD) { object *objects; if (!editors) { editors = ([ ]); } objects = map_indices(editors); editors = ([ ]); return objects; } } /* * NAME: first_link() * DESCRIPTION: return first object in linked list */ object first_link(string owner) { if (previous_program() == API_OBJREG) { return links[owner]; } } /* * NAME: prev_link() * DESCRIPTION: return prev object in linked list */ object prev_link(object obj) { if (previous_program() == API_OBJREG) { return obj->_Q_prev(); } } /* * NAME: next_link() * DESCRIPTION: return next object in linked list */ object next_link(object obj) { if (previous_program() == API_OBJREG) { return obj->_Q_next(); } }