Annotation of researchv10no/cmd/f2c/safstrncpy.c, revision 1.1.1.1

1.1       root        1: /****************************************************************
                      2: Copyright 1990 by AT&T Bell Laboratories and Bellcore.
                      3: 
                      4: Permission to use, copy, modify, and distribute this software
                      5: and its documentation for any purpose and without fee is hereby
                      6: granted, provided that the above copyright notice appear in all
                      7: copies and that both that the copyright notice and this
                      8: permission notice and warranty disclaimer appear in supporting
                      9: documentation, and that the names of AT&T Bell Laboratories or
                     10: Bellcore or any of their entities not be used in advertising or
                     11: publicity pertaining to distribution of the software without
                     12: specific, written prior permission.
                     13: 
                     14: AT&T and Bellcore disclaim all warranties with regard to this
                     15: software, including all implied warranties of merchantability
                     16: and fitness.  In no event shall AT&T or Bellcore be liable for
                     17: any special, indirect or consequential damages or any damages
                     18: whatsoever resulting from loss of use, data or profits, whether
                     19: in an action of contract, negligence or other tortious action,
                     20: arising out of or in connection with the use or performance of
                     21: this software.
                     22: ****************************************************************/
                     23: 
                     24: /* safe_strncpy
                     25: 
                     26:        Copies at most   max_length   characters, stopping at the first   \0
                     27:    character in   source.   The algorithm correctly handles overlapping
                     28:    buffer areas. */
                     29: 
                     30: #include <stdio.h>
                     31: #ifndef NULL
                     32: /* ANSI C */
                     33: #include <stddef.h>
                     34: #endif
                     35: 
                     36: char *safe_strncpy (dest, source, max_length)
                     37: char *dest, *source;
                     38: int max_length;
                     39: {
                     40: 
                     41: /* There are several conditions to be considered in determining buffer
                     42:    area overlap:
                     43: 
                     44:    Buffer Overlap?             Picture         Direction In Which To Copy
                     45: ---------------------------------------------------------------------------
                     46: 1. dest == source         | dest/src |           no copy necessary
                     47:                           ============
                     48: 
                     49: 2. tail of dest against          |   dest | | src   |    left to right
                     50:    head of source        ---------===--------
                     51: 
                     52: 3. head of dest against          |   src | | dest   |    right to left
                     53:    tail of source        --------===---------
                     54: 
                     55: 4. no overlap  |src| |dest|   or   |dest| |src|  either direction
                     56:                ----- ------        ------ -----
                     57: */
                     58: 
                     59:     register char *ret_val = dest;
                     60:     register int real_length;
                     61: 
                     62:     if (source == NULL || dest == NULL)
                     63:        return NULL;
                     64: 
                     65: /* Compute the actual length of the text to be copied */
                     66: 
                     67:     for (real_length = 0; real_length < max_length && source[real_length];
                     68:            real_length++);
                     69: 
                     70: /* Account for condition 3,  dest head v. source tail */
                     71: 
                     72:     if (source + real_length >= dest && source < dest)
                     73:        for (; real_length >= 0; real_length--)
                     74:            dest[real_length] = source[real_length];
                     75: 
                     76: /* Account for conditions 2 and 4,  dest tail v. source head  or no overlap */
                     77: 
                     78:     else if (source != dest)
                     79:        for (; real_length >= 0; real_length--)
                     80:            *dest++ = *source++;
                     81: 
                     82: /* Implicitly handle condition 1, by not performing the copy */
                     83: 
                     84:     return ret_val;
                     85: } /* safe_strncpy */
                     86: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.