Home | History | Annotate | Download | only in csh
      1    0  stevel /*
      2  356  muffin  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
      3    0  stevel  * Use is subject to license terms.
      4    0  stevel  */
      5    0  stevel 
      6    0  stevel /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
      7    0  stevel /*	  All Rights Reserved  	*/
      8    0  stevel 
      9    0  stevel /*
     10    0  stevel  * Copyright (c) 1980 Regents of the University of California.
     11    0  stevel  * All rights reserved. The Berkeley Software License Agreement
     12    0  stevel  * specifies the terms and conditions for redistribution.
     13    0  stevel  */
     14    0  stevel 
     15    0  stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     16    0  stevel 
     17    0  stevel #include "sh.h"
     18    0  stevel 
     19  356  muffin void	p2dig_ull(unsigned long long);
     20  356  muffin void	p2dig_int(int);
     21  356  muffin void	flush(void);
     22  356  muffin void	Putchar(tchar);
     23  356  muffin 
     24    0  stevel 
     25    0  stevel /*
     26    0  stevel  * C Shell
     27    0  stevel  */
     28    0  stevel 
     29    0  stevel void
     30    0  stevel psecs_ull(unsigned long long l)
     31    0  stevel {
     32    0  stevel 	unsigned long long i;
     33    0  stevel 
     34    0  stevel 	i = l / 3600;
     35    0  stevel 	if (i) {
     36    0  stevel 		printf("%llu:", i);
     37    0  stevel 		i = l % 3600;
     38    0  stevel 		p2dig_ull(i / 60);
     39    0  stevel 		goto minsec;
     40    0  stevel 	}
     41    0  stevel 	i = l;
     42    0  stevel 	printf("%llu", i / 60);
     43    0  stevel minsec:
     44    0  stevel 	i %= 60;
     45    0  stevel 	printf(":");
     46    0  stevel 	p2dig_ull(i);
     47    0  stevel }
     48    0  stevel 
     49    0  stevel void
     50    0  stevel psecs_int(int l)
     51    0  stevel {
     52    0  stevel 	int i;
     53    0  stevel 
     54    0  stevel 	i = l / 3600;
     55    0  stevel 	if (i) {
     56    0  stevel 		printf("%d:", i);
     57    0  stevel 		i = l % 3600;
     58    0  stevel 		p2dig_int(i / 60);
     59    0  stevel 		goto minsec;
     60    0  stevel 	}
     61    0  stevel 	i = l;
     62    0  stevel 	printf("%d", i / 60);
     63    0  stevel minsec:
     64    0  stevel 	i %= 60;
     65    0  stevel 	printf(":");
     66    0  stevel 	p2dig_int(i);
     67    0  stevel }
     68    0  stevel 
     69    0  stevel void
     70    0  stevel p2dig_ull(unsigned long long i)
     71    0  stevel {
     72    0  stevel 	printf("%llu%llu", i / 10, i % 10);
     73    0  stevel }
     74    0  stevel 
     75    0  stevel void
     76    0  stevel p2dig_int(int i)
     77    0  stevel {
     78    0  stevel 	printf("%d%d", i / 10, i % 10);
     79    0  stevel }
     80    0  stevel 
     81    0  stevel char linbuf[128];
     82    0  stevel char *linp = linbuf;
     83    0  stevel 
     84    0  stevel #ifdef MBCHAR
     85    0  stevel 
     86    0  stevel /*
     87    0  stevel  * putbyte() send a byte to SHOUT.  No interpretation is done
     88    0  stevel  * except an un-QUOTE'd control character, which is displayed
     89    0  stevel  * as ^x.
     90    0  stevel  */
     91    0  stevel void
     92    0  stevel putbyte(int c)
     93    0  stevel {
     94    0  stevel 
     95    0  stevel 	if ((c & QUOTE) == 0 && (c == 0177 || c < ' ' && c != '\t' &&
     96    0  stevel 	    c != '\n')) {
     97    0  stevel 		putbyte('^');
     98    0  stevel 		if (c == 0177) {
     99    0  stevel 			c = '?';
    100    0  stevel 		} else {
    101    0  stevel 			c |= 'A' - 1;
    102    0  stevel 		}
    103    0  stevel 	}
    104    0  stevel 	c &= TRIM;
    105    0  stevel 	*linp++ = c;
    106    0  stevel 
    107    0  stevel 	if (c == '\n' || linp >= &linbuf[sizeof (linbuf) - 1 - MB_CUR_MAX]) {
    108    0  stevel 		/* 'cause the next Putchar() call may overflow the buffer.  */
    109    0  stevel 		flush();
    110    0  stevel 	}
    111    0  stevel }
    112    0  stevel 
    113    0  stevel /*
    114    0  stevel  * Putchar(tc) does what putbyte(c) do for a byte c.
    115    0  stevel  * Note that putbyte(c) just send the byte c (provided c is not
    116    0  stevel  * a control character) as it is, while Putchar(tc) may expand the
    117    0  stevel  * character tc to some byte sequnce that represents the character
    118    0  stevel  * in EUC form.
    119    0  stevel  */
    120  356  muffin void
    121    0  stevel Putchar(tchar tc)
    122    0  stevel {
    123    0  stevel 	int	n;
    124    0  stevel 
    125    0  stevel 	if (isascii(tc&TRIM)) {
    126    0  stevel 		putbyte((int)tc);
    127    0  stevel 		return;
    128    0  stevel 	}
    129    0  stevel 	tc &= TRIM;
    130    0  stevel 	n = wctomb(linp, tc);
    131    0  stevel 	if (n == -1) {
    132    0  stevel 		return;
    133    0  stevel 	}
    134    0  stevel 	linp += n;
    135    0  stevel 	if (linp >= &linbuf[sizeof (linbuf) - 1 - MB_CUR_MAX]) {
    136    0  stevel 		flush();
    137    0  stevel 	}
    138    0  stevel }
    139    0  stevel 
    140    0  stevel #else	/* !MBCHAR */
    141    0  stevel 
    142    0  stevel /*
    143    0  stevel  * putbyte() send a byte to SHOUT.  No interpretation is done
    144    0  stevel  * except an un-QUOTE'd control character, which is displayed
    145    0  stevel  * as ^x.
    146    0  stevel  */
    147    0  stevel void
    148    0  stevel putbyte(int c)
    149    0  stevel {
    150    0  stevel 
    151    0  stevel 	if ((c & QUOTE) == 0 && (c == 0177 || c < ' ' && c != '\t' &&
    152    0  stevel 	    c != '\n')) {
    153    0  stevel 		putbyte('^');
    154    0  stevel 		if (c == 0177) {
    155    0  stevel 			c = '?';
    156    0  stevel 		} else {
    157    0  stevel 			c |= 'A' - 1;
    158    0  stevel 		}
    159    0  stevel 	}
    160    0  stevel 	c &= TRIM;
    161    0  stevel 	*linp++ = c;
    162    0  stevel 	if (c == '\n' || linp >= &linbuf[sizeof (linbuf) - 2]) {
    163    0  stevel 		flush();
    164    0  stevel 	}
    165    0  stevel }
    166    0  stevel 
    167    0  stevel /*
    168    0  stevel  * Putchar(tc) does what putbyte(c) do for a byte c.
    169    0  stevel  * For single-byte character only environment, there is no
    170    0  stevel  * difference between Putchar() and putbyte() though.
    171    0  stevel  */
    172  356  muffin void
    173  356  muffin Putchar(tchar tc)
    174    0  stevel {
    175    0  stevel 	putbyte((int)tc);
    176    0  stevel }
    177    0  stevel 
    178    0  stevel #endif	/* !MBCHAR */
    179    0  stevel 
    180    0  stevel void
    181  356  muffin draino(void)
    182    0  stevel {
    183    0  stevel 	linp = linbuf;
    184    0  stevel }
    185    0  stevel 
    186    0  stevel void
    187  356  muffin flush(void)
    188    0  stevel {
    189    0  stevel 	int unit;
    190    0  stevel 	int lmode;
    191    0  stevel 
    192    0  stevel 	if (linp == linbuf) {
    193    0  stevel 		return;
    194    0  stevel 	}
    195    0  stevel 	if (haderr) {
    196    0  stevel 		unit = didfds ? 2 : SHDIAG;
    197    0  stevel 	} else {
    198    0  stevel 		unit = didfds ? 1 : SHOUT;
    199    0  stevel 	}
    200    0  stevel #ifdef TIOCLGET
    201    0  stevel 	if (didfds == 0 && ioctl(unit, TIOCLGET,  (char *)&lmode) == 0 &&
    202    0  stevel 	    lmode&LFLUSHO) {
    203    0  stevel 		lmode = LFLUSHO;
    204    0  stevel 		(void) ioctl(unit, TIOCLBIC,  (char *)&lmode);
    205    0  stevel 		(void) write(unit, "\n", 1);
    206    0  stevel 	}
    207    0  stevel #endif
    208    0  stevel 	(void) write(unit, linbuf, linp - linbuf);
    209    0  stevel 	linp = linbuf;
    210    0  stevel }
    211    0  stevel 
    212    0  stevel /*
    213    0  stevel  * Should not be needed.
    214    0  stevel  */
    215    0  stevel void
    216    0  stevel write_string(char *s)
    217    0  stevel {
    218    0  stevel 	int unit;
    219    0  stevel 	/*
    220    0  stevel 	 * First let's make it sure to flush out things.
    221    0  stevel 	 */
    222    0  stevel 	flush();
    223    0  stevel 
    224    0  stevel 	if (haderr) {
    225    0  stevel 		unit = didfds ? 2 : SHDIAG;
    226    0  stevel 	} else {
    227    0  stevel 		unit = didfds ? 1 : SHOUT;
    228    0  stevel 	}
    229    0  stevel 
    230    0  stevel 	(void) write(unit, s, strlen(s));
    231    0  stevel }
    232