/*
 * 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, 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( 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;
}
