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