1 module dflexe;
2 ///come from the old 'dflexe.d'
3 import std.stdio;
4 import std.path;
5 import std.stream;
6 import dfl.application;
7 import std.conv;
8 import std..string;
9 private import dfl.internal.winapi, dfl.internal.utf;//dfl.all, 
10 
11 alias dfl.internal.winapi.ShellExecuteA ShellExecuteA;
12 alias dfl.environment.Environment Environment;
13 
14 
15 private extern(Windows)
16 {
17 	DWORD GetLogicalDriveStringsA(DWORD nBufferLength,LPSTR lpBuffer);
18 	UINT GetDriveTypeA(LPCTSTR lpRootPathName);
19 	DWORD GetShortPathNameA(LPCSTR lpszLongPath, LPSTR lpszShortPath, DWORD cchBuffer);
20 
21 
22 enum: UINT
23 {
24 	DRIVE_FIXED = 3,
25 }
26 	alias DWORD function(LPCWSTR lpszLongPath, LPWSTR lpszShortPath, DWORD cchBuffer) GetShortPathNameWProc;
27 }
28 
29 
30 enum Flags: DWORD
31 {
32 	NONE = 0,
33 
34 	INSTALLED = 1, // Everything is setup.
35 }
36 
37 
38 string importdir,startpath, basepath;
39 string dmdpath, dmdpath_windows = "\0";
40 string strDebug="-debug";
41 string strWindow="SUBSYSTEM:WINDOWS";
42 string strDFLlib="dfl_debug.lib";
43 string strDFile="";
44 void main(string[] args)
45 {
46 	startpath = getshortpath(Application.startupPath);
47 	if(args.length <2 || (args.length == 2 && (args[1]=="-h" || args[1]=="-help")))
48 	{
49 		ShowUsage();
50 		 return;
51 	}
52 	 
53 	buildExe(args);
54 }
55 
56 void buildExe(string[] args)
57 {
58 	string batfilepath = std.path.buildPath(startpath, "exe.bat");
59 
60 	scope batf = new BufferedFile(batfilepath, FileMode.OutNew);
61 	string c;
62 	int i;
63 	foreach(arg;args)
64 	{
65 		c = toLower(arg);
66 		i = c.indexOf('-');
67 		if(i != -1)
68 		{
69 			c=c[i+1 .. c.length];
70 		}
71 		switch(c)
72     	{
73     		case "debug":
74 				strDFLlib = "dfl_debug.lib";
75 				break;
76 			case "release":
77 				strDFLlib = "dfl.lib";
78 				strDebug ="-"~c.idup;
79 			break;
80 			case "gui","windows","winexe":
81 				strWindow ="SUBSYSTEM:WINDOWS";
82 				break;
83     		case "console","con","exe":
84     			strWindow ="su:console:4";
85     			break;
86     		default:
87 				if(c.indexOf(".d") !=-1)
88 				{
89 					strDFile ~=" ";
90 					strDFile~=arg;
91 				}
92     		break;
93     	}
94 	}
95  
96     if(strDFile == "")
97 	{
98 		writeln("Please input *.d file");
99 		return;
100 	}
101 	string strwinLib = " ole32.lib oleAut32.lib gdi32.lib Comctl32.lib Comdlg32.lib advapi32.lib uuid.lib ws2_32.lib"; 
102     string buildstr ="dmd -de -w -property -X -I$(DMDInstallDir)windows\\import "~strDFLlib~strwinLib~" -L/"~strWindow~" "~strDFile~" "~strDebug~"\r\n";// 
103 	batf.writeString(buildstr);
104 	batf.writeString("\r\n");
105 	batf.close();
106 
107 	 std.process.spawnShell(batfilepath.dup());
108 
109 	//std.file.remove(batfilepath);
110 
111 }
112 
113 string getshortpath(string fn)
114 {
115 	if(dfl.internal.utf.useUnicode)
116 	{
117 		version(STATIC_UNICODE)
118 		{
119 			alias GetShortPathNameW proc;
120 		}
121 		else
122 		{
123 			const string NAME = "GetShortPathNameW";
124 			static GetShortPathNameWProc proc = null;
125 
126 			if(!proc)
127 			{
128 				proc = cast(GetShortPathNameWProc)GetProcAddress(GetModuleHandleA("kernel32.dll"), NAME.ptr);
129 				if(!proc)
130 					throw new Exception("GetShortPathNameW not found");
131 			}
132 		}
133 
134 		DWORD len;
135 		wchar[MAX_PATH] s;
136 		len = proc(dfl.internal.utf.toUnicodez(fn), s.ptr, s.length);
137 		return to!string(s[0..len]);
138 	}
139 	else
140 	{
141 		DWORD len;
142 		char[MAX_PATH] s;
143 		len = GetShortPathNameA(dfl.internal.utf.toAnsiz(fn), s.ptr, s.length);
144 		return to!string(s[0..len]);
145 	}
146 } 
147 
148 void ShowUsage()
149 {
150 	writeln("\ndflexe written by FrankLIKE,and study by Christopher E. Miller\n");
151 	writeln("Usage:\n"
152 		"   dflexe [<switches...>] <files...>\n\n"
153 		~" for example: dflexe app.d \n\n");
154 	writeln("Switches:\n"
155 		"   -release   Build files's Release version(Default version is 'debug').\n"~
156 		"   -con	   output to Console(Default 'windows').\n");
157 		
158 }
159