Initial revision
[kopensolaris-gnu/glibc.git] / sysdeps / generic / strncat.c
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 1, or (at your option)
7 any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the GNU C Library; see the file COPYING.  If not, write to
16 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #include <ansidecl.h>
19 #include <string.h>
20 #include <memcopy.h>
21
22 char *
23 DEFUN(strncat, (s1, s2, n), char *s1 AND CONST char *s2 AND size_t n)
24 {
25   reg_char c;
26   char *s = s1;
27
28   /* Find the end of S1.  */
29   do
30     c = *s1++;
31   while (c != '\0');
32
33   /* Make S1 point before next character, so we can increment
34      it while memory is read (wins on pipelined cpus).  */
35   s1 -= 2;
36
37   if (n >= 4)
38     {
39       size_t n4 = n >> 2;
40       do
41         {
42           c = *s2++;
43           *++s1 = c;
44           if (c == '\0')
45             return s;
46           c = *s2++;
47           *++s1 = c;
48           if (c == '\0')
49             return s;
50           c = *s2++;
51           *++s1 = c;
52           if (c == '\0')
53             return s;
54           c = *s2++;
55           *++s1 = c;
56           if (c == '\0')
57             return s;
58         } while (--n4 > 0);
59       n &= 3;
60     }
61
62   while (n > 0)
63     {
64       c = *s2++;
65       *++s1 = c;
66       if (c == '\0')
67         return s;
68       n--;
69     }
70
71   if (c != '\0')
72     *++s1 = '\0';
73
74   return s;
75 }