1 : //==============================================================================
2 : // File <$/src/cpp/dev/idlc/idlc_main.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, 2006, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //==============================================================================
21 :
22 : // Portability
23 : #include "yaorb/config.h"
24 : #include "src/cpp/prod/port/port_stdc.h"
25 : #include "src/cpp/prod/port/port_stdlib.h"
26 :
27 : #include <stdio.h>
28 : #include <iostream>
29 :
30 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
31 : #include "src/cpp/prod/tool/Assert.h"
32 :
33 : #include "src/cpp/prod/tool/String.h"
34 : #include "src/cpp/prod/tool/Version.h"
35 :
36 : #include "src/cpp/dev/idlc/yyutils.h"
37 : #include "src/cpp/dev/idlc/compiler.h"
38 : #include "src/cpp/dev/idlc/sym_tab.h"
39 : #include "src/cpp/dev/idlc/back/lang_cpp/lang_cpp.h"
40 : #include "src/cpp/dev/idlc/back/lang_cpp/info.h"
41 : #include "src/cpp/dev/idlc/back/lang_java/lang_java.h"
42 : #include "src/cpp/dev/idlc/back/lang_java/javainfo.h"
43 :
44 : // FIXME : use header file or automake config.h
45 : static const char* const G_DIR_SEPARATOR = "/" ;
46 :
47 : // Command line options, general
48 33 : String arg_input_file("") ;
49 33 : String arg_output_file("") ;
50 33 : String arg_output_dir("") ;
51 : StringList arg_directory ;
52 : bool arg_preprocessing_only ;
53 33 : String arg_language("") ;
54 :
55 : // Command line options, C++
56 33 : String arg_cpp_stub("") ;
57 33 : String arg_cpp_skel("") ;
58 33 : String arg_cpp_impl("") ;
59 33 : String arg_cpp_generate_module("") ;
60 :
61 : // Command line options, Java
62 33 : String arg_java_generate_module("") ;
63 :
64 : // Debug code, not used
65 : // void ExitHandler(void)
66 : // {
67 : // fprintf(stderr, " EXIT HANDLER\n") ;
68 : // fflush(stderr) ;
69 : // }
70 :
71 0 : void MemHandler(void)
72 : {
73 0 : fprintf(stderr, " MEMORY HANDLER\n") ;
74 0 : fflush(stderr) ;
75 : }
76 :
77 0 : void Usage(FILE * where)
78 : {
79 : static const char* text[] =
80 : {
81 : "",
82 : "idlc : YAORB IDL Compiler",
83 : "=========================",
84 : "",
85 : "Copyright (C) 2000-2003, 2006, Marc Alff.",
86 : "",
87 : "Usage:",
88 : "idlc <<General Options>> <<Language specific options>>",
89 : "",
90 : "General Options:",
91 : "----------------",
92 : " -c <filename> : input IDL source to compile",
93 : " -o <filename> : basename for output files",
94 : " -odir <dirname> : output directory",
95 : " -I <directory> : add <directory> to the #include search path",
96 : " -E : preprocessing only, do not generate code",
97 : " -D<macro> : #define <macro> with value 1",
98 : " -D<macro>=<value> : #define <macro> with value <value>",
99 : " -U<macro> : #undefine <macro>",
100 : " -language C++ : IDL->C++ mapping",
101 : " -language Java : IDL->Java mapping",
102 :
103 : #ifdef LATER
104 : " -language C : IDL->C mapping (not supported in this release) ,",
105 : #endif
106 :
107 : " --help : print this help",
108 : " --version : print version",
109 :
110 : "",
111 : "IDL->C++ Specific Options:",
112 : "--------------------------",
113 : " -C++-Stub <pattern> : sprintf format for Stub classes (default \"%s_Stub\")",
114 : " -C++-Skel <pattern> : sprintf format for Skel classes (default \"%s_Skel\")",
115 : " -C++-Impl <pattern> : sprintf format for Impl classes (default \"%s_Impl\")",
116 : " -C++-Generate <Module> : Generate code for <Module> only",
117 :
118 : "",
119 : "IDL->Java Specific Options:",
120 : "---------------------------",
121 : " -Java-Generate <Module> : Generate code for <Module> only",
122 :
123 : NULL
124 : } ;
125 :
126 : const char** tmp = & text[0] ;
127 :
128 0 : while (*tmp != NULL)
129 : {
130 0 : fprintf(where, "%s\n", *tmp) ;
131 : tmp ++ ;
132 : }
133 : }
134 :
135 0 : void Version(FILE * where)
136 : {
137 0 : PrintVersion(where) ;
138 0 : PrintSpecs(where) ;
139 : }
140 :
141 33 : void ParseArg(int argc, char* argv[])
142 : {
143 33 : if (argc < 1)
144 : {
145 0 : Usage(stderr) ;
146 0 : exit(1) ;
147 : }
148 :
149 33 : argc -- ; argv ++ ; // Eat idlc
150 :
151 261 : while (argc >= 1)
152 : {
153 228 : if (argc >= 2)
154 : {
155 228 : if (strcmp(argv[0], "-c") == 0)
156 : {
157 33 : if (arg_input_file != "")
158 : {
159 0 : Usage(stderr) ; // -c <filename> already specified
160 0 : exit(1) ;
161 : }
162 :
163 : argc -- ; argv ++ ; // Eat -c
164 33 : arg_input_file = argv[0] ;
165 33 : argc -- ; argv ++ ; // Eat <filename>
166 :
167 33 : continue ;
168 : }
169 :
170 195 : if (strcmp(argv[0], "-o") == 0)
171 : {
172 31 : if (arg_output_file != "")
173 : {
174 0 : Usage(stderr) ; // already specified
175 0 : exit(1) ;
176 : }
177 :
178 : argc -- ; argv ++ ; // Eat -o
179 31 : arg_output_file = argv[0] ;
180 31 : argc -- ; argv ++ ; // Eat <filename>
181 :
182 31 : continue ;
183 : }
184 :
185 164 : if (strcmp(argv[0], "-odir") == 0)
186 : {
187 31 : if (arg_output_dir != "")
188 : {
189 0 : Usage(stderr) ; // already specified
190 0 : exit(1) ;
191 : }
192 :
193 : argc -- ; argv ++ ; // Eat -odir
194 31 : arg_output_dir = argv[0] ;
195 31 : argc -- ; argv ++ ; // Eat <dirname>
196 :
197 31 : continue ;
198 : }
199 :
200 133 : if (strcmp(argv[0], "-I") == 0)
201 : {
202 : argc -- ; argv ++ ; // Eat -I
203 69 : String *dir = new String(argv[0]) ;
204 69 : argc -- ; argv ++ ; // Eat <dirname>
205 :
206 : arg_directory.addTail(dir) ;
207 :
208 69 : continue ;
209 : }
210 :
211 64 : if (strncmp(argv[0], "-I", 2) == 0)
212 : {
213 : const char* dirname = & argv[0][2] ;
214 0 : String *dir = new String(dirname) ;
215 0 : argc -- ; argv ++ ; // Eat -I<dirname>
216 :
217 : arg_directory.addTail(dir) ;
218 :
219 0 : continue ;
220 : }
221 :
222 64 : if (strcmp(argv[0], "-language") == 0)
223 : {
224 32 : if (arg_language != "")
225 : {
226 0 : Usage(stderr) ; // -language <lang_spec> already specified
227 0 : exit(1) ;
228 : }
229 :
230 : argc -- ; argv ++ ; // Eat -language
231 32 : arg_language = argv[0] ;
232 32 : argc -- ; argv ++ ; // Eat <lang_spec>
233 :
234 34 : if ( (arg_language != "C++")
235 : && (arg_language != "Java") )
236 : {
237 0 : Usage(stderr) ;
238 0 : exit(1) ;
239 : }
240 :
241 : continue ;
242 : }
243 :
244 32 : if (strcmp(argv[0], "-C++-Stub") == 0)
245 : {
246 0 : if (arg_cpp_stub != "")
247 : {
248 0 : Usage(stderr) ; // already specified
249 0 : exit(1) ;
250 : }
251 :
252 : argc -- ; argv ++ ; // Eat -C++-Stub
253 0 : arg_cpp_stub = argv[0] ;
254 0 : argc -- ; argv ++ ; // Eat <pattern>
255 :
256 0 : continue ;
257 : }
258 :
259 32 : if (strcmp(argv[0], "-C++-Skel") == 0)
260 : {
261 0 : if (arg_cpp_skel != "")
262 : {
263 0 : Usage(stderr) ; // already specified
264 0 : exit(1) ;
265 : }
266 :
267 : argc -- ; argv ++ ; // Eat -C++-Skel
268 0 : arg_cpp_skel = argv[0] ;
269 0 : argc -- ; argv ++ ; // Eat <pattern>
270 :
271 0 : continue ;
272 : }
273 :
274 32 : if (strcmp(argv[0], "-C++-Impl") == 0)
275 : {
276 0 : if (arg_cpp_impl != "")
277 : {
278 0 : Usage(stderr) ; // already specified
279 0 : exit(1) ;
280 : }
281 :
282 : argc -- ; argv ++ ; // Eat -C++-Impl
283 0 : arg_cpp_impl = argv[0] ;
284 0 : argc -- ; argv ++ ; // Eat <pattern>
285 :
286 0 : continue ;
287 : }
288 :
289 32 : if (strcmp(argv[0], "-C++-Generate") == 0)
290 : {
291 30 : if (arg_cpp_generate_module != "")
292 : {
293 0 : Usage(stderr) ; // already specified
294 0 : exit(1) ;
295 : }
296 :
297 : argc -- ; argv ++ ; // Eat -C++-Generate
298 30 : arg_cpp_generate_module = argv[0] ;
299 30 : argc -- ; argv ++ ; // Eat <Module>
300 :
301 30 : continue ;
302 : }
303 :
304 2 : if (strcmp(argv[0], "-Java-Generate") == 0)
305 : {
306 2 : if (arg_java_generate_module != "")
307 : {
308 0 : Usage(stderr) ; // already specified
309 0 : exit(1) ;
310 : }
311 :
312 : argc -- ; argv ++ ; // Eat -Java-Generate
313 2 : arg_java_generate_module = argv[0] ;
314 2 : argc -- ; argv ++ ; // Eat <Module>
315 :
316 2 : continue ;
317 : }
318 : }
319 :
320 0 : if (strncmp(argv[0], "-D", 2) == 0)
321 : {
322 0 : NON_DEV("option -D") ;
323 0 : argc -- ; argv ++ ;
324 :
325 0 : continue ;
326 : }
327 :
328 0 : if (strncmp(argv[0], "-U", 2) == 0)
329 : {
330 0 : NON_DEV("option -U") ;
331 0 : argc -- ; argv ++ ;
332 :
333 0 : continue ;
334 : }
335 :
336 0 : if (strncmp(argv[0], "-E", 2) == 0)
337 : {
338 0 : arg_preprocessing_only = true ;
339 0 : argc -- ; argv ++ ;
340 :
341 0 : continue ;
342 : }
343 :
344 0 : if (strcmp(argv[0], "--help") == 0)
345 : {
346 : argc -- ; argv ++ ; // eat --help
347 :
348 0 : Usage(stdout) ;
349 0 : exit(0) ;
350 : }
351 :
352 0 : if (strcmp(argv[0], "--version") == 0)
353 : {
354 : argc -- ; argv ++ ; // eat --version
355 :
356 0 : Version(stdout) ;
357 0 : exit(0) ;
358 : }
359 :
360 0 : if (strncmp(argv[0], "-", 1) == 0)
361 : {
362 0 : fprintf(stderr, "Unknown option %s\n", argv[0]) ;
363 0 : Usage(stderr) ;
364 0 : exit(1) ;
365 : }
366 :
367 0 : if (arg_input_file != "")
368 : {
369 0 : Usage(stderr) ; // -c <filename> or <filename> already specified
370 0 : exit(1) ;
371 : }
372 :
373 0 : arg_input_file = argv[0] ;
374 0 : argc -- ; argv ++ ; // Eat <filename>
375 : }
376 :
377 : // defaults
378 :
379 33 : if (arg_language == "")
380 : {
381 1 : arg_language = "C++" ;
382 : }
383 :
384 33 : if (arg_output_file == "")
385 : {
386 2 : char *tmp = strdup(arg_input_file) ;
387 2 : int len = strlen(tmp) ;
388 :
389 2 : if (len > 4)
390 : {
391 : char *end = & tmp [len - 4] ;
392 2 : if (strcasecmp(end, ".idl") == 0)
393 : {
394 : len -= 4 ; // truncate .idl
395 2 : tmp[len] = '\0' ;
396 : }
397 : }
398 :
399 2 : arg_output_file = tmp ;
400 2 : free (tmp) ;
401 : }
402 :
403 33 : if (arg_output_dir != "")
404 : {
405 31 : int len = strlen(arg_output_dir) ;
406 31 : const char* tmpStr = arg_output_dir ;
407 : char last = tmpStr[len-1] ;
408 :
409 31 : if (last != G_DIR_SEPARATOR[0])
410 : {
411 31 : arg_output_dir += G_DIR_SEPARATOR ;
412 : }
413 : }
414 : }
415 :
416 33 : int main(int argc, char *argv[])
417 : {
418 33 : int nb_err = 0 ;
419 33 : int nb_warn = 0 ;
420 :
421 33 : std::set_new_handler(MemHandler) ;
422 : // atexit(ExitHandler) ;
423 :
424 33 : ParseArg(argc, argv) ;
425 :
426 : SymbolTable *symTab = NULL ;
427 :
428 : symTab = CompileIDL(
429 : arg_input_file,
430 : arg_directory,
431 : nb_err,
432 : nb_warn,
433 33 : arg_preprocessing_only) ;
434 :
435 : arg_directory.clearAndDestroy() ;
436 :
437 33 : if (nb_err == 0)
438 : {
439 30 : if (arg_language == "C++")
440 : {
441 28 : LangCpp mapping ;
442 :
443 28 : if (arg_cpp_stub != "")
444 : {
445 0 : CppInfo::SetStubPattern(arg_cpp_stub) ;
446 : }
447 :
448 28 : if (arg_cpp_skel != "")
449 : {
450 0 : CppInfo::SetSkelPattern(arg_cpp_skel) ;
451 : }
452 :
453 28 : if (arg_cpp_impl != "")
454 : {
455 0 : CppInfo::SetImplPattern(arg_cpp_impl) ;
456 : }
457 :
458 28 : if (arg_cpp_generate_module != "")
459 : {
460 27 : mapping.SetGenerateOption(arg_cpp_generate_module) ;
461 : }
462 :
463 28 : mapping.SetOutputFile(arg_output_file) ;
464 :
465 28 : mapping.SetOutputDir(arg_output_dir) ;
466 :
467 28 : mapping.GenerateCode(symTab) ;
468 : }
469 2 : else if (arg_language == "Java")
470 : {
471 2 : LangJava mapping ;
472 :
473 2 : if (arg_java_generate_module != "")
474 : {
475 2 : mapping.SetGenerateOption(arg_java_generate_module) ;
476 : }
477 :
478 2 : mapping.SetOutputDir(arg_output_dir) ;
479 :
480 2 : mapping.GenerateCode(symTab) ;
481 : }
482 : }
483 : else
484 : {
485 3 : errLog << "Code generation aborted due to errors." << std::endl ;
486 9 : errLog << nb_err << " errors, " << nb_warn << " warnings." << std::endl ;
487 : }
488 :
489 33 : delete symTab ;
490 :
491 : return 0 ;
492 33 : }
493 33 :
|