As I am trying to do a dll that acts exactly like one written in C, I am trying 
to compile my code with the -betterC option. So I would not need the DllMain 
function.

I am not sure that I use the best syntax for my CTFE function to be able to 
make it works with the option -betterC and to maintain it after.

In particular I have following issues (my code is at the end of message) :
 * startsWith function doesn't compile with -betterC
 * can't put static before the first foreach
 * don't really now how to factorize small expressions (oglFunctionName , 
oglFunctionName,...)
 * how to make the code I generate less polluted by conditions and iterations? 
Certainly by naming some previously computed parts with alias?
 * after that how to see the generated result and debug?

Thank you in advance for any help.

module api_entry;

import std.stdio : writeln;
import std.algorithm.searching;

import missing_ogl;

import std.traits;
import std.meta;

static string implementFunctionsOf(string Module, bool removeARB = false)()
{
    import std.traits;
    import std.regex;
    import std.conv;

    mixin("import " ~ Module ~ ";");

    string      res;

    res ~= "extern (C) {\n";

    foreach (name; __traits(allMembers, mixin(Module)))
    {
        static if (name.startsWith("da_")
                   && mixin("isCallable!" ~ name))
        {
            alias derelict_oglFunctionName = Alias!(name[3..$]);
            alias oglFunctionName = derelict_oglFunctionName;
            alias returnType = Alias!(ReturnType!(mixin(name)).stringof);
            alias parametersType = Alias!(Parameters!(mixin(name)).stringof);

            static if (removeARB && name.endsWith("ARB"))
                oglFunctionName = oglFunctionName[0..$ - 3];

            res ~=
                "export\n" ~
                returnType ~ "\n" ~
                oglFunctionName ~
                parametersType ~ "\n" ~
                "{\n" ~
                "    writeln(\"" ~ oglFunctionName ~ " is not 
specialized\");\n";

            // Forward the call to the driver (with arguments and return the
            // value of the forward directly)
            res ~= "import " ~ Module ~ ";";

            // For a reason I do not understand the compiler can not
            // compile with returnType
            static if (ReturnType!(mixin(name)).stringof == "int function()")
                res ~=
                    "    alias extern (C) " ~ returnType ~ " returnType;\n" ~
                    "    return cast(returnType) ";
            else if (returnType != "void")
                res ~=
                    "    return ";
            res ~=
                "    " ~ Module ~ "." ~ derelict_oglFunctionName ~ "(";
            foreach (i, parameter; Parameters!(mixin(name)))
            {
                if (i > 0)
                    res ~= ", ";
                                // We use the default parameter name variable 
"_param_x" where x
                                // is the index of the parameter starting from 0
                res ~= "_param_" ~ to!string(i);
            }
            res ~=
                ");";

            res ~=
                "}\n";
        }
    }

    res ~=
        "}\n";
    return res;
}


mixin(implementFunctionsOf!("derelict.opengl3.functions"));
mixin(implementFunctionsOf!("derelict.opengl3.deprecatedFunctions"));

Reply via email to