150 lines
4.7 KiB
C++
150 lines
4.7 KiB
C++
|
|
#include "options.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
static int
|
|
usage()
|
|
{
|
|
fprintf(stderr,
|
|
"usage: aidl OPTIONS INPUT [OUTPUT]\n"
|
|
" aidl --preprocess OUTPUT INPUT...\n"
|
|
"\n"
|
|
"OPTIONS:\n"
|
|
" -I<DIR> search path for import statements.\n"
|
|
" -d<FILE> generate dependency file.\n"
|
|
" -p<FILE> file created by --preprocess to import.\n"
|
|
" -o<FOLDER> base output folder for generated files.\n"
|
|
" -b fail when trying to compile a parcelable.\n"
|
|
"\n"
|
|
"INPUT:\n"
|
|
" An aidl interface file.\n"
|
|
"\n"
|
|
"OUTPUT:\n"
|
|
" The generated interface files.\n"
|
|
" If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.\n"
|
|
" If the -o option is used, the generated files will be placed in the base output folder, under their package folder\n"
|
|
);
|
|
return 1;
|
|
}
|
|
|
|
int
|
|
parse_options(int argc, const char* const* argv, Options *options)
|
|
{
|
|
int i = 1;
|
|
|
|
if (argc >= 2 && 0 == strcmp(argv[1], "--preprocess")) {
|
|
if (argc < 4) {
|
|
return usage();
|
|
}
|
|
options->outputFileName = argv[2];
|
|
for (int i=3; i<argc; i++) {
|
|
options->filesToPreprocess.push_back(argv[i]);
|
|
}
|
|
options->task = PREPROCESS_AIDL;
|
|
return 0;
|
|
}
|
|
|
|
options->task = COMPILE_AIDL;
|
|
options->failOnParcelable = false;
|
|
|
|
// OPTIONS
|
|
while (i < argc) {
|
|
const char* s = argv[i];
|
|
int len = strlen(s);
|
|
if (s[0] == '-') {
|
|
if (len > 1) {
|
|
// -I<system-import-path>
|
|
if (s[1] == 'I') {
|
|
if (len > 2) {
|
|
options->importPaths.push_back(s+2);
|
|
} else {
|
|
fprintf(stderr, "-I option (%d) requires a path.\n", i);
|
|
return usage();
|
|
}
|
|
}
|
|
else if (s[1] == 'd') {
|
|
if (len > 2) {
|
|
options->depFileName = s+2;
|
|
} else {
|
|
fprintf(stderr, "-d option (%d) requires a file.\n", i);
|
|
return usage();
|
|
}
|
|
}
|
|
else if (s[1] == 'p') {
|
|
if (len > 2) {
|
|
options->preprocessedFiles.push_back(s+2);
|
|
} else {
|
|
fprintf(stderr, "-p option (%d) requires a file.\n", i);
|
|
return usage();
|
|
}
|
|
}
|
|
else if (s[1] == 'o') {
|
|
if (len > 2) {
|
|
options->outputBaseFolder = s+2;
|
|
} else {
|
|
fprintf(stderr, "-o option (%d) requires a path.\n", i);
|
|
return usage();
|
|
}
|
|
}
|
|
else if (len == 2 && s[1] == 'b') {
|
|
options->failOnParcelable = true;
|
|
}
|
|
else {
|
|
// s[1] is not known
|
|
fprintf(stderr, "unknown option (%d): %s\n", i, s);
|
|
return usage();
|
|
}
|
|
} else {
|
|
// len <= 1
|
|
fprintf(stderr, "unknown option (%d): %s\n", i, s);
|
|
return usage();
|
|
}
|
|
} else {
|
|
// s[0] != '-'
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
// INPUT
|
|
if (i < argc) {
|
|
options->inputFileName = argv[i];
|
|
i++;
|
|
} else {
|
|
fprintf(stderr, "INPUT required\n");
|
|
return usage();
|
|
}
|
|
|
|
// OUTPUT
|
|
if (i < argc) {
|
|
options->outputFileName = argv[i];
|
|
i++;
|
|
} else if (options->outputBaseFolder.length() == 0) {
|
|
// copy input into output and change the extension from .aidl to .java
|
|
options->outputFileName = options->inputFileName;
|
|
string::size_type pos = options->outputFileName.size()-5;
|
|
if (options->outputFileName.compare(pos, 5, ".aidl") == 0) { // 5 = strlen(".aidl")
|
|
options->outputFileName.replace(pos, 5, ".java"); // 5 = strlen(".aidl")
|
|
} else {
|
|
fprintf(stderr, "INPUT is not an .aidl file.\n");
|
|
return usage();
|
|
}
|
|
}
|
|
|
|
// anything remaining?
|
|
if (i != argc) {
|
|
fprintf(stderr, "unknown option%s:", (i==argc-1?(const char*)"":(const char*)"s"));
|
|
for (; i<argc-1; i++) {
|
|
fprintf(stderr, " %s", argv[i]);
|
|
}
|
|
fprintf(stderr, "\n");
|
|
return usage();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|