| |
| #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; |
| } |
| |