173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValueArray.cpp ------------------------------------*- C++ -*-===//
273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//                     The LLVM Compiler Infrastructure
473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// This file is distributed under the University of Illinois Open Source
673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// License. See LICENSE.TXT for details.
773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===----------------------------------------------------------------------===//
973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueArray.h"
1173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C Includes
1373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C++ Includes
1473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Other libraries and framework includes
1573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Project includes
1673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Core/Stream.h"
1773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/Args.h"
1873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb;
2073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb_private;
2173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
2273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid
2373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
2473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
2573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    const Type array_element_type = ConvertTypeMaskToType (m_type_mask);
2673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionType)
2773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if ((GetType() == eTypeArray) && (m_type_mask != eTypeInvalid))
2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.Printf ("(%s of %ss)", GetTypeAsCString(), GetBuiltinTypeAsCString(array_element_type));
3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        else
3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.Printf ("(%s)", GetTypeAsCString());
3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionValue)
3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
3573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (dump_mask & eDumpOptionType)
3673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.Printf (" =%s", (m_values.size() > 0) ? "\n" : "");
3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        strm.IndentMore();
3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        const uint32_t size = m_values.size();
3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        for (uint32_t i = 0; i<size; ++i)
4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.Indent();
4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.Printf("[%u]: ", i);
4373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const uint32_t extra_dump_options = m_raw_value_dump ? eDumpOptionRaw : 0;
4473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            switch (array_element_type)
4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                default:
4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeArray:
4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeDictionary:
4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeProperties:
5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeFileSpecList:
5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypePathMap:
5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    m_values[i]->DumpValue(exe_ctx, strm, dump_mask | extra_dump_options);
5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    break;
5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeBoolean:
5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeEnum:
5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeFileSpec:
5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeFormat:
5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeSInt64:
6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeString:
6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeUInt64:
6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                case eTypeUUID:
6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    // No need to show the type for dictionaries of simple items
6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    m_values[i]->DumpValue(exe_ctx, strm, (dump_mask & (~eDumpOptionType)) | extra_dump_options);
6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    break;
6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (i < (size - 1))
6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                strm.EOL();
6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        strm.IndentLess();
7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
7473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError
7573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::SetValueFromCString (const char *value, VarSetOperationType op)
7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    Args args(value);
7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return SetArgs (args, op);
7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
8273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP
8373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::GetSubValue (const ExecutionContext *exe_ctx,
8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                               const char *name,
8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                               bool will_modify,
8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                               Error &error) const
8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (name && name[0] == '[')
8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        const char *end_bracket = strchr (name+1, ']');
9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (end_bracket)
9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const char *sub_value = NULL;
9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (end_bracket[1])
9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                sub_value = end_bracket + 1;
9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            std::string index_str (name+1, end_bracket);
9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const size_t array_count = m_values.size();
9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            int32_t idx = Args::StringToSInt32(index_str.c_str(), INT32_MAX, 0, NULL);
9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (idx != INT32_MAX)
10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                ;
10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                uint32_t new_idx = UINT32_MAX;
10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (idx < 0)
10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    // Access from the end of the array if the index is negative
10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    new_idx = array_count - idx;
10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else
10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    // Just a standard index
11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    new_idx = idx;
11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (new_idx < array_count)
11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    if (m_values[new_idx])
11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
11873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        if (sub_value)
11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            return m_values[new_idx]->GetSubValue (exe_ctx, sub_value, will_modify, error);
12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        else
12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            return m_values[new_idx];
12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else
12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    if (array_count == 0)
12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        error.SetErrorStringWithFormat("index %i is not valid for an empty array", idx);
12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    else if (idx > 0)
1295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                        error.SetErrorStringWithFormat("index %i out of range, valid values are 0 through %" PRIu64, idx, (uint64_t)(array_count - 1));
13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    else
1315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                        error.SetErrorStringWithFormat("negative index %i out of range, valid values are -1 through -%" PRIu64, idx, (uint64_t)array_count);
13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
13473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    else
13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        error.SetErrorStringWithFormat("invalid value path '%s', %s values only support '[<index>]' subvalues where <index> is a positive or negative array index", name, GetTypeAsCString());
13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return OptionValueSP();
14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
14473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t
14573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::GetArgs (Args &args) const
14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    const uint32_t size = m_values.size();
14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    std::vector<const char *> argv;
14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    for (uint32_t i = 0; i<size; ++i)
15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        const char *string_value = m_values[i]->GetStringValue ();
15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (string_value)
15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            argv.push_back(string_value);
15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (argv.empty())
15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        args.Clear();
15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    else
15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        args.SetArguments(argv.size(), &argv[0]);
16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return args.GetArgumentCount();
16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
16373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError
16473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::SetArgs (const Args &args, VarSetOperationType op)
16573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
16673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    Error error;
16773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    const size_t argc = args.GetArgumentCount();
16873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    switch (op)
16973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
17073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInvalid:
17173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        error.SetErrorString("unsupported operation");
17273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
17373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
17473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInsertBefore:
17573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInsertAfter:
17673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (argc > 1)
17773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
17873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
17973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const uint32_t count = GetSize();
18073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (idx > count)
18173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
18273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                error.SetErrorStringWithFormat("invalid insert array index %u, index must be 0 through %u", idx, count);
18373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
18473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            else
18573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
18673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (op == eVarSetOperationInsertAfter)
18773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    ++idx;
18873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                for (size_t i=1; i<argc; ++i, ++idx)
18973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
19073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i),
19173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                                     m_type_mask,
19273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                                     error));
19373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    if (value_sp)
19473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
19573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        if (error.Fail())
19673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            return error;
19773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        if (idx >= m_values.size())
19873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            m_values.push_back(value_sp);
19973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        else
20073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            m_values.insert(m_values.begin() + idx, value_sp);
20173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
20273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    else
20373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
20473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        error.SetErrorString("array of complex types must subclass OptionValueArray");
20573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        return error;
20673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
20773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
20873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
20973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
21073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        else
21173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
21273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            error.SetErrorString("insert operation takes an array index followed by one or more values");
21373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
21473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
21573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationRemove:
21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (argc > 0)
21873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
21973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const uint32_t size = m_values.size();
22073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            std::vector<int> remove_indexes;
22173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            bool all_indexes_valid = true;
22273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            size_t i;
22373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            for (i=0; i<argc; ++i)
22473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
22573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                const int idx = Args::StringToSInt32(args.GetArgumentAtIndex(i), INT32_MAX);
22673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (idx >= size)
22773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
22873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    all_indexes_valid = false;
22973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    break;
23073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
23173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else
23273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    remove_indexes.push_back(idx);
23373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
23473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
23573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (all_indexes_valid)
23673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
23773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                size_t num_remove_indexes = remove_indexes.size();
23873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (num_remove_indexes)
23973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
24073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    // Sort and then erase in reverse so indexes are always valid
24173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    if (num_remove_indexes > 1)
24273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
24373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        std::sort(remove_indexes.begin(), remove_indexes.end());
24473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        for (std::vector<int>::const_reverse_iterator pos = remove_indexes.rbegin(), end = remove_indexes.rend(); pos != end; ++pos)
24573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        {
24673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            m_values.erase(m_values.begin() + *pos);
24773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        }
24873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
24973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    else
25073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
25173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        // Only one index
25273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        m_values.erase(m_values.begin() + remove_indexes.front());
25373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
25473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
25573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
25673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            else
25773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
25873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                error.SetErrorStringWithFormat("invalid array index '%s', aborting remove operation", args.GetArgumentAtIndex(i));
25973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
26073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
26173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        else
26273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
26373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            error.SetErrorString("remove operation takes one or more array indices");
26473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
26573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
26673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
26773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationClear:
26873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        Clear ();
26973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
27073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
27173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationReplace:
27273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (argc > 1)
27373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
27473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            uint32_t idx = Args::StringToUInt32(args.GetArgumentAtIndex(0), UINT32_MAX);
27573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            const uint32_t count = GetSize();
27673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (idx > count)
27773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
27873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                error.SetErrorStringWithFormat("invalid replace array index %u, index must be 0 through %u", idx, count);
27973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
28073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            else
28173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
28273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                for (size_t i=1; i<argc; ++i, ++idx)
28373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                {
28473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i),
28573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                                     m_type_mask,
28673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                                     error));
28773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    if (value_sp)
28873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
28973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        if (error.Fail())
29073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            return error;
29173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        if (idx < count)
29273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            m_values[idx] = value_sp;
29373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        else
29473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                            m_values.push_back(value_sp);
29573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    else
29773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    {
29873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        error.SetErrorString("array of complex types must subclass OptionValueArray");
29973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                        return error;
30073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    }
30173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                }
30273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
30373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
30473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        else
30573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
30673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            error.SetErrorString("replace operation takes an array index followed by one or more values");
30773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
30873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
30973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
31073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationAssign:
31173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        m_values.clear();
31273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        // Fall through to append case
31373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationAppend:
31473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        for (size_t i=0; i<argc; ++i)
31573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
31673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            lldb::OptionValueSP value_sp (CreateValueFromCStringForTypeMask (args.GetArgumentAtIndex(i),
31773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                             m_type_mask,
31873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                                                             error));
31973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (value_sp)
32073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
32173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (error.Fail())
32273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    return error;
32373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                m_value_was_set = true;
32473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                AppendValue(value_sp);
32573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
32673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            else
32773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
32873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                error.SetErrorString("array of complex types must subclass OptionValueArray");
32973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
33073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
33173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
33273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
33373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return error;
33473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
33573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
33673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP
33773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueArray::DeepCopy () const
33873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
33973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    OptionValueArray *copied_array = new OptionValueArray (m_type_mask, m_raw_value_dump);
34073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    lldb::OptionValueSP copied_value_sp(copied_array);
34173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    const uint32_t size = m_values.size();
34273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    for (uint32_t i = 0; i<size; ++i)
34373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
34473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        copied_array->AppendValue (m_values[i]->DeepCopy());
34573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
34673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return copied_value_sp;
34773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
34873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
34973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
35073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
351