/** * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/lgpl-3.0.txt * * 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. */ package org.kevoree.tools.nativeN.generator; import org.kevoree.ContainerRoot; /** * Created with IntelliJ IDEA. * User: jed * Date: 19/10/12 * Time: 14:34 * To change this template use File | Settings | File Templates. */ public class CodeGeneratorC extends AbstractCodeGenerator { public CodeGeneratorC(ContainerRoot model) { super(model); } @Override public void execute() { gen_headerPorts.append("#include \"$NAME$.h\"\n\n"); gen_headerPorts.append(generateOutputsPorts()); gen_headerPorts.append(generateInputsPorts()); gen_headerPorts.append(generateMethods()); gen_body.append(generateBodyC()); } public String generateStepPreCompile(){ StringBuilder gen = new StringBuilder(); gen.append("#include \"$NAME$.h\"\n\n"); gen.append(generateOutputsPorts()); gen.append(generateInputsPorts()); gen.append(generateMethods()); return gen.toString(); } public String generateInputsPorts() { StringBuilder gen = new StringBuilder(); for (String name : inputs_ports.keySet()){ gen.append("\n/* @Port(name = \""+name+"\") */\n"); gen.append("void "+name+"(void *input) {\n"); gen.append("// USE INPUT\n"); gen.append("}\n"); } return gen.toString(); } public String generateMethods(){ StringBuilder gen =new StringBuilder(); gen.append("\n" + "/*@Start*/\n" + "int start()\n" + "{\n" + "\tfprintf(stderr,\"Component starting \\n\");\n" + "\n" + "return 0;\n" + "}\n" + "\n" + "/*@Stop */\n" + "int stop()\n" + "{\n" + " fprintf(stderr,\"Component stoping \\n\");\n" + "return 0;\n" + "}\n" + "\n" + "/*@Update */\n" + "int update()\n" + "{\n" + " fprintf(stderr,\"Component updating \\n\");\n" + " return 0;\n" + "}\n"); return gen.toString(); } public String generateOutputsPorts(){ StringBuilder gen = new StringBuilder(); for (String name : ouputs_ports.keySet()){ gen.append("extern void "+name+"(void *input);\n"); } return gen.toString(); } public String generateBodyC() { StringBuilder gen = new StringBuilder(); gen.append("#include <dlfcn.h>\n"); gen.append("#include \"thirdparty/component.h\" \n\n\n"); for (String name : inputs_ports.keySet()) { gen.append("void "+name+"(void *input);\n"); } gen.append("void dummy_function() { }\n" + "static const char *get_runtime_path ()\n" + "{\n" + " Dl_info info;\n" + " if (0 == dladdr((void*)dummy_function, &info)) return \"unknown\";\n" + " return info.dli_fname;\n" + "}\n"); gen.append("const char * getRessource(const char*key)\n" + "{\n" + " int length=0;\n" + " char path_ressource[2048];\n" + " const char *path_uexe = get_runtime_path();\n" + " length = strlen(rindex(path_uexe, '/'));\n" + " memset(path_ressource,0,sizeof(path_ressource));\n" + " strncpy(path_ressource,get_runtime_path(),strlen(get_runtime_path()) - length);\n" + " strcat(path_ressource,\"/"+getComponentType().getName()+"/\");\n" + " strcat(path_ressource,key);\n" + " return strdup(path_ressource);\n" + "}"); for (String name : ouputs_ports.keySet()){ gen.append("void "+name+"(void *input) {\n"); gen.append(" process_output("+ouputs_ports.get(name)+",input);\n"); gen.append("}\n"); } gen.append("void dispatch(int port,int id_queue)\n" + "{\n" + " kmessage *msg = NULL;\n" + " msg = dequeue(id_queue);\n" + " if(msg !=NULL)\n" + " {\n" + " switch(port)\n" + " {"); for (String name : inputs_ports.keySet()){ gen.append("\t\t\t case "+inputs_ports.get(name)+":\n"); gen.append("\t\t\t\t\t "+name+"(msg->value);\n"); gen.append("\t\t\t break;\n"); } gen.append(" }\n" + " }\n" + "\n" + "}"); gen.append("int main (int argc,char *argv[])\n" + "{\n" + " \tif(argc > 1)\n" + " {\n" + "\t key_t key = atoi(argv[1]);\n" + "\t // int port= atoi(argv[2]);\n" + "\n" + "\t bootstrap(key,-1);\n" + " ctx->start= &start;\n" + " ctx->stop = &stop;\n" + " ctx->update = &update;\n" + " ctx->dispatch = &dispatch;\n" + " // todo fix here we are waiting that dico are sets\n" + " sleep(2); \n" + "\t ctx->start();\n " + " pause();\n" + " }\n" + "}"); return gen.toString(); } }