1f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org/*
2f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *
4f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  Use of this source code is governed by a BSD-style license
5f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org */
10f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
11b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org#include "webrtc/tools/simple_command_line_parser.h"
12f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
1312dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <stdio.h>
1412dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <stdlib.h>
1512dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org
16b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org#include <string>
17f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
18f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgnamespace webrtc {
19f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgnamespace test {
20f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
21b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.orgusing std::string;
22b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org
23a6f56acc53ce29a360199f6422ef704e751c976bpbos@webrtc.orgCommandLineParser::CommandLineParser() {}
24a6f56acc53ce29a360199f6422ef704e751c976bpbos@webrtc.orgCommandLineParser::~CommandLineParser() {}
25a6f56acc53ce29a360199f6422ef704e751c976bpbos@webrtc.org
26f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgvoid CommandLineParser::Init(int argc, char** argv) {
27f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  args_ = std::vector<std::string> (argv + 1, argv + argc);
28f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
29f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
30f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgbool CommandLineParser::IsStandaloneFlag(std::string flag) {
31b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  return flag.find("=") == string::npos;
32f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
33f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
34f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgbool CommandLineParser::IsFlagWellFormed(std::string flag) {
35b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t dash_pos = flag.find("--");
36b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t equal_pos = flag.find("=");
37f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  if (dash_pos != 0) {
38f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    fprintf(stderr, "Wrong switch format: %s\n", flag.c_str());
39f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    fprintf(stderr, "Flag doesn't start with --\n");
40f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    return false;
41f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
42b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t flag_length = flag.length() - 1;
43f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
44f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  // We use 3 here because we assume that the flags are in the format
45f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  // --flag_name=flag_value, thus -- are at positions 0 and 1 and we should have
46b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  // at least one symbol for the flag name.
47b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  if (equal_pos > 0 && (equal_pos < 3 || equal_pos == flag_length)) {
48f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    fprintf(stderr, "Wrong switch format: %s\n", flag.c_str());
49f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    fprintf(stderr, "Wrong placement of =\n");
50f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    return false;
51f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
52f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  return true;
53f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
54f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
55f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgstd::string CommandLineParser::GetCommandLineFlagName(std::string flag) {
56b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t dash_pos = flag.find("--");
57b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t equal_pos = flag.find("=");
58b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  if (equal_pos == string::npos) {
59b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org    return flag.substr(dash_pos + 2);
60f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  } else {
61b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org    return flag.substr(dash_pos + 2, equal_pos - 2);
62f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
63f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
64f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
65f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgstd::string CommandLineParser::GetCommandLineFlagValue(std::string flag) {
66b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  size_t equal_pos = flag.find("=");
67b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  if (equal_pos == string::npos) {
68b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org    return "";
69b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  } else {
70b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org    return flag.substr(equal_pos + 1);
71b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  }
72f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
73f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
74f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgvoid CommandLineParser::PrintEnteredFlags() {
75f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  std::map<std::string, std::string>::iterator flag_iter;
76f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  fprintf(stdout, "You have entered:\n");
77f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  for (flag_iter = flags_.begin(); flag_iter != flags_.end(); ++flag_iter) {
78f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    if (flag_iter->first != "help") {
79f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      fprintf(stdout, "%s=%s, ", flag_iter->first.c_str(),
80f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org              flag_iter->second.c_str());
81f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    }
82f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
83f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  fprintf(stdout, "\n");
84f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
85f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
86f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgvoid CommandLineParser::ProcessFlags() {
87f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  std::map<std::string, std::string>::iterator flag_iter;
88f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  std::vector<std::string>::iterator iter;
89f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  for (iter = args_.begin(); iter != args_.end(); ++iter) {
90f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    if (!IsFlagWellFormed(*iter)) {
91f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      // Ignore badly formated flags.
92f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      continue;
93f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    }
94f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    std::string flag_name = GetCommandLineFlagName(*iter);
95f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    flag_iter = flags_.find(flag_name);
96f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    if (flag_iter == flags_.end()) {
97f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      // Ignore unknown flags.
98f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      fprintf(stdout, "Flag '%s' is not recognized\n", flag_name.c_str());
99f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      continue;
100f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    }
101f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    if (IsStandaloneFlag(*iter)) {
102f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      flags_[flag_name] = "true";
103f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    } else {
104f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org      flags_[flag_name] = GetCommandLineFlagValue(*iter);
105f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    }
106f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
107f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
108f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
109f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgvoid CommandLineParser::SetUsageMessage(std::string usage_message) {
110f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  usage_message_ = usage_message;
111f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
112f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
113f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgvoid CommandLineParser::PrintUsageMessage() {
114f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  fprintf(stdout, "%s", usage_message_.c_str());
115f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
116f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
117b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.orgvoid CommandLineParser::SetFlag(std::string flag_name,
118b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org                                std::string default_flag_value) {
119b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  flags_[flag_name] = default_flag_value;
120f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
121f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
122f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.orgstd::string CommandLineParser::GetFlag(std::string flag_name) {
123f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  std::map<std::string, std::string>::iterator flag_iter;
124f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  flag_iter = flags_.find(flag_name);
125b2d7497fafa8ac0455cb65f012922a1bd6d533bekjellander@webrtc.org  // If no such flag.
126f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  if (flag_iter == flags_.end()) {
127f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org    return "";
128f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  }
129f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org  return flag_iter->second;
130f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}
131f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org
132f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}  // namespace test
133f61dc9be41eaa427d1d8ccdbdce4a7187754ffc9vspasova@webrtc.org}  // namespace webrtc
134