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