diff options
author | obrien <obrien@FreeBSD.org> | 2000-04-15 04:41:27 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 2000-04-15 04:41:27 +0000 |
commit | 4ad28cefef28ce6bdb44a0532cfe20a2076bc694 (patch) | |
tree | 7679c440a91912ee9586cee3ebab24596c0fe1c4 /contrib/tcsh/sh.print.c | |
download | FreeBSD-src-4ad28cefef28ce6bdb44a0532cfe20a2076bc694.zip FreeBSD-src-4ad28cefef28ce6bdb44a0532cfe20a2076bc694.tar.gz |
Import the latest version of the 44BSD C-shell -- tcsh-6.09.
Diffstat (limited to 'contrib/tcsh/sh.print.c')
-rw-r--r-- | contrib/tcsh/sh.print.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/contrib/tcsh/sh.print.c b/contrib/tcsh/sh.print.c new file mode 100644 index 0000000..047ab5d --- /dev/null +++ b/contrib/tcsh/sh.print.c @@ -0,0 +1,278 @@ +/* $Header: /src/pub/tcsh/sh.print.c,v 3.18 1999/05/11 13:07:51 christos Exp $ */ +/* + * sh.print.c: Primitive Output routines. + */ +/*- + * Copyright (c) 1980, 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "sh.h" + +RCSID("$Id: sh.print.c,v 3.18 1999/05/11 13:07:51 christos Exp $") + +#include "ed.h" + +extern int Tty_eight_bit; +extern int Tty_raw_mode; +extern Char GettingInput; + +int lbuffed = 1; /* true if line buffered */ + +static void p2dig __P((int)); + +/* + * C Shell + */ + +#if defined(BSDLIMIT) || defined(RLIMIT_CPU) +void +psecs(l) + long l; +{ + register int i; + + i = (int) (l / 3600); + if (i) { + xprintf("%d:", i); + i = (int) (l % 3600); + p2dig(i / 60); + goto minsec; + } + i = (int) l; + xprintf("%d", i / 60); +minsec: + i %= 60; + xprintf(":"); + p2dig(i); +} + +#endif + +void +pcsecs(l) /* PWP: print mm:ss.dd, l is in sec*100 */ +#ifdef BSDTIMES + long l; +#else /* BSDTIMES */ +# ifndef POSIX + time_t l; +# else /* POSIX */ + clock_t l; +# endif /* POSIX */ +#endif /* BSDTIMES */ +{ + register int i; + + i = (int) (l / 360000); + if (i) { + xprintf("%d:", i); + i = (int) ((l % 360000) / 100); + p2dig(i / 60); + goto minsec; + } + i = (int) (l / 100); + xprintf("%d", i / 60); +minsec: + i %= 60; + xprintf(":"); + p2dig(i); + xprintf("."); + p2dig((int) (l % 100)); +} + +static void +p2dig(i) + register int i; +{ + + xprintf("%d%d", i / 10, i % 10); +} + +char linbuf[2048]; /* was 128 */ +char *linp = linbuf; +bool output_raw = 0; /* PWP */ +bool xlate_cr = 0; /* HE */ + +void +xputchar(c) + register int c; +{ + int atr = 0; + + atr |= c & ATTRIBUTES & TRIM; + c &= CHAR | QUOTE; + if (!output_raw && (c & QUOTE) == 0) { + if (Iscntrl(c)) { +#ifdef COLORCAT + if (c != '\t' && c != '\n' && !(adrof(STRcolorcat) && c=='\033') && (xlate_cr || c != '\r')) { +#else + if (c != '\t' && c != '\n' && (xlate_cr || c != '\r')) { +#endif + xputchar('^' | atr); +#ifndef _OSD_POSIX + if (c == ASCII) + c = '?'; + else + c |= 0100; +#else /*_OSD_POSIX*/ + if (c == CTL_ESC('\177')) + c = '?'; + else + c =_toebcdic[_toascii[c]|0100]; +#endif /*_OSD_POSIX*/ + + } + } + else if (!Isprint(c)) { + xputchar('\\' | atr); + xputchar((((c >> 6) & 7) + '0') | atr); + xputchar((((c >> 3) & 7) + '0') | atr); + c = (c & 7) + '0'; + } + (void) putraw(c | atr); + } + else { + c &= TRIM; + if (haderr ? (didfds ? is2atty : isdiagatty) : + (didfds ? is1atty : isoutatty)) + SetAttributes(c | atr); + (void) putpure(c); + } + if (lbuffed && (c & CHAR) == '\n') + flush(); +} + +int +putraw(c) + register int c; +{ + if (haderr ? (didfds ? is2atty : isdiagatty) : + (didfds ? is1atty : isoutatty)) { + if (Tty_eight_bit == -1) + ed_set_tty_eight_bit(); + if (!Tty_eight_bit && (c & META)) { + c = (c & ~META) | STANDOUT; + } + SetAttributes(c); + } + return putpure(c); +} + +int +putpure(c) + register int c; +{ + c &= CHAR; + + *linp++ = (char) c; + if (linp >= &linbuf[sizeof linbuf - 10]) + flush(); + return (1); +} + +void +drainoline() +{ + linp = linbuf; +} + +void +flush() +{ + int unit; + static int interrupted = 0; + size_t sz; + + /* int lmode; */ + + if (linp == linbuf) + return; + if (GettingInput && !Tty_raw_mode && linp < &linbuf[sizeof linbuf - 10]) + return; + if (interrupted) { + interrupted = 0; + linp = linbuf; /* avoid resursion as stderror calls flush */ + stderror(ERR_SILENT); + } + interrupted = 1; + if (haderr) + unit = didfds ? 2 : SHDIAG; + else + unit = didfds ? 1 : SHOUT; +#ifdef COMMENT +#ifdef TIOCLGET + if (didfds == 0 && ioctl(unit, TIOCLGET, (ioctl_t) & lmode) == 0 && + lmode & LFLUSHO) { + lmode = LFLUSHO; + (void) ioctl(unit, TIOCLBIC, (ioclt_t) & lmode); + (void) write(unit, "\n", 1); + } +#endif +#endif + sz = (size_t) (linp - linbuf); + if (write(unit, linbuf, sz) == -1) + switch (errno) { +#ifdef EIO + /* We lost our tty */ + case EIO: +#endif +#ifdef ENXIO + /* + * Deal with Digital Unix 4.0D bogocity, returning ENXIO when + * we lose our tty. + */ + case ENXIO: +#endif + /* + * IRIX 6.4 bogocity? + */ +#ifdef ENOTTY + case ENOTTY: +#endif +#ifdef EBADF + case EBADF: +#endif + /* + * Over our quota, writing the history file + */ +#ifdef EDQUOT + case EDQUOT: +#endif + /* Nothing to do, but die */ + xexit(1); + break; + default: + stderror(ERR_SILENT); + break; + } + + linp = linbuf; + interrupted = 0; +} |