VirtualBox

Changeset 17087 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Feb 24, 2009 6:28:29 PM (16 years ago)
Author:
vboxsync
Message:

RTGetOpt: cleanup, restored @todo and returning 0 on first non-option.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/getopt.cpp

    r17083 r17087  
    3737#include <iprt/assert.h>
    3838#include <iprt/ctype.h>
     39#include <limits.h>
    3940
    4041
     
    5657    {
    5758        Assert(!(paOptions[i].fFlags & ~RTGETOPT_VALID_MASK));
    58 
    59         bool fShort = (    *pszArgThis == '-'
    60                         && (uint32_t)pszArgThis[1] == paOptions[i].uShort
    61                       );
     59        Assert(paOptions[i].uShort > 0 && paOptions[i].uShort <= (unsigned)INT_MAX);
     60
     61        bool fShort = *pszArgThis == '-'
     62                    && (uint32_t)pszArgThis[1] == paOptions[i].uShort
     63                    && paOptions[i].uShort;
    6264
    6365        if ((paOptions[i].fFlags & RTGETOPT_REQ_MASK) != RTGETOPT_REQ_NOTHING)
    6466        {
    6567            /*
    66                 * A value is required with the argument. We're trying to very
    67                 * understanding here and will permit any of the following:
    68                 *      -svalue, -s:value, -s=value,
    69                 *      -s value, -s: value, -s= value
    70                 * (Ditto for long options.)
    71                 */
     68             * A value is required with the argument. We're trying to be very
     69             * understanding here and will permit any of the following:
     70             *      -svalue, -s:value, -s=value,
     71             *      -s value, -s: value, -s= value
     72             * (Ditto for long options.)
     73             */
    7274            size_t cchLong = 2;
    73             if (    (    paOptions[i].pszLong
    74                         && !strncmp(pszArgThis, paOptions[i].pszLong, (cchLong = strlen(paOptions[i].pszLong)))
    75                         && (   pszArgThis[cchLong] == '\0'
    76                             || pszArgThis[cchLong] == ':'
    77                             || pszArgThis[cchLong] == '=')
     75            if (    (   paOptions[i].pszLong
     76                     && !strncmp(pszArgThis, paOptions[i].pszLong, (cchLong = strlen(paOptions[i].pszLong)))
     77                     && (   pszArgThis[cchLong] == '\0'
     78                         || pszArgThis[cchLong] == ':'
     79                         || pszArgThis[cchLong] == '=')
    7880                    )
    79                  || fShort
     81                || fShort
    8082                )
    8183            {
     
    8385
    8486                /*
    85                     * Find the argument value
    86                     */
     87                 * Find the argument value
     88                 */
    8789                const char *pszValue;
    8890                if (    fShort
    89                      ?     pszArgThis[2] == '\0'
    90                         || ((pszArgThis[2] == ':' || pszArgThis[2] == '=') && pszArgThis[3] == '\0')
    91                      :  pszArgThis[cchLong] == '\0' || pszArgThis[cchLong + 1] == '\0')
     91                         pszArgThis[2] == '\0'
     92                        ||  ((pszArgThis[2] == ':' || pszArgThis[2] == '=') && pszArgThis[3] == '\0')
     93                    :   pszArgThis[cchLong] == '\0' || pszArgThis[cchLong + 1] == '\0')
    9294                {
    9395                    if (iThis + 1 >= argc)
     
    98100                else /* same argument. */
    99101                    pszValue = fShort
    100                                 ? &pszArgThis[2  + (pszArgThis[2] == ':' || pszArgThis[2] == '=')]
    101                                 : &pszArgThis[cchLong + 1];
     102                             ? &pszArgThis[2  + (pszArgThis[2] == ':' || pszArgThis[2] == '=')]
     103                             : &pszArgThis[cchLong + 1];
    102104
    103105                /*
    104                     * Transform into a option value as requested.
    105                     * If decimal conversion fails, we'll check for "0x<xdigit>" and
    106                     * try a 16 based conversion. We will not interpret any of the
    107                     * generic ints as octals.
    108                     */
     106                 * Transform into a option value as requested.
     107                 * If decimal conversion fails, we'll check for "0x<xdigit>" and
     108                 * try a 16 based conversion. We will not interpret any of the
     109                 * generic ints as octals.
     110                 */
    109111                switch (paOptions[i].fFlags & (RTGETOPT_REQ_MASK | RTGETOPT_FLAG_HEX | RTGETOPT_FLAG_OCT | RTGETOPT_FLAG_DEC))
    110112                {
     
    182184        }
    183185        else if (   (   paOptions[i].pszLong
    184                         && !strcmp(pszArgThis, paOptions[i].pszLong))
    185                     || (   fShort
    186                         && pszArgThis[2] == '\0') /** @todo implement support for ls -lsR like stuff?  */
     186                     && !strcmp(pszArgThis, paOptions[i].pszLong))
     187                 || (   fShort
     188                     && pszArgThis[2] == '\0') /** @todo implement support for ls -lsR like stuff?  */
    187189                )
    188190        {
     
    192194    }
    193195
    194     return VERR_GETOPT_UNKNOWN_OPTION;
     196    /* Option or not? */
     197    if (*pszArgThis == '-')
     198        return VERR_GETOPT_UNKNOWN_OPTION;
     199
     200    /*
     201     * Not an option.
     202     */
     203    (*piThis)--;
     204    /** @todo Sort options and arguments (i.e. stuff that doesn't start with '-'), stop when
     205     * encountering the first argument. */
     206
     207    return 0;
    195208}
    196209
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette