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