home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gettext-0.10.24-src.tgz / tar.out / fsf / gettext / lib / stpncpy.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  90 lines

  1. /* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
  2.  
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2, or (at your option)
  6. any later version.
  7.  
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12.  
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  16.  
  17. /* This is almost copied from strncpy.c, written by Torbjorn Granlund.  */
  18.  
  19. #ifdef HAVE_CONFIG_H
  20. # include <config.h>
  21. #endif
  22.  
  23. #include <sys/types.h>
  24.  
  25.  
  26. /* Copy no more than N characters of SRC to DEST, returning the address of
  27.    the last character written into DEST.  */
  28. char *
  29. stpncpy (dest, src, n)
  30.      char *dest;
  31.      const char *src;
  32.      size_t n;
  33. {
  34.   char c;
  35.   char *s = dest;
  36.  
  37.   --dest;
  38.  
  39.   if (n >= 4)
  40.     {
  41.       size_t n4 = n >> 2;
  42.  
  43.       for (;;)
  44.     {
  45.       c = *src++;
  46.       *++dest = c;
  47.       if (c == '\0')
  48.         break;
  49.       c = *src++;
  50.       *++dest = c;
  51.       if (c == '\0')
  52.         break;
  53.       c = *src++;
  54.       *++dest = c;
  55.       if (c == '\0')
  56.         break;
  57.       c = *src++;
  58.       *++dest = c;
  59.       if (c == '\0')
  60.         break;
  61.       if (--n4 == 0)
  62.         goto last_chars;
  63.     }
  64.       n = n - (dest - s) - 1;
  65.       if (n == 0)
  66.     return dest;
  67.       goto zero_fill;
  68.     }
  69.  
  70.  last_chars:
  71.   n &= 3;
  72.   if (n == 0)
  73.     return dest;
  74.  
  75.   do
  76.     {
  77.       c = *src++;
  78.       *++dest = c;
  79.       if (--n == 0)
  80.     return dest;
  81.     }
  82.   while (c != '\0');
  83.  
  84.  zero_fill:
  85.   while (n-- > 0)
  86.     dest[n] = '\0';
  87.  
  88.   return dest;
  89. }
  90.