Annotation of 43BSDReno/usr.bin/ex/OTHER/vms/vms.c, revision 1.1.1.1

1.1       root        1: #include "ex.h"
                      2: #include <ssdef.h>
                      3: #include <iodef.h>
                      4: #include <ttdef.h>
                      5: #include <descrip.h>
                      6: 
                      7: /*
                      8:  * These are hack routines that will only work with
                      9:  * ex/vi on vms.  If you use it for anything else,
                     10:  * that's your problem.
                     11:  */
                     12: 
                     13: static $DESCRIPTOR(inpdev, "TT");      /* Terminal to use for input */
                     14: static long termset[2] = { 0,0 };      /* No terminator */
                     15: static short iosb[4];
                     16: 
                     17: static short   ichan = -1;             /* Gets channel for inpdev */
                     18: static int     cbreak = 0;             /* Whether we are in cbreak mode */
                     19: 
                     20: /* ARGSUSED */
                     21: gtty(chan, ttybuf)
                     22: int            chan;
                     23: struct sgttyb  *ttybuf;
                     24: {
                     25:        int     errcode;
                     26:        long    term_char[2];
                     27: 
                     28:        if (ichan < 0)
                     29:                set_ichan();
                     30:        errcode = sys$qiow(1, ichan, IO$_SENSEMODE, iosb, NULL, 0,
                     31:                term_char, 0, 0, 0, 0, 0);
                     32:        if (errcode != SS$_NORMAL)
                     33:                return -1;
                     34:        switch (iosb[1]) {
                     35:          case TT$C_BAUD_300:
                     36:                ttybuf->sg_ispeed = ttybuf->sg_ospeed = B300;
                     37:                break;
                     38:          case TT$C_BAUD_1200:
                     39:                ttybuf->sg_ispeed = ttybuf->sg_ospeed = B1200;
                     40:                break;
                     41:          case TT$C_BAUD_9600:
                     42:                /*
                     43:                 * Effectively the same as 2400
                     44:                 */
                     45:          case TT$C_BAUD_2400:
                     46:                ttybuf->sg_ispeed = ttybuf->sg_ospeed = B2400;
                     47:                break;
                     48:          default:
                     49:                lprintf("Defaulting to 2400 baud terminal\n");
                     50:                flush();
                     51:                ttybuf->sg_ispeed = ttybuf->sg_ospeed = B2400;
                     52:                break;
                     53:        }
                     54:        ttybuf->sg_erase = 0177;
                     55:        ttybuf->sg_kill = CTRL(U);
                     56:        ttybuf->sg_flags = ECHO | CRMOD;
                     57:        if (cbreak)
                     58:                ttybuf->sg_flags |= CBREAK;
                     59:        return 0;
                     60: }
                     61: 
                     62: stty(chan, ttybuf)
                     63: int            chan;
                     64: struct sgttyb  *ttybuf;
                     65: {
                     66:        if (chan != 1)
                     67:                return;
                     68:        cbreak = (ttybuf->sg_flags & CBREAK);
                     69:        return 0;
                     70: }
                     71: 
                     72: set_ichan()
                     73: {
                     74:        if (sys$assign(&inpdev, &ichan, 0, 0) != SS$_NORMAL) {
                     75:                syserror("TT");
                     76:                ex_exit(1);
                     77:        }
                     78: }
                     79: 
                     80: vms_read(fd, buf, cnt)
                     81: int    fd;
                     82: char   *buf;
                     83: int    cnt;
                     84: {
                     85:        int     errcode;
                     86: 
                     87:        if (fd != 0)
                     88:                return read(fd, buf, cnt);
                     89:        if (ichan < 0)
                     90:                set_ichan();
                     91:        errcode = sys$qiow(1, ichan,
                     92:                IO$_READLBLK | IO$M_NOECHO | IO$M_NOFILTR,
                     93:                NULL, NULL, 0, buf, 1, 0, &termset, NULL, 0);
                     94:        if (errcode == SS$_NORMAL)
                     95:                return 1;
                     96:        else
                     97:                return 0;
                     98: }
                     99: 
                    100: vms_write(fd, buf, cnt)
                    101: int    fd;
                    102: char   *buf;
                    103: int    cnt;
                    104: {
                    105:        int     errcode;
                    106: 
                    107:        if (fd != 1 || !cbreak)
                    108:                return write(fd, buf, cnt);
                    109:        if (ichan < 0)
                    110:                set_ichan();
                    111:        errcode = sys$qiow(1, ichan,
                    112:                IO$_WRITELBLK | IO$M_NOFORMAT,
                    113:                NULL, NULL, 0, buf, cnt, 0, 0, 0, 0);
                    114:        if (errcode == SS$_NORMAL)
                    115:                return cnt;
                    116:        else
                    117:                return 0;
                    118: }
                    119: 
                    120: /*
                    121:  * getlog - getenv() look-alike routine for VMS logical names
                    122:  *
                    123:  * Chris Carlson 1nov84
                    124:  */
                    125: char *
                    126: getlog(log)
                    127:        char *log;
                    128: {
                    129:        struct dsc$descriptor_s log_d = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
                    130:        static char trans[128];
                    131:        $DESCRIPTOR(trans_d, trans);
                    132:        short int translen;
                    133: 
                    134:        log_d.dsc$a_pointer = log;
                    135:        log_d.dsc$w_length = strlen(log);
                    136:        if (lib$sys_trnlog(&log_d, &translen, &trans_d, 0, 0, 0)
                    137:        == SS$_NORMAL) {
                    138:                do {
                    139:                        log_d.dsc$a_pointer = trans;
                    140:                        log_d.dsc$w_length = translen;
                    141:                } while (lib$sys_trnlog(&log_d, &translen, &trans_d, 0, 0, 0)
                    142:                         == SS$_NORMAL);
                    143:                trans[translen] = '\0';
                    144:                return(trans);
                    145:        }
                    146:        return((char *)0);
                    147: }
                    148: 
                    149: /*
                    150:  * unlink:
                    151:  *     Removes a file.  This is provided so there is a minimum
                    152:  *     of carnage in standard ex sources
                    153:  */
                    154: unlink(fname)
                    155: char   *fname;
                    156: {
                    157:        return delete(fname);
                    158: }
                    159: 
                    160: vms_exit(n)
                    161: int    n;
                    162: {
                    163: #undef _exit
                    164:        if (n == 0)
                    165:                _exit(SS$_NORMAL);
                    166:        else
                    167:                _exit(SS$_ABORT);
                    168: }
                    169: 
                    170: bcopy(from, to, count)
                    171: char   *from, *to;
                    172: int    count;
                    173: {
                    174:        lib$movc3(&count, from, to);
                    175: }

unix.superglobalmegacorp.com

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