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