|
|
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 "@(#)fputs.s 5.6 (Berkeley) 6/27/88"
20: #endif /* LIBC_SCCS and not lint */
21:
22: /*
23: * fputs(s, iop);
24: * char *s;
25: * FILE *iop;
26: *
27: * arguments: a source string and a file pointer.
28: * side effects: writes to the file indicated by iop using the data in
29: * the null-terminated source string.
30: * result: technically void; for compatibility we return 0 for the null
31: * string, non-zero otherwise. We return zero for errors too.
32: */
33:
34: #include "DEFS.h"
35:
36: #define NBF 04
37: #define LBF 0200
38:
39: #define NL 012
40:
41: ENTRY(fputs, R11|R10|R9)
42:
43: #define S r11
44: movl 4(ap),S
45: #define IOP r10
46: #define _CNT
47: #define _PTR 4
48: #define _BASE 8
49: #define _BUFSIZ 12
50: #define _FLAG 16
51: movl 8(ap),IOP
52:
53: #define UNBUF -4(fp)
54:
55: #define COUNT r9
56:
57: /*
58: * For compatibility (sigh).
59: */
60: tstb (S)
61: jeql Lerror
62:
63: /*
64: * For unbuffered I/O, line buffer the output line.
65: * Ugly but fast -- and doesn't CURRENTLY break anything (sigh).
66: */
67: movab -1028(sp),sp
68: bicw3 $~NBF,_FLAG(IOP),UNBUF
69: jeql 1f
70:
71: bicw2 $NBF,_FLAG(IOP) /* Clear no-buffering flag */
72: movl sp,_BASE(IOP) /* Create a buffer */
73: movl sp,_PTR(IOP)
74: cvtwl $1024,_BUFSIZ(IOP)
75: jbr 2f
76:
77: 1:
78: tstl _CNT(IOP) /* Has a buffer been allocated? */
79: jgtr 2f
80: pushl IOP /* Get _flsbuf() to do the work */
81: pushl $0
82: calls $2,__flsbuf
83: tstl r0
84: jlss Lerror
85: incl _CNT(IOP) /* Unput the char we sent */
86: decl _PTR(IOP)
87: 2:
88:
89: /*
90: * Search for the terminating null.
91: * We only need to look at _BUFSIZ bytes or less on each pass.
92: */
93: Lloop:
94: addl3 _BASE(IOP),_BUFSIZ(IOP),COUNT /* How many bytes? */
95: subl2 _PTR(IOP),COUNT
96: locc $0,COUNT,(S) /* Look for a null */
97: jeql Lagain
98:
99: subl2 r0,COUNT /* Copy the data */
100: movc3 COUNT,(S),*_PTR(IOP)
101: movl r3,_PTR(IOP) /* Fix up IOP */
102: subl2 COUNT,_CNT(IOP)
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: Lfixup:
120: tstw UNBUF
121: jeql 1f
122: bisw2 $NBF,_FLAG(IOP) /* Reset flag */
123: clrl _BASE(IOP) /* Clear data structure */
124: clrl _BUFSIZ(IOP)
125: clrl _CNT(IOP)
126: 1:
127: cvtbl $NL,r0 /* Compatibility hack */
128: ret
129:
130: /*
131: * We didn't find the null -- loop.
132: */
133: Lagain:
134: movc3 COUNT,(S),*_PTR(IOP) /* Copy the data */
135: movl r1,S
136: movl r3,_PTR(IOP) /* Fix up IOP */
137: subl2 COUNT,_CNT(IOP)
138: pushl IOP /* The buffer is full -- flush it */
139: calls $1,_fflush
140: tstl r0
141: jlss Lerror
142: tstb (S) /* More data? */
143: jneq Lloop
144: jbr Lfixup
145:
146: /*
147: * Bomb out. Return 0 (why not? that's what the old one did).
148: */
149: Lerror:
150: clrl r0
151: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.