Annotation of 3BSD/cmd/stty.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * set teletype modes
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <sgtty.h>
                      7: 
                      8: struct
                      9: {
                     10:        char    *string;
                     11:        int     speed;
                     12: } speeds[] = {
                     13:        "0",    B0,
                     14:        "50",   B50,
                     15:        "75",   B75,
                     16:        "110",  B110,
                     17:        "134",  B134,
                     18:        "134.5",B134,
                     19:        "150",  B150,
                     20:        "200",  B200,
                     21:        "300",  B300,
                     22:        "600",  B600,
                     23:        "1200", B1200,
                     24:        "1800", B1800,
                     25:        "2400", B2400,
                     26:        "4800", B4800,
                     27:        "9600", B9600,
                     28:        "exta", EXTA,
                     29:        "extb", EXTB,
                     30:        0,
                     31: };
                     32: struct
                     33: {
                     34:        char    *string;
                     35:        int     set;
                     36:        int     reset;
                     37: } modes[] = {
                     38:        "even",
                     39:        EVENP, 0,
                     40: 
                     41:        "-even",
                     42:        0, EVENP,
                     43: 
                     44:        "odd",
                     45:        ODDP, 0,
                     46: 
                     47:        "-odd",
                     48:        0, ODDP,
                     49: 
                     50:        "raw",
                     51:        RAW, 0,
                     52: 
                     53:        "-raw",
                     54:        0, RAW,
                     55: 
                     56:        "cooked",
                     57:        0, RAW,
                     58: 
                     59:        "-nl",
                     60:        CRMOD, 0,
                     61: 
                     62:        "nl",
                     63:        0, CRMOD,
                     64: 
                     65:        "echo",
                     66:        ECHO, 0,
                     67: 
                     68:        "-echo",
                     69:        0, ECHO,
                     70: 
                     71:        "LCASE",
                     72:        LCASE, 0,
                     73: 
                     74:        "lcase",
                     75:        LCASE, 0,
                     76: 
                     77:        "-LCASE",
                     78:        0, LCASE,
                     79: 
                     80:        "-lcase",
                     81:        0, LCASE,
                     82: 
                     83:        "-tabs",
                     84:        XTABS, 0,
                     85: 
                     86:        "tabs",
                     87:        0, XTABS,
                     88: 
                     89: 
                     90:        "cbreak",
                     91:        CBREAK, 0,
                     92: 
                     93:        "-cbreak",
                     94:        0, CBREAK,
                     95: 
                     96:        "cr0",
                     97:        CR0, CR3,
                     98: 
                     99:        "cr1",
                    100:        CR1, CR3,
                    101: 
                    102:        "cr2",
                    103:        CR2, CR3,
                    104: 
                    105:        "cr3",
                    106:        CR3, CR3,
                    107: 
                    108:        "tab0",
                    109:        TAB0, XTABS,
                    110: 
                    111:        "tab1",
                    112:        TAB1, XTABS,
                    113: 
                    114:        "tab2",
                    115:        TAB2, XTABS,
                    116: 
                    117:        "nl0",
                    118:        NL0, NL3,
                    119: 
                    120:        "nl1",
                    121:        NL1, NL3,
                    122: 
                    123:        "nl2",
                    124:        NL2, NL3,
                    125: 
                    126:        "nl3",
                    127:        NL3, NL3,
                    128: 
                    129:        "ff0",
                    130:        FF0, FF1,
                    131: 
                    132:        "ff1",
                    133:        FF1, FF1,
                    134: 
                    135:        "bs0",
                    136:        BS0, BS1,
                    137: 
                    138:        "bs1",
                    139:        BS1, BS1,
                    140: 
                    141:        "33",
                    142:        CR1, ALLDELAY,
                    143: 
                    144:        "tty33",
                    145:        CR1, ALLDELAY,
                    146: 
                    147:        "37",
                    148:        FF1+CR2+TAB1+NL1, ALLDELAY,
                    149: 
                    150:        "tty37",
                    151:        FF1+CR2+TAB1+NL1, ALLDELAY,
                    152: 
                    153:        "05",
                    154:        NL2, ALLDELAY,
                    155: 
                    156:        "vt05",
                    157:        NL2, ALLDELAY,
                    158: 
                    159:        "tn",
                    160:        CR1, ALLDELAY,
                    161: 
                    162:        "tn300",
                    163:        CR1, ALLDELAY,
                    164: 
                    165:        "ti",
                    166:        CR2, ALLDELAY,
                    167: 
                    168:        "ti700",
                    169:        CR2, ALLDELAY,
                    170: 
                    171:        "tek",
                    172:        FF1, ALLDELAY,
                    173: 
                    174:        0,
                    175:        };
                    176: 
                    177: char   *arg;
                    178: struct tchars tc;
                    179: struct sgttyb mode;
                    180: 
                    181: main(argc, argv)
                    182: char   *argv[];
                    183: {
                    184:        int i;
                    185: 
                    186:        gtty(1, &mode);
                    187:        ioctl(1, TIOCGETC, &tc);
                    188:        if(argc == 1) {
                    189:                prmodes();
                    190:                exit(0);
                    191:        }
                    192:        while(--argc > 0) {
                    193: 
                    194:                arg = *++argv;
                    195:                if (eq("ek")){
                    196:                        mode.sg_erase = '#';
                    197:                        mode.sg_kill = '@';
                    198:                }
                    199:                if (eq("erase") && --argc) {
                    200:                        if (**++argv == '^')
                    201:                                mode.sg_erase = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    202:                        else
                    203:                                mode.sg_erase = **argv;
                    204:                }
                    205:                if (eq("intr") && --argc) {
                    206:                        if (**++argv == '^')
                    207:                                tc.t_intrc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    208:                        else
                    209:                                tc.t_intrc = **argv;
                    210:                }
                    211:                if (eq("quit") && --argc) {
                    212:                        if (**++argv == '^')
                    213:                                tc.t_quitc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    214:                        else
                    215:                                tc.t_quitc = **argv;
                    216:                }
                    217:                if (eq("start") && --argc) {
                    218:                        if (**++argv == '^')
                    219:                                tc.t_startc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    220:                        else
                    221:                                tc.t_startc = **argv;
                    222:                }
                    223:                if (eq("stop") && --argc) {
                    224:                        if (**++argv == '^')
                    225:                                tc.t_stopc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    226:                        else
                    227:                                tc.t_stopc = **argv;
                    228:                }
                    229:                if (eq("eof") && --argc) {
                    230:                        if (**++argv == '^')
                    231:                                tc.t_eofc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    232:                        else
                    233:                                tc.t_eofc = **argv;
                    234:                }
                    235:                if (eq("brk") && --argc) {
                    236:                        if (**++argv == '^')
                    237:                                tc.t_brkc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    238:                        else
                    239:                                tc.t_brkc = **argv;
                    240:                }
                    241:                if (eq("kill") && --argc) {
                    242:                        if (**++argv == '^')
                    243:                                mode.sg_kill = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
                    244:                        else
                    245:                                mode.sg_kill = **argv;
                    246:                }
                    247:                if (eq("gspeed")) {
                    248:                        mode.sg_ispeed = B300;
                    249:                        mode.sg_ospeed = B9600;
                    250:                }
                    251:                if (eq("hup")) {
                    252:                        ioctl(1, TIOCHPCL, NULL);
                    253:                } else
                    254:                for(i=0; speeds[i].string; i++)
                    255:                        if(eq(speeds[i].string))
                    256:                                mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
                    257:                for(i=0; modes[i].string; i++)
                    258:                        if(eq(modes[i].string)) {
                    259:                                mode.sg_flags &= ~modes[i].reset;
                    260:                                mode.sg_flags |= modes[i].set;
                    261:                        }
                    262:                if(arg)
                    263:                        fprintf(stderr,"unknown mode: %s\n", arg);
                    264:        }
                    265:        stty(1,&mode);
                    266:        ioctl(1, TIOCSETC, &tc);
                    267: }
                    268: 
                    269: eq(string)
                    270: char *string;
                    271: {
                    272:        int i;
                    273: 
                    274:        if(!arg)
                    275:                return(0);
                    276:        i = 0;
                    277: loop:
                    278:        if(arg[i] != string[i])
                    279:                return(0);
                    280:        if(arg[i++] != '\0')
                    281:                goto loop;
                    282:        arg = 0;
                    283:        return(1);
                    284: }
                    285: 
                    286: prmodes()
                    287: {
                    288:        register m;
                    289: 
                    290:        if(mode.sg_ispeed != mode.sg_ospeed) {
                    291:                prspeed("input speed  ", mode.sg_ispeed);
                    292:                prspeed("output speed ", mode.sg_ospeed);
                    293:        } else
                    294:                prspeed("speed ", mode.sg_ispeed);
                    295:        pit(mode.sg_erase, "erase", "; ");
                    296:        pit(mode.sg_kill, "kill", "; ");
                    297:        pit(tc.t_intrc, "intr", "; ");
                    298:        pit(tc.t_quitc, "quit", "\n");
                    299:        pit(tc.t_startc, "start", "; ");
                    300:        pit(tc.t_stopc, "stop", "; ");
                    301:        pit(tc.t_eofc, "eof", "; ");
                    302:        pit(tc.t_brkc, "brk", "\n");
                    303:        m = mode.sg_flags;
                    304:        if(m & EVENP)   fprintf(stderr,"even ");
                    305:        if(m & ODDP)    fprintf(stderr,"odd ");
                    306:        fprintf(stderr,"-raw "+((m&RAW)!=0));
                    307:        fprintf(stderr,"-nl "+((m&CRMOD)==0));
                    308:        fprintf(stderr,"-echo "+((m&ECHO)!=0));
                    309:        fprintf(stderr,"-lcase "+((m&LCASE)!=0));
                    310:        fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS));
                    311:        fprintf(stderr,"-cbreak "+((m&CBREAK)!=0));
                    312:        delay((m&NLDELAY)/NL1,  "nl");
                    313:        if ((m&TBDELAY)!=XTABS)
                    314:                delay((m&TBDELAY)/TAB1, "tab");
                    315:        delay((m&CRDELAY)/CR1,  "cr");
                    316:        delay((m&VTDELAY)/FF1,  "ff");
                    317:        delay((m&BSDELAY)/BS1,  "bs");
                    318:        fprintf(stderr,"\n");
                    319: }
                    320: 
                    321: pit(what, itsname, sep)
                    322:        unsigned char what;
                    323:        char *itsname, *sep;
                    324: {
                    325: 
                    326:        fprintf(stderr, "%s", itsname);
                    327:        if (what == 0377) {
                    328:                fprintf(stderr, " <undef>%s", sep);
                    329:                return;
                    330:        }
                    331:        fprintf(stderr, " = ");
                    332:        if (what & 0200) {
                    333:                fprintf(stderr, "M-");
                    334:                what &= ~ 0200;
                    335:        }
                    336:        if (what == 0177) {
                    337:                fprintf(stderr, "^");
                    338:                what = '?';
                    339:        } else if (what < ' ') {
                    340:                fprintf(stderr, "^");
                    341:                what += '@';
                    342:        }
                    343:        fprintf(stderr, "%c%s", what, sep);
                    344: }
                    345: 
                    346: delay(m, s)
                    347: char *s;
                    348: {
                    349: 
                    350:        if(m)
                    351:                fprintf(stderr,"%s%d ", s, m);
                    352: }
                    353: 
                    354: int    speed[] = {
                    355:        0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
                    356: };
                    357: 
                    358: prspeed(c, s)
                    359: char *c;
                    360: {
                    361: 
                    362:        fprintf(stderr,"%s%d baud\n", c, speed[s]);
                    363: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.