diff options
Diffstat (limited to 'drivers/staging/media/atomisp/pci/hive_isp_css_include/string_support.h')
-rw-r--r-- | drivers/staging/media/atomisp/pci/hive_isp_css_include/string_support.h | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/drivers/staging/media/atomisp/pci/hive_isp_css_include/string_support.h b/drivers/staging/media/atomisp/pci/hive_isp_css_include/string_support.h new file mode 100644 index 000000000000..84efbbe78650 --- /dev/null +++ b/drivers/staging/media/atomisp/pci/hive_isp_css_include/string_support.h @@ -0,0 +1,165 @@ +/* + * Support for Intel Camera Imaging ISP subsystem. + * Copyright (c) 2015, Intel Corporation. + * + * 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. + */ + +#ifndef __STRING_SUPPORT_H_INCLUDED__ +#define __STRING_SUPPORT_H_INCLUDED__ +#include <platform_support.h> +#include <type_support.h> + +/* + * For all non microsoft cases, we need the following functions + */ + +/* @brief Copy from src_buf to dest_buf. + * + * @param[out] dest_buf. Destination buffer to copy to + * @param[in] dest_size. The size of the destination buffer in bytes + * @param[in] src_buf. The source buffer + * @param[in] src_size. The size of the source buffer in bytes + * @return 0 on success, error code on failure + * @return EINVAL on Invalid arguments + * @return ERANGE on Destination size too small + */ +static inline int memcpy_s( + void *dest_buf, + size_t dest_size, + const void *src_buf, + size_t src_size) +{ + if ((!src_buf) || (!dest_buf)) { + /* Invalid arguments*/ + return EINVAL; + } + + if ((dest_size < src_size) || (src_size == 0)) { + /* Destination too small*/ + return ERANGE; + } + + memcpy(dest_buf, src_buf, src_size); + return 0; +} + +/* @brief Get the length of the string, excluding the null terminator + * + * @param[in] src_str. The source string + * @param[in] max_len. Look only for max_len bytes in the string + * @return Return the string length excluding null character + * @return Return max_len if no null character in the first max_len bytes + * @return Returns 0 if src_str is NULL + */ +static size_t strnlen_s( + const char *src_str, + size_t max_len) +{ + size_t ix; + + if (!src_str) { + /* Invalid arguments*/ + return 0; + } + + for (ix = 0; ix < max_len && src_str[ix] != '\0'; ix++) + ; + + /* On Error, it will return src_size == max_len*/ + return ix; +} + +/* @brief Copy string from src_str to dest_str + * + * @param[out] dest_str. Destination buffer to copy to + * @param[in] dest_size. The size of the destination buffer in bytes + * @param[in] src_str. The source buffer + * @param[in] src_size. The size of the source buffer in bytes + * @return Returns 0 on success + * @return Returns EINVAL on invalid arguments + * @return Returns ERANGE on destination size too small + */ +static inline int strncpy_s( + char *dest_str, + size_t dest_size, + const char *src_str, + size_t src_size) +{ + size_t len; + + if (!dest_str) { + /* Invalid arguments*/ + return EINVAL; + } + + if ((!src_str) || (dest_size == 0)) { + /* Invalid arguments*/ + dest_str[0] = '\0'; + return EINVAL; + } + + len = strnlen_s(src_str, src_size); + + if (len >= dest_size) { + /* Destination too small*/ + dest_str[0] = '\0'; + return ERANGE; + } + + /* dest_str is big enough for the len */ + strncpy(dest_str, src_str, len); + dest_str[len] = '\0'; + return 0; +} + +/* @brief Copy string from src_str to dest_str + * + * @param[out] dest_str. Destination buffer to copy to + * @param[in] dest_size. The size of the destination buffer in bytes + * @param[in] src_str. The source buffer + * @return Returns 0 on success + * @return Returns EINVAL on invalid arguments + * @return Returns ERANGE on destination size too small + */ +static inline int strcpy_s( + char *dest_str, + size_t dest_size, + const char *src_str) +{ + size_t len; + + if (!dest_str) { + /* Invalid arguments*/ + return EINVAL; + } + + if ((!src_str) || (dest_size == 0)) { + /* Invalid arguments*/ + dest_str[0] = '\0'; + return EINVAL; + } + + len = strnlen_s(src_str, dest_size); + + if (len >= dest_size) { + /* Destination too small*/ + dest_str[0] = '\0'; + return ERANGE; + } + + /* dest_str is big enough for the len */ + strncpy(dest_str, src_str, len); + dest_str[len] = '\0'; + return 0; +} + + +#endif /* __STRING_SUPPORT_H_INCLUDED__ */ |