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