On Saturday, 17 June 2017 at 11:20:53 UTC, Igor Shirkalin wrote:
On Saturday, 17 June 2017 at 11:10:47 UTC, Igor wrote:
On Saturday, 17 June 2017 at 10:56:52 UTC, Igor Shirkalin wrote:
Hello!

I have a simple C header file that looks like:
#define Name1 101
#define Name2 122
....
#define NameN 157

It comes from resource compiler and I need all these constants to be available in my Dlang program in compile time. It seems to me it is possible. I know I can simply write external program (in python, for example) that does it, but it means I should constantly run it after every change before D compilation.

Please, can anyone help to direct me how to realize it?
Thank you in advance!

Igor Shirkalin

Maybe I am not quite understanding what you are asking but can't you just use:

enum Name1 = 101;
enum Name2 = 122;
...

No, I need the original header file to be used in other applications (say, resource compiler). Therefore this file is primary. I think some pretty short code can be written in D that use such a file to generate constants (enum Name1 = 101) in compile time.

I'm sure others will have cleaner solutions as as a quick hack you can read the file at compile time, modify it, and compile the D code on the go:

    import std.stdio;
    import std.array;
    import std.algorithm;

// Normal function that takes a list of #define and transforms them in enum
    // constants textually.
    string enumify(string header) {
        return header.split("\n")
                     .filter!(x => x.startsWith("#define Name"))
                     .map!(x => x.split(" "))
.map!(s => "enum " ~ s[1] ~ " = " ~ s[2] ~ ";")
                     .join("\n");
    }

    unittest {
        string txt = "#define Name1 101\n#define Name2 122";
assert(txt.enumify == "enum Name1 = 101;\nenum Name2 = 122;");
    }

    /* Our file header.h
    #define Name1 101
    #define Name2 122
    #define Name3 157
    */

// We import the content of the file, enumify it producing D code, and mix it
    // in place to declare our constants.
    //
// The string import requires compiling with -Jpath/to/dir/with/header.h
    mixin(enumify(import("header.h")));

    void main(string[] args) {
        writeln(Name3);     // 157 // Yep, that works
pragma(msg, Name2); // 122 // Yep, that works at compile time too
    }


Reply via email to