1*db8a88feSMichael Jones //===-- Implementation of memccpy ----------------------------------------===// 2*db8a88feSMichael Jones // 3*db8a88feSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*db8a88feSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 5*db8a88feSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*db8a88feSMichael Jones // 7*db8a88feSMichael Jones //===----------------------------------------------------------------------===// 8*db8a88feSMichael Jones 9*db8a88feSMichael Jones #include "src/string/memccpy.h" 10*db8a88feSMichael Jones 11*db8a88feSMichael Jones #include "src/__support/common.h" 12*db8a88feSMichael Jones #include <stddef.h> // For size_t. 13*db8a88feSMichael Jones 14*db8a88feSMichael Jones namespace __llvm_libc { 15*db8a88feSMichael Jones 16*db8a88feSMichael Jones LLVM_LIBC_FUNCTION(void *, memccpy, 17*db8a88feSMichael Jones (void *__restrict dest, const void *__restrict src, int c, 18*db8a88feSMichael Jones size_t count)) { 19*db8a88feSMichael Jones unsigned char end = static_cast<unsigned char>(c); 20*db8a88feSMichael Jones const unsigned char *ucSrc = static_cast<const unsigned char *>(src); 21*db8a88feSMichael Jones unsigned char *ucDest = static_cast<unsigned char *>(dest); 22*db8a88feSMichael Jones size_t i = 0; 23*db8a88feSMichael Jones // Copy up until end is found. 24*db8a88feSMichael Jones for (; i < count && ucSrc[i] != end; ++i) 25*db8a88feSMichael Jones ucDest[i] = ucSrc[i]; 26*db8a88feSMichael Jones // if i < count, then end must have been found, so copy end into dest and 27*db8a88feSMichael Jones // return the byte after. 28*db8a88feSMichael Jones if (i < count) { 29*db8a88feSMichael Jones ucDest[i] = ucSrc[i]; 30*db8a88feSMichael Jones return ucDest + i + 1; 31*db8a88feSMichael Jones } 32*db8a88feSMichael Jones return nullptr; 33*db8a88feSMichael Jones } 34*db8a88feSMichael Jones 35*db8a88feSMichael Jones } // namespace __llvm_libc 36