Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site pegasus.UUCP Path: utzoo!linus!vaxine!wjh12!genrad!decvax!mcnc!akgua!sdcsvax!sdcrdcf!hplabs!hao!seismo!cmcl2!floyd!whuxle!spuxll!abnjh!u1100a!pyuxn!pyuxww!gamma!ulysses!mhuxl!ihnp4!pegasus!hansen From: hansen@pegasus.UUCP (Tony L. Hansen) Newsgroups: net.sources Subject: Re: strxcat.c and xstring revisited Message-ID: <1349@pegasus.UUCP> Date: Fri, 25-May-84 11:56:39 EDT Article-I.D.: pegasus.1349 Posted: Fri May 25 11:56:39 1984 Date-Received: Mon, 28-May-84 06:15:00 EDT References: <1343@pegasus.UUCP> Organization: AT&T Information Systems, Lincroft NJ Lines: 203 Sorry about that, the .c files weren't in the previous shar that I posted. You'll find it all below. Sincerely, Tony Hansen pegasus!hansen ---------------- cut here ---------------- echo x - xstring.3c sed 's/^X//' > xstring.3c << '~FUNKY STUFF~' X.TH XSTRING 3C X.SH NAME Xstrxcat, strxncat, strxcpy, strxncpy \- string operations with variable number of arguments X.SH SYNOPSIS X.nf X.P X.B "char \(**strxcat (dest, s1, s2, ..., (char \(**) 0)" X.B "char \(**dest, \(**s1, \(**s2, ...;" X.P X.B "char \(**strxncat (dest, n, s1, s2, ..., (char \(**) 0)" X.B "char \(**dest, \(**s1, \(**s2, ...;" X.B "int n;" X.P X.B "char \(**strxcpy (dest, s1, s2, ..., (char \(**) 0)" X.B "char \(**dest, \(**s1, \(**s2, ...;" X.P X.B "char \(**strxncpy (dest, n, s1, s2, ..., (char \(**) 0)" X.B "char \(**dest, \(**s1, \(**s2, ...;" X.B "int n;" X.SH DESCRIPTION XThese functions operate on null-terminated strings. XThey are equivalent to the corresponding functions X.IR strcat (3c), X.IR strncat (3c), X.IR strcpy (3c), Xand X.IR strncpy (3c), Xexcept that they allow more than one source string to be named. XAll routines return a pointer to their destination. XThey do not check for overflow of any receiving string. X.P X.I Strxcat\^ Xappends a copy of the strings X.IR s1 , X.IR s2 , Xand so on, to X.IR dest . X.I Strxncat\^ Xcopies at most X.I n\^ Xcharacters. XThe resulting string will always be null-terminated. X.P X.I Strxcpy\^ Xcopies the strings X.IR s1 , X.IR s2 , Xand so on, into X.IR dest . X.I Strxncpy\^ Xcopies at most X.I n\^ Xcharacters. XThe resulting string will not be null-terminated if X.I n\^ Xor more characters were in the source strings. X.SH CAVEATS XThe placement for the X.I n\^ Xvariable is different from the placement in the functions X.IR strncat (3c) Xand X.IR strncpy (3c). ~FUNKY STUFF~ echo x - makefile sed 's/^X//' > makefile << '~FUNKY STUFF~' XSRC= strxcat.c strxcpy.c strxncat.c strxncpy.c XOBJ= $(SRC:.c=.o) XLIB= xstring.a X X$(LIB): $(OBJ) X ar rv $(LIB) $? X Xxstrtest: xstrtest.c $(LIB) X cc $@.c $(LIB) -o $@ ~FUNKY STUFF~ echo x - strxcat.c sed 's/^X//' > strxcat.c << '~FUNKY STUFF~' X#include X X/* VARARGS */ X/* strxcat(dest, s1, s2, ..., (char *) 0) */ Xchar *strxcat (va_alist) Xva_dcl X{ X va_list argptr; X register char *dest, *src, *retptr; X X va_start(argptr); X retptr = dest = va_arg(argptr, char *); X X /* go to the end of the destination */ X while (*dest != '\0') X dest++; X X /* src = arg[i] */ X while ((src = va_arg(argptr, char *)) != (char *)0) X /* strcat(dest,arg[i]) */ X while (*src != '\0') X *dest++ = *src++; X X *dest = '\0'; X va_end(argptr); X return retptr; X} ~FUNKY STUFF~ echo x - strxcpy.c sed 's/^X//' > strxcpy.c << '~FUNKY STUFF~' X#include X X/* VARARGS */ X/* strxcpy(dest, s1, s2, ..., (char *) 0) */ Xchar *strxcpy(va_alist) Xva_dcl X{ X va_list argptr; X register char *dest, *src, *retptr; X X va_start(argptr); X retptr = dest = va_arg(argptr, char *); /* dest="" */ X X /* src = arg[i] */ X while ((src = va_arg(argptr, char *)) != (char *) 0) X /* strcat(dest,s[i]) */ X while (*src != '\0') X *dest++ = *src++; X X *dest = '\0'; X va_end(argptr); X return retptr; X} ~FUNKY STUFF~ echo x - strxncat.c sed 's/^X//' > strxncat.c << '~FUNKY STUFF~' X#include X X/* VARARGS */ X/* strxncat(dest, n, s1, s2, ..., (char *) 0) */ Xchar *strxncat(va_alist) Xva_dcl X{ X va_list argptr; X register char *dest, *src, *retptr; X register int n; X X va_start(argptr); X retptr = dest = va_arg(argptr, char *); X n = va_arg(argptr, int); X X /* go to the end of the destination */ X while (*dest) X dest++; X X /* src = arg[i] */ X while ((src = va_arg(argptr, char *)) != (char *)0) X /* strncat(dest,arg[i],n) */ X while ((*src != '\0') && n--) X *dest++ = *src++; X X *dest = '\0'; X va_end(argptr); X return retptr; X} ~FUNKY STUFF~ echo x - strxncpy.c sed 's/^X//' > strxncpy.c << '~FUNKY STUFF~' X#include X X/* VARARGS */ X/* strxncpy(dest, n, s1, s2, ..., (char *) 0) */ Xchar *strxncpy(va_alist) Xva_dcl X{ X va_list argptr; X register char *dest, *src, *retptr; X register int n; X X va_start(argptr); X retptr = dest = va_arg(argptr, char *); /* dest="" */ X n = va_arg(argptr, int); X X /* src = arg[i] */ X while ((src = va_arg(argptr, char *)) != (char *)0) X /* strncat(dest,arg[i],n) */ X while ((*src != '\0') && n--) X *dest++ = *src++; X X if (n > 0) X *dest = '\0'; X va_end(argptr); X return retptr; X} ~FUNKY STUFF~