Anzeige short und long: Closures beruecksichtigen

Die Props fuer Long und Short koennen Closures enthalten,
das muss beruecksichtigt werden.
Sie werden jetzt auch ausgefuehrt, wenn das problematisch
ist, muss man das wieder abschalten.

Change-Id: I0bcb50ca4317f64d11df36dedd1f38abbb0887af
diff --git a/obj/tools/MGtool.c b/obj/tools/MGtool.c
index efda624..2405688 100644
--- a/obj/tools/MGtool.c
+++ b/obj/tools/MGtool.c
@@ -267,8 +267,8 @@
 
 static void PrintObj(object obj, string file)
 {
-  object item, tmp;
-  string str;
+  object item;
+  string|closure long_desc;
   int i;
 
   SECURE1();
@@ -280,18 +280,19 @@
   else
     write_file(file,"Long :\n");
   if(query_once_interactive(obj))
-    str=capitalize(getuid(obj));
+    long_desc=capitalize(getuid(obj));
   else
   {
-    if(str=({string})obj->QueryProp(P_INT_LONG));
-    else if(str=({string})obj->QueryProp(P_LONG));
-    else
-        str="- no long description -\n";
+    if( (long_desc=({string|closure})obj->QueryProp(P_INT_LONG))
+        || (long_desc=({string|closure})obj->QueryProp(P_LONG)) )
+      long_desc="- no long description -\n";
+    if (closurep(long_desc))
+      long_desc = funcall(long_desc);
   }
   if(!file||file=="")
-    W(str);
+    W(long_desc);
   else
-    write_file(file,str);
+    write_file(file,long_desc);
   FORALL(item, obj)
   {
     if(!i)
@@ -310,7 +311,7 @@
 
 static varargs void PrintShort(string pre, object obj, string file)
 {
-  string str;
+  string|closure shrt;
 
   SECURE1();
   if(!obj)
@@ -318,31 +319,33 @@
   if(MODE(MODE_SHORT))
   {
     if (query_once_interactive(obj))
-      str=capitalize(getuid(obj));
+      shrt=capitalize(getuid(obj));
     else
     {
-      if(!((str=({string})obj->QueryProp(P_INT_SHORT))||
-	   (str=({string})obj->QueryProp(P_SHORT))))
-	if(is_player(obj))
-	  str=CRNAME(obj)+" (invisible)";
-	else
-	  str="- no short description -";
+      if(!((shrt=({string|closure})obj->QueryProp(P_INT_SHORT))
+            || (shrt=({string|closure})obj->QueryProp(P_SHORT))))
+        if(is_player(obj))
+          shrt=CRNAME(obj)+" (invisible)";
+        else
+          shrt="- no short description -";
+      if (closurep(shrt))
+        shrt = funcall(shrt);
     }
-    str=ALEFT(sprintf("%O ",str), 34, ".")+" ";
+    shrt=ALEFT(sprintf("%O ",shrt), 34, ".")+" ";
   }
   else
-    str="";
+    shrt="";
   if(interactive(obj))
-    str+="i";
+    shrt+="i";
   else if(living(obj))
-    str+="l";
+    shrt+="l";
   else
-    str+=".";
-  str+=(shadow(obj, 0) ? "s" : ".");
+    shrt+=".";
+  shrt+=(shadow(obj, 0) ? "s" : ".");
   if(!file||file=="")
-    WLN((pre+CAP(str)+" "+ObjFile(obj))[0..79]);
+    WLN((pre+CAP(shrt)+" "+ObjFile(obj))[0..79]);
   else
-    write_file(file,(pre+CAP(str)+" "+ObjFile(obj))[0..79]+"\n");
+    write_file(file,(pre+CAP(shrt)+" "+ObjFile(obj))[0..79]+"\n");
 }
 
 static varargs void DeepPrintShort(object env, int indent, string pre, string file)