Back to index

glibc  2.9
wcpncpy.c
Go to the documentation of this file.
00001 /* Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc.
00002    This file is part of the GNU C Library.
00003    Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
00004 
00005    The GNU C Library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Lesser General Public
00007    License as published by the Free Software Foundation; either
00008    version 2.1 of the License, or (at your option) any later version.
00009 
00010    The GNU C Library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Lesser General Public License for more details.
00014 
00015    You should have received a copy of the GNU Lesser General Public
00016    License along with the GNU C Library; if not, write to the Free
00017    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00018    02111-1307 USA.  */
00019 
00020 #include <wchar.h>
00021 
00022 
00023 /* Copy no more than N wide-characters of SRC to DEST, returning the
00024    address of the last character written into DEST.  */
00025 wchar_t *
00026 __wcpncpy (dest, src, n)
00027      wchar_t *dest;
00028      const wchar_t *src;
00029      size_t n;
00030 {
00031   wint_t c;
00032   wchar_t *const s = dest;
00033 
00034   if (n >= 4)
00035     {
00036       size_t n4 = n >> 2;
00037 
00038       for (;;)
00039        {
00040          c = *src++;
00041          *dest++ = c;
00042          if (c == L'\0')
00043            break;
00044          c = *src++;
00045          *dest++ = c;
00046          if (c == L'\0')
00047            break;
00048          c = *src++;
00049          *dest++ = c;
00050          if (c == L'\0')
00051            break;
00052          c = *src++;
00053          *dest++ = c;
00054          if (c == L'\0')
00055            break;
00056          if (--n4 == 0)
00057            goto last_chars;
00058        }
00059       n -= dest - s;
00060       goto zero_fill;
00061     }
00062 
00063  last_chars:
00064   n &= 3;
00065   if (n == 0)
00066     return dest;
00067 
00068   for (;;)
00069     {
00070       c = *src++;
00071       --n;
00072       *dest++ = c;
00073       if (c == L'\0')
00074        break;
00075       if (n == 0)
00076        return dest;
00077     }
00078 
00079  zero_fill:
00080   while (n-- > 0)
00081     dest[n] = L'\0';
00082 
00083   return dest - 1;
00084 }
00085 
00086 weak_alias (__wcpncpy, wcpncpy)