Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4108)

Unified Diff: base/command_line.cc

Issue 7249: Store the command line in a more convenient format on non-windows platforms. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/command_line.cc
===================================================================
--- base/command_line.cc (revision 3369)
+++ base/command_line.cc (working copy)
@@ -57,21 +57,19 @@
Data() {
Init(GetCommandLineW());
}
+
+ Data(const wstring& command_line) {
+ Init(command_line);
+ }
#elif defined(OS_POSIX)
Data() {
// Owner must call Init().
}
-#endif
-#if defined(OS_WIN)
- Data(const wstring& command_line) {
- Init(command_line);
- }
-#elif defined(OS_POSIX)
Data(int argc, const char* const* argv) {
Init(argc, argv);
}
-#endif
+#endif // defined(OS_POSIX)
#if defined(OS_WIN)
// Does the actual parsing of the command line.
@@ -116,18 +114,19 @@
if (args)
LocalFree(args);
}
-
#elif defined(OS_POSIX)
// Does the actual parsing of the command line.
void Init(int argc, const char* const* argv) {
if (argc < 1)
return;
program_ = base::SysNativeMBToWide(argv[0]);
+ argv_.push_back(std::string(argv[0]));
command_line_string_ = program_;
bool parse_switches = true;
for (int i = 1; i < argc; ++i) {
std::wstring arg = base::SysNativeMBToWide(argv[i]);
+ argv_.push_back(argv[i]);
command_line_string_.append(L" ");
command_line_string_.append(arg);
@@ -168,6 +167,12 @@
return loose_values_;
}
+#if defined(OS_POSIX)
+ const std::vector<std::string>& argv() const {
+ return argv_;
+ }
+#endif
+
private:
// Returns true if parameter_string represents a switch. If true,
// switch_string and switch_value are set. (If false, both are
@@ -206,6 +211,7 @@
std::wstring program_;
std::map<std::wstring, std::wstring> switches_;
std::vector<std::wstring> loose_values_;
+ std::vector<std::string> argv_;
DISALLOW_EVIL_CONSTRUCTORS(Data);
};
@@ -228,6 +234,15 @@
: we_own_data_(true),
data_(new Data(argc, argv)) {
}
+
+CommandLine::CommandLine(const std::vector<std::string>& argv)
+ : we_own_data_(true) {
+ const char* argv_copy[argv.size()];
+ for (size_t i = 0; i < argv.size(); i++) {
+ argv_copy[i] = argv[i].c_str();
+ }
+ data_ = new Data(argv.size(), argv_copy);
+}
#endif
CommandLine::~CommandLine() {
@@ -278,38 +293,68 @@
return data_->command_line_string();
}
+#if defined(OS_POSIX)
+const std::vector<std::string>& CommandLine::argv() const {
+ return data_->argv();
+}
+#endif
+
std::wstring CommandLine::program() const {
return data_->program();
}
// static
+wstring CommandLine::PrefixedSwitchString(const wstring& switch_string) {
+ return StringPrintf(L"%ls%ls",
+ kSwitchPrefixes[0],
+ switch_string.c_str());
+}
+
+// static
+wstring CommandLine::PrefixedSwitchStringWithValue(
+ const wstring& switch_string, const wstring& value_string) {
+ if (value_string.empty()) {
+ return PrefixedSwitchString(switch_string);
+ }
+
+ return StringPrintf(L"%ls%ls%ls%ls",
+ kSwitchPrefixes[0],
+ switch_string.c_str(),
+ kSwitchValueSeparator,
+ value_string.c_str());
+}
+
+// static
void CommandLine::AppendSwitch(wstring* command_line_string,
const wstring& switch_string) {
DCHECK(command_line_string);
+ wstring prefixed_switch_string = PrefixedSwitchString(switch_string);
command_line_string->append(L" ");
- command_line_string->append(kSwitchPrefixes[0]);
- command_line_string->append(switch_string);
+ command_line_string->append(prefixed_switch_string);
}
// static
void CommandLine::AppendSwitchWithValue(wstring* command_line_string,
const wstring& switch_string,
const wstring& value_string) {
- AppendSwitch(command_line_string, switch_string);
+ wstring value_string_edit;
- if (value_string.empty())
- return;
-
- command_line_string->append(kSwitchValueSeparator);
// NOTE(jhughes): If the value contains a quotation mark at one
// end but not both, you may get unusable output.
- if ((value_string.find(L" ") != std::wstring::npos) &&
+ if (!value_string.empty() &&
+ (value_string.find(L" ") != std::wstring::npos) &&
(value_string[0] != L'"') &&
(value_string[value_string.length() - 1] != L'"')) {
// need to provide quotes
- StringAppendF(command_line_string, L"\"%ls\"", value_string.c_str());
+ value_string_edit = StringPrintf(L"\"%ls\"", value_string.c_str());
} else {
- command_line_string->append(value_string);
+ value_string_edit = value_string;
}
+
+ wstring combined_switch_string =
+ PrefixedSwitchStringWithValue(switch_string, value_string_edit);
+
+ command_line_string->append(L" ");
+ command_line_string->append(combined_switch_string);
}
« base/command_line.h ('K') | « base/command_line.h ('k') | base/command_line_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698