/*
 * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include "../testutil.h"
#include "internal/nelem.h"
#include "tu_local.h"
#include "output.h"


static int used[100] = { 0 };


size_t test_get_argument_count(void)
{
    return opt_num_rest();
}

char *test_get_argument(size_t n)
{
    char **argv = opt_rest();

    OPENSSL_assert(n < sizeof(used));
    if ((int)n >= opt_num_rest() || argv == NULL)
        return NULL;
    used[n] = 1;
    return argv[n];
}

void opt_check_usage(void)
{
    int i;
    char **argv = opt_rest();
    int n, arg_count = opt_num_rest();

    if (arg_count > (int)OSSL_NELEM(used))
        n = (int)OSSL_NELEM(used);
    else
        n = arg_count;
    for (i = 0; i < n; i++) {
        if (used[i] == 0)
            test_printf_stderr("Warning ignored command-line argument %d: %s\n",
                               i, argv[i]);
    }
    if (i < arg_count)
        test_printf_stderr("Warning arguments %d and later unchecked\n", i);
}

int opt_printf_stderr(const char *fmt, ...)
{
    va_list ap;
    int ret;

    va_start(ap, fmt);
    ret = test_vprintf_stderr(fmt, ap);
    va_end(ap);
    return ret;
}

