-
Notifications
You must be signed in to change notification settings - Fork 1
/
ArgumentList.cpp
91 lines (70 loc) · 2.03 KB
/
ArgumentList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* $Header: /Book/ArgumentList.cpp 9 20.08.99 16:33 Oslph312 $
*
* Implements command line handling.
*/
#include "precomp.h"
#include "ArgumentList.h"
ArgumentList::ArgumentList( LPCTSTR /* pszCmdLine */ ) {
assert( isGoodPtr( this ) );
assert( isGoodReadPtr( &__argc, sizeof __argc ) );
assert( isGoodReadPtr( &__targv, sizeof __targv ) );
assert(
isGoodReadPtr( __targv, __argc * sizeof( __targv[ 0 ] ) ) );
m_argc = __argc;
// Using the system-supplied array appears to work OK,
// but I am wary of messing with parameters that really
// should have been const in the first place.
// Hence the semi-deep copy. Since the strings themselves are
// const, a deep copy is not necessary.
#if 0
m_argv = __targv;
assert( 0 == m_argv[ m_argc ] );
#else
m_argv.alloc( m_argc + 1 );
for ( int iArg = 0; iArg < m_argc; ++iArg ) {
m_argv[ iArg ] = __targv[ iArg ];
}
assert( 0 == __targv[ m_argc ] );
m_argv[ m_argc ] = 0;
#endif
}
bool ArgumentList::hasOption( LPCTSTR pszOption ) {
assert( isValid() );
bool bOption = false;
for ( int iArg = 1; iArg < m_argc; ++iArg ) {
if ( isOption( iArg ) &&
0 == _tcsicmp( pszOption, getArg( iArg ) + 1 ) )
{
bOption = true;
consume( iArg-- );
}
}
return bOption;
}
void ArgumentList::consume( int nArg ) {
assert( isValid() );
assert( 0 <= nArg && nArg < m_argc );
for ( int iArg = nArg; iArg < m_argc; ++iArg ) {
m_argv[ iArg ] = m_argv[ iArg + 1 ];
}
--m_argc;
assert( 0 == m_argv[ m_argc ] );
}
#ifdef _DEBUG
bool ArgumentList::isValid( void ) const {
bool bValid = isGoodConstPtr( this ) && 0 < m_argc &&
isGoodReadPtr( m_argv, (m_argc + 1) * sizeof( *m_argv ) );
if ( bValid ) {
for ( int iArg = 0; iArg < m_argc; ++iArg ) {
if ( !isGoodStringPtr( m_argv[ iArg ] ) ) {
bValid = false;
break;
}
}
assert( 0 == m_argv[ m_argc ] );
}
return bValid;
}
#endif // _DEBUG
// end of file