* Copyright (c) 1985 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#if defined(LIBC_SCCS) && !defined(lint)
.asciz "@(#)puts.s 5.7 (Berkeley) 6/1/90"
#endif /* LIBC_SCCS and not lint */
* argument: a source string.
* side effects: writes to the standard output using the data in
* the null-terminated source string; a newline is appended.
* result: technically void; for compatibility we return 0 for the null
* string, non-zero otherwise. We return zero for errors too.
* For unbuffered I/O, line buffer the output line.
* Ugly but fast -- and doesn't CURRENTLY break anything (sigh).
bicw3 $~NBF,_FLAG(IOP),UNBUF
bicw2 $NBF,_FLAG(IOP) /* Clear no-buffering flag */
movl sp,_BASE(IOP) /* Create a buffer */
tstl _CNT(IOP) /* Has a buffer been allocated? */
pushl IOP /* Get _flsbuf() to make one */
incl _CNT(IOP) /* Unput the char we sent */
* Search for the terminating null.
addl3 _BASE(IOP),_BUFSIZ(IOP),COUNT /* How many bytes? */
locc $0,COUNT,(S) /* Look for a null */
subl2 r0,COUNT /* Copy the data */
movc3 COUNT,(S),*_PTR(IOP)
movl r3,_PTR(IOP) /* Fix up IOP */
movb $NL,*_PTR(IOP) /* Append a newline */
bitw $LBF,_FLAG(IOP) /* If line buffered... */
tstw UNBUF /* or unbuffered... */
tstl _CNT(IOP) /* or a full buffer... */
pushl IOP /* ... flush the buffer */
* Fix up buffering again.
bisw2 $NBF,_FLAG(IOP) /* Reset flag */
clrl _BASE(IOP) /* Clear data structure */
cvtbl $NL,r0 /* Compatibility hack */
* We didn't find the null -- loop.
movc3 COUNT,(S),*_PTR(IOP) /* Copy the data */
movl r3,_PTR(IOP) /* Fix up IOP */
pushl IOP /* The buffer is full -- flush it */
tstb (S) /* More data? */
* Bomb out. Return 0 (why not? that's what the old one did).