/* StringOpsImpl.c */
/* strcpy
* Copy string s2 to s1. s1 must be large enough.
* return s1
*/
asm (" export StringOps");
asm (" exportproc ←strcpy, StringOps");
char *
strcpy(s1, s2)
register char *s1, *s2;
{
register char *os1;
os1 = s1;
while (*s1++ = *s2++)
;
return(os1);
}
/* strncpy
* Copy s2 to s1, truncating or null-padding to always copy n bytes
* return s1
*/
asm (" exportproc ←strncpy, StringOps");
char *
strncpy(s1, s2, n)
register char *s1, *s2;
{
register i;
register char *os1;
os1 = s1;
for (i = 0; i < n; i++)
if ((*s1++ = *s2++) == '\0') {
while (++i < n)
*s1++ = '\0';
return(os1);
}
return(os1);
}
/* strcat
* Concatenate s2 on the end of s1. S1's space must be large enough.
* Return s1.
*/
asm (" exportproc ←strcat, StringOps");
char *
strcat(s1, s2)
register char *s1, *s2;
{
register char *os1;
os1 = s1;
while (*s1++)
;
--s1;
while (*s1++ = *s2++)
;
return(os1);
}
/* strncat
* Concatenate s2 on the end of s1. S1's space must be large enough.
* At most n characters are moved.
* Return s1.
*/
asm (" exportproc ←strncat, StringOps");
char *
strncat(s1, s2, n)
register char *s1, *s2;
register n;
{
register char *os1;
os1 = s1;
while (*s1++)
;
--s1;
while (*s1++ = *s2++)
if (--n < 0) {
*--s1 = '\0';
break;
}
return(os1);
}
/* strcmp
* Compare strings: s1>s2: >0 s1==s2: 0 s1<s2: <0
*/
asm (" exportproc ←strcmp, StringOps");
strcmp(s1, s2)
register char *s1, *s2;
{
while (*s1 == *s2++)
if (*s1++=='\0')
return(0);
return(*s1 - *--s2);
}
/* strncmp
* Compare strings (at most n bytes): s1>s2: >0 s1==s2: 0 s1<s2: <0
*/
asm (" exportproc ←strncmp, StringOps");
strncmp(s1, s2, n)
register char *s1, *s2;
register n;
{
while (--n >= 0 && *s1 == *s2++)
if (*s1++ == '\0')
return(0);
return(n<0 ? 0 : *s1 - *--s2);
}
/* strlen
* Returns the number of
* non-NULL bytes in string argument.
*/
asm (" exportproc ←strlen, StringOps");
strlen(s)
register char *s;
{
register n;
n = 0;
while (*s++)
n++;
return(n);
}