@program cmd-@sizer
1 9999 d
1 i
$include $lib/strings
$include $lib/match
$def locknodebytes 18
$def propdirbytes 28
$def propbytes 28
$def objbytes 96
lvar bytesused
lvar overhead
lvar propcount
: init ( -- )
0 bytesused !
0 overhead !
0 propcount !
;
: inc_bytes ( i -- )
bytesused @ + bytesused !
;
: inc_overhead ( -- )
overhead @ 12 + overhead !
;
: props_sizer_rec (d s -- )
over swap "/" strcat nextprop
dup not if pop pop exit then
inc_overhead
propdirbytes inc_bytes
begin
dup while
propcount @ 1 + propcount !
inc_overhead
propdirbytes inc_bytes
inc_overhead
dup strlen 1 + inc_bytes
over over getpropstr
dup if
strlen 1 + inc_bytes
inc_overhead
else pop
then
over over propdir? if
over over props_sizer_rec
then
over swap nextprop
repeat
pop pop
;
: props_sizer (d -- )
"" props_sizer_rec
;
: lock_sizer_rec ({s} -- )
dup begin
dup while
dup locknodebytes * inc_bytes
inc_overhead
2 /
repeat pop
begin
dup while 1 -
swap pop
repeat pop
;
: lock_sizer (d -- )
dup getlockstr "#" explode
lock_sizer_rec
getlockstr ":" explode
lock_sizer_rec
;
: obj_sizer (d -- )
objbytes inc_bytes
dup name strlen 1 + inc_bytes
inc_overhead
dup props_sizer
lock_sizer
;
: display_size (d -- )
unparseobj
" takes up an estimated " strcat
bytesused @ overhead @ + intostr strcat
" bytes of memory." strcat .tell
;
lvar who
lvar totalbytes
: main
"me" match me !
#-1 who !
0 totalbytes !
command @ "@sizeall" stringcmp not
command @ "@sizeallq" stringcmp not or if
.pmatch dup not if
pop "I don't know who you mean." .tell
exit
then
me @ over dbcmp not
me @ "wizard" flag? not and if
pop "Permission denied." .tell
exit
then
"This will take some time to finish, so I'll tell you when I'm done."
.tell who !
0 begin
dup dbtop int < while
dup dbref ok? if
dup dbref owner who @ dbcmp if
init dup dbref obj_sizer
command @ "@sizeallq" stringcmp if
dup dbref display_size
then
bytesused @ overhead @ +
totalbytes @ + totalbytes !
1 sleep
then
then
1 +
repeat pop
totalbytes @ intostr
" estimated bytes uses total." strcat
"@sizeall complete." .tell
.tell
else
.match_controlled
dup not if pop exit then
init dup obj_sizer
display_size
then
;
.
c
q
#ifdef NEW
@action @sizer;@sizeall;@sizeallq;@size;@siz;@si=#0=tmp/exit1
@link $tmp/exit1=cmd-@sizer
#endif