1ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall/* 2ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* Copyright (C) 2011 The Android Open Source Project 3ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* 4ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* Licensed under the Apache License, Version 2.0 (the "License"); 5ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* you may not use this file except in compliance with the License. 6ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* You may obtain a copy of the License at 7ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* 8ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* http://www.apache.org/licenses/LICENSE-2.0 9ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* 10ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* Unless required by applicable law or agreed to in writing, software 11ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* distributed under the License is distributed on an "AS IS" BASIS, 12ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* See the License for the specific language governing permissions and 14ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall* limitations under the License. 15ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall*/ 16ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include <stdio.h> 17ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include <stdlib.h> 18ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "errors.h" 19ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "EntryPoint.h" 20ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "strUtils.h" 21ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "ApiGen.h" 22ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#include "TypeFactory.h" 23ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 24ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallconst std::string SPEC_EXTENSION = std::string(".in"); 25ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallconst std::string ATTRIB_EXTENSION = std::string(".attrib"); 26ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallconst std::string TYPES_EXTENTION = std::string(".types"); 27ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 28ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 29ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallvoid usage(const char *filename) 30ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall{ 31ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "Usage: %s [options] <base name>\n", filename); 32ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-h: This message\n"); 33ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-E <dir>: generate encoder into dir\n"); 34ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-D <dir>: generate decoder into dir\n"); 35ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-i: input dir, local directory by default\n"); 36ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-T : generate attribute template into the input directory\n\t\tno other files are generated\n"); 37ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "\t-W : generate wrapper into dir\n"); 38ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall} 39ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 40ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hallint main(int argc, char *argv[]) 41ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall{ 42ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string encoderDir = ""; 43ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string decoderDir = ""; 44ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string wrapperDir = ""; 45ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string inDir = "."; 46ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall bool generateAttributesTemplate = false; 47ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 48ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall int c; 49ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall while((c = getopt(argc, argv, "TE:D:i:hW:")) != -1) { 50ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall switch(c) { 51ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'W': 52ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall wrapperDir = std::string(optarg); 53ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 54ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'T': 55ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall generateAttributesTemplate = true; 56ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 57ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'h': 58ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall usage(argv[0]); 59ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall exit(0); 60ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 61ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'E': 62ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall encoderDir = std::string(optarg); 63ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 64ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'D': 65ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall decoderDir = std::string(optarg); 66ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 67ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case 'i': 68ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall inDir = std::string(optarg); 69ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall break; 70ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall case ':': 71ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "Missing argument !!\n"); 72ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall // fall through 73ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall default: 74ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall usage(argv[0]); 75ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall exit(0); 76ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 77ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 78ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 79ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (optind >= argc) { 80ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "Usage: %s [options] <base name> \n", argv[0]); 81ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall return BAD_USAGE; 82ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 83ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 84ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (encoderDir.size() == 0 && 85ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall decoderDir.size() == 0 && 86ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall generateAttributesTemplate == false && 87ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall wrapperDir.size() == 0) { 88ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "No output specified - aborting\n"); 89ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall return BAD_USAGE; 90ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 91ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 92ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string baseName = std::string(argv[optind]); 93ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall ApiGen apiEntries(baseName); 94ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 95ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall // init types; 96ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string typesFilename = inDir + "/" + baseName + TYPES_EXTENTION; 97ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 98ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (TypeFactory::instance()->initFromFile(typesFilename) < 0) { 99ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "missing or error reading types file: %s...ignored\n", typesFilename.c_str()); 100ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 101ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 102ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string filename = inDir + "/" + baseName + SPEC_EXTENSION; 103ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (apiEntries.readSpec(filename) < 0) { 104ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall perror(filename.c_str()); 105ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall return BAD_SPEC_FILE; 106ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 107ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 108ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 109ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (generateAttributesTemplate) { 110ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genAttributesTemplate(inDir + "/" + baseName + ATTRIB_EXTENSION); 111ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall exit(0); 112ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 113ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 114ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall std::string attribFileName = inDir + "/" + baseName + ATTRIB_EXTENSION; 115ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (apiEntries.readAttributes(attribFileName) < 0) { 116ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall perror(attribFileName.c_str()); 117ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stderr, "failed to parse attributes\n"); 118ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall exit(1); 119ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 120ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 121ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (encoderDir.size() != 0) { 122ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 123ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genOpcodes(encoderDir + "/" + baseName + "_opcodes.h"); 124ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContext(encoderDir + "/" + baseName + "_client_context.h", ApiGen::CLIENT_SIDE); 125ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContextImpl(encoderDir + "/" + baseName + "_client_context.cpp", ApiGen::CLIENT_SIDE); 126ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 127ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genProcTypes(encoderDir + "/" + baseName + "_client_proc.h", ApiGen::CLIENT_SIDE); 128ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genFuncTable(encoderDir + "/" + baseName + "_ftable.h", ApiGen::CLIENT_SIDE); 129ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 130ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genEntryPoints(encoderDir + "/" + baseName + "_entry.cpp", ApiGen::CLIENT_SIDE); 131ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genEncoderHeader(encoderDir + "/" + baseName + "_enc.h"); 132ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genEncoderImpl(encoderDir + "/" + baseName + "_enc.cpp"); 133ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 134ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 135ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (decoderDir.size() != 0) { 136ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genOpcodes(decoderDir + "/" + baseName + "_opcodes.h"); 137ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genProcTypes(decoderDir + "/" + baseName + "_server_proc.h", ApiGen::SERVER_SIDE); 138ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContext(decoderDir + "/" + baseName + "_server_context.h", ApiGen::SERVER_SIDE); 139ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContextImpl(decoderDir + "/" + baseName + "_server_context.cpp", ApiGen::SERVER_SIDE); 140ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genDecoderHeader(decoderDir + "/" + baseName + "_dec.h"); 141ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genDecoderImpl(decoderDir + "/" + baseName + "_dec.cpp"); 142ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 143ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 144ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (wrapperDir.size() != 0) { 145ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genProcTypes(wrapperDir + "/" + baseName + "_wrapper_proc.h", ApiGen::WRAPPER_SIDE); 146ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContext(wrapperDir + "/" + baseName + "_wrapper_context.h", ApiGen::WRAPPER_SIDE); 147ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genContextImpl(wrapperDir + "/" + baseName + "_wrapper_context.cpp", ApiGen::WRAPPER_SIDE); 148ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries.genEntryPoints(wrapperDir + "/" + baseName + "_wrapper_entry.cpp", ApiGen::WRAPPER_SIDE); 149ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 150ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 151ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#ifdef DEBUG_DUMP 152ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall int withPointers = 0; 153ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall printf("%d functions found\n", int(apiEntries.size())); 154ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall for (int i = 0; i < apiEntries.size(); i++) { 155ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall if (apiEntries[i].hasPointers()) { 156ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall withPointers++; 157ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall apiEntries[i].print(); 158ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 159ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall } 160ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall fprintf(stdout, "%d entries has poitners\n", withPointers); 161ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall#endif 162ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 163ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall} 164ce6c3389061fb9fcdefc94fab2044a8e11600b52Jesse Hall 165