Simple Header to D Source Converter Example
Part of TutorialAdvanced
Description
This simple program tries to convert a simple header (.h) file to a D source (.d) file. This can be useful for dealing with resource scripts (.rc) which can be complied into resources files (.res) that can be combined with executables (.exe).
Example
simpleheadertodsrcexample.d
module tutorials.examples.h_to_d.simpleheadertodsrcexample; /* SimpleHeaderToDsrcExample by J C Calvarese License: Public Domain Partially converts a C header file (.h) to a D module (.d). * Doesn't convert everything. * Converts constants so that I can use them in a resource file and in a D module. * End-of-line comments (//) aren't handled as they should be. */ import std.file; import std.stream; import std.string; import std.stdio; const char[] pgmFilename = "SimpleHeaderToDsrcExample.exe"; char[] BaseFilenameWithPath(char[] r) { /* Returns the path & filename without the .h extension. */ int i; char[] s; i = rfind(r, ".h"); if (i > 0) s = r[0..i]; else s = r; return s; } int main(char[][] Args) { char[] r; char[] v1; char[] v2; char[] s1; char[] s2; int i; int line; writefln(pgmFilename ~ " (partially converts .h files to .d files)"); if (Args.length < 2) { printf("Usage: " ~ pgmFilename ~ " [source.h]\n"); return 0; } if (exists(Args[1])) /* File Exists . . . */ { writefln(pgmFilename ~ ": Creating " ~ BaseFilenameWithPath(Args[1]) ~ ".d..."); File fi = new File(Args[1]); File fo = new File(); fo.create(BaseFilenameWithPath(Args[1]) ~ ".d"); while (!fi.eof()) { r = strip(fi.readLine()); line++; if (r.length >= 0) { /* split varName into name & value */ i = find(r, ' '); /* returns -1 if it's not found . . . */ if (i > 0) { s1 = strip(r[0..i]); s2 = strip(r[i..r.length]); if(s1 == "#define") { i = find(s2, ' '); if (i == 0) printf("Error (line %i): missing definition.", line); else { v1 = strip(s2[0..i]); v2 = strip(s2[i..s2.length]); if (v2[0..1] == "\"") { fo.writeLine("const char[] " ~ v1 ~ " = " ~ v2 ~ ";"); } else if (v2[0..1] == "-") { fo.writeLine("const int " ~ v1 ~ " = " ~ v2 ~ ";"); } else { fo.writeLine("const uint " ~ v1 ~ " = " ~ v2 ~ ";"); } } } else fo.writeLine(r); } else fo.writeLine(""); } } writefln("h_to_d.exe: Finished."); fo.close(); fi.close(); } else writefln("File not found: %i", Args[1]); return 0; }
Compiling
Run the batch file (build.bat) to compile and test the example.
To see what the resource scripts actually do, you'll need to have the "rcc" program install (available for free from the Digital Mars "Basic Utilities" package from: http://www.digitalmars.com/download/dmcpp.html).
Tested Version
Tested with DMD v0.143.
Other helpful files
bulid.bat
@echo off echo Building SimpleHeaderToDsrcExample... dmd SimpleHeaderToDsrcExample.d -O -I..\..\.. echo Compilation complete. pause erase SimpleHeaderToDsrcExample.obj erase SimpleHeaderToDsrcExample.map echo. echo Testing SimpleHeaderToDsrcExample... SimpleHeaderToDsrcExample.exe Standard.h pause type standard.d erase standard.d echo. echo Testing SimpleHeaderToDsrcExample for "File not found"... SimpleHeaderToDsrcExample.exe Not_Standard.h pause echo. rem The "rcc" program is from the Digital Mars "Basic Utilities" package rem Download it from: http://www.digitalmars.com/download/dmcpp.html SimpleHeaderToDsrcExample.exe resource.h rcc resource.rc -v -32 dmd SimpleHeaderToDsrcExample.d resource.res -I..\..\.. pause echo.
standard.h
#define pgmTitle "Program Name" #define pgmInternalName "ProgramName" #define pgmOriginalFilename "ProgramName.exe" #define pgmFileDescription "Hopefully it does something" #define pgmVersion "0.0.1" #define pgmMajVer 0 #define pgmMinVer 0 #define pgmBuild 1 #define pgmCopyright "(c) 2005 A Nonymous" #define pgmCompanyName "Software Company" #define pgmIcon "program.ico"
resource.h
#define pgmTitle "SimpleHeaderToDsrcExample" #define pgmInternalName "SimpleHeaderToDsrcExample" #define pgmOriginalFilename "SimpleHeaderToDsrcExample.exe" #define pgmFileDescription "Converts a simple .h file into a .d file" #define pgmVersion "0.0.1" #define pgmMajVer 0 #define pgmMinVer 0 #define pgmBuild 1 #define pgmCopyright "(c) 2005 J C Calvarese" #define pgmCompanyName "dsource.org" #define pgmIcon "SimpleHeaderToDsrcExample.ico" #define ID_ICON 1000
resource.rc
#include "resource.h" 1000 ICON MOVEABLE PURE LOADONCALL DISCARDABLE pgmIcon 1 VERSIONINFO FILEVERSION pgmMajVer, pgmMinVer, pgmBuild, 0 PRODUCTVERSION pgmMajVer, pgmMajVer, pgmBuild, 0 FILEOS 0x4 FILETYPE 0x1 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "LegalCopyright", pgmCopyright VALUE "FileDescription", pgmFileDescription VALUE "Author", "J C Calvarese" VALUE "CompanyName", pgmCompanyName VALUE "ProductName", pgmTitle VALUE "FileVersion", pgmVersion VALUE "ProductVersion", pgmVersion VALUE "InternalName", pgmInternalName VALUE "OriginalFilename", pgmOriginalFilename END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0409, 0x04B0 //0x0409 0x04B0 END END