The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | |
| 2 | #include "options.h" |
| 3 | |
| 4 | #include <stdio.h> |
| 5 | #include <stdlib.h> |
| 6 | #include <string.h> |
| 7 | |
| 8 | static int |
| 9 | usage() |
| 10 | { |
| 11 | fprintf(stderr, |
| 12 | "usage: aidl OPTIONS INPUT [OUTPUT]\n" |
| 13 | " aidl --preprocess OUTPUT INPUT...\n" |
| 14 | "\n" |
| 15 | "OPTIONS:\n" |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 16 | " -I<DIR> search path for import statements.\n" |
| 17 | " -d<FILE> generate dependency file.\n" |
| 18 | " -p<FILE> file created by --preprocess to import.\n" |
| 19 | " -o<FOLDER> base output folder for generated files.\n" |
| 20 | " -b fail when trying to compile a parcelable.\n" |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 21 | "\n" |
| 22 | "INPUT:\n" |
| 23 | " An aidl interface file.\n" |
| 24 | "\n" |
| 25 | "OUTPUT:\n" |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 26 | " The generated interface files.\n" |
| 27 | " If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.\n" |
| 28 | " If the -o option is used, the generated files will be placed in the base output folder, under their package folder\n" |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 29 | ); |
| 30 | return 1; |
| 31 | } |
| 32 | |
| 33 | int |
| 34 | parse_options(int argc, const char* const* argv, Options *options) |
| 35 | { |
| 36 | int i = 1; |
| 37 | |
| 38 | if (argc >= 2 && 0 == strcmp(argv[1], "--preprocess")) { |
| 39 | if (argc < 4) { |
| 40 | return usage(); |
| 41 | } |
| 42 | options->outputFileName = argv[2]; |
| 43 | for (int i=3; i<argc; i++) { |
| 44 | options->filesToPreprocess.push_back(argv[i]); |
| 45 | } |
| 46 | options->task = PREPROCESS_AIDL; |
| 47 | return 0; |
| 48 | } |
| 49 | |
| 50 | options->task = COMPILE_AIDL; |
| 51 | options->failOnParcelable = false; |
| 52 | |
| 53 | // OPTIONS |
| 54 | while (i < argc) { |
| 55 | const char* s = argv[i]; |
| 56 | int len = strlen(s); |
| 57 | if (s[0] == '-') { |
| 58 | if (len > 1) { |
| 59 | // -I<system-import-path> |
| 60 | if (s[1] == 'I') { |
| 61 | if (len > 2) { |
| 62 | options->importPaths.push_back(s+2); |
| 63 | } else { |
| 64 | fprintf(stderr, "-I option (%d) requires a path.\n", i); |
| 65 | return usage(); |
| 66 | } |
| 67 | } |
| 68 | else if (s[1] == 'd') { |
| 69 | if (len > 2) { |
| 70 | options->depFileName = s+2; |
| 71 | } else { |
| 72 | fprintf(stderr, "-d option (%d) requires a file.\n", i); |
| 73 | return usage(); |
| 74 | } |
| 75 | } |
| 76 | else if (s[1] == 'p') { |
| 77 | if (len > 2) { |
| 78 | options->preprocessedFiles.push_back(s+2); |
| 79 | } else { |
| 80 | fprintf(stderr, "-p option (%d) requires a file.\n", i); |
| 81 | return usage(); |
| 82 | } |
| 83 | } |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 84 | else if (s[1] == 'o') { |
| 85 | if (len > 2) { |
| 86 | options->outputBaseFolder = s+2; |
| 87 | } else { |
| 88 | fprintf(stderr, "-o option (%d) requires a path.\n", i); |
| 89 | return usage(); |
| 90 | } |
| 91 | } |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 92 | else if (len == 2 && s[1] == 'b') { |
| 93 | options->failOnParcelable = true; |
| 94 | } |
| 95 | else { |
| 96 | // s[1] is not known |
| 97 | fprintf(stderr, "unknown option (%d): %s\n", i, s); |
| 98 | return usage(); |
| 99 | } |
| 100 | } else { |
| 101 | // len <= 1 |
| 102 | fprintf(stderr, "unknown option (%d): %s\n", i, s); |
| 103 | return usage(); |
| 104 | } |
| 105 | } else { |
| 106 | // s[0] != '-' |
| 107 | break; |
| 108 | } |
| 109 | i++; |
| 110 | } |
| 111 | |
| 112 | // INPUT |
| 113 | if (i < argc) { |
| 114 | options->inputFileName = argv[i]; |
| 115 | i++; |
| 116 | } else { |
| 117 | fprintf(stderr, "INPUT required\n"); |
| 118 | return usage(); |
| 119 | } |
| 120 | |
| 121 | // OUTPUT |
| 122 | if (i < argc) { |
| 123 | options->outputFileName = argv[i]; |
| 124 | i++; |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 125 | } else if (options->outputBaseFolder.length() == 0) { |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 126 | // copy input into output and change the extension from .aidl to .java |
| 127 | options->outputFileName = options->inputFileName; |
| 128 | string::size_type pos = options->outputFileName.size()-5; |
| 129 | if (options->outputFileName.compare(pos, 5, ".aidl") == 0) { // 5 = strlen(".aidl") |
| 130 | options->outputFileName.replace(pos, 5, ".java"); // 5 = strlen(".aidl") |
| 131 | } else { |
| 132 | fprintf(stderr, "INPUT is not an .aidl file.\n"); |
| 133 | return usage(); |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | // anything remaining? |
| 138 | if (i != argc) { |
| 139 | fprintf(stderr, "unknown option%s:", (i==argc-1?(const char*)"":(const char*)"s")); |
| 140 | for (; i<argc-1; i++) { |
| 141 | fprintf(stderr, " %s", argv[i]); |
| 142 | } |
| 143 | fprintf(stderr, "\n"); |
| 144 | return usage(); |
| 145 | } |
| 146 | |
| 147 | return 0; |
| 148 | } |
| 149 | |