This commit was generated by cvs2svn to track changes on a CVS vendor
[unix-history] / bin / stty / modes.c
CommitLineData
15637ed4
RG
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35static char sccsid[] = "@(#)modes.c 5.4 (Berkeley) 6/10/91";
36#endif /* not lint */
37
38#include <sys/types.h>
39#include <stddef.h>
40#include <string.h>
41#include "stty.h"
42
43struct modes {
44 char *name;
45 long set;
46 long unset;
47};
48
49/*
50 * The code in optlist() depends on minus options following regular
51 * options, i.e. "foo" must immediately precede "-foo".
52 */
53struct modes cmodes[] = {
54 "cs5", CS5, CSIZE,
55 "cs6", CS6, CSIZE,
56 "cs7", CS7, CSIZE,
57 "cs8", CS8, CSIZE,
58 "cstopb", CSTOPB, 0,
59 "-cstopb", 0, CSTOPB,
60 "cread", CREAD, 0,
61 "-cread", 0, CREAD,
62 "parenb", PARENB, 0,
63 "-parenb", 0, PARENB,
64 "parodd", PARODD, 0,
65 "-parodd", 0, PARODD,
66 "parity", PARENB | CS7, PARODD | CSIZE,
67 "-parity", CS8, PARODD | PARENB | CSIZE,
68 "evenp", PARENB | CS7, PARODD | CSIZE,
69 "-evenp", CS8, PARODD | PARENB | CSIZE,
70 "oddp", PARENB | CS7 | PARODD, CSIZE,
71 "-oddp", CS8, PARODD | PARENB | CSIZE,
72 "pass8", CS8, PARODD | PARENB | CSIZE,
73 "hupcl", HUPCL, 0,
74 "-hupcl", 0, HUPCL,
75 "hup", HUPCL, 0,
76 "-hup", 0, HUPCL,
77 "clocal", CLOCAL, 0,
78 "-clocal", 0, CLOCAL,
79 "crtscts", CRTSCTS, 0,
80 "-crtscts", 0, CRTSCTS,
6fc842cf
AC
81 "ctsflow", CCTS_OFLOW, 0,
82 "-ctsflow", 0, CCTS_OFLOW,
83 "dsrflow", CDSR_OFLOW, 0,
84 "-dsrflow", 0, CDSR_OFLOW,
85 "dtrflow", CDTR_IFLOW, 0,
86 "-dtrflow", 0, CDTR_IFLOW,
87 "rtsflow", CRTS_IFLOW, 0,
88 "-rtsflow", 0, CRTS_IFLOW,
15637ed4
RG
89 NULL
90};
91
92struct modes imodes[] = {
93 "ignbrk", IGNBRK, 0,
94 "-ignbrk", 0, IGNBRK,
95 "brkint", BRKINT, 0,
96 "-brkint", 0, BRKINT,
97 "ignpar", IGNPAR, 0,
98 "-ignpar", 0, IGNPAR,
99 "parmrk", PARMRK, 0,
100 "-parmrk", 0, PARMRK,
101 "inpck", INPCK, 0,
102 "-inpck", 0, INPCK,
103 "istrip", ISTRIP, 0,
104 "-istrip", 0, ISTRIP,
105 "inlcr", INLCR, 0,
106 "-inlcr", 0, INLCR,
107 "igncr", IGNCR, 0,
108 "-igncr", 0, IGNCR,
109 "icrnl", ICRNL, 0,
110 "-icrnl", 0, ICRNL,
111 "ixon", IXON, 0,
112 "-ixon", 0, IXON,
113 "flow", IXON, 0,
114 "-flow", 0, IXON,
115 "ixoff", IXOFF, 0,
116 "-ixoff", 0, IXOFF,
117 "tandem", IXOFF, 0,
118 "-tandem", 0, IXOFF,
119 "ixany", IXANY, 0,
120 "-ixany", 0, IXANY,
121 "decctlq", 0, IXANY,
122 "-decctlq", IXANY, 0,
123 "imaxbel", IMAXBEL, 0,
124 "-imaxbel", 0, IMAXBEL,
125 NULL
126};
127
128struct modes lmodes[] = {
129 "echo", ECHO, 0,
130 "-echo", 0, ECHO,
131 "echoe", ECHOE, 0,
132 "-echoe", 0, ECHOE,
133 "crterase", ECHOE, 0,
134 "-crterase", 0, ECHOE,
135 "crtbs", ECHOE, 0, /* crtbs not supported, close enough */
136 "-crtbs", 0, ECHOE,
137 "echok", ECHOK, 0,
138 "-echok", 0, ECHOK,
139 "echoke", ECHOKE, 0,
140 "-echoke", 0, ECHOKE,
141 "crtkill", ECHOKE, 0,
142 "-crtkill", 0, ECHOKE,
143 "altwerase", ALTWERASE, 0,
144 "-altwerase", 0, ALTWERASE,
145 "iexten", IEXTEN, 0,
146 "-iexten", 0, IEXTEN,
147 "echonl", ECHONL, 0,
148 "-echonl", 0, ECHONL,
149 "echoctl", ECHOCTL, 0,
150 "-echoctl", 0, ECHOCTL,
151 "ctlecho", ECHOCTL, 0,
152 "-ctlecho", 0, ECHOCTL,
153 "echoprt", ECHOPRT, 0,
154 "-echoprt", 0, ECHOPRT,
155 "prterase", ECHOPRT, 0,
156 "-prterase", 0, ECHOPRT,
157 "isig", ISIG, 0,
158 "-isig", 0, ISIG,
159 "icanon", ICANON, 0,
160 "-icanon", 0, ICANON,
161 "noflsh", NOFLSH, 0,
162 "-noflsh", 0, NOFLSH,
163 "tostop", TOSTOP, 0,
164 "-tostop", 0, TOSTOP,
165 "mdmbuf", MDMBUF, 0,
166 "-mdmbuf", 0, MDMBUF,
167 "flusho", FLUSHO, 0,
168 "-flusho", 0, FLUSHO,
169 "pendin", PENDIN, 0,
170 "-pendin", 0, PENDIN,
171 "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT,
172 "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL,
173 "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT,
174 "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL,
175 "nokerninfo", NOKERNINFO, 0,
176 "-nokerninfo", 0, NOKERNINFO,
177 "kerninfo", 0, NOKERNINFO,
178 "-kerninfo", NOKERNINFO, 0,
179 NULL
180};
181
182struct modes omodes[] = {
183 "opost", OPOST, 0,
184 "-opost", 0, OPOST,
185 "litout", 0, OPOST,
186 "-litout", OPOST, 0,
187 "onlcr", ONLCR, 0,
188 "-onlcr", 0, ONLCR,
189 "tabs", 0, OXTABS, /* "preserve" tabs */
190 "-tabs", OXTABS, 0,
191 "xtabs", OXTABS, 0,
192 "-xtabs", 0, OXTABS,
193 "oxtabs", OXTABS, 0,
194 "-oxtabs", 0, OXTABS,
195 NULL
196};
197
198#define CHK(s) (*name == s[0] && !strcmp(name, s))
199
200msearch(argvp, ip)
201 char ***argvp;
202 struct info *ip;
203{
204 register struct modes *mp;
205 register char *name;
206
207 name = **argvp;
208
209 for (mp = cmodes; mp->name; ++mp)
210 if (CHK(mp->name)) {
211 ip->t.c_cflag &= ~mp->unset;
212 ip->t.c_cflag |= mp->set;
213 ip->set = 1;
214 return(1);
215 }
216 for (mp = imodes; mp->name; ++mp)
217 if (CHK(mp->name)) {
218 ip->t.c_iflag &= ~mp->unset;
219 ip->t.c_iflag |= mp->set;
220 ip->set = 1;
221 return(1);
222 }
223 for (mp = lmodes; mp->name; ++mp)
224 if (CHK(mp->name)) {
225 ip->t.c_lflag &= ~mp->unset;
226 ip->t.c_lflag |= mp->set;
227 ip->set = 1;
228 return(1);
229 }
230 for (mp = omodes; mp->name; ++mp)
231 if (CHK(mp->name)) {
232 ip->t.c_oflag &= ~mp->unset;
233 ip->t.c_oflag |= mp->set;
234 ip->set = 1;
235 return(1);
236 }
237 return(0);
238}