ni_nitdoc: added fast copy past utility to signatures.
[nit.git] / src / c_tools.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2012 Alexis Laferrière <alexis.laf@xymus.net>
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 # provides tools to write C .c and .h files
18 module c_tools
19
20 import compiling_writer
21
22 # Accumulates all C code for a compilation unit
23 class CCompilationUnit
24 ## header
25 # comments and native interface imports
26 var header_c_base : Writer = new Writer
27
28 # custom C header code or generated for other languages
29 var header_custom : Writer = new Writer
30
31 # types of extern classes and friendly types
32 var header_c_types : Writer = new Writer
33
34 # implementation declaration for extern methods
35 var header_decl : Writer = new Writer
36
37 ## body
38 # comments, imports, etc
39 var body_decl : Writer = new Writer
40
41 # custom code and generated for ffi
42 var body_custom : Writer = new Writer
43
44 # implementation body of extern methods
45 var body_impl : Writer = new Writer
46
47 # files to compile TODO check is appropriate
48 #var files = new Array[String]
49
50 fun add_local_function( efc : CFunction )
51 do
52 body_decl.add( "{efc.signature};\n" )
53 body_impl.add( "\n" )
54 body_impl.append( efc.to_writer )
55 end
56
57 fun add_exported_function( efc : CFunction )
58 do
59 header_decl.add( "{efc.signature};\n" )
60 body_impl.add( "\n" )
61 body_impl.append( efc.to_writer )
62 end
63
64 fun compile_header_core( stream : OStream )
65 do
66 header_c_base.write_to_stream( stream )
67 header_custom.write_to_stream( stream )
68 header_c_types.write_to_stream( stream )
69 header_decl.write_to_stream( stream )
70 end
71
72 fun compile_body_core( stream : OStream )
73 do
74 body_decl.write_to_stream( stream )
75 body_custom.write_to_stream( stream )
76 body_impl.write_to_stream( stream )
77 end
78 end
79
80 # Accumulates C code related to a specific function
81 class CFunction
82 var signature : String
83
84 var decls : Writer = new Writer
85 var exprs : Writer = new Writer
86
87 fun to_writer : Writer
88 do
89 var w = new Writer
90
91 w.add( "{signature}\n\{\n" )
92
93 w.append( decls )
94 w.add( "\n" )
95 w.append( exprs )
96
97 w.add( "\}\n" )
98
99 return w
100 end
101 end