xref: /original-bsd/bin/stty/modes.c (revision 217010d6)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)modes.c	5.4 (Berkeley) 06/10/91";
10 #endif /* not lint */
11 
12 #include <sys/types.h>
13 #include <stddef.h>
14 #include <string.h>
15 #include "stty.h"
16 
17 struct modes {
18 	char *name;
19 	long set;
20 	long unset;
21 };
22 
23 /*
24  * The code in optlist() depends on minus options following regular
25  * options, i.e. "foo" must immediately precede "-foo".
26  */
27 struct modes cmodes[] = {
28 	"cs5",		CS5, CSIZE,
29 	"cs6",		CS6, CSIZE,
30 	"cs7",		CS7, CSIZE,
31 	"cs8",		CS8, CSIZE,
32 	"cstopb",	CSTOPB, 0,
33 	"-cstopb",	0, CSTOPB,
34 	"cread",	CREAD, 0,
35 	"-cread",	0, CREAD,
36 	"parenb",	PARENB, 0,
37 	"-parenb",	0, PARENB,
38 	"parodd",	PARODD, 0,
39 	"-parodd",	0, PARODD,
40 	"parity",	PARENB | CS7, PARODD | CSIZE,
41 	"-parity",	CS8, PARODD | PARENB | CSIZE,
42 	"evenp",	PARENB | CS7, PARODD | CSIZE,
43 	"-evenp",	CS8, PARODD | PARENB | CSIZE,
44 	"oddp",		PARENB | CS7 | PARODD, CSIZE,
45 	"-oddp",	CS8, PARODD | PARENB | CSIZE,
46 	"pass8",	CS8, PARODD | PARENB | CSIZE,
47 	"hupcl",	HUPCL, 0,
48 	"-hupcl",	0, HUPCL,
49 	"hup",		HUPCL, 0,
50 	"-hup",		0, HUPCL,
51 	"clocal",	CLOCAL, 0,
52 	"-clocal",	0, CLOCAL,
53 	"crtscts",	CRTSCTS, 0,
54 	"-crtscts",	0, CRTSCTS,
55 	NULL
56 };
57 
58 struct modes imodes[] = {
59 	"ignbrk",	IGNBRK, 0,
60 	"-ignbrk",	0, IGNBRK,
61 	"brkint",	BRKINT, 0,
62 	"-brkint",	0, BRKINT,
63 	"ignpar",	IGNPAR, 0,
64 	"-ignpar",	0, IGNPAR,
65 	"parmrk",	PARMRK, 0,
66 	"-parmrk",	0, PARMRK,
67 	"inpck",	INPCK, 0,
68 	"-inpck",	0, INPCK,
69 	"istrip",	ISTRIP, 0,
70 	"-istrip",	0, ISTRIP,
71 	"inlcr",	INLCR, 0,
72 	"-inlcr",	0, INLCR,
73 	"igncr",	IGNCR, 0,
74 	"-igncr",	0, IGNCR,
75 	"icrnl",	ICRNL, 0,
76 	"-icrnl",	0, ICRNL,
77 	"ixon",		IXON, 0,
78 	"-ixon",	0, IXON,
79 	"flow",		IXON, 0,
80 	"-flow",	0, IXON,
81 	"ixoff",	IXOFF, 0,
82 	"-ixoff",	0, IXOFF,
83 	"tandem",	IXOFF, 0,
84 	"-tandem",	0, IXOFF,
85 	"ixany",	IXANY, 0,
86 	"-ixany",	0, IXANY,
87 	"decctlq",	0, IXANY,
88 	"-decctlq",	IXANY, 0,
89 	"imaxbel",	IMAXBEL, 0,
90 	"-imaxbel",	0, IMAXBEL,
91 	NULL
92 };
93 
94 struct modes lmodes[] = {
95 	"echo",		ECHO, 0,
96 	"-echo",	0, ECHO,
97 	"echoe",	ECHOE, 0,
98 	"-echoe",	0, ECHOE,
99 	"crterase",	ECHOE, 0,
100 	"-crterase",	0, ECHOE,
101 	"crtbs",	ECHOE, 0,   /* crtbs not supported, close enough */
102 	"-crtbs",	0, ECHOE,
103 	"echok",	ECHOK, 0,
104 	"-echok",	0, ECHOK,
105 	"echoke",	ECHOKE, 0,
106 	"-echoke",	0, ECHOKE,
107 	"crtkill",	ECHOKE, 0,
108 	"-crtkill",	0, ECHOKE,
109 	"altwerase",	ALTWERASE, 0,
110 	"-altwerase",	0, ALTWERASE,
111 	"iexten",	IEXTEN, 0,
112 	"-iexten",	0, IEXTEN,
113 	"echonl",	ECHONL, 0,
114 	"-echonl",	0, ECHONL,
115 	"echoctl",	ECHOCTL, 0,
116 	"-echoctl",	0, ECHOCTL,
117 	"ctlecho",	ECHOCTL, 0,
118 	"-ctlecho",	0, ECHOCTL,
119 	"echoprt",	ECHOPRT, 0,
120 	"-echoprt",	0, ECHOPRT,
121 	"prterase",	ECHOPRT, 0,
122 	"-prterase",	0, ECHOPRT,
123 	"isig",		ISIG, 0,
124 	"-isig",	0, ISIG,
125 	"icanon",	ICANON, 0,
126 	"-icanon",	0, ICANON,
127 	"noflsh",	NOFLSH, 0,
128 	"-noflsh",	0, NOFLSH,
129 	"tostop",	TOSTOP, 0,
130 	"-tostop",	0, TOSTOP,
131 	"mdmbuf",	MDMBUF, 0,
132 	"-mdmbuf",	0, MDMBUF,
133 	"flusho",	FLUSHO, 0,
134 	"-flusho",	0, FLUSHO,
135 	"pendin",	PENDIN, 0,
136 	"-pendin",	0, PENDIN,
137 	"crt",		ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT,
138 	"-crt",		ECHOK, ECHOE|ECHOKE|ECHOCTL,
139 	"newcrt",	ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT,
140 	"-newcrt",	ECHOK, ECHOE|ECHOKE|ECHOCTL,
141 	"nokerninfo",	NOKERNINFO, 0,
142 	"-nokerninfo",	0, NOKERNINFO,
143 	"kerninfo",	0, NOKERNINFO,
144 	"-kerninfo",	NOKERNINFO, 0,
145 	NULL
146 };
147 
148 struct modes omodes[] = {
149 	"opost",	OPOST, 0,
150 	"-opost",	0, OPOST,
151 	"litout",	0, OPOST,
152 	"-litout",	OPOST, 0,
153 	"onlcr",	ONLCR, 0,
154 	"-onlcr",	0, ONLCR,
155 	"tabs",		0, OXTABS,	/* "preserve" tabs */
156 	"-tabs",	OXTABS, 0,
157 	"xtabs",	OXTABS, 0,
158 	"-xtabs",	0, OXTABS,
159 	"oxtabs",	OXTABS, 0,
160 	"-oxtabs",	0, OXTABS,
161 	NULL
162 };
163 
164 #define	CHK(s)	(*name == s[0] && !strcmp(name, s))
165 
166 msearch(argvp, ip)
167 	char ***argvp;
168 	struct info *ip;
169 {
170 	register struct modes *mp;
171 	register char *name;
172 
173 	name = **argvp;
174 
175 	for (mp = cmodes; mp->name; ++mp)
176 		if (CHK(mp->name)) {
177 			ip->t.c_cflag &= ~mp->unset;
178 			ip->t.c_cflag |= mp->set;
179 			ip->set = 1;
180 			return(1);
181 		}
182 	for (mp = imodes; mp->name; ++mp)
183 		if (CHK(mp->name)) {
184 			ip->t.c_iflag &= ~mp->unset;
185 			ip->t.c_iflag |= mp->set;
186 			ip->set = 1;
187 			return(1);
188 		}
189 	for (mp = lmodes; mp->name; ++mp)
190 		if (CHK(mp->name)) {
191 			ip->t.c_lflag &= ~mp->unset;
192 			ip->t.c_lflag |= mp->set;
193 			ip->set = 1;
194 			return(1);
195 		}
196 	for (mp = omodes; mp->name; ++mp)
197 		if (CHK(mp->name)) {
198 			ip->t.c_oflag &= ~mp->unset;
199 			ip->t.c_oflag |= mp->set;
200 			ip->set = 1;
201 			return(1);
202 		}
203 	return(0);
204 }
205