|
|
1.1 root 1: /*
2: * Copyright (c) 1985 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #if defined(LIBC_SCCS) && !defined(lint)
21: .asciz "@(#)puts.s 5.7 (Berkeley) 6/1/90"
22: #endif /* LIBC_SCCS and not lint */
23:
24: /*
25: * puts(s);
26: * char *s;
27: *
28: * argument: a source string.
29: * side effects: writes to the standard output using the data in
30: * the null-terminated source string; a newline is appended.
31: * result: technically void; for compatibility we return 0 for the null
32: * string, non-zero otherwise. We return zero for errors too.
33: */
34:
35: #include "DEFS.h"
36:
37: #define NBF 04
38: #define LBF 0200
39:
40: #define NL 012
41:
42: ENTRY(puts, R11|R10|R9)
43:
44: #define S r11
45: movl 4(ap),S
46: #define IOP r10
47: #define _CNT
48: #define _PTR 4
49: #define _BASE 8
50: #define _BUFSIZ 12
51: #define _FLAG 16
52: movab __iob+20,IOP
53:
54: #define UNBUF -4(fp)
55:
56: #define COUNT r9
57:
58: /*
59: * For unbuffered I/O, line buffer the output line.
60: * Ugly but fast -- and doesn't CURRENTLY break anything (sigh).
61: */
62: movab -1028(sp),sp
63: bicw3 $~NBF,_FLAG(IOP),UNBUF
64: jeql 1f
65:
66: bicw2 $NBF,_FLAG(IOP) /* Clear no-buffering flag */
67: movl sp,_BASE(IOP) /* Create a buffer */
68: movl sp,_PTR(IOP)
69: cvtwl $1024,_BUFSIZ(IOP)
70: jbr 2f
71:
72: 1:
73: tstl _CNT(IOP) /* Has a buffer been allocated? */
74: jgtr 2f
75: pushl IOP /* Get _flsbuf() to make one */
76: pushl $0
77: calls $2,__flsbuf
78: tstl r0
79: jlss Lerror
80: incl _CNT(IOP) /* Unput the char we sent */
81: decl _PTR(IOP)
82: 2:
83:
84: /*
85: * Search for the terminating null.
86: */
87: Lloop:
88: addl3 _BASE(IOP),_BUFSIZ(IOP),COUNT /* How many bytes? */
89: subl2 _PTR(IOP),COUNT
90: locc $0,COUNT,(S) /* Look for a null */
91: jeql Lagain
92:
93: subl2 r0,COUNT /* Copy the data */
94: movc3 COUNT,(S),*_PTR(IOP)
95: movl r3,_PTR(IOP) /* Fix up IOP */
96: subl2 COUNT,_CNT(IOP)
97:
98: Lnl:
99: movb $NL,*_PTR(IOP) /* Append a newline */
100: incl _PTR(IOP)
101: decl _CNT(IOP)
102:
103: bitw $LBF,_FLAG(IOP) /* If line buffered... */
104: jneq 1f
105: tstw UNBUF /* or unbuffered... */
106: jneq 1f
107: tstl _CNT(IOP) /* or a full buffer... */
108: jgtr 2f
109: 1:
110: pushl IOP /* ... flush the buffer */
111: calls $1,_fflush
112: tstl r0
113: jlss Lerror
114: 2:
115:
116: /*
117: * Fix up buffering again.
118: */
119: tstw UNBUF
120: jeql 1f
121: bisw2 $NBF,_FLAG(IOP) /* Reset flag */
122: clrl _BASE(IOP) /* Clear data structure */
123: clrl _BUFSIZ(IOP)
124: clrl _CNT(IOP)
125: 1:
126: cvtbl $NL,r0 /* Compatibility hack */
127: ret
128:
129: /*
130: * We didn't find the null -- loop.
131: */
132: Lagain:
133: movc3 COUNT,(S),*_PTR(IOP) /* Copy the data */
134: movl r1,S
135: movl r3,_PTR(IOP) /* Fix up IOP */
136: subl2 COUNT,_CNT(IOP)
137: pushl IOP /* The buffer is full -- flush it */
138: calls $1,_fflush
139: tstl r0
140: jlss Lerror
141: tstb (S) /* More data? */
142: jneq Lloop
143: jbr Lnl
144:
145: /*
146: * Bomb out. Return 0 (why not? that's what the old one did).
147: */
148: Lerror:
149: clrl r0
150: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.