]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * Copyright 1993, 1995 Christopher Seiwald. | |
3 | * | |
4 | * This file is part of Jam - see jam.c for Copyright information. | |
5 | */ | |
6 | ||
7 | # include "jam.h" | |
8 | # include "option.h" | |
9 | ||
10 | /* | |
11 | * option.c - command line option processing | |
12 | * | |
13 | * {o >o | |
14 | * \<>) "Process command line options as defined in <option.h>. | |
15 | * Return the number of argv[] elements used up by options, | |
16 | * or -1 if an invalid option flag was given or an argument | |
17 | * was supplied for an option that does not require one." | |
18 | */ | |
19 | ||
20 | int getoptions( int argc, char * * argv, char * opts, bjam_option * optv ) | |
21 | { | |
22 | int i; | |
23 | int optc = N_OPTS; | |
24 | ||
25 | memset( (char *)optv, '\0', sizeof( *optv ) * N_OPTS ); | |
26 | ||
27 | for ( i = 0; i < argc; ++i ) | |
28 | { | |
29 | char *arg; | |
30 | ||
31 | if ( ( argv[ i ][ 0 ] != '-' ) || | |
32 | ( ( argv[ i ][ 1 ] != '-' ) && !isalpha( argv[ i ][ 1 ] ) ) ) | |
33 | continue; | |
34 | ||
35 | if ( !optc-- ) | |
36 | { | |
37 | printf( "too many options (%d max)\n", N_OPTS ); | |
38 | return -1; | |
39 | } | |
40 | ||
41 | for ( arg = &argv[ i ][ 1 ]; *arg; ++arg ) | |
42 | { | |
43 | char * f; | |
44 | ||
45 | for ( f = opts; *f; ++f ) | |
46 | if ( *f == *arg ) | |
47 | break; | |
48 | ||
49 | if ( !*f ) | |
50 | { | |
51 | printf( "Invalid option: -%c\n", *arg ); | |
52 | return -1; | |
53 | } | |
54 | ||
55 | optv->flag = *f; | |
56 | ||
57 | if ( f[ 1 ] != ':' ) | |
58 | { | |
59 | optv++->val = "true"; | |
60 | } | |
61 | else if ( arg[ 1 ] ) | |
62 | { | |
63 | optv++->val = &arg[1]; | |
64 | break; | |
65 | } | |
66 | else if ( ++i < argc ) | |
67 | { | |
68 | optv++->val = argv[ i ]; | |
69 | break; | |
70 | } | |
71 | else | |
72 | { | |
73 | printf( "option: -%c needs argument\n", *f ); | |
74 | return -1; | |
75 | } | |
76 | } | |
77 | } | |
78 | ||
79 | return i; | |
80 | } | |
81 | ||
82 | ||
83 | /* | |
84 | * Name: getoptval() - find an option given its character. | |
85 | */ | |
86 | ||
87 | char * getoptval( bjam_option * optv, char opt, int subopt ) | |
88 | { | |
89 | int i; | |
90 | for ( i = 0; i < N_OPTS; ++i, ++optv ) | |
91 | if ( ( optv->flag == opt ) && !subopt-- ) | |
92 | return optv->val; | |
93 | return 0; | |
94 | } |