xref: /original-bsd/sys/i386/stand/gets.c (revision e59fb703)
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