diff --git a/src/module_support.c b/src/module_support.c
index 3e2820ac370bd7132cf7622f26bc83619625c7e6..3fcdb65fccecfe8b17947ebf0c0aeb6971fd2f43 100644
--- a/src/module_support.c
+++ b/src/module_support.c
@@ -6,7 +6,7 @@
 #include "pike_types.h"
 #include "error.h"
 
-RCSID("$Id: module_support.c,v 1.19 1999/01/25 23:34:43 mirar Exp $");
+RCSID("$Id: module_support.c,v 1.20 1999/02/12 04:26:17 per Exp $");
 
 /* Checks that args_to_check arguments are OK.
  * Returns 1 if everything worked ok, zero otherwise.
@@ -132,6 +132,7 @@ void check_all_args(const char *fnname, int args, ... )
  *   %m: struct mapping *
  *   %M: struct multiset *
  *   %o: struct object *
+ *   %O: struct object * or NULL
  *   %p: struct program *
  *   %*: struct svalue *
  */
@@ -142,6 +143,8 @@ int va_get_args(struct svalue *s,
 		va_list ap)
 {
   int ret=0;
+  extern void f_cast();
+
   while(*fmt)
   {
     if(*fmt != '%')
@@ -159,6 +162,34 @@ int va_get_args(struct svalue *s,
       if(s->type != T_INT) return ret;
       *va_arg(ap, INT32 *)=s->u.integer;
       break;
+    case 'D':
+      if(s->type == T_INT)
+	 *va_arg(ap, int *)=s->u.integer;
+      else if(s->type == T_FLOAT)
+        *va_arg(ap, int *)=(int)s->u.float_number;
+      else 
+      {
+        push_svalue( s );
+        push_text( "int" );
+        f_cast( );
+        *va_arg(ap, int *)=sp[-1].u.integer;
+        pop_stack();
+      }
+      break;
+    case 'I':
+      if(s->type == T_INT)
+	 *va_arg(ap, INT32 *)=s->u.integer;
+      else if(s->type == T_FLOAT)
+        *va_arg(ap, INT32 *)=(int)s->u.float_number;
+      else 
+      {
+        push_svalue( s );
+        push_text( "int" );
+        f_cast( );
+        *va_arg(ap, INT32 *)=sp[-1].u.integer;
+        pop_stack();
+      }
+      break;
     case 's':
       if(s->type != T_STRING) return ret;
       if(s->u.string->size_shift) return ret;
@@ -187,8 +218,15 @@ int va_get_args(struct svalue *s,
       else if(s->type == T_INT)
 	 *va_arg(ap, float *)=(float)s->u.integer;
       else 
-	 return ret;
+      {
+        push_svalue( s );
+        push_text( "float" );
+        f_cast( );
+        *va_arg(ap, float *)=sp[-1].u.float_number;
+        pop_stack();
+      }
       break;
+
     case 'm':
       if(s->type != T_MAPPING) return ret;
       *va_arg(ap, struct mapping **)=s->u.mapping;
@@ -201,6 +239,14 @@ int va_get_args(struct svalue *s,
       if(s->type != T_OBJECT) return ret;
       *va_arg(ap, struct object **)=s->u.object;
       break;
+    case 'O':
+      if(s->type == T_OBJECT) 
+        *va_arg(ap, struct object **)=s->u.object;
+      else if(IS_ZERO(s))
+        *va_arg(ap, struct object **)=NULL;
+      else
+        return ret;
+      break;
     case 'p':
       if(s->type != T_PROGRAM) return ret;
       *va_arg(ap, struct program **)=s->u.program;
@@ -242,6 +288,7 @@ void get_all_args(char *fname, INT32 args, char *format,  ... )
     char *expected_type;
     switch(format[ret*2+1]) {
     case 'd': case 'i': expected_type = "int"; break;
+    case 'D': case 'I': expected_type = "int|float"; break;
     case 's': case 'S': expected_type = "string (8bit)"; break;
     case 'W': expected_type = "string"; break;
     case 'a': expected_type = "array"; break;
@@ -250,6 +297,7 @@ void get_all_args(char *fname, INT32 args, char *format,  ... )
     case 'm': expected_type = "mapping"; break;
     case 'M': expected_type = "multiset"; break;
     case 'o': expected_type = "object"; break;
+    case 'O': expected_type = "object or zero"; break;
     case 'p': expected_type = "program"; break;
     case '*': expected_type = "mixed"; break;
     default: expected_type = "Unknown"; break;