2.11BSD/src/lib/libc/pdp/stdio/fputc.s
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifdef LIBC_SCCS
<@(#)fputc.s 1.1 (Berkeley) 2/4/87\0>
.even
#endif LIBC_SCCS
#include "DEFS.h"
#include "STDIO.h"
.globl __flsbuf
/*
* fputc(c, iop)
* char c;
* FILE *iop;
*
* Output c to stream iop and return c. For unbuffered streams iop->cnt is
* always zero. For normally buffered streams iop->cnt is the amount of space
* left in the buffer. For line buffered streams, -(iop->cnt) is the number
* of characters in the buffer.
*/
ENTRY(fputc)
mov 4(sp),r1 / grab iop
dec _CNT(r1) / less room in buffer
blt 2f
mov 2(sp),r0 / grab the character (for return)
1:
movb r0,*_PTR(r1) / push character into the buffer,
inc _PTR(r1) / increment the pointer,
bic $!0377,r0 / cast to u_char - just in case ...
rts pc / and return
2:
bit $_IOLBF,_FLAG(r1) / iop-cnt < 0: are we line buffered?
beq 3f / (nope, flush output)
mov _CNT(r1),r0 / -(iop->cnt) < iop->bufsiz?
add _BUFSIZ(r1),r0 / (same as 0 < iop->bufsiz + iop->cnt)
ble 3f / (nope, flush output)
mov 2(sp),r0 / grab the character
cmpb r0,$NL / a newline?
bne 1b / no, just put it into the buffer
3:
jmp __flsbuf