//===-- StringConvert.cpp ---------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// C Includes
#include <stdlib.h>

// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Host/StringConvert.h"

namespace lldb_private
{
    namespace StringConvert
    {

        int32_t
        ToSInt32 (const char *s, int32_t fail_value, int base, bool *success_ptr)
        {
            if (s && s[0])
            {
                char *end = nullptr;
                const long sval = ::strtol (s, &end, base);
                if (*end == '\0')
                {
                    if (success_ptr)
                        *success_ptr = ((sval <= INT32_MAX) && (sval >= INT32_MIN));
                    return (int32_t)sval; // All characters were used, return the result
                }
            }
            if (success_ptr)
                *success_ptr = false;
            return fail_value;
        }

        uint32_t
        ToUInt32 (const char *s, uint32_t fail_value, int base, bool *success_ptr)
        {
            if (s && s[0])
            {
                char *end = nullptr;
                const unsigned long uval = ::strtoul (s, &end, base);
                if (*end == '\0')
                {
                    if (success_ptr)
                        *success_ptr = (uval <= UINT32_MAX);
                    return (uint32_t)uval; // All characters were used, return the result
                }
            }
            if (success_ptr)
                *success_ptr = false;
            return fail_value;
        }

        int64_t
        ToSInt64 (const char *s, int64_t fail_value, int base, bool *success_ptr)
        {
            if (s && s[0])
            {
                char *end = nullptr;
                int64_t uval = ::strtoll (s, &end, base);
                if (*end == '\0')
                {
                    if (success_ptr)
                        *success_ptr = true;
                    return uval; // All characters were used, return the result
                }
            }
            if (success_ptr)
                *success_ptr = false;
            return fail_value;
        }

        uint64_t
        ToUInt64 (const char *s, uint64_t fail_value, int base, bool *success_ptr)
        {
            if (s && s[0])
            {
                char *end = nullptr;
                uint64_t uval = ::strtoull (s, &end, base);
                if (*end == '\0')
                {
                    if (success_ptr)
                        *success_ptr = true;
                    return uval; // All characters were used, return the result
                }
            }
            if (success_ptr) *success_ptr = false;
            return fail_value;
        }

        double
        ToDouble (const char *s, double fail_value, bool *success_ptr)
        {
            if (s && s[0])
            {
                char *end = nullptr;
                double val = strtod (s, &end);
                if (*end == '\0')
                {
                    if (success_ptr)
                        *success_ptr = true;
                    return val; // All characters were used, return the result
                }
            }
            if (success_ptr)
                *success_ptr = false;
            return fail_value;
        }
    }
}
