# /* * set teletype modes */ #include <local-system> #define SILENT /* ** implement flag "-v" for silent changes */ /* * terminal types */ #ifdef BASSER #define ASR33 #define NCR260 #define DIABLO #define CDC713 #else #define TI700 #define TEKTRONICS #define VT05 #endif BASSER /* * tty flags */ #define HUPCL 01 #define XTABS 02 #define LCASE 04 #define ECHO 010 #define CRMOD 020 #define RAW 040 #define ODDP 0100 #define EVENP 0200 #define ANYP 0300 #define INVCASE 04000 #define FLOWCNTRL 0100000 /* * Delay algorithms */ #define CR0 0 #define CR1 010000 #define CR2 020000 #define CR3 030000 #define NL0 0 #define NL1 000400 #define NL2 001000 #define NL3 001400 #define TAB0 0 #define TAB1 002000 #ifndef INVCASE #define TAB2 004000 #define TAB3 006000 #endif #ifdef INVCASE #define TAB3 TAB1 #endif #define FF0 0 #define FF1 040000 #ifndef FLOWCNTRL #define BS0 0 #define BS1 0100000 #endif #ifndef INVCASE|FLOWCNTRL #define ALL 0177400 #endif #ifdef INVCASE|FLOWCNTRL #define ALL 073400 #endif /*#define NO_REDIRECT /* define to stop non-susers from effecting other ttys */ /* * disable redirection except for super-user. * use fd 2 not 1 * */ struct { char *string; int speed; } speeds[] { "0", (0<<8)|0, "50", (1<<8)|1, "75", (2<<8)|2, "110", (3<<8)|3, "134.5",(4<<8)|4, "150", (5<<8)|5, "200", (6<<8)|6, "300", (7<<8)|7, "600", (8<<8)|8, "1200", (9<<8)|9, "1800", (10<<8)|10, "2400", (11<<8)|11, "4800", (12<<8)|12, "9600", (13<<8)|13, "exta", (14<<8)|14, "extb", (15<<8)|15, "134", (4<<8)|4, 0, }; struct { char *string; int set; int reset; } modes[] { #ifdef FLOWCNTRL "fc", FLOWCNTRL, 0, "-fc", 0, FLOWCNTRL, #endif #ifdef INVCASE "INVCASE", INVCASE, 0, "invcase", INVCASE, 0, "-INVCASE", 0, INVCASE, "-invcase", 0, INVCASE, #endif "even", EVENP, 0, "-even", 0, EVENP, "odd", ODDP, 0, "-odd", 0, ODDP, "raw", RAW, 0, "-raw", 0, RAW, "cooked", 0, RAW, "-nl", CRMOD, 0, "nl", 0, CRMOD, "echo", ECHO, 0, "-echo", 0, ECHO, "LCASE", LCASE, 0, "lcase", LCASE, 0, "-LCASE", 0, LCASE, "-lcase", 0, LCASE, "-tabs", XTABS, 0, "tabs", 0, XTABS, "hup", HUPCL, 0, "-hup", 0, HUPCL, "cr0", CR0, CR3, "cr1", CR1, CR3, "cr2", CR2, CR3, "cr3", CR3, CR3, "tab0", TAB0, TAB3, "tab1", TAB1, TAB3, #ifndef INVCASE "tab2", TAB2, TAB3, "tab3", TAB3, TAB3, #endif "nl0", NL0, NL3, "nl1", NL1, NL3, "nl2", NL2, NL3, "nl3", NL3, NL3, "ff0", FF0, FF1, "ff1", FF1, FF1, #ifndef FLOWCNTRL "bs0", BS0, BS1, "bs1", BS1, BS1, #endif #ifdef ASR33 "33", CR1, ALL, "tty33", CR1, ALL, #endif #ifdef ASR37 "37", FF1+CR2+TAB1+NL1, ALL, "tty37", FF1+CR2+TAB1+NL1, ALL, #endif #ifdef VT05 "05", NL2, ALL, "vt05", NL2, ALL, #endif #ifdef TERMINET "tn", CR1, ALL, "tn300", CR1, ALL, #endif #ifdef TI700 "ti", CR2, ALL, "ti700", CR2, ALL, #endif #ifdef TEKTRONICS "tek", FF1, ALL, #endif #ifdef NCR260 "NCR", NL2+CR3+INVCASE, ALL+LCASE, "ncr", NL2+CR3+INVCASE, ALL+LCASE, "260", NL2+CR3+INVCASE, ALL+LCASE, #endif NCR260 0, }; char *arg; int mode[3]; #ifdef SILENT int vflg; #endif SILENT struct { char lobyte, hibyte; }; main(argc, argv) char *argv[]; { int i; gtty(1, mode); if(argc == 1) { prmodes(); exit(0); } while(--argc > 0) { arg = *++argv; if (eq("ek")) #ifndef BASSER mode[1] = '#@'; #else mode[1] = '\b@'; #endif BASSER if (eq("erase")) { mode[1].lobyte = **++argv; argc--; } if (eq("kill")) { mode[1].hibyte = **++argv; argc--; } # ifdef SILENT if (eq("-v")) vflg++; # endif SILENT for(i=0; speeds[i].string; i++) if(eq(speeds[i].string)) mode[0] = speeds[i].speed; for(i=0; modes[i].string; i++) if(eq(modes[i].string)) { mode[2] =& ~modes[i].reset; mode[2] =| modes[i].set; } if(arg) printf("unknown mode: %s\n", arg); } #ifdef NO_REDIRECT if(!getreal()) stty(1,mode); else stty(2,mode); #else stty(1,mode); #endif NO_REDIRECT gtty(1,mode); # ifdef SILENT if ( !vflg ) # endif SILENT prmodes(); } eq(string) register char *string; { register i; if(!arg) return(0); i = 0; loop: if(arg[i] != string[i]) return(0); if(arg[i++] != '\0') goto loop; arg = 0; return(1); } prmodes() { register m; if(mode[0].lobyte != mode[0].hibyte) { prspeed("input speed ", mode[0].lobyte); prspeed("output speed", mode[0].hibyte); } else prspeed("speed", mode[0].lobyte); printf("erase = '%c'; kill = '%c'\n", mode[1].lobyte, mode[1].hibyte); m = mode[2]; #ifdef FLOWCNTRL if ( m&FLOWCNTRL ) printf( "fc " ); #endif #ifdef INVCASE if ( m&INVCASE ) printf( "invcase " ); #endif if(m & 0200) printf("even "); if(m & 0100) printf("odd "); if(m & 040) printf("raw "); if(m & 020) printf("-nl "); if(m & 010) printf("echo "); if(m & 04) printf("lcase "); if(m & 02) printf("-tabs "); if(m & 01) printf("hup "); delay(m>>8, "nl"); #ifndef INVCASE delay(m>>10, "tab"); #endif #ifdef INVCASE delay( (m>>10)&1 , "tab" ); #endif delay(m>>12, "cr"); delay((m>>14)&1, "ff"); #ifndef FLOWCNTRL delay((m>>15)&1, "bs"); #endif printf("\n"); } delay(m, s) char *s; { if(m =& 3) printf("%s%d ", s, m); } prspeed(c, s) { printf("%s %s baud\n", c, speeds[s].string); } printf( s , a ) register char *s; { register c; register *p = &a; while ( c = *s++ ) { if ( c == '%' ) switch ( c = *s++ ) { case 's': printf( *p++ ); continue; case 'c': c = *p++; break; case 'd': printn( *p++ ); continue; case '\0': return; } putc( c ); } } printn( n ) register n; { register d; if ( d = n/10 ) printn( d ); putc( n%10 + '0' ); } putc(c) { write(2, &c, 1); }