|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1991,1990 Carnegie Mellon University ! 4: * All Rights Reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software and its ! 7: * documentation is hereby granted, provided that both the copyright ! 8: * notice and this permission notice appear in all copies of the ! 9: * software, derivative works or modified versions, and any portions ! 10: * thereof, and that both notices appear in supporting documentation. ! 11: * ! 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS ! 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 15: * ! 16: * Carnegie Mellon requests users of this software to return to ! 17: * ! 18: * Software Distribution Coordinator or [email protected] ! 19: * School of Computer Science ! 20: * Carnegie Mellon University ! 21: * Pittsburgh PA 15213-3890 ! 22: * ! 23: * any improvements or extensions that they make and grant Carnegie the ! 24: * rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * HISTORY ! 28: * $Log: db_input.c,v $ ! 29: * Revision 1.1 1992/03/25 21:45:10 pace ! 30: * Initial revision ! 31: * ! 32: * Revision 2.4 91/02/14 14:41:53 mrt ! 33: * Add input line editing. ! 34: * [90/11/11 dbg] ! 35: * ! 36: * Revision 2.3 91/02/05 17:06:32 mrt ! 37: * Changed to new Mach copyright ! 38: * [91/01/31 16:18:13 mrt] ! 39: * ! 40: * Revision 2.2 90/08/27 21:51:03 dbg ! 41: * Reduce lint. ! 42: * [90/08/07 dbg] ! 43: * Created. ! 44: * [90/07/25 dbg] ! 45: * ! 46: */ ! 47: /* ! 48: * Author: David B. Golub, Carnegie Mellon University ! 49: * Date: 7/90 ! 50: */ ! 51: ! 52: #include "param.h" ! 53: #include "proc.h" ! 54: #include <ddb/db_output.h> ! 55: ! 56: /* ! 57: * Character input and editing. ! 58: */ ! 59: ! 60: /* ! 61: * We don't track output position while editing input, ! 62: * since input always ends with a new-line. We just ! 63: * reset the line position at the end. ! 64: */ ! 65: char * db_lbuf_start; /* start of input line buffer */ ! 66: char * db_lbuf_end; /* end of input line buffer */ ! 67: char * db_lc; /* current character */ ! 68: char * db_le; /* one past last character */ ! 69: ! 70: #define CTRL(c) ((c) & 0x1f) ! 71: #define isspace(c) ((c) == ' ' || (c) == '\t') ! 72: #define BLANK ' ' ! 73: #define BACKUP '\b' ! 74: ! 75: void ! 76: db_putstring(s, count) ! 77: char *s; ! 78: int count; ! 79: { ! 80: while (--count >= 0) ! 81: cnputc(*s++); ! 82: } ! 83: ! 84: void ! 85: db_putnchars(c, count) ! 86: int c; ! 87: int count; ! 88: { ! 89: while (--count >= 0) ! 90: cnputc(c); ! 91: } ! 92: ! 93: /* ! 94: * Delete N characters, forward or backward ! 95: */ ! 96: #define DEL_FWD 0 ! 97: #define DEL_BWD 1 ! 98: void ! 99: db_delete(n, bwd) ! 100: int n; ! 101: int bwd; ! 102: { ! 103: register char *p; ! 104: ! 105: if (bwd) { ! 106: db_lc -= n; ! 107: db_putnchars(BACKUP, n); ! 108: } ! 109: for (p = db_lc; p < db_le-n; p++) { ! 110: *p = *(p+n); ! 111: cnputc(*p); ! 112: } ! 113: db_putnchars(BLANK, n); ! 114: db_putnchars(BACKUP, db_le - db_lc); ! 115: db_le -= n; ! 116: } ! 117: ! 118: /* returns TRUE at end-of-line */ ! 119: int ! 120: db_inputchar(c) ! 121: int c; ! 122: { ! 123: switch (c) { ! 124: case CTRL('b'): ! 125: /* back up one character */ ! 126: if (db_lc > db_lbuf_start) { ! 127: cnputc(BACKUP); ! 128: db_lc--; ! 129: } ! 130: break; ! 131: case CTRL('f'): ! 132: /* forward one character */ ! 133: if (db_lc < db_le) { ! 134: cnputc(*db_lc); ! 135: db_lc++; ! 136: } ! 137: break; ! 138: case CTRL('a'): ! 139: /* beginning of line */ ! 140: while (db_lc > db_lbuf_start) { ! 141: cnputc(BACKUP); ! 142: db_lc--; ! 143: } ! 144: break; ! 145: case CTRL('e'): ! 146: /* end of line */ ! 147: while (db_lc < db_le) { ! 148: cnputc(*db_lc); ! 149: db_lc++; ! 150: } ! 151: break; ! 152: case CTRL('h'): ! 153: case 0177: ! 154: /* erase previous character */ ! 155: if (db_lc > db_lbuf_start) ! 156: db_delete(1, DEL_BWD); ! 157: break; ! 158: case CTRL('d'): ! 159: /* erase next character */ ! 160: if (db_lc < db_le) ! 161: db_delete(1, DEL_FWD); ! 162: break; ! 163: case CTRL('k'): ! 164: /* delete to end of line */ ! 165: if (db_lc < db_le) ! 166: db_delete(db_le - db_lc, DEL_FWD); ! 167: break; ! 168: case CTRL('t'): ! 169: /* twiddle last 2 characters */ ! 170: if (db_lc >= db_lbuf_start + 2) { ! 171: c = db_lc[-2]; ! 172: db_lc[-2] = db_lc[-1]; ! 173: db_lc[-1] = c; ! 174: cnputc(BACKUP); ! 175: cnputc(BACKUP); ! 176: cnputc(db_lc[-2]); ! 177: cnputc(db_lc[-1]); ! 178: } ! 179: break; ! 180: case CTRL('r'): ! 181: db_putstring("^R\n", 3); ! 182: if (db_le > db_lbuf_start) { ! 183: db_putstring(db_lbuf_start, db_le - db_lbuf_start); ! 184: db_putnchars(BACKUP, db_le - db_lc); ! 185: } ! 186: break; ! 187: case '\n': ! 188: case '\r': ! 189: *db_le++ = c; ! 190: return (1); ! 191: default: ! 192: if (db_le == db_lbuf_end) { ! 193: cnputc('\007'); ! 194: } ! 195: else if (c >= ' ' && c <= '~') { ! 196: register char *p; ! 197: ! 198: for (p = db_le; p > db_lc; p--) ! 199: *p = *(p-1); ! 200: *db_lc++ = c; ! 201: db_le++; ! 202: cnputc(c); ! 203: db_putstring(db_lc, db_le - db_lc); ! 204: db_putnchars(BACKUP, db_le - db_lc); ! 205: } ! 206: break; ! 207: } ! 208: return (0); ! 209: } ! 210: ! 211: int ! 212: db_readline(lstart, lsize) ! 213: char * lstart; ! 214: int lsize; ! 215: { ! 216: db_force_whitespace(); /* synch output position */ ! 217: ! 218: db_lbuf_start = lstart; ! 219: db_lbuf_end = lstart + lsize; ! 220: db_lc = lstart; ! 221: db_le = lstart; ! 222: ! 223: while (!db_inputchar(cngetc())) ! 224: continue; ! 225: ! 226: db_putchar('\n'); /* synch output position */ ! 227: ! 228: *db_le = 0; ! 229: return (db_le - db_lbuf_start); ! 230: } ! 231: ! 232: void ! 233: db_check_interrupt() ! 234: { ! 235: register int c; ! 236: ! 237: c = cnmaygetc(); ! 238: switch (c) { ! 239: case -1: /* no character */ ! 240: return; ! 241: ! 242: case CTRL('c'): ! 243: db_error((char *)0); ! 244: /*NOTREACHED*/ ! 245: ! 246: case CTRL('s'): ! 247: do { ! 248: c = cnmaygetc(); ! 249: if (c == CTRL('c')) ! 250: db_error((char *)0); ! 251: } while (c != CTRL('q')); ! 252: break; ! 253: ! 254: default: ! 255: /* drop on floor */ ! 256: break; ! 257: } ! 258: } ! 259: ! 260: cnmaygetc () ! 261: { ! 262: return (-1); ! 263: } ! 264: ! 265: /* called from kdb_trap in db_interface.c */ ! 266: cnpollc (flag) ! 267: { ! 268: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.