1 /*- 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * William Jolitz. 7 * 8 * %sccs.include.noredist.c% 9 * 10 * @(#)gets.c 7.1 (Berkeley) 04/24/90 11 */ 12 13 /* special characters */ 14 #define bs 8 15 #define lf 10 16 #define cr 13 17 #define cntlc 3 18 #define del 0177 19 #define cntld 4 20 21 gets(buf) 22 char *buf; 23 { 24 register char *lp; 25 register c; 26 27 lp = buf; 28 for (;;) { 29 c = getchar() & 0177; 30 31 switch(c) { 32 case '\n': case '\r': *lp++ = '\0'; 33 return; 34 case '#': 35 if (lp > buf && lp[-1] == '\\') { 36 lp--; 37 goto norm; 38 } 39 /* FALL THROUGH */ 40 case bs: 41 case del: 42 lp--; 43 if (lp < buf) 44 lp = buf; 45 break; 46 case '@': 47 if (lp > buf && lp[-1] == '\\') { 48 lp--; 49 goto norm; 50 } 51 /* FALL THROUGH */ 52 case 'u'&037: 53 case 'x'&037: 54 lp = buf; 55 putchar('\n'); 56 break; 57 default: 58 norm: 59 *lp++ = c; 60 } 61 } 62 } 63 64 getchar() 65 { 66 register char thechar; 67 68 while (1) { 69 thechar = kbd(); 70 switch (thechar) { 71 default: if (thechar >= ' ') 72 sput(thechar); 73 return(thechar); 74 case cr: 75 case lf: sput(cr); 76 sput(lf); 77 return(lf); 78 case bs: 79 case del: 80 sput(bs); 81 sput(' '); 82 sput(bs); 83 return(thechar); 84 case cntlc: 85 sput('^') ; sput('C') ; sput('\r') ; sput('\n') ; 86 exit(-2) ; 87 case cntld: 88 sput('^') ; sput('D') ; sput('\r') ; sput('\n') ; 89 return(0); 90 } 91 } 92 } 93