home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / ncftp-2.3.0-base.tgz / ncftp-2.3.0-base.tar / contrib / ncftp / Strn.c < prev    next >
C/C++ Source or Header  |  1995-05-28  |  2KB  |  80 lines

  1. #include <string.h>
  2. #include <sys/types.h>
  3. #include "Strn.h"
  4.  
  5. /*
  6.  * Concatenate src on the end of dst.  The resulting string will have at most
  7.  * n-1 characters, not counting the NUL terminator which is always appended
  8.  * unlike strncat.  The other big difference is that strncpy uses n as the
  9.  * max number of characters _appended_, while this routine uses n to limit
  10.  * the overall length of dst.
  11.  */
  12. char *Strncat(char *dst, char *src, size_t n)
  13. {
  14.     register size_t i;
  15.     register char *d, *s;
  16.  
  17.     if (n != 0 && ((i = strlen(dst)) < (n - 1))) {
  18.         d = dst + i;
  19.         s = src;
  20.         /* If they specified a maximum of n characters, use n - 1 chars to
  21.          * hold the copy, and the last character in the array as a NUL.
  22.          * This is the difference between the regular strncpy routine.
  23.          * strncpy doesn't guarantee that your new string will have a
  24.          * NUL terminator, but this routine does.
  25.          */
  26.         for (++i; i<n; i++) {
  27.             if ((*d++ = *s++) == 0) {
  28.                 /* Pad with zeros. */
  29.                 for (; i<n; i++)
  30.                     *d++ = 0;
  31.                 return dst;
  32.             }
  33.         }
  34.         /* If we get here, then we have a full string, with n - 1 characters,
  35.          * so now we NUL terminate it and go home.
  36.          */
  37.         *d = 0;
  38.     }
  39.     return (dst);
  40. }    /* Strncat */
  41.  
  42.  
  43. /*
  44.  * Copy src to dst, truncating or null-padding to always copy n-1 bytes.
  45.  * Return dst.
  46.  */
  47. char *Strncpy(char *dst, char *src, size_t n)
  48. {
  49.     register char *d;
  50.     register char *s;
  51.     register size_t i;
  52.  
  53.     d = dst;
  54.     *d = 0;
  55.     if (n != 0) {
  56.         s = src;
  57.         /* If they specified a maximum of n characters, use n - 1 chars to
  58.          * hold the copy, and the last character in the array as a NUL.
  59.          * This is the difference between the regular strncpy routine.
  60.          * strncpy doesn't guarantee that your new string will have a
  61.          * NUL terminator, but this routine does.
  62.          */
  63.         for (i=1; i<n; i++) {
  64.             if ((*d++ = *s++) == 0) {
  65.                 /* Pad with zeros. */
  66.                 for (; i<n; i++)
  67.                     *d++ = 0;
  68.                 return dst;
  69.             }
  70.         }
  71.         /* If we get here, then we have a full string, with n - 1 characters,
  72.          * so now we NUL terminate it and go home.
  73.          */
  74.         *d = 0;
  75.     }
  76.     return (dst);
  77. }    /* Strncpy */
  78.  
  79. /* eof Strn.c */
  80.