/* * Copyright (c) Atmosphère-NX * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include namespace ams::util { template constexpr T ToLower(T c) { return ('A' <= c && c <= 'Z') ? (c - 'A' + 'a') : c; } template constexpr T ToUpper(T c) { return ('a' <= c && c <= 'z') ? (c - 'a' + 'A') : c; } template constexpr int Strncmp(const T *lhs, const T *rhs, int count) { AMS_ASSERT(lhs != nullptr); AMS_ASSERT(rhs != nullptr); AMS_ABORT_UNLESS(count >= 0); if (count == 0) { return 0; } T l, r; do { l = *(lhs++); r = *(rhs++); } while (l && (l == r) && (--count)); return l - r; } template constexpr int Strnicmp(const T *lhs, const T *rhs, int count) { AMS_ASSERT(lhs != nullptr); AMS_ASSERT(rhs != nullptr); AMS_ABORT_UNLESS(count >= 0); if (count == 0) { return 0; } T l, r; do { l = ::ams::util::ToLower(*(lhs++)); r = ::ams::util::ToLower(*(rhs++)); } while (l && (l == r) && (--count)); return l - r; } template constexpr int Strlcpy(T *dst, const T *src, int count) { AMS_ASSERT(dst != nullptr); AMS_ASSERT(src != nullptr); const T *cur = src; if (count > 0) { while ((--count) && *cur) { *(dst++) = *(cur++); } *dst = 0; } while (*cur) { cur++; } return static_cast(cur - src); } template constexpr int Strnlen(const T *str, int count) { AMS_ASSERT(str != nullptr); AMS_ASSERT(count >= 0); int length = 0; while (count-- && *str++) { ++length; } return length; } }