//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// cl_utils.cpp: Helper functions for the CL back end
//

#include "libANGLE/renderer/cl/cl_util.h"
#include "common/unsafe_buffers.h"

#include "libANGLE/Debug.h"

#include <cstdlib>

namespace rx
{

cl_version ExtractCLVersion(const std::string &version)
{
    const std::string::size_type spacePos = version.find(' ');
    const std::string::size_type dotPos   = version.find('.');
    if (spacePos == std::string::npos || dotPos == std::string::npos)
    {
        ERR() << "Failed to extract version from OpenCL version string: " << version;
        return 0u;
    }

    const long major = ANGLE_UNSAFE_TODO(std::strtol(&version[spacePos + 1u], nullptr, 10));
    const long minor = ANGLE_UNSAFE_TODO(std::strtol(&version[dotPos + 1u], nullptr, 10));
    if (major < 1 || major > 9 || minor < 0 || minor > 9)
    {
        ERR() << "Failed to extract version from OpenCL version string: " << version;
        return 0u;
    }
    return CL_MAKE_VERSION(static_cast<cl_uint>(major), static_cast<cl_uint>(minor), 0);
}

void RemoveUnsupportedCLExtensions(std::string &extensions)
{
    if (extensions.empty())
    {
        return;
    }
    using SizeT    = std::string::size_type;
    SizeT extStart = 0u;
    SizeT spacePos = extensions.find(' ');

    // Remove all unsupported extensions which are terminated by a space
    while (spacePos != std::string::npos)
    {
        const SizeT length = spacePos - extStart;
        if (IsCLExtensionSupported(extensions.substr(extStart, length)))
        {
            extStart = spacePos + 1u;
        }
        else
        {
            extensions.erase(extStart, length + 1u);
        }
        spacePos = extensions.find(' ', extStart);
    }

    // Remove last extension in string, if exists and unsupported
    if (extStart < extensions.length())
    {
        const SizeT length = extensions.length() - extStart;
        if (!IsCLExtensionSupported(extensions.substr(extStart, length)))
        {
            extensions.erase(extStart, length);
        }
    }

    // Remove trailing spaces
    while (!extensions.empty() && extensions.back() == ' ')
    {
        extensions.pop_back();
    }
}

void RemoveUnsupportedCLExtensions(NameVersionVector &extensions)
{
    auto extIt = extensions.cbegin();
    while (extIt != extensions.cend())
    {
        if (IsCLExtensionSupported(extIt->name))
        {
            ++extIt;
        }
        else
        {
            extIt = extensions.erase(extIt);
        }
    }
}

}  // namespace rx
