sourcepawn/compiler/lstring.c
author David Anderson <dvander@alliedmods.net>
Sat Jul 15 05:15:15 2006 +0000 (2006-07-15)
changeset 27 764c6dd3dc25
permissions -rw-r--r--
stupid, moved up one dir
dvander@27
     1
/* Safe string copying and concatenation
dvander@27
     2
 * These routines are originally distributed in two separate files. I have
dvander@27
     3
 * copied the files verbatim in this single source file, including all comments.
dvander@27
     4
 * The only change is that the second set of include files is commented out
dvander@27
     5
 * (there is no need to include the same files twice).
dvander@27
     6
 */
dvander@27
     7
dvander@27
     8
#include "lstring.h"
dvander@27
     9
dvander@27
    10
#if !defined HAVE_SAFESTR
dvander@27
    11
dvander@27
    12
/*	$OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $	*/
dvander@27
    13
dvander@27
    14
/*
dvander@27
    15
 * Copyright (c) 1998 Todd C. Miller <[email protected]>
dvander@27
    16
 *
dvander@27
    17
 * Permission to use, copy, modify, and distribute this software for any
dvander@27
    18
 * purpose with or without fee is hereby granted, provided that the above
dvander@27
    19
 * copyright notice and this permission notice appear in all copies.
dvander@27
    20
 *
dvander@27
    21
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
dvander@27
    22
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
dvander@27
    23
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
dvander@27
    24
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
dvander@27
    25
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
dvander@27
    26
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
dvander@27
    27
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
dvander@27
    28
 */
dvander@27
    29
dvander@27
    30
/*
dvander@27
    31
  #include <sys/types.h>  already included through lstring.h
dvander@27
    32
 */
dvander@27
    33
#include <string.h>   /* for strlen() */
dvander@27
    34
dvander@27
    35
/*
dvander@27
    36
 * Copy src to string dst of size siz.  At most siz-1 characters
dvander@27
    37
 * will be copied.  Always NUL terminates (unless siz == 0).
dvander@27
    38
 * Returns strlen(src); if retval >= siz, truncation occurred.
dvander@27
    39
 */
dvander@27
    40
size_t
dvander@27
    41
strlcpy(char *dst, const char *src, size_t siz)
dvander@27
    42
{
dvander@27
    43
	char *d = dst;
dvander@27
    44
	const char *s = src;
dvander@27
    45
	size_t n = siz;
dvander@27
    46
dvander@27
    47
	/* Copy as many bytes as will fit */
dvander@27
    48
	if (n != 0 && --n != 0) {
dvander@27
    49
		do {
dvander@27
    50
			if ((*d++ = *s++) == 0)
dvander@27
    51
				break;
dvander@27
    52
		} while (--n != 0);
dvander@27
    53
	}
dvander@27
    54
dvander@27
    55
	/* Not enough room in dst, add NUL and traverse rest of src */
dvander@27
    56
	if (n == 0) {
dvander@27
    57
		if (siz != 0)
dvander@27
    58
			*d = '\0';		/* NUL-terminate dst */
dvander@27
    59
		while (*s++)
dvander@27
    60
			;
dvander@27
    61
	}
dvander@27
    62
dvander@27
    63
	return(s - src - 1);	/* count does not include NUL */
dvander@27
    64
}
dvander@27
    65
dvander@27
    66
/*	$OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $	*/
dvander@27
    67
dvander@27
    68
/*
dvander@27
    69
 * Copyright (c) 1998 Todd C. Miller <[email protected]>
dvander@27
    70
 *
dvander@27
    71
 * Permission to use, copy, modify, and distribute this software for any
dvander@27
    72
 * purpose with or without fee is hereby granted, provided that the above
dvander@27
    73
 * copyright notice and this permission notice appear in all copies.
dvander@27
    74
 *
dvander@27
    75
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
dvander@27
    76
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
dvander@27
    77
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
dvander@27
    78
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
dvander@27
    79
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
dvander@27
    80
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
dvander@27
    81
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
dvander@27
    82
 */
dvander@27
    83
dvander@27
    84
/*
dvander@27
    85
  #include <sys/types.h>    already included
dvander@27
    86
  #include <string.h>       already included
dvander@27
    87
*/
dvander@27
    88
dvander@27
    89
/*
dvander@27
    90
 * Appends src to string dst of size siz (unlike strncat, siz is the
dvander@27
    91
 * full size of dst, not space left).  At most siz-1 characters
dvander@27
    92
 * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
dvander@27
    93
 * Returns strlen(src) + MIN(siz, strlen(initial dst)).
dvander@27
    94
 * If retval >= siz, truncation occurred.
dvander@27
    95
 */
dvander@27
    96
size_t
dvander@27
    97
strlcat(char *dst, const char *src, size_t siz)
dvander@27
    98
{
dvander@27
    99
	char *d = dst;
dvander@27
   100
	const char *s = src;
dvander@27
   101
	size_t n = siz;
dvander@27
   102
	size_t dlen;
dvander@27
   103
dvander@27
   104
	/* Find the end of dst and adjust bytes left but don't go past end */
dvander@27
   105
	while (n-- != 0 && *d != '\0')
dvander@27
   106
		d++;
dvander@27
   107
	dlen = d - dst;
dvander@27
   108
	n = siz - dlen;
dvander@27
   109
dvander@27
   110
	if (n == 0)
dvander@27
   111
		return(dlen + strlen(s));
dvander@27
   112
	while (*s != '\0') {
dvander@27
   113
		if (n != 1) {
dvander@27
   114
			*d++ = *s;
dvander@27
   115
			n--;
dvander@27
   116
		}
dvander@27
   117
		s++;
dvander@27
   118
	}
dvander@27
   119
	*d = '\0';
dvander@27
   120
dvander@27
   121
	return(dlen + (s - src));	/* count does not include NUL */
dvander@27
   122
}
dvander@27
   123
dvander@27
   124
#endif /* #if !defined HAVE_SAFESTR */