Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : /*
7 : ** File: plgetopt.h
8 : ** Description: utilities to parse argc/argv
9 : */
10 :
11 : #if defined(PLGETOPT_H_)
12 : #else
13 : #define PLGETOPT_H_
14 :
15 : #include "prtypes.h"
16 :
17 : PR_BEGIN_EXTERN_C
18 :
19 : typedef struct PLOptionInternal PLOptionInternal;
20 :
21 : typedef enum
22 : {
23 : PL_OPT_OK, /* all's well with the option */
24 : PL_OPT_EOL, /* end of options list */
25 : PL_OPT_BAD /* invalid option (and value) */
26 : } PLOptStatus;
27 :
28 : typedef struct PLLongOpt
29 : {
30 : const char * longOptName; /* long option name string */
31 : PRIntn longOption; /* value put in PLOptState for this option. */
32 : PRBool valueRequired; /* If option name not followed by '=', */
33 : /* value is the next argument from argv. */
34 : } PLLongOpt;
35 :
36 : typedef struct PLOptState
37 : {
38 : char option; /* the name of the option */
39 : const char *value; /* the value of that option | NULL */
40 :
41 : PLOptionInternal *internal; /* private processing state */
42 :
43 : PRIntn longOption; /* value from PLLongOpt put here */
44 : PRIntn longOptIndex; /* index into caller's array of PLLongOpts */
45 : } PLOptState;
46 :
47 : /*
48 : * PL_CreateOptState
49 : *
50 : * The argument "options" points to a string of single-character option
51 : * names. Option names that may have an option argument value must be
52 : * followed immediately by a ':' character.
53 : */
54 0 : PR_EXTERN(PLOptState*) PL_CreateOptState(
55 : PRIntn argc, char **argv, const char *options);
56 :
57 : /*
58 : * PL_CreateLongOptState
59 : *
60 : * Alternative to PL_CreateOptState.
61 : * Allows caller to specify BOTH a string of single-character option names,
62 : * AND an array of structures describing "long" (keyword) option names.
63 : * The array is terminated by a structure in which longOptName is NULL.
64 : * Long option values (arguments) may always be given as "--name=value".
65 : * If PLLongOpt.valueRequired is not PR_FALSE, and the option name was not
66 : * followed by '=' then the next argument from argv is taken as the value.
67 : */
68 0 : PR_EXTERN(PLOptState*) PL_CreateLongOptState(
69 : PRIntn argc, char **argv, const char *options,
70 : const PLLongOpt *longOpts);
71 : /*
72 : * PL_DestroyOptState
73 : *
74 : * Call this to destroy the PLOptState returned from PL_CreateOptState or
75 : * PL_CreateLongOptState.
76 : */
77 0 : PR_EXTERN(void) PL_DestroyOptState(PLOptState *opt);
78 :
79 : /*
80 : * PL_GetNextOpt
81 : *
82 : * When this function returns PL_OPT_OK,
83 : * - opt->option will hold the single-character option name that was parsed,
84 : * or zero.
85 : * When opt->option is zero, the token parsed was either a "long" (keyword)
86 : * option or a positional parameter.
87 : * For a positional parameter,
88 : * - opt->longOptIndex will contain -1, and
89 : * - opt->value will point to the positional parameter string.
90 : * For a long option name,
91 : * - opt->longOptIndex will contain the non-negative index of the
92 : * PLLongOpt structure in the caller's array of PLLongOpt structures
93 : * corresponding to the long option name, and
94 : * For a single-character or long option,
95 : * - opt->longOption will contain the value of the single-character option
96 : * name, or the value of the longOption from the PLLongOpt structure
97 : * for that long option. See notes below.
98 : * - opt->value will point to the argument option string, or will
99 : * be NULL if option does not require argument. If option requires
100 : * argument but it is not provided, PL_OPT_BAD is returned.
101 : * When opt->option is non-zero,
102 : * - opt->longOptIndex will be -1
103 : * When this function returns PL_OPT_EOL, or PL_OPT_BAD, the contents of
104 : * opt are undefined.
105 : *
106 : * Notes: It is possible to ignore opt->option, and always look at
107 : * opt->longOption instead. opt->longOption will contain the same value
108 : * as opt->option for single-character option names, and will contain the
109 : * value of longOption from the PLLongOpt structure for long option names.
110 : * This means that it is possible to equivalence long option names to
111 : * single character names by giving the longOption in the PLLongOpt struct
112 : * the same value as the single-character option name.
113 : * For long options that are NOT intended to be equivalent to any single-
114 : * character option, the longOption value should be chosen to not match
115 : * any possible single character name. It might be advisable to choose
116 : * longOption values greater than 0xff for such long options.
117 : */
118 0 : PR_EXTERN(PLOptStatus) PL_GetNextOpt(PLOptState *opt);
119 :
120 : PR_END_EXTERN_C
121 :
122 : #endif /* defined(PLGETOPT_H_) */
123 :
124 : /* plgetopt.h */
125 :
|