sh.print.c revision 59243
1218466Sjilles/* $Header: /src/pub/tcsh/sh.print.c,v 3.18 1999/05/11 13:07:51 christos Exp $ */
2218466Sjilles/*
3218466Sjilles * sh.print.c: Primitive Output routines.
4218466Sjilles */
5218466Sjilles/*-
6218466Sjilles * Copyright (c) 1980, 1991 The Regents of the University of California.
7218466Sjilles * All rights reserved.
8218466Sjilles *
9218466Sjilles * Redistribution and use in source and binary forms, with or without
10218466Sjilles * modification, are permitted provided that the following conditions
11218466Sjilles * are met:
12218466Sjilles * 1. Redistributions of source code must retain the above copyright
13218466Sjilles *    notice, this list of conditions and the following disclaimer.
14218466Sjilles * 2. Redistributions in binary form must reproduce the above copyright
15218466Sjilles *    notice, this list of conditions and the following disclaimer in the
16218466Sjilles *    documentation and/or other materials provided with the distribution.
17218466Sjilles * 3. All advertising materials mentioning features or use of this software
18218466Sjilles *    must display the following acknowledgement:
19218466Sjilles *	This product includes software developed by the University of
20218466Sjilles *	California, Berkeley and its contributors.
21218466Sjilles * 4. Neither the name of the University nor the names of its contributors
22218466Sjilles *    may be used to endorse or promote products derived from this software
23218466Sjilles *    without specific prior written permission.
24218466Sjilles *
25218466Sjilles * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26218466Sjilles * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27218466Sjilles * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28218466Sjilles * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29218466Sjilles * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30218466Sjilles * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31218466Sjilles * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32218466Sjilles * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33218466Sjilles * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34218466Sjilles * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35218466Sjilles * SUCH DAMAGE.
36218466Sjilles */
37218466Sjilles#include "sh.h"
38218466Sjilles
39218466SjillesRCSID("$Id: sh.print.c,v 3.18 1999/05/11 13:07:51 christos Exp $")
40218466Sjilles
41218466Sjilles#include "ed.h"
42218466Sjilles
43218466Sjillesextern int Tty_eight_bit;
44218466Sjillesextern int Tty_raw_mode;
45218466Sjillesextern Char GettingInput;
46218466Sjilles
47218466Sjillesint     lbuffed = 1;		/* true if line buffered */
48218466Sjilles
49218466Sjillesstatic	void	p2dig	__P((int));
50218466Sjilles
51218466Sjilles/*
52218466Sjilles * C Shell
53218466Sjilles */
54218466Sjilles
55218466Sjilles#if defined(BSDLIMIT) || defined(RLIMIT_CPU)
56218466Sjillesvoid
57218466Sjillespsecs(l)
58218466Sjilles    long    l;
59218466Sjilles{
60218466Sjilles    register int i;
61218466Sjilles
62218466Sjilles    i = (int) (l / 3600);
63218466Sjilles    if (i) {
64218466Sjilles	xprintf("%d:", i);
65218466Sjilles	i = (int) (l % 3600);
66218466Sjilles	p2dig(i / 60);
67218466Sjilles	goto minsec;
68218466Sjilles    }
69218466Sjilles    i = (int) l;
70218466Sjilles    xprintf("%d", i / 60);
71218466Sjillesminsec:
72218466Sjilles    i %= 60;
73218466Sjilles    xprintf(":");
74218466Sjilles    p2dig(i);
75218466Sjilles}
76218466Sjilles
77218466Sjilles#endif
78218466Sjilles
79218466Sjillesvoid
80218466Sjillespcsecs(l)			/* PWP: print mm:ss.dd, l is in sec*100 */
81218466Sjilles#ifdef BSDTIMES
82218466Sjilles    long    l;
83218466Sjilles#else /* BSDTIMES */
84218466Sjilles# ifndef POSIX
85218466Sjilles    time_t  l;
86218466Sjilles# else /* POSIX */
87218466Sjilles    clock_t l;
88218466Sjilles# endif /* POSIX */
89218466Sjilles#endif /* BSDTIMES */
90218466Sjilles{
91218466Sjilles    register int i;
92218466Sjilles
93218466Sjilles    i = (int) (l / 360000);
94218466Sjilles    if (i) {
95218466Sjilles	xprintf("%d:", i);
96218466Sjilles	i = (int) ((l % 360000) / 100);
97218466Sjilles	p2dig(i / 60);
98218466Sjilles	goto minsec;
99218466Sjilles    }
100218466Sjilles    i = (int) (l / 100);
101218466Sjilles    xprintf("%d", i / 60);
102218466Sjillesminsec:
103218466Sjilles    i %= 60;
104218466Sjilles    xprintf(":");
105218466Sjilles    p2dig(i);
106218466Sjilles    xprintf(".");
107218466Sjilles    p2dig((int) (l % 100));
108218466Sjilles}
109218466Sjilles
110218466Sjillesstatic void
111218466Sjillesp2dig(i)
112218466Sjilles    register int i;
113218466Sjilles{
114218466Sjilles
115218466Sjilles    xprintf("%d%d", i / 10, i % 10);
116218466Sjilles}
117218466Sjilles
118218466Sjilleschar    linbuf[2048];		/* was 128 */
119218466Sjilleschar   *linp = linbuf;
120218466Sjillesbool    output_raw = 0;		/* PWP */
121218466Sjillesbool    xlate_cr   = 0;		/* HE */
122218466Sjilles
123218466Sjillesvoid
124218466Sjillesxputchar(c)
125218466Sjilles    register int c;
126218466Sjilles{
127218466Sjilles    int     atr = 0;
128218626Sjilles
129218626Sjilles    atr |= c & ATTRIBUTES & TRIM;
130218466Sjilles    c &= CHAR | QUOTE;
131218466Sjilles    if (!output_raw && (c & QUOTE) == 0) {
132218466Sjilles	if (Iscntrl(c)) {
133218466Sjilles#ifdef COLORCAT
134218466Sjilles	    if (c != '\t' && c != '\n' && !(adrof(STRcolorcat) && c=='\033') && (xlate_cr || c != '\r')) {
135218466Sjilles#else
136218466Sjilles	    if (c != '\t' && c != '\n' && (xlate_cr || c != '\r')) {
137218466Sjilles#endif
138218466Sjilles		xputchar('^' | atr);
139218466Sjilles#ifndef _OSD_POSIX
140218466Sjilles		if (c == ASCII)
141218466Sjilles		    c = '?';
142218466Sjilles		else
143218466Sjilles		    c |= 0100;
144218466Sjilles#else /*_OSD_POSIX*/
145218466Sjilles		if (c == CTL_ESC('\177'))
146218466Sjilles		    c = '?';
147218466Sjilles		else
148218466Sjilles		    c =_toebcdic[_toascii[c]|0100];
149218466Sjilles#endif /*_OSD_POSIX*/
150218466Sjilles
151218466Sjilles	    }
152218466Sjilles	}
153218466Sjilles	else if (!Isprint(c)) {
154218466Sjilles	    xputchar('\\' | atr);
155218466Sjilles	    xputchar((((c >> 6) & 7) + '0') | atr);
156218466Sjilles	    xputchar((((c >> 3) & 7) + '0') | atr);
157218466Sjilles	    c = (c & 7) + '0';
158218466Sjilles	}
159218466Sjilles	(void) putraw(c | atr);
160218466Sjilles    }
161218466Sjilles    else {
162218466Sjilles	c &= TRIM;
163218466Sjilles	if (haderr ? (didfds ? is2atty : isdiagatty) :
164218466Sjilles	    (didfds ? is1atty : isoutatty))
165218466Sjilles	    SetAttributes(c | atr);
166218466Sjilles	(void) putpure(c);
167218466Sjilles    }
168218466Sjilles    if (lbuffed && (c & CHAR) == '\n')
169218466Sjilles	flush();
170218466Sjilles}
171218466Sjilles
172218466Sjillesint
173218466Sjillesputraw(c)
174218466Sjilles    register int c;
175218466Sjilles{
176218466Sjilles    if (haderr ? (didfds ? is2atty : isdiagatty) :
177218466Sjilles	(didfds ? is1atty : isoutatty)) {
178218466Sjilles	if (Tty_eight_bit == -1)
179218466Sjilles	    ed_set_tty_eight_bit();
180218466Sjilles	if (!Tty_eight_bit && (c & META)) {
181218466Sjilles	    c = (c & ~META) | STANDOUT;
182218466Sjilles	}
183218466Sjilles	SetAttributes(c);
184218466Sjilles    }
185218466Sjilles    return putpure(c);
186218466Sjilles}
187218466Sjilles
188218466Sjillesint
189218466Sjillesputpure(c)
190218466Sjilles    register int c;
191218466Sjilles{
192218466Sjilles    c &= CHAR;
193218466Sjilles
194218466Sjilles    *linp++ = (char) c;
195218466Sjilles    if (linp >= &linbuf[sizeof linbuf - 10])
196218466Sjilles	flush();
197218466Sjilles    return (1);
198218466Sjilles}
199218466Sjilles
200218466Sjillesvoid
201218466Sjillesdrainoline()
202218466Sjilles{
203218466Sjilles    linp = linbuf;
204218466Sjilles}
205218466Sjilles
206218466Sjillesvoid
207218466Sjillesflush()
208218466Sjilles{
209218466Sjilles    int unit;
210218466Sjilles    static int interrupted = 0;
211218466Sjilles    size_t sz;
212218466Sjilles
213218466Sjilles    /* int lmode; */
214218466Sjilles
215218466Sjilles    if (linp == linbuf)
216218466Sjilles	return;
217218466Sjilles    if (GettingInput && !Tty_raw_mode && linp < &linbuf[sizeof linbuf - 10])
218218466Sjilles	return;
219218466Sjilles    if (interrupted) {
220218466Sjilles	interrupted = 0;
221218466Sjilles	linp = linbuf;		/* avoid resursion as stderror calls flush */
222218466Sjilles	stderror(ERR_SILENT);
223218466Sjilles    }
224218466Sjilles    interrupted = 1;
225218466Sjilles    if (haderr)
226218466Sjilles	unit = didfds ? 2 : SHDIAG;
227218466Sjilles    else
228218466Sjilles	unit = didfds ? 1 : SHOUT;
229218466Sjilles#ifdef COMMENT
230218466Sjilles#ifdef TIOCLGET
231218466Sjilles    if (didfds == 0 && ioctl(unit, TIOCLGET, (ioctl_t) & lmode) == 0 &&
232218466Sjilles	lmode & LFLUSHO) {
233218466Sjilles	lmode = LFLUSHO;
234218466Sjilles	(void) ioctl(unit, TIOCLBIC, (ioclt_t) & lmode);
235218466Sjilles	(void) write(unit, "\n", 1);
236218466Sjilles    }
237218466Sjilles#endif
238218466Sjilles#endif
239218466Sjilles    sz = (size_t) (linp - linbuf);
240218466Sjilles    if (write(unit, linbuf, sz) == -1)
241218466Sjilles	switch (errno) {
242218466Sjilles#ifdef EIO
243218466Sjilles	/* We lost our tty */
244218466Sjilles	case EIO:
245218466Sjilles#endif
246218466Sjilles#ifdef ENXIO
247218466Sjilles	/*
248218466Sjilles	 * Deal with Digital Unix 4.0D bogocity, returning ENXIO when
249218466Sjilles	 * we lose our tty.
250218466Sjilles	 */
251218466Sjilles	case ENXIO:
252218466Sjilles#endif
253218466Sjilles	/*
254218466Sjilles	 * IRIX 6.4 bogocity?
255218466Sjilles	 */
256218466Sjilles#ifdef ENOTTY
257218466Sjilles	case ENOTTY:
258218466Sjilles#endif
259218466Sjilles#ifdef EBADF
260218466Sjilles	case EBADF:
261218466Sjilles#endif
262218466Sjilles	/*
263218466Sjilles	 * Over our quota, writing the history file
264218466Sjilles	 */
265218466Sjilles#ifdef EDQUOT
266218466Sjilles	case EDQUOT:
267218466Sjilles#endif
268218466Sjilles	/* Nothing to do, but die */
269218466Sjilles	    xexit(1);
270218466Sjilles	    break;
271218466Sjilles	default:
272218466Sjilles	    stderror(ERR_SILENT);
273218466Sjilles	    break;
274218466Sjilles	}
275218466Sjilles
276218466Sjilles    linp = linbuf;
277218466Sjilles    interrupted = 0;
278218466Sjilles}
279218466Sjilles