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