]> git.llucax.com Git - software/druntime.git/commitdiff
Added core.vararg for variadic argument handling. This seemed necessary, since varar...
authorsean <sean@4a9d5153-6564-4b3f-b5e1-7e8e9dac548f>
Tue, 25 Nov 2008 23:53:07 +0000 (23:53 +0000)
committersean <sean@4a9d5153-6564-4b3f-b5e1-7e8e9dac548f>
Tue, 25 Nov 2008 23:53:07 +0000 (23:53 +0000)
git-svn-id: http://svn.dsource.org/projects/druntime/trunk@52 4a9d5153-6564-4b3f-b5e1-7e8e9dac548f

src/common/core/vararg.d [new file with mode: 0644]
src/common/posix.mak
src/common/win32.mak

diff --git a/src/common/core/vararg.d b/src/common/core/vararg.d
new file mode 100644 (file)
index 0000000..2c22000
--- /dev/null
@@ -0,0 +1,84 @@
+/**
+ * The vararg module is intended to facilitate vararg manipulation in D.
+ * It should be interface compatible with the C module "stdarg," and the
+ * two modules may share a common implementation if possible (as is done
+ * here).
+ *
+ * Copyright: Public Domain
+ * License:   Public Domain
+ * Authors:   Hauke Duden, Walter Bright
+ */
+module core.vararg;
+
+
+version( GNU )
+{
+    public import std.stdarg;
+}
+else
+{
+    /**
+     * The base vararg list type.
+     */
+    alias void* va_list;
+
+
+    /**
+     * This function initializes the supplied argument pointer for subsequent
+     * use by va_arg and va_end.
+     *
+     * Params:
+     *  ap      = The argument pointer to initialize.
+     *  paramn  = The identifier of the rightmost parameter in the function
+     *            parameter list.
+     */
+    void va_start(T) ( out va_list ap, inout T parmn )
+    {
+        ap = cast(va_list) ( cast(void*) &parmn + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) );
+    }
+
+    /**
+     * This function returns the next argument in the sequence referenced by
+     * the supplied argument pointer.  The argument pointer will be adjusted
+     * to point to the next arggument in the sequence.
+     *
+     * Params:
+     *  ap  = The argument pointer.
+     *
+     * Returns:
+     *  The next argument in the sequence.  The result is undefined if ap
+     *  does not point to a valid argument.
+     */
+    T va_arg(T) ( inout va_list ap )
+    {
+        T arg = *cast(T*) ap;
+        ap = cast(va_list) ( cast(void*) ap + ( ( T.sizeof + int.sizeof - 1 ) & ~( int.sizeof - 1 ) ) );
+        return arg;
+    }
+
+    /**
+     * This function cleans up any resources allocated by va_start.  It is
+     * currently a no-op and exists mostly for syntax compatibility with
+     * the variadric argument functions for C.
+     *
+     * Params:
+     *  ap  = The argument pointer.
+     */
+    void va_end( va_list ap )
+    {
+
+    }
+
+
+    /**
+     * This function copied the argument pointer src to dst.
+     *
+     * Params:
+     *  src = The source pointer.
+     *  dst = The destination pointer.
+     */
+    void va_copy( out va_list dst, va_list src )
+    {
+        dst = src;
+    }
+}
index 22bb3a9765b154bc55cdd42a0f058d5da8277096..5f8ba4dc6f1a6721a6d2f09725a0890d40f6b2c1 100644 (file)
@@ -78,7 +78,8 @@ OBJ_CORE= \
     core/exception.o \\r
     core/memory_.o \\r
     core/runtime.o \\r
-    core/thread.o\r
+    core/thread.o \\r
+    core/vararg.o\r
 \r
 OBJ_STDC= \\r
     core/stdc/errno.o\r
@@ -94,7 +95,8 @@ DOC_CORE= \
     core/exception.html \\r
     core/memory.html \\r
     core/runtime.html \\r
-    core/thread.html\r
+    core/thread.html \\r
+    core/vararg.html\r
 \r
 ######################################################\r
 \r
@@ -139,6 +141,11 @@ core/memory_.o : core/memory.d
 core/thread.o : core/thread.d\r
        $(DC) -c $(DFLAGS) -d -Hf$*.di core/thread.d -of$@\r
 \r
+### vararg\r
+\r
+core/vararg.o : core/vararg.d\r
+       $(DC) -c $(TFLAGS) -Hf$*.di core/vararg.d -of$@\r
+\r
 ######################################################\r
 \r
 clean :\r
index b05948a8fb91c290b7546ea1b76109b6294db33e..70f7ad20648aa83d8abb73333780c6bd2bfa8536 100644 (file)
@@ -75,7 +75,8 @@ OBJ_CORE= \
     core\exception.obj \\r
     core\memory.obj \\r
     core\runtime.obj \\r
-    core\thread.obj\r
+    core\thread.obj \\r
+    core\vararg.obj\r
 \r
 OBJ_STDC= \\r
     core\stdc\errno.obj\r
@@ -91,7 +92,8 @@ DOC_CORE= \
     core\exception.html \\r
     core\memory.html \\r
     core\runtime.html \\r
-    core\thread.html\r
+    core\thread.html \\r
+    core\vararg.html\r
 \r
 ######################################################\r
 \r
@@ -131,6 +133,11 @@ core\bitmanip.obj : core\bitmanip.d
 core\thread.obj : core\thread.d\r
        $(DC) -c $(DFLAGS) -d -Hf$*.di core\thread.d -of$@\r
 \r
+### vararg\r
+\r
+core\vararg.obj : core\vararg.d\r
+       $(DC) -c $(TFLAGS) -Hf$*.di core\vararg.d -of$@\r
+\r
 ######################################################\r
 \r
 clean :\r