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