|  | 
 | #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" | 
 |             "   -a         generate dependency file next to the output file with the name based on the input 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->autoDepFile = 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] == 'a') { | 
 |                     options->autoDepFile = true; | 
 |                 } | 
 |                 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; | 
 | } | 
 |  |