// Copyright 2014 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that 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.

#include "android/utils/string.h"

#include <algorithm>

#include <stdlib.h>
#include <string.h>

#if defined(__APPLE__) || defined(__FreeBSD__)

// already defined in C library

#else // __linux__ && _WIN32

// NOTE: linux has this defined in libbsd if we want to switch to
// that some day

size_t strlcpy(char* dst, const char * src, size_t size)
{
    size_t srcLen = strlen(src);
    if (size > 0) {
        size_t copyLen = std::min(srcLen, size-1);
        memcpy(dst, src, copyLen);
        dst[copyLen] = 0;
    }
    return srcLen;
}

#endif

bool str_begins_with(const char* string, const char* prefix) {
    return strncmp(prefix, string, strlen(prefix)) == 0;
}

bool str_ends_with(const char* str, const char* suffix) {
    int str_len = strlen(str);
    int suffix_len = strlen(suffix);
    return (str_len >= suffix_len) &&
           (0 == strcmp(str + (str_len - suffix_len), suffix));
}

const char* str_skip_white_space_if_any(const char* pos) {
    while (isspace(*pos)) {
        pos++;
    }
    return pos;
}

void str_reset(char** string, const char* new_value) {
    ::free(*string);
    *string = new_value ? ::strdup(new_value) : nullptr;
}

void str_reset_nocopy(char** string, char* new_value) {
    ::free(*string);
    *string = new_value;
}

void str_reset_null(char** string) {
    ::free(*string);
    *string = nullptr;
}
