1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/*
2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc.
3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file.
6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
8e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#ifndef SK_COMMAND_LINE_FLAGS_H
9e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#define SK_COMMAND_LINE_FLAGS_H
10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkString.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h"
1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTDArray.h"
14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/**
16e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  Including this file (and compiling SkCommandLineFlags.cpp) provides command line
17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  parsing. In order to use it, use the following macros in global
18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  namespace:
19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_bool(name, defaultValue, helpString);
21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_string(name, defaultValue, helpString);
22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_int32(name, defaultValue, helpString);
23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_double(name, defaultValue, helpString);
24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
25e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  Then, in main, call SkCommandLineFlags::SetUsage() to describe usage and call
26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  SkCommandLineFlags::Parse() to parse the flags. Henceforth, each flag can
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  be referenced using
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  FLAGS_name
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  For example, the line
32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_bool(boolean, false, "The variable boolean does such and such");
34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create the following variable:
36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  bool FLAGS_boolean;
38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  which will initially be set to false, and can be set to true by using the
40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  flag "--boolean" on the commandline. "--noboolean" will set FLAGS_boolean
41e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  to false. FLAGS_boolean can also be set using "--boolean=true" or
42e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  "--boolean true" (where "true" can be replaced by "false", "TRUE", "FALSE",
43e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  "1" or "0").
44e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *
45e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  The helpString will be printed if the help flag (-h or -help) is used.
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Similarly, the line
48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_int32(integer, .., ..);
50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create
52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  int32_t FLAGS_integer;
54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  and
56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_double(real, .., ..);
58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create
60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  double FLAGS_real;
62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
63096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  These flags can be set by specifying, for example, "--integer 7" and
64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  "--real 3.14" on the command line.
65096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
66096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Unlike the others, the line
67096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_string(args, .., ..);
69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  creates an array:
71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  SkCommandLineFlags::StringArray FLAGS_args;
73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  If the default value is the empty string, FLAGS_args will default to a size
75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  of zero. Otherwise it will default to a size of 1 with the default string
76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  as its value. All strings that follow the flag on the command line (until
77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  a string that begins with '-') will be entries in the array.
78096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Any flag can be referenced from another file after using the following:
80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DECLARE_x(name);
82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  (where 'x' is the type specified in the DEFINE).
84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Inspired by gflags (https://code.google.com/p/gflags/). Is not quite as
86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  robust as gflags, but suits our purposes. For example, allows creating
87e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  a flag -h or -help which will never be used, since SkCommandLineFlags handles it.
88e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  SkCommandLineFlags will also allow creating --flag and --noflag. Uses the same input
89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  format as gflags and creates similarly named variables (i.e. FLAGS_name).
90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Strings are handled differently (resulting variable will be an array of
91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  strings) so that a flag can be followed by multiple parameters.
92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SkFlagInfo;
95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
96e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenbergerclass SkCommandLineFlags {
97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic:
99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Call to set the help message to be displayed. Should be called before
101e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  Parse.
102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static void SetUsage(const char* usage);
104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Call at the beginning of main to parse flags created by DEFINE_x, above.
107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Must only be called once.
108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
109e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    static void Parse(int argc, char** argv);
110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Custom class for holding the arguments for a string flag.
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Publicly only has accessors so the strings cannot be modified.
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    class StringArray {
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    public:
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const char* operator[](int i) const {
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkASSERT(i >= 0 && i < fStrings.count());
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return fStrings[i].c_str();
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        int count() const {
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return fStrings.count();
1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bool isEmpty() const { return this->count() == 0; }
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        /**
1290a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger         * Returns true iff string is equal to one of the strings in this array.
1300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger         */
1310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        bool contains(const char* string) const {
1320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            for (int i = 0; i < fStrings.count(); i++) {
1330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                if (fStrings[i].equals(string)) {
1340a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                    return true;
1350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                }
1360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            }
1370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            return false;
1380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        }
1390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    private:
1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void reset() { fStrings.reset(); }
1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void append(const char* string) {
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings.push_back().set(string);
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void append(const char* string, size_t length) {
1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings.push_back().set(string, length);
1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkTArray<SkString> fStrings;
1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        friend class SkFlagInfo;
1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    };
1557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    /* Takes a list of the form [~][^]match[$]
1570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     ~ causes a matching test to always be skipped
1580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     ^ requires the start of the test to match
1590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     $ requires the end of the test to match
1600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     ^ and $ requires an exact match
1610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger     If a test does not match any list entry, it is skipped unless some list entry starts with ~
1620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    */
1630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static bool ShouldSkip(const SkTDArray<const char*>& strings, const char* name);
1640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    static bool ShouldSkip(const StringArray& strings, const char* name);
1650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
166096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
167096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static SkFlagInfo* gHead;
168096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static SkString    gUsage;
169096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
170096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // For access to gHead.
171096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    friend class SkFlagInfo;
172096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger};
173096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
174096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define TO_STRING2(s) #s
175096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define TO_STRING(s) TO_STRING2(s)
176096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
177096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_bool(name, defaultValue, helpString)                         \
178096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool FLAGS_##name;                                                          \
179096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
180096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       NULL,                \
181096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       &FLAGS_##name,       \
182096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       defaultValue,        \
183096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       helpString)
184096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
185096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// bool 2 allows specifying a short name. No check is done to ensure that shortName
186096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// is actually shorter than name.
187096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_bool2(name, shortName, defaultValue, helpString)             \
188096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool FLAGS_##name;                                                          \
189096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
190096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       TO_STRING(shortName),\
191096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       &FLAGS_##name,       \
192096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       defaultValue,        \
193096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       helpString)
194096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
195096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_bool(name) extern bool FLAGS_##name;
196096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
197096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_string(name, defaultValue, helpString)                       \
1987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSkCommandLineFlags::StringArray FLAGS_##name;                               \
199096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),   \
200096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         NULL,              \
201096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,     \
202096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,      \
203096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
204096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// string2 allows specifying a short name. There is an assert that shortName
2067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// is only 1 character.
207096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_string2(name, shortName, defaultValue, helpString)               \
2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSkCommandLineFlags::StringArray FLAGS_##name;                                   \
209096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),       \
210096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         TO_STRING(shortName),  \
211096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,         \
212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,          \
213096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DECLARE_string(name) extern SkCommandLineFlags::StringArray FLAGS_##name;
216096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
217096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_int32(name, defaultValue, helpString)                        \
218096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerint32_t FLAGS_##name;                                                       \
219096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateIntFlag(TO_STRING(name),      \
220096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      &FLAGS_##name,        \
221096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      defaultValue,         \
222096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      helpString)
223096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
224096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_int32(name) extern int32_t FLAGS_##name;
225096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
226096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_double(name, defaultValue, helpString)                       \
227096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerdouble FLAGS_##name;                                                        \
228096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateDoubleFlag(TO_STRING(name),   \
229096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,     \
230096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,      \
231096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
232096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
233096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_double(name) extern double FLAGS_##name;
234096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
235096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SkFlagInfo {
236096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
237096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic:
238096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    enum FlagTypes {
239096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kBool_FlagType,
240096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kString_FlagType,
241096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kInt_FlagType,
242096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kDouble_FlagType,
243096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    };
244096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Each Create<Type>Flag function creates an SkFlagInfo of the specified type. The SkFlagInfo
2477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  object is appended to a list, which is deleted when SkCommandLineFlags::Parse is called.
2487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Therefore, each call should be made before the call to ::Parse. They are not intended
2497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  to be called directly. Instead, use the macros described above.
2507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param name Long version (at least 2 characters) of the name of the flag. This name can
2517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be referenced on the command line as "--name" to set the value of this flag.
2527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param shortName Short version (one character) of the name of the flag. This name can
2537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be referenced on the command line as "-shortName" to set the value of this flag.
2547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param p<Type> Pointer to a global variable which holds the value set by SkCommandLineFlags.
2557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultValue The default value of this flag. The variable pointed to by p<Type> will
2567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be set to this value initially. This is also displayed as part of the help output.
2577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param helpString Explanation of what this flag changes in the program.
2587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
259096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateBoolFlag(const char* name, const char* shortName, bool* pBool,
260096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                               bool defaultValue, const char* helpString) {
2617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, shortName, kBool_FlagType, helpString));
262096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fBoolValue = pBool;
263096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fBoolValue = info->fDefaultBool = defaultValue;
264096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
265096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
266096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param pStrings Unlike the others, this is a pointer to an array of values.
2707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultValue Thise default will be parsed so that strings separated by spaces
2717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      will be added to pStrings.
2727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
273096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateStringFlag(const char* name, const char* shortName,
2747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 SkCommandLineFlags::StringArray* pStrings,
2757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 const char* defaultValue, const char* helpString);
276096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
280096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateIntFlag(const char* name, int32_t* pInt,
281096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                              int32_t defaultValue, const char* helpString) {
2827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, NULL, kInt_FlagType, helpString));
283096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fIntValue = pInt;
284096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fIntValue = info->fDefaultInt = defaultValue;
285096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
286096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
287096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
291096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateDoubleFlag(const char* name, double* pDouble,
292096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                 double defaultValue, const char* helpString) {
2937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, NULL, kDouble_FlagType, helpString));
294096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fDoubleValue = pDouble;
295096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fDoubleValue = info->fDefaultDouble = defaultValue;
296096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
297096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
298096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
299096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
300e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  Returns true if the string matches this flag.
301e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  For a boolean flag, also sets the value, since a boolean flag can be set in a number of ways
302e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  without looking at the following string:
303e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name
304e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --noname
305e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=true
306e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=false
307e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=1
308e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=0
309e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=TRUE
310e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=FALSE
311096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
312e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    bool match(const char* string);
313096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
314096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    FlagTypes getFlagType() const { return fFlagType; }
315096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
316096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void resetStrings() {
317096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kString_FlagType == fFlagType) {
318096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            fStrings->reset();
319096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
3200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkDEBUGFAIL("Can only call resetStrings on kString_FlagType");
321096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
322096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
323096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
324096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void append(const char* string) {
325096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kString_FlagType == fFlagType) {
3267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings->append(string);
327096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
3280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkDEBUGFAIL("Can only append to kString_FlagType");
329096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
330096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
331096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
332096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void setInt(int32_t value) {
333096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kInt_FlagType == fFlagType) {
334096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            *fIntValue = value;
335096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
3360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkDEBUGFAIL("Can only call setInt on kInt_FlagType");
337096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
338096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
339096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
340096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void setDouble(double value) {
341096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kDouble_FlagType == fFlagType) {
342096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            *fDoubleValue = value;
343096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
3440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkDEBUGFAIL("Can only call setDouble on kDouble_FlagType");
345096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
346096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
347096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
348e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    void setBool(bool value) {
349e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        if (kBool_FlagType == fFlagType) {
350e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger            *fBoolValue = value;
351e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        } else {
3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkDEBUGFAIL("Can only call setBool on kBool_FlagType");
353e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        }
354e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    }
355e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger
356096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFlagInfo* next() { return fNext; }
357096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
358096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const SkString& name() const { return fName; }
359096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
360e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    const SkString& shortName() const { return fShortName; }
361e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger
362096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const SkString& help() const { return fHelpString; }
363096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
364096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString defaultValue() const {
365096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkString result;
366096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        switch (fFlagType) {
367096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kBool_FlagType:
368096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%s", fDefaultBool ? "true" : "false");
369096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
370096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kString_FlagType:
371096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return fDefaultString;
372096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kInt_FlagType:
373096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%i", fDefaultInt);
374096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
375096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kDouble_FlagType:
376096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%2.2f", fDefaultDouble);
377096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
378096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            default:
3790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                SkDEBUGFAIL("Invalid flag type");
380096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
381096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return result;
382096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
383096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
384096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString typeAsString() const {
385096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        switch (fFlagType) {
386096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kBool_FlagType:
387096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("bool");
388096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kString_FlagType:
389096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("string");
390096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kInt_FlagType:
391096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("int");
392096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kDouble_FlagType:
393096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("double");
394096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            default:
3950a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                SkDEBUGFAIL("Invalid flag type");
396096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString();
397096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
398096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
399096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
400096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
4017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkFlagInfo(const char* name, const char* shortName, FlagTypes type, const char* helpString)
402096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        : fName(name)
4037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fShortName(shortName)
404096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fFlagType(type)
405096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fHelpString(helpString)
406096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fBoolValue(NULL)
407096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultBool(false)
408096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fIntValue(NULL)
409096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultInt(0)
410096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDoubleValue(NULL)
411096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultDouble(0)
412096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fStrings(NULL) {
413e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        fNext = SkCommandLineFlags::gHead;
414e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        SkCommandLineFlags::gHead = this;
4157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkASSERT(NULL != name && strlen(name) > 1);
4167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkASSERT(NULL == shortName || 1 == strlen(shortName));
417096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
4187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
4197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
4207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Set a StringArray to hold the values stored in defaultStrings.
4217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param array The StringArray to modify.
4227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultStrings Space separated list of strings that should be inserted into array
4237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      individually.
4247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
4257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void SetDefaultStrings(SkCommandLineFlags::StringArray* array,
4267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  const char* defaultStrings);
4277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
428096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Name of the flag, without initial dashes
429096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fName;
430096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fShortName;
431096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    FlagTypes            fFlagType;
432096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fHelpString;
433096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool*                fBoolValue;
434096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool                 fDefaultBool;
435096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    int32_t*             fIntValue;
436096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    int32_t              fDefaultInt;
437096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    double*              fDoubleValue;
438096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    double               fDefaultDouble;
4397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkCommandLineFlags::StringArray* fStrings;
440096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Both for the help string and in case fStrings is empty.
441096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fDefaultString;
442096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
443096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // In order to keep a linked list.
444096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFlagInfo*          fNext;
445096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger};
446e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#endif // SK_COMMAND_LINE_FLAGS_H
447