@q @program lib-propdirs 1 9999 d i ( lib-propdirs v1.1 Jessy @ FurryMUCK 5/97, 8/01 A library of property and directory handling routines. INSTALLATION: Set lib-propdirs L, and register as lib/propdir. In your MUCK window, type or paste the following def props: @set lib-propdirs=_defs/copy_root:"$lib/propdirs" match "copy_root" call @set lib-propdirs=_defs/move_root:"$lib/propdirs" match "move_root" call @set lib-propdirs=_defs/copy_prop:"$lib/propdirs" match "copy_prop" call @set lib-propdirs=_defs/move_prop:"$lib/propdirs" match "move_prop" call @set lib-propdirs=_defs/remove_dir:"$lib/propdirs" match "remove_dir" call @set lib-propdirs=_defs/copy_dir:"$lib/propdirs" match "copy_dir" call @set lib-propdirs=_defs/move_dir:"$lib/propdirs" match "move_dir" call @set lib-propdirs=_defs/remove_dir-r:"$lib/propdirs" match "remove_dir-r" call @set lib-propdirs=_defs/copy_dir-r:"$lib/propdirs" match "copy_dir-r" call @set lib-propdirs=_defs/move_dir-r:"$lib/propdirs" match "move_dir-r" call Then, set the _docs property for @view: @set lib-propdirs=_docs:@list $lib/propdirs=24-63 USE: Note: Unless otherwise specified, 'propdir' should be read to mean 'any propdir other than / root'. Use copy_root and move_root for handling the / root directory. Lib-propdirs includes the following routines: copy_root [ d1 d2 -- ] Copies all props and propdirs on d1 to d2. move_root [ d1 d2 -- ] Moves all props and propdirs on d1 to d2. copy_prop [ d1 s1 d2 s2 -- ] Copies property s1 on object d1 to property s2 on object d2. move_prop [ d1 s1 d2 s2 -- ] Moves property s1 on object d1 to property s2 on object d2. remove_dir [ d s -- ] Removes directory s from object d, leaving any subdirectories in place. To remove subdirectories as well, use 'remove_dir-r'. copy_dir [ d1 s1 d2 s2 -- ] Copies directory s1 from object d1 to directory s2 on object d2. This iterative version of will not copy subdirectories, but is significantly more efficient than the recursive version 'copy_dir-r'. Use 'copy_dir' if you know that s1 will not include subdirectories, or do not wish to copy subdirs if present. move_dir [ d1 s1 d2 s2 -- ] Moves directory s1 from object d1 to directory s2 on object d2. s1 is deleted from d1. This iterative version of will not move subdirectories, but is significantly more efficient than the recursive version 'move_dir-r'. Use 'move_dir' if you know that s1 will not include subdirectories, or do not wish to move subdirs if present. remove_dir-r [ d s -- ] Removes directory s and any of its subdirectories from object d. Unlike the 'copy' and 'move' routines, there is no significant difference in efficiency between 'remove_dir' and 'remove_dir-r'. copy_dir-r [ d1 s1 d2 s2 -- ] Copies directory s1 and any of its subdirectories from object d1 to directory s2 on object d2. move_dir-r [ d1 s1 d2 s2 -- ] Moves directory s1 and any of its subdirectories from object d1 to directory s2 on object d2. s1 is deleted from d1. Lib-propdirs may be freely ported. Please comment any changes. ) : copy_prop ( d1 s1 d2 s2 -- ) (* copy prop s1 on d1 to s2 on d2 *) 4 rotate 4 rotate getprop setprop ; Public copy_prop : move_prop ( d1 s1 d2 s2 -- ) (* move prop s1 on d1 to s2 on d2 *) 4 pick 4 pick getprop setprop remove_prop ; Public move_prop : remove_dir ( d s -- ) (* remove dir s from d; leave subdirs *) dup "*/" smatch not if "/" strcat then over over nextprop swap pop begin dup while over over nextprop 3 pick rot "" setprop repeat pop pop ; Public remove_dir : copy_dir ( d1 s1 d2 s2 -- ) (* copy dir s1 on d1 to dir s2 on d2. do not copy subdirs *) 4 pick 4 pick propdir? if 3 pick "*/" smatch not if 3 pick "/" strcat 3 put then else pop pop pop pop exit then dup "*/" smatch not if "/" strcat then 3 pick 5 rotate 5 rotate 5 rotate 5 rotate dup 5 rotate 5 rotate 5 rotate 5 rotate 4 pick 4 pick nextprop dup 4 put 5 rotate 5 rotate 5 rotate 5 rotate begin 4 pick 4 pick getprop if pop over 7 pick 7 pick swap subst 4 pick 4 pick 4 pick 4 pick 4 rotate 4 rotate getprop setprop 4 pick 4 pick nextprop dup not if break then dup 4 put 5 put else 4 pick 4 pick dup "*/" smatch if dup strlen 1 - strcut pop then over over nextprop not if pop pop break then nextprop dup 4 put 5 put then pop over 7 pick 7 pick swap subst repeat pop pop pop pop pop pop pop pop ; Public copy_dir : move_dir ( d1 s1 d2 s2 -- ) (* move dir s1 on d1 to dir s2 on d2; delete originals; do not copy or delete subdirs *) 4 pick 4 pick 4 pick 4 pick copy_dir pop pop remove_dir ; Public move_dir : remove_dir-r ( d s -- ) (* remove dir s and s's subdirs from d *) dup "*/" smatch not if "/" strcat then over over nextprop swap pop begin dup while over over nextprop 3 pick rot remove_prop repeat pop pop ; Public remove_dir-r : move_dir-r ( d1 s2 d2 s2 -- ) (* move dir/subdirs s1 on d1 to dir/subdirs s2 on d2 *) begin 4 pick 4 pick propdir? not if dup "*/" smatch if dup strlen 1 - strcut pop then 3 pick "*/" smatch if 3 pick dup strlen 1 - strcut pop 3 put then 4 pick 4 pick getprop setprop remove_prop break then 4 pick 4 pick propdir? if 4 pick 4 pick 4 pick 4 pick dup "*/" smatch not if "/" strcat then 3 pick "*/" smatch not if 3 pick "/" strcat 3 put then 4 pick 4 pick nextprop dup 3 pick 6 pick subst 2 put 3 put move_dir-r else 4 pick 4 pick getprop setprop remove_prop then repeat ; Public move_dir-r : move_root ( d1 d2 ) (* move all props on d1 to d2 *) over "/" nextprop begin dup while 3 pick over 4 pick over move_dir-r 3 pick swap nextprop repeat pop pop pop ; public move_root : copy_dir_loop ( d1 s1 d2 s2 -- ) (* move dir/subdirs s1 on d1 to dir/subdirs s2 on d2 *) begin 4 pick 4 pick propdir? not if dup "*/" smatch if dup strlen 1 - strcut pop then 3 pick "*/" smatch if 3 pick dup strlen 1 - strcut pop 3 put then 4 pick 4 pick over over dup pid intostr "/" strcat swap strcat rot rot getprop prog rot rot setprop getprop setprop remove_prop break then 4 pick 4 pick propdir? if 4 pick 4 pick 4 pick 4 pick dup "*/" smatch not if "/" strcat then 3 pick "*/" smatch not if 3 pick "/" strcat 3 put then 4 pick 4 pick nextprop dup 3 pick 6 pick subst 2 put 3 put copy_dir_loop else 4 pick 4 pick getprop setprop remove_prop then repeat ; : copy_dir-r ( d1 s1 d2 s2 -- ) (* copy dir/subdirs s1 on d1 to dir/subdirs s2 on d2 *) (* function copies to dest and prog, deleting from source; then copies back from prog to source, deleting from prog. This turns out to be more efficient than leaving dir on source and recording info necessary to back out of subdirs *) 4 pick 4 pick 6 rotate 6 rotate 6 rotate 6 rotate copy_dir_loop prog pid intostr "/" strcat 3 pick strcat 4 rotate 4 rotate move_dir-r ; Public copy_dir-r : copy_root ( d1 d2 ) (* copy all props on d1 to d2 *) over "/" nextprop begin dup while 3 pick over 4 pick over copy_dir-r 3 pick swap nextprop repeat pop pop pop ; public copy_root . c q @set lib-propdirs=L @reg lib-propdirs=reg/libpropdirs @set lib-propdirs=_defs/copy_root:"$lib/propdirs" match "copy_root" call @set lib-propdirs=_defs/move_root:"$lib/propdirs" match "move_root" call @set lib-propdirs=_defs/copy_prop:"$lib/propdirs" match "copy_prop" call @set lib-propdirs=_defs/move_prop:"$lib/propdirs" match "move_prop" call @set lib-propdirs=_defs/remove_dir:"$lib/propdirs" match "remove_dir" call @set lib-propdirs=_defs/copy_dir:"$lib/propdirs" match "copy_dir" call @set lib-propdirs=_defs/move_dir:"$lib/propdirs" match "move_dir" call @set lib-propdirs=_defs/remove_dir-r:"$lib/propdirs" match "remove_dir-r" call @set lib-propdirs=_defs/copy_dir-r:"$lib/propdirs" match "copy_dir-r" call @set lib-propdirs=_defs/move_dir-r:"$lib/propdirs" match "move_dir-r" call