Back to index

lightning-sunbird  0.9+nobinonly
Classes | Functions | Variables
plgetopt.c File Reference
#include "prmem.h"
#include "prlog.h"
#include "prerror.h"
#include "plstr.h"
#include "plgetopt.h"
#include <string.h>

Go to the source code of this file.

Classes

struct  PLOptionInternal

Functions

 PR_IMPLEMENT (PLOptState *)
 PR_IMPLEMENT (void)
 PR_IMPLEMENT (PLOptStatus)

Variables

static char static_Nul = 0

Class Documentation

struct PLOptionInternal

Definition at line 53 of file plgetopt.c.

Class Members
PRIntn argc
char ** argv
PRBool minus
const char * options
PRIntn xargc
const char * xargv

Function Documentation

Definition at line 70 of file plgetopt.c.

{
    PLOptState *opt = NULL;
    if (NULL == options)
        PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
    else
    {
        opt = PR_NEWZAP(PLOptState);
        if (NULL == opt)
            PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
        else
        {
            PLOptionInternal *internal = PR_NEW(PLOptionInternal);
            if (NULL == internal)
            {
                PR_DELETE(opt);
                PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0);
            }
            else
            {
                            opt->option = 0;
                            opt->value = NULL;
                            opt->internal = internal;

                internal->argc = argc;
                internal->argv = argv;
                internal->xargc = 0;
                internal->xargv = &static_Nul;
                internal->minus = PR_FALSE;
                internal->options = options;
            }
        }
    }
    return opt;
}  /* PL_CreateOptState */

Definition at line 110 of file plgetopt.c.

{
    PR_DELETE(opt->internal);
    PR_DELETE(opt);
}  /* PL_DestroyOptState */

Definition at line 116 of file plgetopt.c.

{
    PLOptionInternal *internal = opt->internal;
    PRIntn cop, eoo = PL_strlen(internal->options);

    /*
    ** If the current xarg points to nul, advance to the next
    ** element of the argv vector. If the vector index is equal
    ** to argc, we're out of arguments, so return an EOL.
       ** Note whether the first character of the new argument is
       ** a '-' and skip by it if it is.
    */
    while (0 == *internal->xargv)
    {
        internal->xargc += 1;
        if (internal->xargc >= internal->argc)
              {
                     opt->option = 0;
                     opt->value = NULL;
                     return PL_OPT_EOL;
              }
        internal->xargv = internal->argv[internal->xargc];
              internal->minus = ('-' == *internal->xargv ? PR_TRUE : PR_FALSE);  /* not it */
              if (internal->minus) internal->xargv += 1;  /* and consume */
    }

    /*
    ** If we already have a '-' in hand, xargv points to the next
    ** option. See if we can find a match in the list of possible
    ** options supplied.
    */

    if (internal->minus)
    {
        for (cop = 0; cop < eoo; ++cop)
        {
            if (internal->options[cop] == *internal->xargv)
            {
                opt->option = *internal->xargv;
                internal->xargv += 1;
                /*
                ** if options indicates that there's an associated
                            ** value, this argv is finished and the next is the
                            ** option's value.
                */
                if (':' == internal->options[cop + 1])
                {
                    if (0 != *internal->xargv) return PL_OPT_BAD;
                    opt->value = internal->argv[++(internal->xargc)];
                    internal->xargv = &static_Nul;
                    internal->minus = PR_FALSE;
                }
                            else opt->value = NULL;
                return PL_OPT_OK;
            }
        }
        internal->xargv += 1;  /* consume that option */
        return PL_OPT_BAD;
    }
    /*
    ** No '-', so it must be a standalone value. The option is nul.
    */
    opt->value = internal->argv[internal->xargc];
    internal->xargv = &static_Nul;
    opt->option = 0;
    return PL_OPT_OK;
}  /* PL_GetNextOpt */

Variable Documentation

char static_Nul = 0 [static]

Definition at line 51 of file plgetopt.c.