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