blob: 0aa7db2b860e3059292bc12ec34c91e2a41811db [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001
2#include "options.h"
3
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7
8static int
9usage()
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 Projectba87e3e2009-03-13 13:04:22 -070016 " -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 Project9066cfe2009-03-03 19:31:44 -080021 "\n"
22 "INPUT:\n"
23 " An aidl interface file.\n"
24 "\n"
25 "OUTPUT:\n"
The Android Open Source Projectba87e3e2009-03-13 13:04:22 -070026 " 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 Project9066cfe2009-03-03 19:31:44 -080029 );
30 return 1;
31}
32
33int
34parse_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 Projectba87e3e2009-03-13 13:04:22 -070084 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 Project9066cfe2009-03-03 19:31:44 -080092 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 Projectba87e3e2009-03-13 13:04:22 -0700125 } else if (options->outputBaseFolder.length() == 0) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800126 // 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