tmi2/
tmi2/bin/
tmi2/etc/
tmi2/lib/
tmi2/lib/adm/
tmi2/lib/adm/daemons/languages/
tmi2/lib/adm/daemons/network/I3/
tmi2/lib/adm/daemons/virtual/template/
tmi2/lib/adm/obj/master/
tmi2/lib/adm/priv/
tmi2/lib/adm/shell/
tmi2/lib/adm/tmp/
tmi2/lib/cmds/
tmi2/lib/d/
tmi2/lib/d/Conf/
tmi2/lib/d/Conf/adm/
tmi2/lib/d/Conf/boards/
tmi2/lib/d/Conf/cmds/
tmi2/lib/d/Conf/data/
tmi2/lib/d/Conf/logs/
tmi2/lib/d/Conf/obj/
tmi2/lib/d/Conf/text/help/
tmi2/lib/d/Fooland/adm/
tmi2/lib/d/Fooland/data/
tmi2/lib/d/Fooland/data/attic/
tmi2/lib/d/Fooland/items/
tmi2/lib/d/TMI/
tmi2/lib/d/TMI/adm/
tmi2/lib/d/TMI/boards/
tmi2/lib/d/TMI/data/
tmi2/lib/d/TMI/rooms/
tmi2/lib/d/grid/
tmi2/lib/d/grid/adm/
tmi2/lib/d/grid/data/
tmi2/lib/d/std/
tmi2/lib/d/std/adm/
tmi2/lib/data/adm/
tmi2/lib/data/adm/daemons/
tmi2/lib/data/adm/daemons/doc_d/
tmi2/lib/data/adm/daemons/emoted/
tmi2/lib/data/adm/daemons/network/http/
tmi2/lib/data/adm/daemons/network/services/mail_q/
tmi2/lib/data/adm/daemons/network/smtp/
tmi2/lib/data/adm/daemons/news/archives/
tmi2/lib/data/attic/connection/
tmi2/lib/data/attic/user/
tmi2/lib/data/std/connection/b/
tmi2/lib/data/std/connection/l/
tmi2/lib/data/std/user/a/
tmi2/lib/data/std/user/b/
tmi2/lib/data/std/user/d/
tmi2/lib/data/std/user/f/
tmi2/lib/data/std/user/l/
tmi2/lib/data/std/user/x/
tmi2/lib/data/u/d/dm/working/doc_d/
tmi2/lib/data/u/l/leto/doc_d/
tmi2/lib/data/u/l/leto/smtp/
tmi2/lib/doc/
tmi2/lib/doc/driverdoc/applies/
tmi2/lib/doc/driverdoc/concepts/
tmi2/lib/doc/driverdoc/driver/
tmi2/lib/doc/driverdoc/efuns/arrays/
tmi2/lib/doc/driverdoc/efuns/buffers/
tmi2/lib/doc/driverdoc/efuns/compile/
tmi2/lib/doc/driverdoc/efuns/ed/
tmi2/lib/doc/driverdoc/efuns/floats/
tmi2/lib/doc/driverdoc/efuns/functions/
tmi2/lib/doc/driverdoc/efuns/general/
tmi2/lib/doc/driverdoc/efuns/numbers/
tmi2/lib/doc/driverdoc/efuns/parsing/
tmi2/lib/doc/driverdoc/lpc/constructs/
tmi2/lib/doc/driverdoc/lpc/preprocessor/
tmi2/lib/doc/driverdoc/lpc/types/
tmi2/lib/doc/driverdoc/platforms/
tmi2/lib/doc/mudlib/
tmi2/lib/ftp/
tmi2/lib/log/
tmi2/lib/obj/net/
tmi2/lib/obj/shells/
tmi2/lib/std/board/
tmi2/lib/std/body/
tmi2/lib/std/fun/
tmi2/lib/std/living/
tmi2/lib/std/object/
tmi2/lib/std/shop/
tmi2/lib/std/socket/
tmi2/lib/std/virtual/
tmi2/lib/student/
tmi2/lib/student/kalypso/
tmi2/lib/student/kalypso/armor/
tmi2/lib/student/kalypso/rooms/
tmi2/lib/student/kalypso/weapons/
tmi2/lib/u/l/leto/
tmi2/lib/u/l/leto/cmds/
tmi2/lib/www/errors/
tmi2/lib/www/gateways/
tmi2/lib/www/images/
tmi2/old/
tmi2/v21.7a10/
tmi2/v21.7a10/ChangeLog.old/
tmi2/v21.7a10/compat/simuls/
tmi2/v21.7a10/include/
tmi2/v21.7a10/testsuite/
tmi2/v21.7a10/testsuite/clone/
tmi2/v21.7a10/testsuite/command/
tmi2/v21.7a10/testsuite/data/
tmi2/v21.7a10/testsuite/etc/
tmi2/v21.7a10/testsuite/include/
tmi2/v21.7a10/testsuite/inherit/
tmi2/v21.7a10/testsuite/inherit/master/
tmi2/v21.7a10/testsuite/log/
tmi2/v21.7a10/testsuite/u/
tmi2/v21.7a10/tmp/
#include "std.h"
#include "lpc_incl.h"
#include "comm.h"
#include "file.h"

/*
 * Write statistics about objects on file.
 */

static int sumSizes PROT((mapping_t *, mapping_node_t *, int *));
static int svalue_size PROT((svalue_t *));

static int sumSizes P3(mapping_t *, m, mapping_node_t *, elt, int *, t)
{
    *t += (svalue_size(&elt->values[0]) + svalue_size(&elt->values[1]));
    *t += sizeof(mapping_node_t);
    return 0;
}

static int svalue_size P1(svalue_t *, v)
{
    int i, total;

    switch (v->type) {
    case T_OBJECT:
    case T_REAL:
    case T_NUMBER:
	return 0;
    case T_STRING:
	return (int) (strlen(v->u.string) + 1);
    case T_ARRAY:
    case T_CLASS:
	/* first svalue is stored inside the array struct */
	total = sizeof(array_t) - sizeof(svalue_t);
	for (i = 0, total = 0; i < v->u.arr->size; i++) {
	    total += svalue_size(&v->u.arr->item[i]) + sizeof(svalue_t);
	}
	return total;
    case T_MAPPING:
	total = sizeof(mapping_t);
	mapTraverse(v->u.map, (int (*) ()) sumSizes, &total);
	return total;
    case T_FUNCTION:
	{
	    svalue_t tmp;
	    tmp.type = T_ARRAY;
	    tmp.u.arr = v->u.fp->hdr.args;

	    if (tmp.u.arr)
		total = (int)(sizeof(funptr_hdr_t) + svalue_size(&tmp));
	    else
		total = (int)(sizeof(funptr_hdr_t));
	    switch (v->u.fp->hdr.type) {
	    case FP_EFUN:
		total += sizeof(efun_ptr_t);
		break;
	    case FP_LOCAL | FP_NOT_BINDABLE:
		total += sizeof(local_ptr_t);
		break;
	    case FP_SIMUL:
		total += sizeof(simul_ptr_t);
		break;
	    case FP_FUNCTIONAL:
	    case FP_FUNCTIONAL | FP_NOT_BINDABLE:
		total += sizeof(functional_t);
		break;
	    }
	    return total;
	}
    case T_BUFFER:
	/* first byte is stored inside the buffer struct */
	return (int) (sizeof(buffer_t) + v->u.buf->size - 1);
    case T_ANY:
	break;
    default:
	fatal("Illegal type: %d\n", v->type);
    }
    /* NOTREACHED */
    return 0;
}

int data_size P1(object_t *, ob)
{
    int total = 0, i;

    if (ob->prog) {
	for (i = 0; i < (int) ob->prog->num_variables; i++) {
	    total += svalue_size(&ob->variables[i]) + sizeof(svalue_t);
	}
    }
    return total;
}

void dumpstat P1(char *, tfn)
{
    FILE *f;
    object_t *ob;
    char *fn;
    int display_hidden;

    fn = check_valid_path(tfn, current_object, "dumpallobj", 1);
    if (!fn) {
	error("Invalid path '%s' for writing.\n", tfn);
	return;
    }
    f = fopen(fn, "w");
    if (!f) {
	error("Unable to open '/%s' for writing.\n", fn);
	return;
    }

    display_hidden = -1;
    for (ob = obj_list; ob; ob = ob->next_all) {
	int tmp;

	if (ob->flags & O_HIDDEN) {
	    if (display_hidden == -1)
		display_hidden = valid_hide(current_object);
	    if (!display_hidden)
		continue;
	}
	if (ob->prog && (ob->prog->ref == 1 || !(ob->flags & O_CLONE)))
	    tmp = ob->prog->total_size;
	else
	    tmp = 0;
	fprintf(f, "%-20s %i ref %2d %s %s (%d) %s\n", ob->name,
		tmp + data_size(ob) + sizeof(object_t), ob->ref,
		ob->flags & O_HEART_BEAT ? "HB" : "  ",
#ifndef NO_ENVIRONMENT
		ob->super ? ob->super->name : "--",
#else
		"--",
#endif
		/* ob->cpu */ 0,
		(ob->swap_num >= 0) ? ((ob->flags & O_SWAPPED) ?
				       "SWAPPED(out)" : "SWAPPED(in)") : "");
    }
    fclose(f);
}