xref: /trunk/main/codemaker/source/cppumaker/cppuoptions.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_codemaker.hxx"
30 #include <stdio.h>
31 #include <string.h>
32 
33 #include "cppuoptions.hxx"
34 #include "osl/thread.h"
35 #include "osl/process.h"
36 
37 #ifdef SAL_UNX
38 #define SEPARATOR '/'
39 #else
40 #define SEPARATOR '\\'
41 #endif
42 
43 using namespace rtl;
44 
45 sal_Bool CppuOptions::initOptions(int ac, char* av[], sal_Bool bCmdFile)
46     throw( IllegalArgument )
47 {
48     sal_Bool    ret = sal_True;
49     sal_uInt16  i=0;
50 
51     if (!bCmdFile)
52     {
53         bCmdFile = sal_True;
54 
55         OString name(av[0]);
56         sal_Int32 index = name.lastIndexOf(SEPARATOR);
57         m_program = name.copy((index > 0 ? index+1 : 0));
58 
59         if (ac < 2)
60         {
61             fprintf(stderr, "%s", prepareHelp().getStr());
62             ret = sal_False;
63         }
64 
65         i = 1;
66     } else
67     {
68         i = 0;
69     }
70 
71     char    *s=NULL;
72     for( ; i < ac; i++)
73     {
74         if (av[i][0] == '-')
75         {
76             switch (av[i][1])
77             {
78                 case 'O':
79                     if (av[i][2] == '\0')
80                     {
81                         if (i < ac - 1 && av[i+1][0] != '-')
82                         {
83                             i++;
84                             s = av[i];
85                         } else
86                         {
87                             OString tmp("'-O', please check");
88                             if (i <= ac - 1)
89                             {
90                                 tmp += " your input '" + OString(av[i+1]) + "'";
91                             }
92 
93                             throw IllegalArgument(tmp);
94                         }
95                     } else
96                     {
97                         s = av[i] + 2;
98                     }
99 
100                     m_options["-O"] = OString(s);
101                     break;
102                 case 'B':
103                     if (av[i][2] == '\0')
104                     {
105                         if (i < ac - 1 && av[i+1][0] != '-')
106                         {
107                             i++;
108                             s = av[i];
109                         } else
110                         {
111                             OString tmp("'-B', please check");
112                             if (i <= ac - 1)
113                             {
114                                 tmp += " your input '" + OString(av[i+1]) + "'";
115                             }
116 
117                             throw IllegalArgument(tmp);
118                         }
119                     } else
120                     {
121                         s = av[i] + 2;
122                     }
123 
124                     m_options["-B"] = OString(s);
125                     break;
126                 case 'T':
127                     if (av[i][2] == '\0')
128                     {
129                         if (i < ac - 1 && av[i+1][0] != '-')
130                         {
131                             i++;
132                             s = av[i];
133                         } else
134                         {
135                             OString tmp("'-T', please check");
136                             if (i <= ac - 1)
137                             {
138                                 tmp += " your input '" + OString(av[i+1]) + "'";
139                             }
140 
141                             throw IllegalArgument(tmp);
142                         }
143                     } else
144                     {
145                         s = av[i] + 2;
146                     }
147 
148                     if (m_options.count("-T") > 0)
149                     {
150                         OString tmp(m_options["-T"]);
151                         tmp = tmp + ";" + s;
152                         m_options["-T"] = tmp;
153                     } else
154                     {
155                         m_options["-T"] = OString(s);
156                     }
157                     break;
158                 case 'L':
159                     if (av[i][2] != '\0')
160                     {
161                         OString tmp("'-L', please check");
162                         if (i <= ac - 1)
163                         {
164                             tmp += " your input '" + OString(av[i]) + "'";
165                         }
166 
167                         throw IllegalArgument(tmp);
168                     }
169 
170                     if (isValid("-C") || isValid("-CS"))
171                     {
172                         OString tmp("'-L' could not be combined with '-C' or '-CS' option");
173                         throw IllegalArgument(tmp);
174                     }
175                     m_options["-L"] = OString("");
176                     break;
177                 case 'C':
178                     if (av[i][2] == 'S')
179                     {
180                         if (av[i][3] != '\0')
181                         {
182                             OString tmp("'-CS', please check");
183                             if (i <= ac - 1)
184                             {
185                                 tmp += " your input '" + OString(av[i]) + "'";
186                             }
187 
188                             throw IllegalArgument(tmp);
189                         }
190 
191                         if (isValid("-L") || isValid("-C"))
192                         {
193                             OString tmp("'-CS' could not be combined with '-L' or '-C' option");
194                             throw IllegalArgument(tmp);
195                         }
196                         m_options["-CS"] = OString("");
197                         break;
198                     } else
199                     if (av[i][2] != '\0')
200                     {
201                         OString tmp("'-C', please check");
202                         if (i <= ac - 1)
203                         {
204                             tmp += " your input '" + OString(av[i]) + "'";
205                         }
206 
207                         throw IllegalArgument(tmp);
208                     }
209 
210                     if (isValid("-L") || isValid("-CS"))
211                     {
212                         OString tmp("'-C' could not be combined with '-L' or '-CS' option");
213                         throw IllegalArgument(tmp);
214                     }
215                     m_options["-C"] = OString("");
216                     break;
217                 case 'G':
218                     if (av[i][2] == 'c')
219                     {
220                         if (av[i][3] != '\0')
221                         {
222                             OString tmp("'-Gc', please check");
223                             if (i <= ac - 1)
224                             {
225                                 tmp += " your input '" + OString(av[i]) + "'";
226                             }
227 
228                             throw IllegalArgument(tmp);
229                         }
230 
231                         m_options["-Gc"] = OString("");
232                         break;
233                     } else
234                     if (av[i][2] != '\0')
235                     {
236                         OString tmp("'-G', please check");
237                         if (i <= ac - 1)
238                         {
239                             tmp += " your input '" + OString(av[i]) + "'";
240                         }
241 
242                         throw IllegalArgument(tmp);
243                     }
244 
245                     m_options["-G"] = OString("");
246                     break;
247                 case 'X': // support for eXtra type rdbs
248                 {
249                     if (av[i][2] == '\0')
250                     {
251                         if (i < ac - 1 && av[i+1][0] != '-')
252                         {
253                             i++;
254                             s = av[i];
255                         } else
256                         {
257                             OString tmp("'-X', please check");
258                             if (i <= ac - 1)
259                             {
260                                 tmp += " your input '" + OString(av[i+1]) + "'";
261                             }
262 
263                             throw IllegalArgument(tmp);
264                         }
265                     } else
266                     {
267                         s = av[i] + 2;
268                     }
269 
270                     m_extra_input_files.push_back( s );
271                     break;
272                 }
273 
274                 default:
275                     throw IllegalArgument("the option is unknown" + OString(av[i]));
276             }
277         } else
278         {
279             if (av[i][0] == '@')
280             {
281                 FILE* cmdFile = fopen(av[i]+1, "r");
282                 if( cmdFile == NULL )
283                 {
284                     fprintf(stderr, "%s", prepareHelp().getStr());
285                     ret = sal_False;
286                 } else
287                 {
288                     int rargc=0;
289                     char* rargv[512];
290                     char  buffer[512];
291 
292                     while ( fscanf(cmdFile, "%s", buffer) != EOF )
293                     {
294                         rargv[rargc]= strdup(buffer);
295                         rargc++;
296                     }
297                     fclose(cmdFile);
298 
299                     ret = initOptions(rargc, rargv, bCmdFile);
300 
301                     for (long j=0; j < rargc; j++)
302                     {
303                         free(rargv[j]);
304                     }
305                 }
306             } else
307             {
308                 if (bCmdFile)
309                 {
310                     m_inputFiles.push_back(av[i]);
311                 } else
312                 {
313                     OUString system_filepath;
314                     if (osl_getCommandArg( i-1, &system_filepath.pData )
315                         != osl_Process_E_None)
316                     {
317                         OSL_ASSERT(false);
318                     }
319                     m_inputFiles.push_back(OUStringToOString(system_filepath, osl_getThreadTextEncoding()));
320                 }
321             }
322         }
323     }
324 
325     return ret;
326 }
327 
328 OString CppuOptions::prepareHelp()
329 {
330     OString help("\nusing: ");
331     help += m_program + " [-options] file_1 ... file_n\nOptions:\n";
332     help += "    -O<path>   = path describes the root directory for the generated output.\n";
333     help += "                 The output directory tree is generated under this directory.\n";
334     help += "    -T<name>   = name specifies a type or a list of types. The output for this\n";
335     help += "      [t1;...]   type is generated. If no '-T' option is specified,\n";
336     help += "                 then output for all types is generated.\n";
337     help += "                 Example: 'com.sun.star.uno.XInterface' is a valid type.\n";
338     help += "    -B<name>   = name specifies the base node. All types are searched under this\n";
339     help += "                 node. Default is the root '/' of the registry files.\n";
340     help += "    -L         = UNO type functions are generated lightweight, that means only\n";
341     help += "                 the name and typeclass are given and everything else is retrieved\n";
342     help += "                 from the type library dynamically. The default is that UNO type\n";
343     help += "                 functions provides enough type information for boostrapping C++.\n";
344     help += "                 '-L' should be the default for external components.\n";
345     help += "    -C         = UNO type functions are generated comprehensive that means all\n";
346     help += "                 necessary information is available for bridging the type in UNO.\n";
347     help += "    -G         = generate only target files which does not exists.\n";
348     help += "    -Gc        = generate only target files which content will be changed.\n";
349     help += "    -X<file>   = extra types which will not be taken into account for generation.\n\n";
350     help += prepareVersion();
351 
352     return help;
353 }
354 
355 OString CppuOptions::prepareVersion()
356 {
357     OString version(m_program);
358     version += " Version 2.0\n\n";
359     return version;
360 }
361 
362 
363