summaryrefslogtreecommitdiff
path: root/sysdeps/generic/stpncpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/generic/stpncpy.c')
-rw-r--r--sysdeps/generic/stpncpy.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/sysdeps/generic/stpncpy.c b/sysdeps/generic/stpncpy.c
index 5cdd93d19e..427ed4b228 100644
--- a/sysdeps/generic/stpncpy.c
+++ b/sysdeps/generic/stpncpy.c
@@ -24,15 +24,13 @@ Cambridge, MA 02139, USA. */
/* Copy no more than N characters of SRC to DEST, returning the address of
- the last character written into DEST. */
+ the terminating '\0' in DEST, if any, or else DEST + N. */
char *
DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
{
reg_char c;
char *s = dest;
- --dest;
-
if (n >= 4)
{
size_t n4 = n >> 2;
@@ -40,27 +38,27 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
for (;;)
{
c = *src++;
- *++dest = c;
+ *dest++ = c;
if (c == '\0')
break;
c = *src++;
- *++dest = c;
+ *dest++ = c;
if (c == '\0')
break;
c = *src++;
- *++dest = c;
+ *dest++ = c;
if (c == '\0')
break;
c = *src++;
- *++dest = c;
+ *dest++ = c;
if (c == '\0')
break;
if (--n4 == 0)
goto last_chars;
}
- n = n - (dest - s) - 1;
+ n -= dest - s;
if (n == 0)
- return dest;
+ return dest - 1;
goto zero_fill;
}
@@ -69,20 +67,22 @@ DEFUN(__stpncpy, (dest, src, n), char *dest AND CONST char *src AND size_t n)
if (n == 0)
return dest;
- do
+ for (;;)
{
c = *src++;
- *++dest = c;
+ *dest++ = c;
+ if (c == '\0')
+ break;
if (--n == 0)
return dest;
}
- while (c != '\0');
+ --n;
zero_fill:
- while (n-- > 0)
+ while (--n > 0)
dest[n] = '\0';
- return dest;
+ return dest - 1;
}
weak_alias (__stpncpy, stpncpy)