# This file is part of NIT ( http://www.nitlanguage.org ). # # Copyright 2012 Alexis Laferrière # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # provides tools to write C .c and .h files module c_tools import compiling_writer # Accumulates all C code for a compilation unit class CCompilationUnit ## header # comments and native interface imports var header_c_base : Writer = new Writer # custom C header code or generated for other languages var header_custom : Writer = new Writer # types of extern classes and friendly types var header_c_types : Writer = new Writer # implementation declaration for extern methods var header_decl : Writer = new Writer ## body # comments, imports, etc var body_decl : Writer = new Writer # custom code and generated for ffi var body_custom : Writer = new Writer # implementation body of extern methods var body_impl : Writer = new Writer # files to compile TODO check is appropriate #var files = new Array[String] fun add_local_function( efc : CFunction ) do body_decl.add( "{efc.signature};\n" ) body_impl.add( "\n" ) body_impl.append( efc.to_writer ) end fun add_exported_function( efc : CFunction ) do header_decl.add( "{efc.signature};\n" ) body_impl.add( "\n" ) body_impl.append( efc.to_writer ) end fun compile_header_core( stream : OStream ) do header_c_base.write_to_stream( stream ) header_custom.write_to_stream( stream ) header_c_types.write_to_stream( stream ) header_decl.write_to_stream( stream ) end fun compile_body_core( stream : OStream ) do body_decl.write_to_stream( stream ) body_custom.write_to_stream( stream ) body_impl.write_to_stream( stream ) end end # Accumulates C code related to a specific function class CFunction var signature : String var decls : Writer = new Writer var exprs : Writer = new Writer fun to_writer : Writer do var w = new Writer w.add( "{signature}\n\{\n" ) w.append( decls ) w.add( "\n" ) w.append( exprs ) w.add( "\}\n" ) return w end end