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