The getopt library has a structure called option (lowercase). We have a structure called Option (uppercase). previously the two structures had exactly the same definitions, and we were doing a C-style cast of an Option* to an option*. C-style casts don't bother to warn you when you cast to unrelated types, but in the original OptionValidator patch I modified the definition of Option. This patch fixes the errors by building an array of option structures and filling it out the correct way before passing it to the getopt library. This also fixes one other source of test failures: an uninitialized read that occurs due to not initializing a field of the OptionDefinition. Reviewed By: Todd Fiala Differential Revision: http://reviews.llvm.org/D4425 llvm-svn: 212628
69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
//===-- OptionGroupBoolean.cpp ----------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Interpreter/OptionGroupBoolean.h"
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
OptionGroupBoolean::OptionGroupBoolean (uint32_t usage_mask,
|
|
bool required,
|
|
const char *long_option,
|
|
int short_option,
|
|
const char *usage_text,
|
|
bool default_value,
|
|
bool no_argument_toggle_default) :
|
|
m_value (default_value, default_value)
|
|
{
|
|
m_option_definition.usage_mask = usage_mask;
|
|
m_option_definition.required = required;
|
|
m_option_definition.long_option = long_option;
|
|
m_option_definition.short_option = short_option;
|
|
m_option_definition.validator = nullptr;
|
|
m_option_definition.option_has_arg = no_argument_toggle_default ? OptionParser::eNoArgument : OptionParser::eRequiredArgument;
|
|
m_option_definition.enum_values = nullptr;
|
|
m_option_definition.completion_type = 0;
|
|
m_option_definition.argument_type = eArgTypeBoolean;
|
|
m_option_definition.usage_text = usage_text;
|
|
}
|
|
|
|
OptionGroupBoolean::~OptionGroupBoolean ()
|
|
{
|
|
}
|
|
|
|
Error
|
|
OptionGroupBoolean::SetOptionValue (CommandInterpreter &interpreter,
|
|
uint32_t option_idx,
|
|
const char *option_arg)
|
|
{
|
|
Error error;
|
|
if (m_option_definition.option_has_arg == OptionParser::eNoArgument)
|
|
{
|
|
// Not argument, toggle the default value and mark the option as having been set
|
|
m_value.SetCurrentValue (!m_value.GetDefaultValue());
|
|
m_value.SetOptionWasSet ();
|
|
}
|
|
else
|
|
{
|
|
error = m_value.SetValueFromCString (option_arg);
|
|
}
|
|
return error;
|
|
}
|
|
|
|
void
|
|
OptionGroupBoolean::OptionParsingStarting (CommandInterpreter &interpreter)
|
|
{
|
|
m_value.Clear();
|
|
}
|