Subversion Repositories f9daq

Rev

Rev 197 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
195 f9daq 1
/********************************************************************\
2
 
3
   Name:         strlcpy.c
4
   Created by:   Stefan Ritt
5
   Copyright 2000 + Stefan Ritt
6
 
7
   Contents:     Contains strlcpy and strlcat which are versions of
8
                 strcpy and strcat, but which avoid buffer overflows
9
 
10
 
11
  This file is part of MIDAS XML Library.
12
 
13
  MIDAS XML Library is free software: you can redistribute it and/or modify
14
  it under the terms of the GNU General Public License as published by
15
  the Free Software Foundation, either version 3 of the License, or
16
  (at your option) any later version.
17
 
18
  MIDAS XML Library is distributed in the hope that it will be useful,
19
  but WITHOUT ANY WARRANTY; without even the implied warranty of
20
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
  GNU General Public License for more details.
22
 
23
  You should have received a copy of the GNU General Public License
24
  along with MIDAS XML Library.  If not, see <http://www.gnu.org/licenses/>.
25
 
26
\********************************************************************/
27
 
28
#include <stdio.h>
29
#include <string.h>
30
#include "strlcpy.h"
31
 
32
/*
33
* Copy src to string dst of size siz.  At most siz-1 characters
34
* will be copied.  Always NUL terminates (unless size == 0).
35
* Returns strlen(src); if retval >= siz, truncation occurred.
36
*/
37
#ifndef STRLCPY_DEFINED
38
 
39
size_t strlcpy(char *dst, const char *src, size_t size)
40
{
41
   char *d = dst;
42
   const char *s = src;
43
   size_t n = size;
44
 
45
   /* Copy as many bytes as will fit */
46
   if (n != 0 && --n != 0) {
47
      do {
48
         if ((*d++ = *s++) == 0)
49
            break;
50
      } while (--n != 0);
51
   }
52
 
53
   /* Not enough room in dst, add NUL and traverse rest of src */
54
   if (n == 0) {
55
      if (size != 0)
56
         *d = '\0';             /* NUL-terminate dst */
57
      while (*s++);
58
   }
59
 
60
   return (s - src - 1);        /* count does not include NUL */
61
}
62
 
63
/*-------------------------------------------------------------------*/
64
 
65
/*
66
* Appends src to string dst of size siz (unlike strncat, siz is the
67
* full size of dst, not space left).  At most siz-1 characters
68
* will be copied.  Always NUL terminates (unless size <= strlen(dst)).
69
* Returns strlen(src) + MIN(size, strlen(initial dst)).
70
* If retval >= size, truncation occurred.
71
*/
72
size_t strlcat(char *dst, const char *src, size_t size)
73
{
74
   char *d = dst;
75
   const char *s = src;
76
   size_t n = size;
77
   size_t dlen;
78
 
79
   /* Find the end of dst and adjust bytes left but don't go past end */
80
   while (n-- != 0 && *d != '\0')
81
      d++;
82
   dlen = d - dst;
83
   n = size - dlen;
84
 
85
   if (n == 0)
86
      return (dlen + strlen(s));
87
   while (*s != '\0') {
88
      if (n != 1) {
89
         *d++ = *s;
90
         n--;
91
      }
92
      s++;
93
   }
94
   *d = '\0';
95
 
96
   return (dlen + (s - src));   /* count does not include NUL */
97
}
98
 
99
/*-------------------------------------------------------------------*/
100
 
101
#endif // STRLCPY_DEFINED