• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include "options.h"
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 
8 static int
usage()9 usage()
10 {
11     fprintf(stderr,
12             "usage: aidl OPTIONS INPUT [OUTPUT]\n"
13             "       aidl --preprocess OUTPUT INPUT...\n"
14             "\n"
15             "OPTIONS:\n"
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"
21             "\n"
22             "INPUT:\n"
23             "   An aidl interface file.\n"
24             "\n"
25             "OUTPUT:\n"
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"
29            );
30     return 1;
31 }
32 
33 int
parse_options(int argc,const char * const * argv,Options * options)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                 }
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                 }
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++;
125     } else if (options->outputBaseFolder.length() == 0) {
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 
150