1 /**
2  * Copyright: Copyright (c) 2012 Jacob Carlborg. All rights reserved.
3  * Authors: Jacob Carlborg
4  * Version: Initial created: Jun 15, 2012
5  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
6  */
7 module dstep.translator.IncludeHandler;
8 
9 import Path = std.path;
10 
11 import mambo.core._;
12 
13 private IncludeHandler includeHandler_;
14 
15 @property IncludeHandler includeHandler ()
16 {
17 	return includeHandler_;
18 }
19 
20 static this ()
21 {
22 	includeHandler_ = new IncludeHandler;
23 }
24 
25 class IncludeHandler
26 {
27 	private string[] rawIncludes;
28 	private string[] imports;
29 	static string[string] knownIncludes;
30 	
31 	static this ()
32 	{
33 		knownIncludes = [
34 	        "complex" : "core.stdc.complex",
35 	        "config" : "core.stdc.config",
36 	        "ctype" : "core.stdc.ctype",
37 	        "errno" : "core.stdc.errno",
38 	        "fenv" : "core.stdc.fenv",
39 	        "float" : "core.stdc.float",
40 	        "inttypes" : "core.stdc.inttypes",
41 	        "limits" : "core.stdc.limits",
42 	        "locale" : "core.stdc.locale",
43 	        "math" : "core.stdc.math",
44 	        "signal" : "core.stdc.signal",
45 	        "stdarg" : "core.stdc.stdarg",
46 	        "stddef" : "core.stdc.stddef",
47 	        "stdint" : "core.stdc.stdint",
48 	        "stdio" : "core.stdc.stdio",
49 	        "stdlib" : "core.stdc.stdlib",
50 	        "string" : "core.stdc.string",
51 	        "tgmath" : "core.stdc.tgmath",
52 	        "time" : "core.stdc.time",
53 	        "wchar" : "core.stdc.wchar_",
54 	        "wctype" : "core.stdc.wctype",        
55 
56 	        "dirent" : "core.sys.posix.dirent",
57 	        "dlfcn" : "core.sys.posix.dlfcn",
58 	        "fcntl" : "core.sys.posix.fcntl",
59 	        "netdb" : "core.sys.posix.netdb",
60 	        "poll" : "core.sys.posix.poll",
61 	        "pthread" : "core.sys.posix.pthread",
62 	        "pwd" : "core.sys.posix.pwd",
63 	        "sched" : "core.sys.posix.sched",
64 	        "semaphore" : "core.sys.posix.semaphore",
65 	        "setjmp" : "core.sys.posix.setjmp",
66 	        "signal" : "core.sys.posix.signal",
67 	        "termios" : "core.sys.posix.termios",
68 	        "ucontext" : "core.sys.posix.ucontext",
69 	        "unistd" : "core.sys.posix.unistd",
70 	        "utime" : "core.sys.posix.utime",
71 
72 	        "arpa/inet" : "core.sys.posix.arpa.inet",
73 
74 	        "net/if" : "core.sys.posix.net.if_",
75 
76 	        "netinet/in" : "core.sys.posix.netinet.in_",
77 	        "netinet/tcp" : "core.sys.posix.netinet.tcp",
78 
79 	        "sys/ipc" : "core.sys.posix.sys.ipc",
80 	        "sys/mman" : "core.sys.posix.sys.mman",
81 	        "sys/select" : "core.sys.posix.sys.select",
82 	        "sys/shm" : "core.sys.posix.sys.shm",
83 	        "sys/socket" : "core.sys.posix.sys.socket",
84 	        "sys/stat" : "core.sys.posix.sys.stat",
85 	        "sys/time" : "core.sys.posix.sys.time",
86 	        "sys/types" : "core.sys.posix.sys.types",
87 	        "sys/_types" : "core.sys.posix.sys.types",
88 	        "sys/uio" : "core.sys.posix.sys.uio",
89 	        "sys/un" : "core.sys.posix.sys.un",
90 	        "sys/utsname" : "core.sys.posix.sys.utsname",
91 	        "sys/wait" : "core.sys.posix.sys.wait",
92 
93 	        "windows" : "core.sys.windows.windows"
94 	    ];
95 	}
96 
97 	void addInclude (string include)
98 	{
99 		rawIncludes ~= include;
100 	}
101 
102 	void addImport (string imp)
103 	{
104 		imports ~= imp;
105 	}
106 
107 	void addCompatible ()
108 	{
109 		imports ~= "core.stdc.config";
110 	}
111 
112 	string[] toImports ()
113     {
114 		auto r =  rawIncludes.map!((e) {
115 			if (auto i = isKnownInclude(e))
116 				return toImport(i);
117 
118 			else
119 				return "";
120 		});
121 
122 		auto imps = imports.map!(e => toImport(e));
123 
124 		return r.append(imps).filter!(e => e.any).unique.toArray;
125     }
126 
127 private:
128 
129 	string toImport (string str)
130 	{
131 		return "import " ~ str ~ ";";
132 	}
133 
134     string isKnownInclude (string include)
135     {
136 		include = Path.stripExtension(include);
137 
138 		if (auto r = knownIncludes.find!((k, _) => include.endsWith(k)))
139 			return r.value;
140 
141 		return null;
142     }
143 }