MudOSa4DGD/
MudOSa4DGD/bin/
MudOSa4DGD/data/
MudOSa4DGD/doc/
MudOSa4DGD/doc/driver/
MudOSa4DGD/doc/efun/bitstrings/
MudOSa4DGD/doc/efun/command/
MudOSa4DGD/doc/efun/communication/
MudOSa4DGD/doc/efun/heart_beat/
MudOSa4DGD/doc/efun/interactive/
MudOSa4DGD/doc/efun/inventory/
MudOSa4DGD/doc/efun/living/
MudOSa4DGD/doc/efun/mappings/
MudOSa4DGD/doc/efun/strings/
MudOSa4DGD/doc/efun/uid/
MudOSa4DGD/doc/funs/
MudOSa4DGD/doc/language/
MudOSa4DGD/mudlib/dgd/doc/
MudOSa4DGD/mudlib/dgd/lib/include/dgd/
MudOSa4DGD/mudlib/dgd/lib/std/
MudOSa4DGD/mudlib/dgd/lib/sys/
MudOSa4DGD/mudlib/dgd/log/
MudOSa4DGD/mudlib/log/
MudOSa4DGD/mudlib/std/include/
MudOSa4DGD/mudlib/std/obj/
/*
 * copy.c
 *
 * Copy a variable (using a DGD feature)
 *
 * (C) Frank Schmidt, Jesus@NorseMUD
 *
 */

#include <objects.h>

/* return a copy of a variable */
static mixed copy(mixed var) {
#if 1
  switch (typeof(var)) {
  case T_ARRAY: return var+({ }); break;
  case T_MAPPING: return var+([ ]); break;
  }
  return var;
#else
  return GLOBAL->get_copy(var);
#endif
}


/* return deep copy of a variable */
static mixed deep_copy(mixed var) {
  mixed retur, *noekler;
  int i;
  switch (typeof(var)) {
  case T_ARRAY:
    /* array? */
    i=::sizeof(var);
    retur = allocate(i);
    while (--i >= 0) {
      switch (typeof(var[i])) {
      case T_ARRAY:
      case T_MAPPING: 
	retur[i] = deep_copy(var[i]);
	break;
      default:
	retur[i] = var[i];
	break;
      }
    }
    return retur;
  case T_MAPPING: 
    /* mapping? */
    i=::sizeof(noekler=map_indices(var));
    retur = ([ ]);
    while (--i >= 0) {
      string str;
      switch (typeof(var[str=noekler[i]])) {
      case T_ARRAY:
      case T_MAPPING: 
	retur[str] = deep_copy(var[str]);
	break;
      default:
	retur[str] = var[str];
	break;
      }
    }
    return retur; 
  }
  return var;
}