~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/tools/tCommandLine.cpp

  • Committer: luke-jr
  • Date: 2006-05-29 01:55:42 UTC
  • Revision ID: svn-v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs:7d95bf1e-0414-0410-9756-b78462a59f44:armagetronad%2Fbranches%2F0.2.8%2Farmagetronad:4612
Unify tags/branches of modules released together

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
 
7
Copyright (C) 2004  Armagetron Advanced Team (http://sourceforge.net/projects/armagetronad/) 
 
8
 
 
9
**************************************************************************
 
10
 
 
11
This program is free software; you can redistribute it and/or
 
12
modify it under the terms of the GNU General Public License
 
13
as published by the Free Software Foundation; either version 2
 
14
of the License, or (at your option) any later version.
 
15
 
 
16
This program is distributed in the hope that it will be useful,
 
17
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
19
GNU General Public License for more details.
 
20
 
 
21
You should have received a copy of the GNU General Public License
 
22
along with this program; if not, write to the Free Software
 
23
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
24
  
 
25
***************************************************************************
 
26
 
 
27
*/
 
28
 
 
29
// declaration
 
30
#ifndef         TCOMMANDLINE_H_INCLUDED
 
31
#include        "tCommandLine.h"
 
32
#endif
 
33
 
 
34
#include    "tLocale.h"
 
35
#include    "tConfiguration.h"
 
36
#include    "tException.h"
 
37
 
 
38
#ifdef WIN32
 
39
#include    <windows.h>
 
40
#include    <direct.h>
 
41
#endif
 
42
 
 
43
#undef  INLINE_DEF
 
44
#define INLINE_DEF
 
45
 
 
46
static tCommandLineAnalyzer * s_commandLineAnalyzerAnchor;
 
47
 
 
48
static void quitWithMessagePrepare( const char* message )
 
49
{
 
50
#ifdef WIN32
 
51
#ifndef DEDICATED
 
52
#define USEBOX
 
53
#endif
 
54
#endif
 
55
 
 
56
#ifdef USEBOX
 
57
    int result = MessageBox (NULL, message , "Message", MB_OK);
 
58
#else
 
59
    std::cout << message;
 
60
#endif
 
61
 
 
62
    tLocale::Clear();
 
63
}
 
64
 
 
65
static void quitWithMessage( const char* message )
 
66
{
 
67
    tLocale::Clear();
 
68
    quitWithMessagePrepare( message );
 
69
    throw 1;
 
70
 
 
71
    // tGenericException( message, "Command Line Parsing Error" );
 
72
    // exit(1);
 
73
}
 
74
 
 
75
//#define QUIT(x) { std::ostringstream s; s << x; quitWithMessage(s.str().c_str()); name_.Clear(); } exit(0)
 
76
//#define QUIT(x) { std::ostringstream s; s << x; quitWithMessage(s.str().c_str()); name_.Clear(); } return false
 
77
#define QUIT(x) { std::ostringstream s; s << x; quitWithMessage(s.str().c_str()); name_.Clear();}
 
78
 
 
79
bool tCommandLineData::Analyse(int argc,char **argv)
 
80
{
 
81
#ifdef DEBUG_X
 
82
#ifdef WIN32
 
83
#define getcwd _getcwd
 
84
#endif
 
85
 
 
86
    char * cwd = getcwd(0,0);
 
87
    tERR_MESSAGE( "Executable: " << argv[0] << ", CWD: " << cwd );
 
88
    free( cwd );
 
89
#endif
 
90
 
 
91
    tCommandLineParser parser( argc, argv );
 
92
    {
 
93
        tASSERT( programVersion_ );
 
94
 
 
95
        char const * run = parser.Current();
 
96
        while (*run)
 
97
        {
 
98
            if (*run == '\\' || *run == '/')
 
99
                name_ = run+1;
 
100
            run++;
 
101
        }
 
102
 
 
103
        if ( name_.Len() <= 3 )
 
104
        {
 
105
            name_ = "Armagetron";
 
106
        }
 
107
    }
 
108
 
 
109
 
 
110
    // initialize third party analyzers
 
111
    {
 
112
        tCommandLineAnalyzer * commandLineAnalyzer = s_commandLineAnalyzerAnchor;
 
113
        while ( commandLineAnalyzer )
 
114
        {
 
115
            commandLineAnalyzer->Initialize( parser );
 
116
            commandLineAnalyzer = commandLineAnalyzer->Next();
 
117
        }
 
118
    }
 
119
 
 
120
    parser.Advance();
 
121
 
 
122
    //std::cout << "config loaded\n";
 
123
 
 
124
#ifndef WIN32   
 
125
#define HELPAVAIL
 
126
#endif
 
127
#ifdef DEDICATED  
 
128
#define HELPAVAIL
 
129
#endif
 
130
 
 
131
    while ( !parser.End() )
 
132
    {
 
133
        if ( parser.GetSwitch( "--help", "-h" ) )
 
134
        {
 
135
            {
 
136
                std::ostringstream s;
 
137
                s << "\n\nUsage: " << name_ << " [Arguments]\n\n"
 
138
                << "Possible arguments:\n\n";
 
139
                s << "-h, --help                   : print this message\n";
 
140
#ifdef HELPAVAIL
 
141
                s << "--doc                        : print documentation for all console commands\n";
 
142
#endif
 
143
                s << "-v, --version                : print version number\n\n";
 
144
 
 
145
                // ask third party analyzers
 
146
                tCommandLineAnalyzer * commandLineAnalyzer = s_commandLineAnalyzerAnchor;
 
147
                while ( commandLineAnalyzer )
 
148
                {
 
149
                    commandLineAnalyzer->Help( s );
 
150
                    commandLineAnalyzer = commandLineAnalyzer->Next();
 
151
                    s << "\n";
 
152
                }
 
153
 
 
154
                s << "\n";
 
155
 
 
156
                name_.Clear();
 
157
                quitWithMessagePrepare( s.str().c_str() );
 
158
            }
 
159
 
 
160
            return false;
 
161
            // exit(0);
 
162
        }
 
163
#ifdef HELPAVAIL
 
164
        else if ( parser.GetSwitch( "--doc") )
 
165
        {
 
166
            doc_ = true;
 
167
        }
 
168
#endif
 
169
        else if ( parser.GetSwitch( "--version", "-v") )
 
170
        {
 
171
            QUIT( "This is " << name_ << " version " << *programVersion_ << ".\n" );
 
172
        }
 
173
        else
 
174
        {
 
175
            // let the registered command line anelyzers have a go
 
176
            tCommandLineAnalyzer * commandLineAnalyzer = s_commandLineAnalyzerAnchor;
 
177
            bool success = false;
 
178
            while ( commandLineAnalyzer )
 
179
            {
 
180
                if ( success = commandLineAnalyzer->Analyze( parser ) )
 
181
                    break;
 
182
                commandLineAnalyzer = commandLineAnalyzer->Next();
 
183
            }
 
184
            if ( success )
 
185
                continue;
 
186
 
 
187
            QUIT( "\n\nUnknown command line option " << parser.Current() << ". Type " << name_ << " -h to get a list of possible options.\n\n" );
 
188
        }
 
189
    }
 
190
 
 
191
    return true;
 
192
}
 
193
 
 
194
bool tCommandLineData::Execute()
 
195
{
 
196
    tString name;
 
197
 
 
198
    if ( doc_ )
 
199
    {
 
200
        std::cout << "Available console commands/config file settings:\n\n";
 
201
        tConfItemBase::DocAll( std::cout );
 
202
 
 
203
        return false;
 
204
        // QUIT("\n");
 
205
    }
 
206
 
 
207
    return true;
 
208
}
 
209
 
 
210
// *******************************************************************************************
 
211
// *
 
212
// *   GetSwitch
 
213
// *
 
214
// *******************************************************************************************
 
215
//!
 
216
//!        @param  option            long version of the switch
 
217
//!        @param  option_short      short version of the switch
 
218
//!       @return                   true if the switch was detected
 
219
//!
 
220
// *******************************************************************************************
 
221
 
 
222
bool tCommandLineParser::GetSwitch( char const * option, char * option_short )
 
223
{
 
224
    if ( End() )
 
225
        return false;
 
226
 
 
227
    char * argument = argv[index];
 
228
    tASSERT( argument );
 
229
    if ( !strcmp(argument,option) || ( option_short && !strcmp(argument,option_short ) ) )
 
230
    {
 
231
        index++;
 
232
        return true;
 
233
    }
 
234
 
 
235
    return false;
 
236
}
 
237
 
 
238
// *******************************************************************************************
 
239
// *
 
240
// *   GetOption
 
241
// *
 
242
// *******************************************************************************************
 
243
//!
 
244
//!        @param  target            string to store option to
 
245
//!     @param  option            long version of the option
 
246
//!     @param  option_short      short version of the option
 
247
//!     @return                   true if the option was detected
 
248
//!
 
249
// *******************************************************************************************
 
250
 
 
251
bool tCommandLineParser::GetOption( tString & target, char const * option, char * option_short )
 
252
{
 
253
    if ( End() )
 
254
        return false;
 
255
 
 
256
    char * argument = argv[index];
 
257
    tASSERT( argument );
 
258
    if ( GetSwitch( option, option_short ) )
 
259
    {
 
260
        if ( !End() )
 
261
        {
 
262
            target = argv[index];
 
263
            index++;
 
264
            return true;
 
265
        }
 
266
        else
 
267
        {
 
268
            index--;
 
269
            tString name_;
 
270
            QUIT( "  " << argument << " needs another argument.\n" );
 
271
        }
 
272
    }
 
273
 
 
274
    return false;
 
275
}
 
276
 
 
277
// *******************************************************************************************
 
278
// *
 
279
// *   End
 
280
// *
 
281
// *******************************************************************************************
 
282
//!
 
283
//!        @return     true if the options have been parsed to the end
 
284
//!
 
285
// *******************************************************************************************
 
286
 
 
287
bool tCommandLineParser::End( void ) const
 
288
{
 
289
    return ( index >= argc );
 
290
}
 
291
 
 
292
// *******************************************************************************************
 
293
// *
 
294
// *   tCommandLineParser
 
295
// *
 
296
// *******************************************************************************************
 
297
//!
 
298
//!        @param  a_argc  number of arguments
 
299
//!     @param  a_argv  arguments
 
300
//!
 
301
// *******************************************************************************************
 
302
 
 
303
tCommandLineParser::tCommandLineParser( int a_argc, char * * a_argv )
 
304
        : argc( a_argc ), argv( a_argv ), index( 0 )
 
305
{
 
306
}
 
307
 
 
308
// *******************************************************************************************
 
309
// *
 
310
// *   tCommandLineParser
 
311
// *
 
312
// *******************************************************************************************
 
313
//!
 
314
//!
 
315
// *******************************************************************************************
 
316
 
 
317
/*
 
318
tCommandLineParser::tCommandLineParser( void )
 
319
{
 
320
}
 
321
*/
 
322
 
 
323
// *******************************************************************************************
 
324
// *
 
325
// *   Executable
 
326
// *
 
327
// *******************************************************************************************
 
328
//!
 
329
//!        @return     the full path of the executable
 
330
//!
 
331
// *******************************************************************************************
 
332
 
 
333
const char * tCommandLineParser::Executable( void ) const
 
334
{
 
335
    return argv[ 0 ];
 
336
}
 
337
 
 
338
// *******************************************************************************************
 
339
// *
 
340
// *   Current
 
341
// *
 
342
// *******************************************************************************************
 
343
//!
 
344
//!        @return     the current command line option
 
345
//!
 
346
// *******************************************************************************************
 
347
 
 
348
const char * tCommandLineParser::Current( void ) const
 
349
{
 
350
    return argv[ index ];
 
351
}
 
352
 
 
353
// *******************************************************************************************
 
354
// *
 
355
// *   Advance
 
356
// *
 
357
// *******************************************************************************************
 
358
//!
 
359
//!
 
360
// *******************************************************************************************
 
361
 
 
362
void tCommandLineParser::Advance( void )
 
363
{
 
364
    tASSERT( !End() );
 
365
    index ++;
 
366
}
 
367
 
 
368
 
 
369
// *******************************************************************************************
 
370
// *
 
371
// *   tCommandLineAnalyzer
 
372
// *
 
373
// *******************************************************************************************
 
374
//!
 
375
//!
 
376
// *******************************************************************************************
 
377
 
 
378
tCommandLineAnalyzer::tCommandLineAnalyzer( void )
 
379
        : tListItem< tCommandLineAnalyzer >( s_commandLineAnalyzerAnchor )
 
380
{
 
381
}
 
382
 
 
383
// *******************************************************************************************
 
384
// *
 
385
// *   ~tCommandLineAnalyzer
 
386
// *
 
387
// *******************************************************************************************
 
388
//!
 
389
//!
 
390
// *******************************************************************************************
 
391
 
 
392
tCommandLineAnalyzer::~tCommandLineAnalyzer( void )
 
393
{
 
394
}
 
395
 
 
396
// *******************************************************************************************
 
397
// *
 
398
// *   DoAnalyze
 
399
// *
 
400
// *******************************************************************************************
 
401
//!
 
402
//!        @param  parser  parser to analyze
 
403
//!
 
404
// *******************************************************************************************
 
405
 
 
406
void tCommandLineAnalyzer::DoInitialize( tCommandLineParser & parser )
 
407
{
 
408
}
 
409
 
 
410
// *******************************************************************************************
 
411
// *
 
412
// *   DoAnalyze
 
413
// *
 
414
// *******************************************************************************************
 
415
//!
 
416
//!        @param  parser  parser to analyze
 
417
//!       @return         true if anaysis was succesful
 
418
//!
 
419
// *******************************************************************************************
 
420
 
 
421
bool tCommandLineAnalyzer::DoAnalyze( tCommandLineParser & parser )
 
422
{
 
423
    return false;
 
424
}
 
425
 
 
426
// *******************************************************************************************
 
427
// *
 
428
// *   DoHelp
 
429
// *
 
430
// *******************************************************************************************
 
431
//!
 
432
//!        @param  s   string to write help to
 
433
//!
 
434
// *******************************************************************************************
 
435
 
 
436
void tCommandLineAnalyzer::DoHelp( std::ostream & s )
 
437
{
 
438
}
 
439