Annotation of researchv10no/cmd/vsw/vswconf.c, revision 1.1

1.1     ! root        1: #include       <getflags.h>
        !             2: #include       <sys/types.h>
        !             3: #include       <sys/filio.h>
        !             4: #include       <sys/ttyio.h>
        !             5: #include       <ctype.h>
        !             6: 
        !             7: int logfd;
        !             8: int verbose;
        !             9: int vswfd;
        !            10: int row, col;
        !            11: int mode;
        !            12: int didoutput;
        !            13: 
        !            14: main(argc, argv)
        !            15:        char **argv;
        !            16: {
        !            17:        int i, n, in, out;
        !            18:        char buf[256];
        !            19:        struct sgttyb vvec;
        !            20:        extern int tty_ld;
        !            21: 
        !            22:        if((argc = getflags(argc, argv, "vsfi:1", 0)) < 0)
        !            23:                usage("");
        !            24:        verbose = flag['v'] != 0;
        !            25:        logfd = creat("vswconlog", 0666);
        !            26:        if(flag['i']){
        !            27:                if((vswfd = open(flag['i'][0], 0)) < 0){
        !            28:                        perror(flag['i'][0]);
        !            29:                        exit(1);
        !            30:                }
        !            31:        } else {
        !            32:                sprint(buf, "/cs/dk!vswcon");
        !            33:                vswfd = ipcopen(buf, "light");
        !            34:                if(vswfd < 0){
        !            35:                        perror(buf);
        !            36:                        exit(1);
        !            37:                }
        !            38:                if(ioctl(vswfd, FIOLOOKLD, 0) != tty_ld){
        !            39:                        if(ioctl(vswfd, FIOPUSHLD, &tty_ld) < 0){
        !            40:                                perror("tty_ld");
        !            41:                                exit(1);
        !            42:                        }
        !            43:                }
        !            44:                vvec.sg_flags = RAW;
        !            45:                vvec.sg_erase = 0;
        !            46:                vvec.sg_kill = 0;
        !            47:                if(ioctl(vswfd, TIOCSETP, &vvec) < 0){
        !            48:                        perror("ioctl");
        !            49:                        exit(1);
        !            50:                }
        !            51:        }
        !            52:        if(flag['f'])
        !            53:                fileinput();
        !            54:        else
        !            55:                interactive();
        !            56: }
        !            57: 
        !            58: fileinput()
        !            59: {
        !            60:        int i, n, in, out;
        !            61:        long t0;
        !            62:        char buf[256];
        !            63:        fd_set fds;
        !            64: 
        !            65:        FD_ZERO(fds);
        !            66:        for(;;){
        !            67:                t0 = time((long *)0)+2;
        !            68:                didoutput = 0;
        !            69:                for(;;){
        !            70:                        FD_SET(vswfd, fds);
        !            71:                        if((select(vswfd+1, &fds, (fd_set *)0, 2000) > 0) && FD_ISSET(vswfd, fds)){
        !            72:                                if(read(vswfd, buf, 1) == 1){
        !            73:                                        Fputc(logfd, buf[0]);
        !            74:                                        vt100(buf[0]);
        !            75:                                }
        !            76:                        }
        !            77:                        if(time((long *)0) >= t0){
        !            78:                                if(didoutput)
        !            79:                                        didoutput = 0, t0 = time((long *)0)+2;
        !            80:                                else
        !            81:                                        break;
        !            82:                        }
        !            83:                }
        !            84:                if(read(0, buf, 1) <= 0)
        !            85:                        break;
        !            86: if(0)fprint(2, "<%c>", buf[0]);
        !            87:                if(buf[0] == '_'){
        !            88:                        while(read(0, buf, 1) == 1)
        !            89:                                if(buf[0] == '\n')
        !            90:                                        break;
        !            91:                } else
        !            92:                        kbd(buf[0]);
        !            93:        }
        !            94: }
        !            95: 
        !            96: interactive()
        !            97: {
        !            98:        int i, n, in, out;
        !            99:        char buf[256];
        !           100:        struct sgttyb vvec;
        !           101:        fd_set fds;
        !           102: 
        !           103:        FD_ZERO(fds);
        !           104:        for(;;){
        !           105:                FD_SET(0, fds);
        !           106:                FD_SET(vswfd, fds);
        !           107:                if(select(vswfd+1, &fds, (fd_set *)0, 1000*3600) < 0){
        !           108:                        perror("select");
        !           109:                        exit(1);
        !           110:                }
        !           111:                if(FD_ISSET(vswfd, fds)){
        !           112:                        if(read(vswfd, buf, 1) == 1){
        !           113:                                Fputc(logfd, buf[0]);
        !           114:                                vt100(buf[0]);
        !           115:                                continue;
        !           116:                        }
        !           117:                }
        !           118:                if(FD_ISSET(0, fds)){
        !           119:                        read(0, buf, 1);
        !           120:                        kbd(buf[0]);
        !           121:                }
        !           122:        }
        !           123: }
        !           124: 
        !           125: typedef enum { IDLE, ESC, NUM1, NUM2 } State;
        !           126: 
        !           127: vt100(c)
        !           128: {
        !           129:        static State state = IDLE;
        !           130:        static prchar = 0;
        !           131:        static char buf[256];
        !           132:        static next = 0;
        !           133:        static num;
        !           134: 
        !           135:        switch(state)
        !           136:        {
        !           137:        case IDLE:
        !           138:                if(c == 033){
        !           139:                        state = ESC;
        !           140:                flush:
        !           141:                        if(next && !flag['s'])
        !           142:                                next = screen(buf, next);
        !           143:                        if(next){
        !           144:                                buf[next] = 0;
        !           145:                                if(mode)
        !           146:                                        print("[%d,%d]: *%s*\n", row, col, buf);
        !           147:                                else
        !           148:                                        print("[%d,%d]: %s\n", row, col, buf);
        !           149:                                didoutput = 1;
        !           150:                                next = 0;
        !           151:                        }
        !           152:                } else {
        !           153:                        buf[next++] = c;
        !           154:                        if(next+1 == sizeof buf)
        !           155:                                goto flush;
        !           156:                }
        !           157:                break;
        !           158:        case ESC:
        !           159:                switch(c)
        !           160:                {
        !           161:                case '[':
        !           162:                        state = NUM1;
        !           163:                        num = 0;
        !           164:                        break;
        !           165:                case '=':
        !           166:                        state = IDLE;
        !           167:                        break;
        !           168:                default:
        !           169:                        fprint(2, "*************ESC %c\n", c);
        !           170:                        state = IDLE;
        !           171:                        break;
        !           172:                }
        !           173:                break;
        !           174:        case NUM1:
        !           175:                switch(c)
        !           176:                {
        !           177:                case '0': case '1': case '2': case '3': case '4':
        !           178:                case '5': case '6': case '7': case '8': case '9':
        !           179:                        num = 10*num+c-'0';
        !           180:                        break;
        !           181:                case ';':
        !           182:                        row = num;
        !           183:                        num = 0;
        !           184:                        state = NUM2;
        !           185:                        break;
        !           186:                case 'H':       /* short address? */
        !           187:                        row = num;
        !           188:                        state = IDLE;
        !           189:                        break;
        !           190:                case 'm':       /* mode select */
        !           191:                        mode = num;
        !           192:                        state = IDLE;
        !           193:                        break;
        !           194:                case 'K':       /* line erase */
        !           195:                case 'J':       /* screen erase */
        !           196:                        state = IDLE;
        !           197:                        break;
        !           198:                default:
        !           199:                        fprint(2, "***********NUM1 error 0%o '%c'\n", c, c);
        !           200:                        state = IDLE;
        !           201:                }
        !           202:                break;
        !           203:        case NUM2:
        !           204:                switch(c)
        !           205:                {
        !           206:                case '0': case '1': case '2': case '3': case '4':
        !           207:                case '5': case '6': case '7': case '8': case '9':
        !           208:                        num = 10*num+c-'0';
        !           209:                        break;
        !           210:                case 'H':
        !           211:                        col = num;
        !           212:                        state = IDLE;
        !           213:                        break;
        !           214:                default:
        !           215:                        fprint(2, "**********NUM2 error 0%o '%c'\n", c, c);
        !           216:                        state = IDLE;
        !           217:                }
        !           218:                break;
        !           219:        }
        !           220: }
        !           221: 
        !           222: screen(buf, n)
        !           223:        char *buf;
        !           224: {
        !           225:        if(n == 8){
        !           226:                if((buf[2] == ':') && (buf[5] == ':'))
        !           227:                        return(0);
        !           228:        }
        !           229:        return(n);
        !           230: }
        !           231: 
        !           232: kbd(c)
        !           233: {
        !           234:        switch(c)
        !           235:        {
        !           236:        case '*':
        !           237:                while(read(0, &c, 1) == 1)
        !           238:                        if(c == '\n') break;
        !           239:                exit(0);
        !           240:        case '\\':
        !           241:                c = '\r';
        !           242:        default:
        !           243:                fprint(vswfd, "%c", c);
        !           244:                break;
        !           245:        }
        !           246: }

unix.superglobalmegacorp.com

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