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