13bbbec1aSMichael Jones //===-- Implementation of strndup -----------------------------------------===// 23bbbec1aSMichael Jones // 33bbbec1aSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43bbbec1aSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 53bbbec1aSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63bbbec1aSMichael Jones // 73bbbec1aSMichael Jones //===----------------------------------------------------------------------===// 83bbbec1aSMichael Jones 93bbbec1aSMichael Jones #include "src/string/strndup.h" 107b59fcb7SSiva Chandra Reddy #include "src/string/memory_utils/memcpy_implementations.h" 113bbbec1aSMichael Jones #include "src/string/string_utils.h" 123bbbec1aSMichael Jones 133bbbec1aSMichael Jones #include "src/__support/common.h" 143bbbec1aSMichael Jones 153bbbec1aSMichael Jones #include <stddef.h> 163bbbec1aSMichael Jones #include <stdlib.h> 173bbbec1aSMichael Jones 183bbbec1aSMichael Jones namespace __llvm_libc { 193bbbec1aSMichael Jones 203bbbec1aSMichael Jones LLVM_LIBC_FUNCTION(char *, strndup, (const char *src, size_t size)) { 213bbbec1aSMichael Jones if (src == nullptr) 223bbbec1aSMichael Jones return nullptr; 233bbbec1aSMichael Jones size_t len = internal::string_length(src); 243bbbec1aSMichael Jones if (len > size) 253bbbec1aSMichael Jones len = size; 26*155f5a6dSMichael Jones char *dest = reinterpret_cast<char *>(::malloc(len + 1)); 273bbbec1aSMichael Jones if (dest == nullptr) 283bbbec1aSMichael Jones return nullptr; 297b59fcb7SSiva Chandra Reddy inline_memcpy(dest, src, len + 1); 307b59fcb7SSiva Chandra Reddy dest[len] = '\0'; 317b59fcb7SSiva Chandra Reddy return dest; 323bbbec1aSMichael Jones } 333bbbec1aSMichael Jones 343bbbec1aSMichael Jones } // namespace __llvm_libc 35