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