summaryrefslogtreecommitdiff
path: root/jam-files/engine/option.c
blob: d25e5e8ad1f6101a3495916cbf5ddbafccfefed8 (plain)
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
92
93
94
/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

# include "jam.h"
# include "option.h"

/*
 * option.c - command line option processing
 *
 * {o >o
 *  \<>) "Process command line options as defined in <option.h>.
 *        Return the number of argv[] elements used up by options,
 *        or -1 if an invalid option flag was given or an argument
 *        was supplied for an option that does not require one."
 */

int getoptions( int argc, char * * argv, char * opts, bjam_option * optv )
{
    int i;
    int optc = N_OPTS;

    memset( (char *)optv, '\0', sizeof( *optv ) * N_OPTS );

    for ( i = 0; i < argc; ++i )
    {
        char *arg;

        if ( ( argv[ i ][ 0 ] != '-' ) ||
            ( ( argv[ i ][ 1 ] != '-' ) && !isalpha( argv[ i ][ 1 ] ) ) )
            continue;

        if ( !optc-- )
        {
            printf( "too many options (%d max)\n", N_OPTS );
            return -1;
        }

        for ( arg = &argv[ i ][ 1 ]; *arg; ++arg )
        {
            char * f;

            for ( f = opts; *f; ++f )
                if ( *f == *arg )
                    break;

            if ( !*f )
            {
                printf( "Invalid option: -%c\n", *arg );
                return -1;
            }

            optv->flag = *f;

            if ( f[ 1 ] != ':' )
            {
                optv++->val = "true";
            }
            else if ( arg[ 1 ] )
            {
                optv++->val = &arg[1];
                break;
            }
            else if ( ++i < argc )
            {
                optv++->val = argv[ i ];
                break;
            }
            else
            {
                printf( "option: -%c needs argument\n", *f );
                return -1;
            }
        }
    }

    return i;
}


/*
 * Name: getoptval() - find an option given its character.
 */

char * getoptval( bjam_option * optv, char opt, int subopt )
{
    int i;
    for ( i = 0; i < N_OPTS; ++i, ++optv )
        if ( ( optv->flag == opt ) && !subopt-- )
            return optv->val;
    return 0;
}