built in import c header files

FeepingCreature feepingcreature at gmail.com
Mon Apr 19 06:51:54 UTC 2021


On Tuesday, 6 October 2020 at 20:59:54 UTC, 12345swordy wrote:
> I remember reading a reddit comment saying that if d were to 
> import c header files directly without any 3rd party libraries 
> it would be a game changer. The question is: how difficult to 
> implement a C AST parser for the dmd front end?
>
>
> -Alex

I've been doing this in both of my compiled languages. (fcc 
first, built-in, and now in cx as a macro.)

For an example of it in action, check out my glfw sample 
https://github.com/FeepingCreature/Cx/blob/master/demos/glfw.cx , 
or the macro code for it 
https://github.com/FeepingCreature/Cx/blob/master/src/cx/macros/cimport.cx .

Three things that jump out:

1. preprocessed headers with `gcc -dD -E` are a lot easier to 
work with, because gcc helpfully unrolls *most* of #define 
definitions, but leaves enough standing so that you can generate 
enums for all the #defines. This is why it's a useful thing to 
have unrestricted IO support, including arbitrary command 
execution, in CTFE. :)

2. "Header C" is actually pretty easy to parse if you just 
studiously ignore all the weird things, weird inside-out type 
format aside.

3. 10% of effort to parse C gets you 99% of value: because the 
vast majority of typing work involved in making a C header 
binding is trivially simple to parse from the header, and the 
rest you can always just do by hand, or (if your language has 
macros) expand as you need it. I presume glibc headers are more 
complicated, but I have been massively positively surprised how 
much of GLFW and GL I could get running with a day or two of 
coding work on this. To a first approximation, once I added 
function pointers, it pretty much all just worked.

I can wholeheartedly recommend any language do this. It unlocks a 
lot of value and removes a lot of manual work.


More information about the Digitalmars-d mailing list