getopt.cpp revision 4d6dcfe00aab559241d9ed05b89f803ab5ddf611
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync/** @file
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * innotek Portable Runtime - Command Line Parsing
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync */
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync/*
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * Copyright (C) 2007 innotek GmbH
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync *
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * available from http://www.virtualbox.org. This file is free software;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * you can redistribute it and/or modify it under the terms of the GNU
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * General Public License as published by the Free Software Foundation,
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync */
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync/*******************************************************************************
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync* Header Files *
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync*******************************************************************************/
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync#include <iprt/getopt.h>
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync#include <iprt/err.h>
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync#include <iprt/string.h>
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync#include <string.h>
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync/*******************************************************************************
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync* Code *
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync*******************************************************************************/
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsyncint RTGetOpt(int argc,
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync char *argv[],
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync const RTOPTIONDEF *paOptions,
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int cOptions,
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int *piThis,
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync RTOPTIONUNION *pValueUnion)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync{
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if ( (!piThis)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync || (*piThis >= argc)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync )
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return 0;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int iThis = (*piThis)++;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync const char *pcszArgThis = argv[iThis];
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (*pcszArgThis == '-')
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int i;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync for (i = 0;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync i < cOptions;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync ++i)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync bool fShort = false;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if ( (!strcmp(pcszArgThis, paOptions[i].pcszLong))
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync || ( ((fShort = (pcszArgThis[1] == paOptions[i].cShort)))
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync && (pcszArgThis[2] == '\0')
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync )
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync )
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (paOptions[i].fl & RTGETOPT_REQUIRES_ARGUMENT)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (iThis >= argc - 1)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->pcsz = paOptions[i].pcszLong;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return VERR_GETOPT_REQUIRED_ARGUMENT_MISSING;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync else
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int iNext = (*piThis)++;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (paOptions[i].fl & RTGETOPT_ARG_FORMAT_INT32)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync int32_t i;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (RTStrToInt32Full(argv[iNext], 10, &i))
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->pcsz = paOptions[i].pcszLong;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return VERR_GETOPT_INVALID_ARGUMENT_FORMAT;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->i = i;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync else if (paOptions[i].fl & RTGETOPT_ARG_FORMAT_UINT32)
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync uint32_t u;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync if (RTStrToUInt32Full(argv[iNext], 10, &u))
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync {
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->pcsz = paOptions[i].pcszLong;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return VERR_GETOPT_INVALID_ARGUMENT_FORMAT;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->u = u;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync else
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync pValueUnion->pcsz = argv[iNext];
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return paOptions[i].cShort;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync }
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync return VERR_GETOPT_UNKNOWN_OPTION;
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync}
4d6dcfe00aab559241d9ed05b89f803ab5ddf611vboxsync