diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libbc/libc/stdio/common/fputs.c | |
download | illumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libbc/libc/stdio/common/fputs.c')
-rw-r--r-- | usr/src/lib/libbc/libc/stdio/common/fputs.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/usr/src/lib/libbc/libc/stdio/common/fputs.c b/usr/src/lib/libbc/libc/stdio/common/fputs.c new file mode 100644 index 0000000000..a18ba04b12 --- /dev/null +++ b/usr/src/lib/libbc/libc/stdio/common/fputs.c @@ -0,0 +1,146 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1995, by Sun Microsystems, Inc. + * All rights reserved. + */ + +/* Copyright (c) 1984 AT&T */ +/* All Rights Reserved */ + +#pragma ident "%Z%%M% %I% %E% SMI" + + +/*LINTLIBRARY*/ +/* + * This version writes directly to the buffer rather than looping on putc. + * Ptr args aren't checked for NULL because the program would be a + * catastrophic mess anyway. Better to abort than just to return NULL. + */ +#include <stdio.h> +#include "stdiom.h" +#include <errno.h> + +extern char *memccpy(); +static char *memnulccpy(); + +int +fputs(ptr, iop) +char *ptr; +register FILE *iop; +{ + register int ndone = 0, n; + register unsigned char *cptr, *bufend; + register char *p; + register char c; + + if (_WRTCHK(iop)) { + iop->_flag |= _IOERR; +#ifdef POSIX + errno = EBADF; +#endif POSIX + return (EOF); + } + bufend = iop->_base + iop->_bufsiz; + + if ((iop->_flag & _IONBF) == 0) { + if (iop->_flag & _IOLBF) { + for ( ; ; ptr += n) { + while ((n = bufend - (cptr = iop->_ptr)) <= 0) + /* full buf */ + if (_xflsbuf(iop) == EOF) + return(EOF); + if ((p = memnulccpy((char *) cptr, ptr, '\n', n)) != NULL) { + /* + * Copy terminated either because we + * saw a newline or we saw a NUL (end + * of string). + */ + c = *(p - 1); /* last character moved */ + if (c == '\0') + p--; /* didn't write '\0' */ + n = p - (char *) cptr; + } + iop->_cnt -= n; + iop->_ptr += n; + _BUFSYNC(iop); + ndone += n; + if (p != NULL) { + /* + * We found either a newline or a NUL. + * If we found a newline, flush the + * buffer. + * If we found a NUL, we're done. + */ + if (c == '\n') { + if (_xflsbuf(iop) == EOF) + return(EOF); + } else { + /* done */ + return(ndone); + } + } + } + } else { + for ( ; ; ptr += n) { + while ((n = bufend - (cptr = iop->_ptr)) <= 0) + /* full buf */ + if (_xflsbuf(iop) == EOF) + return(EOF); + if ((p = memccpy((char *) cptr, ptr, '\0', n)) != NULL) + n = (p - (char *) cptr) - 1; + iop->_cnt -= n; + iop->_ptr += n; + _BUFSYNC(iop); + ndone += n; + if (p != NULL) { + /* done */ + return(ndone); + } + } + } + } else { + /* write out to an unbuffered file */ + return (write(iop->_file, ptr, strlen(ptr))); + } +} + +/* + * Copy s2 to s1, stopping if character c or a NUL is copied. + * Copy no more than n bytes. + * Return a pointer to the byte after character c or NUL in the copy, + * or NULL if c or NUL is not found in the first n bytes. + */ +static char * +memnulccpy(s1, s2, c, n) +register char *s1, *s2; +register int c, n; +{ + register int cmoved; + + while (--n >= 0) { + cmoved = *s2++; + if ((*s1++ = cmoved) == '\0' || cmoved == c) + return (s1); + } + return (0); +} |