/*
 * Copyright 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_AUDIO_STRING_H
#define ANDROID_AUDIO_STRING_H

#include <string.h>
#ifndef __ANDROID__
#include <cutils/memory.h>
#endif

/** similar to strlcpy but also zero fills to end of string buffer, ensures no data leak
    in parceled data sent over binder.*/
inline size_t audio_utils_strlcpy_zerofill(char *dst, const char *src, size_t dst_size) {
    const size_t srclen = strlcpy(dst, src, dst_size);
    const size_t srclen_with_zero = srclen + 1; /* include zero termination in length. */
    if (srclen_with_zero < dst_size) {
        const size_t num_zeroes = dst_size - srclen_with_zero;
        memset(dst + srclen_with_zero, 0 /* value */, num_zeroes); /* clear remaining buffer */
    }
    return srclen;
}

#ifdef __cplusplus

/** similar to audio_utils_strlcpy_zerofill for fixed size destination string. */
template <size_t size>
inline size_t audio_utils_strlcpy_zerofill(char (&dst)[size], const char *src) {
    return audio_utils_strlcpy_zerofill(dst, src, size);
}

/** similar to strlcpy for fixed size destination string. */
template <size_t size>
inline size_t audio_utils_strlcpy(char (&dst)[size], const char *src) {
    return strlcpy(dst, src, size);
}

#endif // __cplusplus

#endif // !ANDROID_AUDIO_STRING_H
