Mercurial > projects > dil
annotate trunk/src/dil/SettingsLoader.d @ 731:ca7607226caa
Added new module cmd.DDoc.
Added command 'ddoc'.
Fixed scanArguments() in dil.doc.Macro.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 03 Feb 2008 19:56:47 +0100 |
parents | 8955296dd807 |
children | f4b9680c0e16 |
rev | line source |
---|---|
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.SettingsLoader; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import dil.Settings; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.Messages; |
593
2848ce3becf5
Moved dil.Module to dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
586
diff
changeset
|
9 import dil.ast.Node, dil.ast.Declarations, dil.ast.Expressions; |
2848ce3becf5
Moved dil.Module to dil.semantic.Module.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
586
diff
changeset
|
10 import dil.semantic.Module; |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 import dil.File; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 import tango.io.FilePath; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 import common; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 void loadSettings() |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 scope execPath = new FilePath(GetExecutableFilePath()); |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
18 execPath = new FilePath(execPath.folder()); |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 // Load config.d |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
21 auto filePath = resolvePath(execPath, "config.d"); |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
22 auto modul = new Module(filePath); |
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
23 modul.parse(); |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
25 if (modul.hasErrors) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 throw new Exception("There are errors in " ~ filePath ~ "."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
28 foreach (decl; modul.root.children) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 { |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
30 auto v = decl.Is!(VariablesDeclaration); |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 if (v is null) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 continue; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 |
683
1ae72234db26
Implemented some methods in SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
673
diff
changeset
|
34 auto variableName = v.names[0].str; |
1ae72234db26
Implemented some methods in SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
673
diff
changeset
|
35 auto e = v.inits[0]; |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 if (!e) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 throw new Exception(variableName ~ " variable has no value set."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 switch (variableName) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 case "langfile": |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
42 if (auto val = e.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 GlobalSettings.langFile = val.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 case "import_paths": |
695
170ddcdc9711
Renamed VoidInitializer, ArrayInitializer and StructInitializer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
683
diff
changeset
|
46 if (auto array = e.Is!(ArrayInitExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 foreach (value; array.values) |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
49 if (auto str = value.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 GlobalSettings.importPaths ~= str.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 else |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 throw new Exception("import_paths variable is set to "~e.classinfo.name~" instead of an ArrayInitializer."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 break; |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
55 case "ddoc_files": |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
56 if (auto array = e.Is!(ArrayInitExpression)) |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
57 { |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
58 foreach (value; array.values) |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
59 if (auto str = value.Is!(StringExpression)) |
731
ca7607226caa
Added new module cmd.DDoc.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
721
diff
changeset
|
60 GlobalSettings.ddocFilePaths ~= resolvePath(execPath, str.getString()); |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
61 } |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
62 else |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
63 throw new Exception("import_paths variable is set to "~e.classinfo.name~" instead of an ArrayInitializer."); |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
64 break; |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 case "lexer_error": |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
66 if (auto val = e.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 GlobalSettings.lexerErrorFormat = val.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 case "parser_error": |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
70 if (auto val = e.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 GlobalSettings.parserErrorFormat = val.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 case "semantic_error": |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
74 if (auto val = e.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 GlobalSettings.semanticErrorFormat = val.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 default: |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 // Load language file. |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
82 filePath = resolvePath(execPath, GlobalSettings.langFile); |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
83 modul = new Module(filePath); |
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
84 modul.parse(); |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
86 if (modul.hasErrors) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 throw new Exception("There are errors in "~filePath~"."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
89 char[][] messages; |
515
7cb97346bc6f
Using class Module in SettingsLoader.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
513
diff
changeset
|
90 foreach (decl; modul.root.children) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
91 { |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
92 auto v = decl.Is!(VariablesDeclaration); |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 if (v is null) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 continue; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
95 |
683
1ae72234db26
Implemented some methods in SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
673
diff
changeset
|
96 auto variableName = v.names[0].str; |
1ae72234db26
Implemented some methods in SemanticPass1.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
673
diff
changeset
|
97 auto e = v.inits[0]; |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
98 if (!e) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 throw new Exception(variableName~" variable in "~filePath~" has no value set."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
100 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
101 switch (variableName) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
102 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
103 case "messages": |
695
170ddcdc9711
Renamed VoidInitializer, ArrayInitializer and StructInitializer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
683
diff
changeset
|
104 if (auto array = e.Is!(ArrayInitExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
105 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
106 foreach (value; array.values) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
107 { |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
108 if (auto str = value.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
109 messages ~= str.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
110 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
111 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
112 else |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
113 throw new Exception("messages variable is set to "~e.classinfo.name~" instead of an ArrayInitializer."); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
114 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
115 case "lang_code": |
673
64fec49651cf
Renamed VariableDeclaration to VariablesDeclaration.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
593
diff
changeset
|
116 if (auto str = e.Is!(StringExpression)) |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
117 GlobalSettings.langCode = str.getString(); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
118 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
119 default: |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
120 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
121 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
122 if (messages.length != MID.max+1) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
123 throw new Exception( |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 Format( |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
125 "messages table in {0} must exactly have {1} entries, but {2} were found.", |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
126 filePath, MID.max+1, messages.length) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
127 ); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
128 GlobalSettings.messages = messages; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
129 dil.Messages.SetMessages(messages); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
130 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
131 |
721
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
132 string resolvePath(FilePath execPath, string filePath) |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
133 { |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
134 if ((new FilePath(filePath)).isAbsolute()) |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
135 return filePath; |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
136 return execPath.dup.append(filePath).toString(); |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
137 } |
8955296dd807
Added ddoc_files option to config.d
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
695
diff
changeset
|
138 |
513
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
139 version(Windows) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
140 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
141 private extern(Windows) uint GetModuleFileNameA(void*, char*, uint); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
142 /++ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
143 Get the fully qualified path to this executable. |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
144 +/ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
145 char[] GetExecutableFilePath() |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
146 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
147 alias GetModuleFileNameA GetModuleFileName; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
148 char[] buffer = new char[256]; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
149 uint count; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
150 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
151 while (1) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
152 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
153 if (buffer is null) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
154 return null; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
155 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
156 count = GetModuleFileName(null, buffer.ptr, buffer.length); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
157 if (count == 0) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
158 return null; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
159 if (buffer.length != count && buffer[count] == 0) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
160 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
161 // Increase size of buffer |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
162 buffer.length = buffer.length * 2; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
163 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
164 assert(buffer[count] == 0); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
165 // Reduce buffer to the actual length of the string (excluding '\0'.) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
166 if (count < buffer.length) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
167 buffer.length = count; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
168 return buffer; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
169 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
170 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
171 else version(linux) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
172 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
173 private extern(C) size_t readlink(char* path, char* buf, size_t bufsize); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
174 /++ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
175 Get the fully qualified path to this executable. |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
176 +/ |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
177 char[] GetExecutableFilePath() |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
178 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
179 char[] buffer = new char[256]; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
180 size_t count; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
181 |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
182 while (1) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
183 { |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
184 // This won't work on very old Linux systems. |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
185 count = readlink("/proc/self/exe".ptr, buffer.ptr, buffer.length); |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
186 if (count == -1) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
187 return null; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
188 if (count < buffer.length) |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
189 break; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
190 buffer.length = buffer.length * 2; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
191 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
192 buffer.length = count; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
193 return buffer; |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
194 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
195 } |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
196 else |
6160ab7b1816
Refactored code related to settings.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
197 static assert(0, "GetExecutableFilePath() is not implemented on this platform."); |