Edit

IABSD.fr/xenocara/xserver/os/strlcpy.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2006-11-26 18:13:41
    Hash : 889b8606
    Message : Importing xserver from X.Org 7.2RC2

  • xserver/os/strlcpy.c
  • /*	$OpenBSD: strlcpy.c,v 1.1.1.1 2006/11/26 18:16:07 matthieu Exp $	*/
    
    /*
     * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
     *
     * Permission to use, copy, modify, and distribute this software for any
     * purpose with or without fee is hereby granted, provided that the above
     * copyright notice and this permission notice appear in all copies.
     *
     * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
     * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
     * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
     * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     */
    /* $XFree86$ */
    
    #ifdef HAVE_XORG_CONFIG_H
    #include <xorg-config.h>
    #endif
    
    #include <sys/types.h>
    #include <string.h>
    
    /*
     * Copy src to string dst of size siz.  At most siz-1 characters
     * will be copied.  Always NUL terminates (unless siz == 0).
     * Returns strlen(src); if retval >= siz, truncation occurred.
     */
    size_t
    strlcpy(char *dst, const char *src, size_t siz)
    {
    	register char *d = dst;
    	register const char *s = src;
    	register size_t n = siz;
    
    	/* Copy as many bytes as will fit */
    	if (n != 0 && --n != 0) {
    		do {
    			if ((*d++ = *s++) == 0)
    				break;
    		} while (--n != 0);
    	}
    
    	/* Not enough room in dst, add NUL and traverse rest of src */
    	if (n == 0) {
    		if (siz != 0)
    			*d = '\0';		/* NUL-terminate dst */
    		while (*s++)
    			;
    	}
    
    	return(s - src - 1);	/* count does not include NUL */
    }