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