Annotation of cci/usr/src/usr.bin/bsc/cmd/3270/emprocbuf.c, revision 1.1

1.1     ! root        1: /*     D.L.Buck and Associates, Inc. - May, 1984
        !             2:  *
        !             3:  *     COPYRIGHT NOTICE:
        !             4:  *             Copyright c 1984 - An unpublished work by 
        !             5:  *             D.L.Buck and Associates, Inc.
        !             6:  *
        !             7:  *     PROPRIETARY RIGHTS NOTICE:
        !             8:  *             All rights reserved. This document and program contains
        !             9:  *             proprietary information of D.L.Buck and Associates,Inc.
        !            10:  *             of San Jose, California, U.S.A., embodying confidential
        !            11:  *             information,  ideas, and expressions,  no part of which
        !            12:  *             may be reproduced, or transmitted in any form or by any
        !            13:  *             means,  electronic,  mechanical,  or otherwise, without
        !            14:  *             the written permission of D.L.Buck and Associates, Inc.
        !            15:  *
        !            16:  *     NAME
        !            17:  *             emprocbuf 
        !            18:  *     SYNOPSIS
        !            19:  *             emprocbuf(buf,count)
        !            20:  *             char *buf;      address of received buffer
        !            21:  *             register int count;     number of characters in buffer
        !            22:  *     DESCRIPTION
        !            23:  *             The received buffer should have the format of a received
        !            24:  *             3277-style buffer, and contain commands, orders, and
        !            25:  *             buffer data for the 3277 screen. This routine processes
        !            26:  *             the commands, orders, and buffer data, creating or updating
        !            27:  *             the information in the external variables mentioned in
        !            28:  *             em.h which comprise the virtual 3277 screen.
        !            29:  */
        !            30: static char s_emproc[] = "@(#)emprocbuf.c      1.14 REL";
        !            31: 
        !            32: #include <em.h>
        !            33: #include <ctype.h>
        !            34: #define        NUL     '\0'
        !            35: 
        !            36: #define        CMDPRE  033             /* Indicates command code follows */
        !            37: /* command codes: (Ascii) */
        !            38: #define        EWRITE  '5'             /* Erase/Write */
        !            39: #define        WRITE   '1'             /* Write */
        !            40: #define        COPY    '7'             /* Copy (3271 only) */
        !            41: #define        EAU     '?'             /* Erase All Unprotected */
        !            42: #define        RDBUF   '2'             /* Read Buffer */
        !            43: #define        RDMOD   '6'             /* Read Modified */
        !            44: 
        !            45: /* WRITE and EWRITE are followed by a WCC ... */
        !            46: char wcc;
        !            47: 
        !            48: /* Order Definitions:             Name:                Followed by: */
        !            49: #define        SF      0x1d            /* Start Field          Attr. char */
        !            50: #define        SBA     0x11            /* Set Buffer Address   2-byte addr. */
        !            51: #define        IC      0x13            /* Insert Cursor        (nothing) */
        !            52: #define        PT      0x09            /* Program Tab          (nothing) */
        !            53: #define        RA      0x14            /* Repeat to Addr.      2-byte addr. */
        !            54: #define        EUA     0x12            /* Erase Unprot. to Addr.  2-byte addr. */
        !            55: 
        !            56: #define        DATA    1000            /* last thing was data */
        !            57: #define        FUNNYPT 1001            /* last thing was PT that wrapped */
        !            58: 
        !            59: extern char aid_val;
        !            60: extern int lastkey;            /* last AID key entered */
        !            61: 
        !            62: emprocbuf(buf,count)
        !            63: register char *buf;    /* address of received buffer */
        !            64: register int count;            /* number of characters it contains */
        !            65: {
        !            66:        extern int SG;          /* # blanks left by SO or SE */
        !            67:        extern int ascii;       /* ascii or ebcdic code flag */
        !            68:        extern char aadr_tbl[]; /* ascii hex cursor address encoding table */
        !            69:        extern char eadr_tbl[]; /* ebcdic hex cursor address encoding table */
        !            70:        extern char *index();
        !            71:        extern char *SO;        /* Standout sequence */
        !            72:        static int ncarry;      /* number of characters carried over */
        !            73:        static char carrybuf[5];/* carried over characters */
        !            74:        static char lastthing;  /* last thing we did */
        !            75:        register char *p;       /* work pointer */
        !            76:        register int *ip;       /* work pointer */
        !            77:        char newchar;
        !            78:        char clearflag;
        !            79:        int newbufaddr;
        !            80:        char *tr_tbl;           /* ascii or ebcdic address transl. tbl */
        !            81:        long upf;
        !            82: 
        !            83:        tr_tbl = ascii?aadr_tbl:eadr_tbl;
        !            84:        unfiximage();           /* Convert screen image to work mode */
        !            85:        while (ncarry) {        /* if chars were left over from last block, */
        !            86:                *--buf = carrybuf[--ncarry];    /* prefix them to given block */
        !            87:                ++count;
        !            88:                }
        !            89: 
        !            90:        while (--count >= 0)    /* for all characters in buffer, */
        !            91:                {
        !            92:                if (!ascii)     /* translate to ascii if necessary */
        !            93:                        ebcasc(buf,1);
        !            94:                switch (*buf) {
        !            95:                case CMDPRE:    /* start of command */
        !            96:                        fiximage(0);
        !            97:                        unfiximage();
        !            98:                        if (count < 1) {
        !            99:                                ncarry = 1;     /* save ESC */
        !           100:                                goto abort;
        !           101:                        }
        !           102:                        ++buf; --count;         /* next is command code */
        !           103:                        if (!ascii)             /* deal with ascii only */
        !           104:                                ebcasc(buf,1);
        !           105:                        lastthing = *buf;       /* this is a command */
        !           106:                        switch (*buf) {
        !           107:                        case EWRITE:            /* erase screen, then write */
        !           108:                                cursaddr = 0;   /* clear screen variables */
        !           109:                                bufaddr = 0;
        !           110:                                curfield = 0;
        !           111:                                totfields = 0;
        !           112:                                for (p = scrn_image;
        !           113:                                     p < &scrn_image[MAXSCREENSIZE];
        !           114:                                     *p++ = NUL) ;
        !           115:                                for (ip = scrn_xref;
        !           116:                                     ip < &scrn_xref[MAXSCREENSIZE];
        !           117:                                     *ip++ = 0) ;
        !           118:                                wmove(vterm_scr,0,0);
        !           119:                                werase(vterm_scr);
        !           120:                                wrefresh(vterm_scr);
        !           121: 
        !           122:                        /* reset aid value and last aid key hit */
        !           123:                                aid_val = ascii?0x2d:0x60;
        !           124:                                lastkey = 0;
        !           125:                        case WRITE:
        !           126:                                updstat (status | SYS_AVAIL);
        !           127:                                if (count < 1) {        /* need wcc, too */
        !           128:                                        ncarry = 2;     /* save ESC, cmd */
        !           129:                                        goto abort;
        !           130:                                }
        !           131:                                ++buf; --count;
        !           132:                                wcc = *buf;             /* save wcc */
        !           133:                                if (ascii)
        !           134:                                        wcc = eadr_tbl[index(aadr_tbl,wcc)-
        !           135:                                                aadr_tbl];
        !           136:                        /* reset MDT bits; they were saved in scrn_xref */
        !           137:                                if (wcc & WCCMDTRST)
        !           138:                                        for (ip=scrn_xref;
        !           139:                                             ip<&scrn_xref[MAXSCREENSIZE];
        !           140:                                             ++ip)
        !           141:                                                *ip &= ~ATTRMDT;
        !           142:                                if (lastthing == 0 || lastthing == COPY ||
        !           143:                                    lastthing == EAU)
        !           144:                                        bufaddr = cursaddr;
        !           145:                                break;
        !           146:                        case EAU:       /* erase all unprotected */
        !           147:                                updstat (status | SYS_AVAIL);
        !           148:                                lastthing = EAU;
        !           149: 
        !           150:                                /*++buf; --count;*/
        !           151:                                /* erase unprotected positions 0 to
        !           152:                                   MAXSCREENSIZE-1 and reset the MDT bit */
        !           153:                                upf = eua(0, 0, 1);
        !           154:                                if (upf) {
        !           155:                                        bufaddr = cursaddr = fldstart[upf];
        !           156:                                }
        !           157:                                else  { bufaddr = cursaddr = 0; }
        !           158:                                /* Enable keyboard */
        !           159:                                updstat ((status | SYS_AVAIL) & ~INPUT_INH);
        !           160:                                /* reset the aid value */
        !           161:                                aid_val = ascii?0x2d:0x60;
        !           162:                                lastkey = 0;
        !           163:                                break;
        !           164:                        case COPY:      /* UNSUPPORTED */
        !           165:                                if (count < 1) {
        !           166:                                        ncarry = 2;
        !           167:                                        goto abort;
        !           168:                                }
        !           169:                                ++buf; --count;
        !           170:                                lastthing = COPY;
        !           171:                                updstat (status | SYS_AVAIL);
        !           172:                                break;
        !           173:                        }
        !           174:                        break;
        !           175:                case SF:        /* Start Field - followed by attr. char. */
        !           176:                        if (count < 1) {        /* need 1-char attr. */
        !           177:                                ncarry = 1;     /* carry SF forward */
        !           178:                                goto abort;
        !           179:                        }
        !           180:                        lastthing = SF;
        !           181:                        ++buf; --count;
        !           182:                        scrn_image[bufaddr] = ATTRCODE; /* mark screen image */
        !           183:                        newchar = *buf;
        !           184:                        if (ascii)
        !           185:                                newchar = eadr_tbl[index(aadr_tbl,newchar)-
        !           186:                                                aadr_tbl];
        !           187:                        scrn_xref[bufaddr]  = newchar;
        !           188:                        ++bufaddr;
        !           189:                        if (bufaddr >= MAXSCREENSIZE)
        !           190:                                bufaddr = 0;
        !           191:                        break;
        !           192: 
        !           193:                case SBA:       /* Set Buffer Address - followed by addr */
        !           194:                        if (count < 2) {        /* need 2-char addr */
        !           195:                                ncarry = 1;
        !           196:                                goto abort;
        !           197:                        }
        !           198:                        lastthing = SBA;
        !           199:                        newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) |
        !           200:                                   (index(tr_tbl,buf[2])-tr_tbl);
        !           201:                        buf += 2;
        !           202:                        count -= 2;
        !           203:                        if (newbufaddr < 0 || newbufaddr >= MAXSCREENSIZE)
        !           204:                                break;
        !           205:                        bufaddr = newbufaddr;
        !           206:                        break;
        !           207: 
        !           208:                case IC:        /* Set Cursor Address */
        !           209:                        lastthing = IC;
        !           210:                        cursaddr = bufaddr;
        !           211:                        break;
        !           212: 
        !           213:                case PT:        /* Program Tab */
        !           214:                        if (!totfields) {
        !           215:                                bufaddr = 0;
        !           216:                                break;
        !           217:                        }
        !           218:                        clearflag =  (lastthing == 0 || lastthing == DATA ||
        !           219:                            lastthing == FUNNYPT);
        !           220:                        lastthing = FUNNYPT;
        !           221:                /***    while (bufaddr < MAXSCREENSIZE) {  ***/
        !           222:                        for(;;) {  /* scan till hit a field */
        !           223:                                if (scrn_image[bufaddr] == ATTRCODE) {
        !           224:                                        clearflag = 0;
        !           225:                                        if (!(prot_attr(scrn_xref[bufaddr]))) {
        !           226:                                                ++bufaddr;
        !           227:                                                lastthing = PT;
        !           228:                                                break;
        !           229:                                        }
        !           230:                                } else if (clearflag)
        !           231:                                        scrn_image[bufaddr] = '\0';
        !           232:                        /***    ++bufaddr;      ***/
        !           233:                                if (++bufaddr >= MAXSCREENSIZE)
        !           234:                                        bufaddr = 0;
        !           235:                                /*++bufaddr;*/
        !           236:                        }
        !           237:                        if (bufaddr >= MAXSCREENSIZE)
        !           238:                                bufaddr = 0;
        !           239:                        break;
        !           240: 
        !           241:                case RA:        /* Repeat to Address - followed by addr */
        !           242:                        if (count < 3) {        /* need 2-byte addr, char */
        !           243:                                ncarry = 1;
        !           244:                                goto abort;
        !           245:                        }
        !           246:                        lastthing = RA;
        !           247:                        newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) |
        !           248:                                   (index(tr_tbl,buf[2])-tr_tbl);
        !           249:                        newchar = buf[3];       /* char to be repeated */
        !           250:                        if (!ascii)
        !           251:                                ebcasc(&newchar,1);
        !           252:                        buf += 3;
        !           253:                        count -= 3;
        !           254:                        if (newbufaddr < 0 || newbufaddr >= MAXSCREENSIZE)
        !           255:                                break;
        !           256:                        do      {
        !           257:                                scrn_image[bufaddr] = newchar;
        !           258:                                if (++bufaddr >= MAXSCREENSIZE)
        !           259:                                        bufaddr = 0;
        !           260:                        } while (bufaddr != newbufaddr);
        !           261:                        break;
        !           262: 
        !           263:                case EUA:       /* erase unprotected to (following) addr */
        !           264:                        if (count < 2) {        /* need 2-char addr */
        !           265:                                ncarry = 1;
        !           266:                                goto abort;
        !           267:                        }
        !           268:                        lastthing = EUA;
        !           269:                        newbufaddr = ((index(tr_tbl,buf[1])-tr_tbl) << 6) |
        !           270:                                   (index(tr_tbl,buf[2])-tr_tbl);
        !           271:                        buf += 2;
        !           272:                        count -= 2;
        !           273:                        if (newbufaddr < 0 || newbufaddr >= MAXSCREENSIZE)
        !           274:                                break;
        !           275:                        eua(bufaddr, newbufaddr, 0);
        !           276:                        bufaddr = newbufaddr;
        !           277:                        break;
        !           278: 
        !           279:                default:
        !           280:                        lastthing = DATA;
        !           281:                        scrn_image[bufaddr] = *buf;
        !           282:                        if (++bufaddr >= MAXSCREENSIZE)
        !           283:                                bufaddr = 0;
        !           284:                        break;
        !           285:                }
        !           286:                ++buf;
        !           287:        }
        !           288:        fiximage(1);
        !           289:        return;
        !           290: 
        !           291: abort: /* ncarry characters need to be saved in carrybuf */
        !           292:        buf -= ncarry;
        !           293:        strncpy(carrybuf,buf,ncarry+count);
        !           294:        if (!ascii)
        !           295:                ascebc(carrybuf,ncarry+count);
        !           296: }
        !           297: 
        !           298: /*
        !           299:  *     NAME
        !           300:  *             fiximage
        !           301:  *     SYNOPSIS
        !           302:  *             fiximage(do_all)
        !           303:  *             int do_all;     update screen image or not
        !           304:  *     DESCRIPTION
        !           305:  *             Fix up all screen image data structures based on current
        !           306:  *             copy of scrn_image and scrn_xref.
        !           307:  *     ALGORITHM
        !           308:  *             Examine scrn_image and scrn_xref; build correct values
        !           309:  *             for:    totfields
        !           310:  *                     fldstart
        !           311:  *                     fldmax
        !           312:  *                     fldattr
        !           313:  *             Examine cursaddr; build correct value for: curfield
        !           314:  *
        !           315:  *             When an ATTRCODE is found, start a new field:
        !           316:  *                     1) Incr. totfields
        !           317:  *                     2) Set fldstart
        !           318:  *                     3) Copy fldattr from scrn_xref
        !           319:  *                     4) if do_screen, move to starting location,
        !           320:  *                        set/clear highlight mode.
        !           321:  *
        !           322:  *             For a character:
        !           323:  *                     1) Incr. fldmax
        !           324:  *                     2) If do_screen, update screen image
        !           325:  *                     3) assign current field # to scrn_xref
        !           326:  */
        !           327: #include "local.h"
        !           328: #include <bsc/bscio.h>
        !           329: int unprotected;       /* number of unprotected fields on the screen */
        !           330: 
        !           331: extern int ascii;
        !           332: extern int pt_to_pt;
        !           333: extern int stationid;
        !           334: extern int devfd;
        !           335: extern int tb_ctr;
        !           336: 
        !           337: extern char termid;
        !           338: extern struct bscio gp;
        !           339: 
        !           340: /* printer status messages */
        !           341: #define        STX     0x02
        !           342: 
        !           343: /* device busy message */
        !           344: char adbsptpt[] = {'%','R',STX,0x48,' '};      /* ascii, point to point */
        !           345: char edbsptpt[] = {0x6c,0xd9,STX,0xc8,0x40};   /* ebcdic, point to point */
        !           346: char adbsmpt[] = {'%','R',STX,0,0,0x48,' '};   /* ascii, multipoint */
        !           347: char edbsmpt[] = {0x6c,0xd9,STX,0,0,0xc8,0x40};        /* ebcdic, multipoint */
        !           348: 
        !           349: /* device end message */
        !           350: char ascsptpt[] = {'%','R',STX,'B',' '};       /* ascii, point to point */
        !           351: char ebcsptpt[] = {0x6c,0xd9,STX,0xc2,0x40};   /* ebcdic, point to point */
        !           352: char ascsmpt[] = {'%','R',STX,0,0,'B',' '};    /* ascii, multipoint */
        !           353: char ebcsmpt[] = {0x6c,0xd9,STX,0,0,0xc2,0x40};        /* ebcdic, multipoint */
        !           354: 
        !           355: extern int controller; /* 3271 or 3275 control unit */
        !           356: 
        !           357: fiximage(do_all)
        !           358: int do_all;
        !           359: {
        !           360:        register int i, cf;
        !           361:        register char *sp;
        !           362:        register int count;
        !           363: 
        !           364:        cf = -1;
        !           365:        totfields = 0;
        !           366:        unprotected = 0;
        !           367:        fldstart[0] = 0;
        !           368:        fldattr[0] = 0;
        !           369:        fldmax[0] = 0;
        !           370: 
        !           371:        for (sp = scrn_image; sp<&scrn_image[MAXSCREENSIZE]; ++sp)
        !           372:                if (*sp == (char)ATTRCODE)
        !           373:                        break;
        !           374:        if (sp >= &scrn_image[MAXSCREENSIZE])   {
        !           375:                sp = scrn_image;
        !           376:                cf = 0;
        !           377:        }
        !           378:        for (i=sp-scrn_image,count=0;count<MAXSCREENSIZE;++count,++i,++sp) {
        !           379:                if (i>= MAXSCREENSIZE)  {
        !           380:                        i = 0;
        !           381:                        sp = scrn_image;
        !           382:                }
        !           383:                /* attribute char. or end of screen */
        !           384:                if (*sp==(char)ATTRCODE)        {
        !           385:                        ++cf;
        !           386:                        ++totfields;
        !           387:                        fldstart[cf] = (i >= MAXSCREENSIZE-1)? 0 : i+1;
        !           388:                        fldattr[cf] = scrn_xref[i];
        !           389:                        if (!prot_attr(fldattr[cf]))
        !           390:                                ++unprotected;
        !           391:                        fldmax[cf] = 0;
        !           392:                        if (do_all && do_screen) {
        !           393:                                wmove(vterm_scr,i/SCREENWIDTH,
        !           394:                                        i%SCREENWIDTH);
        !           395:                                if (hl_attr(fldattr[cf]))
        !           396:                                        wstandout(vterm_scr);
        !           397:                                else    wstandend(vterm_scr);
        !           398:                                if ((SG == 0 || SO == (char *)0) &&
        !           399:                                    i<MAXSCREENSIZE-1)
        !           400:                                        mvwaddch(vterm_scr,
        !           401:                                                i/SCREENWIDTH,
        !           402:                                                i%SCREENWIDTH,' ');
        !           403:                        }
        !           404:                } else  {       /* data character */
        !           405:                        ++fldmax[cf];
        !           406:                        if (do_all && do_screen &&
        !           407:                            sp < &scrn_image[MAXSCREENSIZE])
        !           408:                                if (*sp && !invis_attr(fldattr[cf]))
        !           409:                                        mvwaddch(vterm_scr,i/SCREENWIDTH,
        !           410:                                                i%SCREENWIDTH,*sp);
        !           411:                                else
        !           412:                                        mvwaddch(vterm_scr,i/SCREENWIDTH,
        !           413:                                                i%SCREENWIDTH,' ');
        !           414:                }
        !           415:                scrn_xref[i] = cf;
        !           416:        }
        !           417:        curfield = scrn_xref[cursaddr];
        !           418: 
        !           419:        if (!do_all)    return;
        !           420:        if (do_screen) {
        !           421:                wmove(vterm_scr,ROW,COL);
        !           422:                wrefresh(vterm_scr);
        !           423:                if (walarm(wcc))
        !           424:                        write (1, "\007",1);    /* send alarm */
        !           425:        }
        !           426:        if (stprt(wcc) && controller == 3275)   {
        !           427:        /* send device busy status */
        !           428: #ifndef DEBUG
        !           429:                ioctl(devfd,BSCSOH,0);  /* set SOH mode */
        !           430:                ioctl(devfd,BSCLAST,0); /* set LAST message flag */
        !           431:                if (pt_to_pt == BSCMPT) {
        !           432:                        ioctl (devfd, BSCID, &stationid);
        !           433:                        if (ascii) {
        !           434:                                adbsmpt[3] = termid;    /* poll addr */
        !           435:                                adbsmpt[4] = stationid; /* subdev addr */
        !           436:                                i = write(devfd, adbsmpt, sizeof adbsmpt);
        !           437:                        } else {
        !           438:                                edbsmpt[3] = termid;    /* poll addr */
        !           439:                                edbsmpt[4] = stationid; /* subdev addr */
        !           440:                                i = write(devfd, edbsmpt, sizeof edbsmpt);
        !           441:                        }
        !           442:                 } else
        !           443:                /* Send status message for pt-pt */
        !           444:                        i= write(devfd,ascii?adbsptpt:edbsptpt,sizeof adbsptpt);
        !           445: 
        !           446:                ioctl(devfd,BSCNSOH,0); /* end SOH mode */
        !           447:                ++tb_ctr;       /* increment transmitted block counter 
        !           448:                                   for stats */
        !           449:        /* ignore any errors from the write */
        !           450:                if (i < 0) ioctl(devfd, BSCGET, &gp);
        !           451: #endif
        !           452: 
        !           453:        /* print screen as is */
        !           454:                emprint(1);
        !           455: 
        !           456: #ifndef DEBUG
        !           457:        /* send device end status */
        !           458:                ioctl(devfd,BSCSOH,0);  /* set SOH mode */
        !           459:                ioctl(devfd,BSCLAST,0); /* set LAST message flag */
        !           460:                if (pt_to_pt == BSCMPT) {
        !           461:                        ioctl (devfd, BSCID, &stationid);
        !           462:                        if (ascii) {
        !           463:                                ascsmpt[3] = termid;    /* poll addr */
        !           464:                                ascsmpt[4] = stationid; /* subdev addr */
        !           465:                                i = write(devfd, ascsmpt, sizeof ascsmpt);
        !           466:                        } else {
        !           467:                                ebcsmpt[3] = termid;    /* poll addr */
        !           468:                                ebcsmpt[4] = stationid; /* subdev addr */
        !           469:                                i = write(devfd, ebcsmpt, sizeof ebcsmpt);
        !           470:                        }
        !           471:                 } else
        !           472:                /* Send status message for pt-pt */
        !           473:                        i= write(devfd,ascii?ascsptpt:ebcsptpt,sizeof ascsptpt);
        !           474: 
        !           475:                ioctl(devfd,BSCNSOH,0); /* end SOH mode */
        !           476:                ++tb_ctr;       /* increment transmitted block counter 
        !           477:                                   for stats */
        !           478:        /* ignore any errors from the write */
        !           479:                if (i < 0) ioctl(devfd, BSCGET, &gp);
        !           480: #endif
        !           481:        }
        !           482: 
        !           483:        if (kbdrst(wcc))        {               /* reset keyboard */
        !           484:                updstat(status & ~INPUT_INH);
        !           485:                aid_val = ascii?0x2d:0x60;
        !           486:        }
        !           487: }
        !           488: 
        !           489: /* NAME
        !           490:  *     eua
        !           491:  *
        !           492:  * SYNOPSIS
        !           493:  *     eua(start,end,clrmdt)
        !           494:  *             register int start;     starting erase buffer address
        !           495:  *             register int end;       ending erase buffer address
        !           496:  *             register int clrmdt;    clear mdt flag
        !           497:  *
        !           498:  * DESCRIPTION
        !           499:  *     eua erases unprotected fields beginning at "start" buffer address 
        !           500:  *     and ending at "end" buffer address. If clrmdt flag is set, the
        !           501:  *     mdt bits of unprotected attributes to be erased are reset.
        !           502:  */
        !           503: 
        !           504: eua(start,end,clrmdt)
        !           505: register int start,end,clrmdt;
        !           506: {
        !           507:        register long first_uf = 0;
        !           508: 
        !           509:        fiximage(0);
        !           510:        
        !           511:        do      {
        !           512:                curfield = scrn_xref[start];
        !           513:                if (!prot_attr(fldattr[curfield]))      {
        !           514:                        if (scrn_image[start] == ATTRCODE)      {
        !           515:                                /* Set return value to 1st unprotected
        !           516:                                   field encountered.
        !           517:                                */
        !           518:                                if (!first_uf) first_uf = curfield;
        !           519:                                if (clrmdt)
        !           520:                                        fldattr[curfield] &= ~ATTRMDT;
        !           521:                        }
        !           522:                        else
        !           523:                                scrn_image[start] = NUL;
        !           524:        
        !           525:                }
        !           526:                if (++start >= MAXSCREENSIZE) start = 0;
        !           527:        }
        !           528:        while (start != end);
        !           529:        unfiximage();
        !           530:        return(first_uf);
        !           531: }
        !           532: 
        !           533: /* make temp. attr. save as we may mess up scrn_xref */
        !           534: unfiximage()
        !           535: {
        !           536:        register char *p; 
        !           537:        register int *ip;
        !           538:        
        !           539:        for (p = fldattr, ip = fldstart; p < &fldattr[totfields]; ++p,++ip)
        !           540:                scrn_xref[*ip?*ip - 1:MAXSCREENSIZE-1] = *p;
        !           541: }

unix.superglobalmegacorp.com

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