1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2006 The WebRTC Project Authors. All rights reserved. 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Originally comes from shared/commandlineflags/flags.h 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Flags are defined and declared using DEFINE_xxx and DECLARE_xxx macros, 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// where xxx is the flag type. Flags are referred to via FLAG_yyy, 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// where yyy is the flag name. For intialization and iteration of flags, 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// see the FlagList class. For full programmatic access to any 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// flag, see the Flag class. 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// The implementation only relies and basic C++ functionality 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// and needs no special library or STL support. 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_FLAGS_H__ 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_FLAGS_H__ 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include <assert.h> 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/checks.h" 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/common.h" 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 31c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.orgnamespace rtc { 32c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.org 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Internal use only. 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgunion FlagValue { 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Note: Because in C++ non-bool values are silently converted into 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // bool values ('bool b = "false";' results in b == true!), we pass 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // and int argument to New_BOOL as this appears to be safer - sigh. 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // In particular, it prevents the (not uncommon!) bug where a bool 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // flag is defined via: DEFINE_bool(flag, "false", "some comment");. 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static FlagValue New_BOOL(int b) { 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue v; 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org v.b = (b != 0); 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return v; 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static FlagValue New_INT(int i) { 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue v; 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org v.i = i; 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return v; 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static FlagValue New_FLOAT(float f) { 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue v; 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org v.f = f; 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return v; 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static FlagValue New_STRING(const char* s) { 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue v; 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org v.s = s; 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return v; 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool b; 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int i; 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double f; 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* s; 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Each flag can be accessed programmatically via a Flag object. 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Flag { 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org enum Type { BOOL, INT, FLOAT, STRING }; 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Internal use only. 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Flag(const char* file, const char* name, const char* comment, 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Type type, void* variable, FlagValue default_); 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // General flag information 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* file() const { return file_; } 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* name() const { return name_; } 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* comment() const { return comment_; } 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Flag type 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Type type() const { return type_; } 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Flag variables 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool* bool_variable() const { 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == BOOL); 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return &variable_->b; 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 933c089d751ede283e21e186885eaf705c3257ccd2henrikg 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int* int_variable() const { 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == INT); 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return &variable_->i; 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 983c089d751ede283e21e186885eaf705c3257ccd2henrikg 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double* float_variable() const { 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == FLOAT); 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return &variable_->f; 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1033c089d751ede283e21e186885eaf705c3257ccd2henrikg 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char** string_variable() const { 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == STRING); 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return &variable_->s; 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default values 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool bool_default() const { 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == BOOL); 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return default_.b; 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1143c089d751ede283e21e186885eaf705c3257ccd2henrikg 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int int_default() const { 116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == INT); 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return default_.i; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1193c089d751ede283e21e186885eaf705c3257ccd2henrikg 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org double float_default() const { 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == FLOAT); 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return default_.f; 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 1243c089d751ede283e21e186885eaf705c3257ccd2henrikg 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* string_default() const { 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org assert(type_ == STRING); 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return default_.s; 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Resets a flag to its default value 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void SetToDefault(); 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Iteration support 134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Flag* next() const { return next_; } 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Prints flag information. The current flag value is only printed 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // if print_current_value is set. 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org void Print(bool print_current_value); 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* file_; 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* name_; 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char* comment_; 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Type type_; 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue* variable_; 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagValue default_; 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Flag* next_; 150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org friend class FlagList; // accesses next_ 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Internal use only. 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DEFINE_FLAG(type, c_type, name, default, comment) \ 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org /* define and initialize the flag */ \ 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org c_type FLAG_##name = (default); \ 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org /* register the flag */ \ 160c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.org static rtc::Flag Flag_##name(__FILE__, #name, (comment), \ 161c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.org rtc::Flag::type, &FLAG_##name, \ 162c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.org rtc::FlagValue::New_##type(default)) 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Internal use only. 166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DECLARE_FLAG(c_type, name) \ 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org /* declare the external flag */ \ 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org extern c_type FLAG_##name 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Use the following macros to define a new flag: 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DEFINE_bool(name, default, comment) \ 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DEFINE_FLAG(BOOL, bool, name, default, comment) 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DEFINE_int(name, default, comment) \ 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DEFINE_FLAG(INT, int, name, default, comment) 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DEFINE_float(name, default, comment) \ 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DEFINE_FLAG(FLOAT, double, name, default, comment) 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DEFINE_string(name, default, comment) \ 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org DEFINE_FLAG(STRING, const char*, name, default, comment) 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Use the following macros to declare a flag defined elsewhere: 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DECLARE_bool(name) DECLARE_FLAG(bool, name) 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DECLARE_int(name) DECLARE_FLAG(int, name) 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DECLARE_float(name) DECLARE_FLAG(double, name) 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define DECLARE_string(name) DECLARE_FLAG(const char*, name) 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// The global list of all flags. 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass FlagList { 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org FlagList(); 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The NULL-terminated list of all flags. Traverse with Flag::next(). 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static Flag* list() { return list_; } 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // If file != NULL, prints information for all flags defined in file; 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // otherwise prints information for all flags in all files. The current 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // flag value is only printed if print_current_value is set. 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static void Print(const char* file, bool print_current_value); 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Lookup a flag by name. Returns the matching flag or NULL. 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static Flag* Lookup(const char* name); 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Helper function to parse flags: Takes an argument arg and splits it into 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // a flag name and flag value (or NULL if they are missing). is_bool is set 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // if the arg started with "-no" or "--no". The buffer may be used to NUL- 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // terminate the name, it must be large enough to hold any possible name. 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static void SplitArgument(const char* arg, 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char* buffer, int buffer_size, 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char** name, const char** value, 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool* is_bool); 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Set the flag values by parsing the command line. If remove_flags 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // is set, the flags and associated values are removed from (argc, 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // argv). Returns 0 if no error occurred. Otherwise, returns the 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // argv index > 0 for the argument where an error occurred. In that 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // case, (argc, argv) will remain unchanged indepdendent of the 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // remove_flags value, and no assumptions about flag settings should 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // be made. 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // The following syntax for flags is accepted (both '-' and '--' are ok): 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // 224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // --flag (bool flags only) 225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // --noflag (bool flags only) 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // --flag=value (non-bool flags only, no spaces around '=') 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // --flag value (non-bool flags only) 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static int SetFlagsFromCommandLine(int* argc, 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org const char** argv, 230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool remove_flags); 231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static inline int SetFlagsFromCommandLine(int* argc, 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char** argv, 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool remove_flags) { 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return SetFlagsFromCommandLine(argc, const_cast<const char**>(argv), 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org remove_flags); 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Registers a new flag. Called during program initialization. Not 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // thread-safe. 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static void Register(Flag* flag); 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org static Flag* list_; 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN) 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// A helper class to translate Windows command line arguments into UTF8, 248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// which then allows us to just pass them to the flags system. 249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// This encapsulates all the work of getting the command line and translating 250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// it to an array of 8-bit strings; all you have to do is create one of these, 251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// and then call argc() and argv(). 252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass WindowsCommandLineArguments { 253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org WindowsCommandLineArguments(); 255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org ~WindowsCommandLineArguments(); 256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int argc() { return argc_; } 258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char **argv() { return argv_; } 259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org int argc_; 261f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org char **argv_; 262f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 263f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 2643c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(WindowsCommandLineArguments); 265f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 2663c089d751ede283e21e186885eaf705c3257ccd2henrikg#endif // WEBRTC_WIN 267f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 268c50bf7cbd0483806c50a848d24349a79939e1161henrike@webrtc.org} // namespace rtc 269f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 270f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // SHARED_COMMANDLINEFLAGS_FLAGS_H__ 271