// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <gpt/gpt.h>
#include <gpt/guid.h>

namespace gpt {

// GUID_*_VALUE are brace-enclosed values {1, 2,..}. Function arguments
// cannot be brace-enclosed initializer. So here we convert VALUE to a
// constexpr
#define GUID_MAKE_ARRAY(name) \
    constexpr uint8_t GUID_##name##_ARRAY[GPT_GUID_LEN] = GUID_##name##_VALUE

GUID_MAKE_ARRAY(EMPTY);
GUID_MAKE_ARRAY(EFI);
GUID_MAKE_ARRAY(SYSTEM);
GUID_MAKE_ARRAY(DATA);
GUID_MAKE_ARRAY(INSTALL);
GUID_MAKE_ARRAY(BLOB);
GUID_MAKE_ARRAY(FVM);
GUID_MAKE_ARRAY(ZIRCON_A);
GUID_MAKE_ARRAY(ZIRCON_B);
GUID_MAKE_ARRAY(ZIRCON_R);
GUID_MAKE_ARRAY(SYS_CONFIG);
GUID_MAKE_ARRAY(FACTORY_CONFIG);
GUID_MAKE_ARRAY(BOOTLOADER);
GUID_MAKE_ARRAY(TEST);
GUID_MAKE_ARRAY(VBMETA_A);
GUID_MAKE_ARRAY(VBMETA_B);
GUID_MAKE_ARRAY(CROS_KERNEL);
GUID_MAKE_ARRAY(CROS_ROOTFS);
GUID_MAKE_ARRAY(CROS_RESERVED);
GUID_MAKE_ARRAY(CROS_FIRMWARE);
GUID_MAKE_ARRAY(CROS_DATA);
GUID_MAKE_ARRAY(BIOS);

#define GUID_NAMETAB(name)                                                                         \
    GuidProperties(GUID_##name##_NAME, GUID_##name##_STRING, GUID_##name##_ARRAY)

// clang-format off
std::array<GuidProperties, kKnownGuidEntries> const KnownGuid::nametab_ = {{
    GUID_NAMETAB(EMPTY),
    GUID_NAMETAB(EFI),
    GUID_NAMETAB(SYSTEM),
    GUID_NAMETAB(DATA),
    GUID_NAMETAB(INSTALL),
    GUID_NAMETAB(BLOB),
    GUID_NAMETAB(FVM),
    GUID_NAMETAB(ZIRCON_A),
    GUID_NAMETAB(ZIRCON_B),
    GUID_NAMETAB(ZIRCON_R),
    GUID_NAMETAB(SYS_CONFIG),
    GUID_NAMETAB(FACTORY_CONFIG),
    GUID_NAMETAB(BOOTLOADER),
    GUID_NAMETAB(TEST),
    GUID_NAMETAB(VBMETA_A),
    GUID_NAMETAB(VBMETA_B),
    GUID_NAMETAB(CROS_KERNEL),
    GUID_NAMETAB(CROS_ROOTFS),
    GUID_NAMETAB(CROS_RESERVED),
    GUID_NAMETAB(CROS_FIRMWARE),
    GUID_NAMETAB(CROS_DATA),
    GUID_NAMETAB(BIOS),
}};
// clang-format on

// Match keywords (like GUID_SYSTEM_NAME) and convert them to their
// corresponding byte sequences. 'out' should point to a GPT_GUID_LEN array.
// Return false if no match if found.
bool KnownGuid::NameToGuid(const char* name, uint8_t* out) {
    if (name == NULL) {
        return false;
    }

    for (auto const& guidp : nametab_) {
        if (!strcmp(name, guidp.name())) {
            memcpy(out, guidp.guid(), GPT_GUID_LEN);
            return true;
        }
    }

    return false;
}

const char* KnownGuid::GuidToName(const uint8_t* guid) {
    if (guid == NULL) {
        return nullptr;
    }

    for (auto const& guidp : nametab_) {
        if (memcmp(guidp.guid(), guid, sizeof(guid_t)) == 0) {
            return guidp.name();
        }
    }
    return nullptr;
}

const char* KnownGuid::GuidStrToName(const char* str) {
    if (str == NULL) {
        return nullptr;
    }

    for (auto const& guidp : nametab_) {
        if (strcmp(guidp.str(), str) == 0) {
            return guidp.name();
        }
    }
    return nullptr;
}

} // namespace gpt
