#include <creator.h>
#define OBJ_LIMIT 50
inherit COMMAND_BASE;
string help();
mixed cmd(string str) {
int memtotal, limit, i = TP->query_cols() -7 -1, j;
string ret, str2, str3;
object *objlist;
if (!str || str == "")
return notify_fail(help());
// Remove excess whitespace
while (strlen(str) && str[0] == ' ')
str = str[1..];
if (sscanf(str, "-%s%d %s", str3, limit, str2) == 3) {
if (str3[0..0] != "l")
return notify_fail("Error: Only valid character following '-' is 'l' at "
"this time.\n");
str = str2;
}
seteuid(geteuid(TP));
// Get the list of corresponding objects
objlist = WIZ_PRESENT->wiz_present(str, TP);
if (!arrayp(objlist) || sizeof(objlist) < 1) {
mixed *filelist;
str = TP->get_path(str);
notify_fail("Unable to find any objects or files corresponding"
" to the given name.\n");
if (sizeof(filelist = TP->get_files(str)) > 0) {
filelist = filter(filelist, (: (sizeof($1) > 2) &&
($1[sizeof($1) - 2..] == ".c") :));
if (sizeof(filelist) < 1)
return 0;
filelist = filter(filelist, (: find_object($1) :));
objlist = map(filelist, (: find_object($1) :));
} else
return 0;
}
ret = sprintf("%-"+ i +"s %-7s\n", "Object name", "Memory");
ret += sprintf("%-"+ i +"s %-7s\n", "------------", "-------");
if (!limit)
limit = OBJ_LIMIT;
if (limit > sizeof(objlist))
limit = sizeof(objlist);
if (limit == 1)
ret += sprintf("%-"+ i +"."+ i +"s %7.7d\n",
WIZ_PRESENT->desc_f_object(objlist[sizeof(objlist) - 1]),
memory_info(objlist[sizeof(objlist) - 1]));
else
for (j = 0; j < limit; j++)
ret += sprintf("%-"+ i +"."+ i +"s %7.7d\n",
WIZ_PRESENT->desc_f_object(objlist[j]),
memory_info(objlist[j]));
if (sizeof(objlist) > 1) {
for (j = 0; j < sizeof(objlist); j++)
memtotal += memory_info(objlist[j]);
ret += sprintf("%-"+ i +"."+ i +"s %7.7s\n",
"", "=======");
ret += sprintf("%-"+ i +"."+ i +"s %7.7d\n",
"Total memory used for all "+ sizeof(objlist) +
" object(s):", memtotal);
}
TP->more_string(ret);
return 1;
}
string help() {
return "Usage: memstat [-l<number>] [<filename(s)>|<wiz_present syntax>]\n\n"
"Memstat lists the guestimated amount of memory the specified object(s) use. "
"Using the -l option, a maximum amount of objects to be listed may be "
"specified otherwise a default limit of "+ OBJ_LIMIT +" objects are listed. "
"Paths including wildcards are taken as a way of specifying more than one "
"file.\n";
}