mud/lib/domains/default/obj/pass_example.c
2020-09-06 05:43:07 -07:00

68 lines
2.3 KiB
C

/* Please note this info from options.h
* REF_RESERVED_WORD: If this is defined then the word 'ref' can be
* used to pass arguments to functions by reference. Example:
*
* void inc(int ref x) {
* x++;
* }
*
* ... y = 1; inc(ref y); ...
*
* A side effect is that 'ref' cannot be a variable or function name.
*
* Note: ref must be used in *both* places; this is intentional. It protects
* against passing references to routines which don't intend to return values
* through their arguments, and against forgetting to pass a reference
* to a function which wants one (or accidentally having a variable modified!)
*/
#include <lib.h>
inherit LIB_ITEM;
mixed globalvar;
static void create() {
item::create();
SetKeyName("object");
SetId( ({ "example", "sample" }) );
SetAdjectives( ({ "example","sample","pass by reference" }) );
SetShort("a pass by reference example object");
SetLong("This object allows you to test passing by reference. "
"When you: \n\n call example->StartPass(1)\n\n\tYou can see that "
"not only has the local variable been changed, but the "
"global variable too, even though there has been no assignment "
"operation to change globalvar to localvar's new value.\n"
"\tThis pass by reference is accomplished by using the \"ref\" "
"keyword. If you need to pass an integer or a string by reference, "
"study how it is done here to understand the process.");
SetNoCondition(1);
SetMass(50);
SetBaseCost(1);
}
void init(){
::init();
}
mixed PassByRef(mixed ref arg){
if(intp(arg)) arg++;
else if(stringp(arg)) arg += "localvar";
else if(mapp(arg)) arg[identify(this_object())] = this_object();
else if(arrayp(arg) && sizeof(arg)){
if(stringp(arg[0])) arg += ({ "localvar" });
else if(intp(arg[0])) arg += ({ 1 });
else if(objectp(arg[0])) arg += ({ this_object() });
}
return arg;
}
mixed StartPass(mixed localvar){
globalvar = localvar;
write("localvar: "+identify(localvar));
write("globalvar: "+identify(globalvar));
flush_messages();
localvar = PassByRef(ref globalvar);
write("localvar: "+identify(localvar));
write("globalvar: "+identify(globalvar));
return 1;
}