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