Annotation of 43BSDTahoe/new/X/ximpv/impv.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985 University of Alberta *
        !             3:  *
        !             4:  * 'impv' impress (i.e. canon) previewer for a SUN workstation.
        !             5:  *     impv [-p##] [-s] [job# | -n name]
        !             6:  * where job# is the job number of the troff/dimp processed output suitable
        !             7:  * for the canon imagen printer. This can be found by executing 'ipq'. The 
        !             8:  * -p## argument sets the number of pages the user will be allowed to
        !             9:  * backup.  The -n name option will cause the users most recent job to
        !            10:  * be displayed.The human interface for this proram leaves something to be
        !            11:  * desired ( skip pages, print page number 'n', etc.).
        !            12:  * The algorithm for crunching glyphs could be improved from the straight 
        !            13:  * forward method used.
        !            14: #ifdef COLOR
        !            15:  * The -s option will cause the output to be sent to the color monitor. Troff
        !            16:  * Macros .CC and .BG set the background and current color. This option is
        !            17:  * intended for slide production.
        !            18: #endif COLOR
        !            19:  * 
        !            20:  *     This program requires that a 'file server' (used very loosely)
        !            21:  * exist on the remote host UNIX system. See the code for impvserv. 
        !            22:  *
        !            23:  * history:
        !            24:  *
        !            25:  * The program was written in desparation by:
        !            26:  *             Steven Sutphen
        !            27:  *             University of Alberta
        !            28:  *             Department of Computing Science
        !            29:  *             Edmonton, Alberta T6G 2H1
        !            30:  *             ihnp4!alberta!steve
        !            31:  *             November 20, 1982
        !            32:  *
        !            33:  *             Revised for Sun Work Station:
        !            34:  *                     January 1, 1984 Ted Bentley
        !            35:  *             Revised for Color SUN displays:
        !            36:  *                     January 1985 Martin Dubetz
        !            37:  */
        !            38: #ifndef lint
        !            39: static char *rcsid_impv_c = "$Header: impv.c,v 10.7 86/11/19 19:27:39 jg Rel $";
        !            40: #endif
        !            41: 
        !            42: #ifdef XWIND
        !            43: #include <X/Xlib.h>
        !            44: #include <X/Xkeyboard.h>
        !            45: #include <sys/types.h>
        !            46: #include <strings.h>
        !            47: #define min(a,b) ((a) < (b) ? (a) : (b))
        !            48: #define CHUNKSIZE 2048
        !            49: #else XWIND
        !            50: #include <pixrect/pixrect_hs.h>
        !            51: /* pixrect_hs.h includes sys/types.h */
        !            52: #include <sys/socket.h>
        !            53: #endif XWIND
        !            54: #include <sys/stat.h>
        !            55: #include <sys/file.h>
        !            56: #include <stdio.h>
        !            57: #include <signal.h>
        !            58: #include <netdb.h>
        !            59: #include <netinet/in.h>
        !            60: #include <sgtty.h>
        !            61: 
        !            62: #include       "site.h"
        !            63: #include       "imPdefs.h"
        !            64: #include       "imPcodes.h"
        !            65: #include       "impv.h"
        !            66: 
        !            67: 
        !            68: char map8_4[256] = {   /* map 8 bits to 4bits for pixel compression */
        !            69:        00, 01, 01, 01, 02, 03, 03, 03, 02, 03, 03, 03, 02, 03, 03, 03,
        !            70:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            71:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            72:        04, 05, 05, 05, 06, 07, 07, 07, 06, 07, 07, 07, 06, 07, 07, 07,
        !            73:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            74:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            75:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            76:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            77:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            78:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            79:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            80:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            81:        010, 011, 011, 011, 012, 013, 013, 013, 012, 013, 013, 013, 012, 013, 013, 013,
        !            82:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            83:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017,
        !            84:        014, 015, 015, 015, 016, 017, 017, 017, 016, 017, 017, 017, 016, 017, 017, 017, 
        !            85: };
        !            86: 
        !            87: #ifdef XWIND
        !            88: int Select_mask, maxplus1;
        !            89: int forepix, backpix;
        !            90: OpaqueFrame win;
        !            91: Window Win;            /* our window */
        !            92: #define impv_width 15
        !            93: #define impv_height 15
        !            94: static short impv_bits[] = {
        !            95:    0x0080, 0x01c0, 0x03e0, 0x06b0,
        !            96:    0x0c98, 0x188c, 0x3086, 0x7fff,
        !            97:    0x3086, 0x188c, 0x0c98, 0x06b0,
        !            98:    0x03e0, 0x01c0, 0x0080};
        !            99: #else XWIND
        !           100: struct pixrect *picon, *ptube, *side;
        !           101: #endif XWIND
        !           102: 
        !           103: int diameter = 1;
        !           104: short pages = SAVE_PAGES;
        !           105: char screen_file[32];
        !           106: unsigned char in_buf[512], *in_bufp;
        !           107: int ptubew, ptubeh;    /* screen window dimensions */
        !           108: struct sgttyb cbreak;  /* tty mode bits */
        !           109: int s = 0;                     /* socket or input file descriptor */
        !           110: int tty;               /* tty file descriptor */
        !           111: int screens;           /* screen store file descriptor */
        !           112: 
        !           113: main(argc, argv)
        !           114: char **argv;
        !           115: {
        !           116:        struct sockaddr_in sin;
        !           117: #ifdef XWIND
        !           118:        char *display = NULL;
        !           119:        char *option;
        !           120:        int reverse = 0;
        !           121:        int bwidth = 2;
        !           122:        char *fore_color;
        !           123:        char *back_color;
        !           124:        char *brdr_color;
        !           125:        char *mous_color;
        !           126:        char *geometry = NULL, def[32];
        !           127:        int backmap, bdrmap, mouspix;
        !           128:        Color cdef;
        !           129: #else XWIND
        !           130: #ifdef COLOR
        !           131:        unsigned char r[216],b[216],g[216],tmp[6];
        !           132:        register short i,j,k;
        !           133:        int l;
        !           134:        register unsigned char *z;
        !           135:        unsigned char setcolor();
        !           136: #endif COLOR
        !           137:        extern struct pixrect *pr_open();
        !           138: #endif XWIND
        !           139:        int pipes[2], id_num = 0, rq;
        !           140:        char string[100], buf[28];
        !           141:        struct hostent *hp;
        !           142:        struct servent *sp;
        !           143:        struct stat stat1;
        !           144:        char *prog = argv[0];
        !           145: 
        !           146:        extern get_out();
        !           147: 
        !           148: #ifdef XWIND
        !           149:        if ((option = XGetDefault(argv[0], "ReverseVideo")) &&
        !           150:            strcmp(option, "on") == 0)
        !           151:                reverse = 1;
        !           152:        if (option = XGetDefault(argv[0], "BorderWidth"))
        !           153:                bwidth = atoi(option);
        !           154:        fore_color = XGetDefault(argv[0], "ForeGround");
        !           155:        back_color = XGetDefault(argv[0], "BackGround");
        !           156:        brdr_color = XGetDefault(argv[0], "Border");
        !           157:        mous_color = XGetDefault(argv[0], "Mouse");
        !           158: #else XWIND
        !           159:        /* set up the keyboard input */
        !           160:        (void)gtty(0, &cbreak);
        !           161:        cbreak.sg_flags &= ~ECHO;
        !           162:        cbreak.sg_flags |= CBREAK;
        !           163:        (void)stty(0, &cbreak);
        !           164:        cbreak.sg_flags &= ~CBREAK;
        !           165:        cbreak.sg_flags |= ECHO;
        !           166: #endif XWIND
        !           167:        signal(SIGINT, get_out);
        !           168:        signal(SIGQUIT, get_out);
        !           169:        signal(SIGHUP, get_out);
        !           170:        signal(SIGIOT, get_out);
        !           171: 
        !           172:        scr_x = MAXx / 2;               /* number of dots on a screen page */
        !           173:        wide =  (7 + MAXx/2) / 8;       /* rounded up to byte for pixrect */
        !           174:        scr_y = MAXy / 2;
        !           175:        scr_d = 1;
        !           176:        /* calculate the screen size in bytes 2::1 compression */
        !           177:        scr_size = (((scr_x + 7) / 8) * scr_y);
        !           178: 
        !           179:        for (argv++; --argc; argv++) {
        !           180:                if (**argv == '-'){
        !           181:                        switch (argv[0][1]){
        !           182: #ifndef NOSPOOL
        !           183:                        case 'n': 
        !           184:                                if (pipe(pipes)) {
        !           185:                                        fprintf(stderr, "pipe mistake\n");
        !           186:                                        get_out();
        !           187:                                }
        !           188:                                if (fork() == 0){
        !           189:                                        /*child*/
        !           190:                                        (void)close(1);
        !           191:                                        (void)dup(pipes[1]);
        !           192:                                        (void)sprintf(string, "echo `ipq | grep %s | awk ' {print $3}'| sort -rn | head -1 `", *++argv);
        !           193:                                        (void)system(string);
        !           194:                                        exit(0);
        !           195:                                }
        !           196:                                /* parent */
        !           197:                                while (read(pipes[0], buf, 20) <= 0);
        !           198:                                id_num = atoi(buf);
        !           199:                                argv++; 
        !           200:                                argc--;
        !           201:                                break;
        !           202:                        case 'r': 
        !           203:                                rq = 1;
        !           204:                                break;
        !           205: #endif NOSPOOL
        !           206:                        case 'p': 
        !           207:                                pages = atoi( &argv[0][2] );
        !           208:                                if (pages < 0) pages = 0;
        !           209:                                break;
        !           210: #ifdef COLOR
        !           211:                        case 's':
        !           212:                                slide = 1;
        !           213:                                scr_x = MAXx / 3;
        !           214:                                scr_y = MAXy / 3;
        !           215:                                scr_d = 8;
        !           216:                                scr_size = scr_x * scr_y;
        !           217:                                bc.red = 0;
        !           218:                                bc.blue = 255;
        !           219:                                bc.green = 0;
        !           220:                                cc.red = 255;
        !           221:                                cc.blue = 255;
        !           222:                                cc.green = 255;
        !           223:                                break;
        !           224: #endif COLOR
        !           225:                        default:
        !           226: #ifdef XWIND
        !           227:                                if (strcmp(*argv, "-rv") == 0) {
        !           228:                                        reverse = 1;
        !           229:                                        break;
        !           230:                                } else if (strcmp(*argv, "-fg") == 0 && argc) {
        !           231:                                        argv++;
        !           232:                                        argc--;
        !           233:                                        fore_color = *argv;
        !           234:                                        break;
        !           235:                                } else if (strcmp(*argv, "-bg") == 0 && argc) {
        !           236:                                        argv++;
        !           237:                                        argc--;
        !           238:                                        back_color = *argv;
        !           239:                                        break;
        !           240:                                } else if (strcmp(*argv, "-bd") == 0 && argc) {
        !           241:                                        argv++;
        !           242:                                        argc--;
        !           243:                                        brdr_color = *argv;
        !           244:                                        break;
        !           245:                                } else if (strcmp(*argv, "-ms") == 0 && argc) {
        !           246:                                        argv++;
        !           247:                                        argc--;
        !           248:                                        mous_color = *argv;
        !           249:                                        break;
        !           250:                                } 
        !           251: #endif XWIND
        !           252:                                (void)usage();
        !           253:                                get_out();
        !           254:                        }
        !           255:                } 
        !           256:                else {
        !           257: #ifdef XWIND
        !           258:                        if (index(*argv, ':') != NULL)
        !           259:                                display = *argv;
        !           260:                        else if (argv[0][0] == '=') {
        !           261:                                        geometry = argv[0];
        !           262:                        }
        !           263: 
        !           264:                        else
        !           265: #endif XWIND
        !           266: #ifdef NOSPOOL
        !           267:                                if((s = open(*argv, O_RDONLY)) <= 0){
        !           268:                                        fprintf(stderr,"can't open file\n");
        !           269:                                        exit(0);
        !           270:                                }
        !           271: #else NOSPOOL
        !           272:                                id_num = atoi(*argv);
        !           273: #endif NOSPOOL
        !           274:                }
        !           275:        }
        !           276: #ifdef NOSPOOL
        !           277:        /* set up tty for piped input situation*/
        !           278:        if(s == 0) {
        !           279:                s = dup(0);
        !           280:                close(0);
        !           281:                tty = open("/dev/tty",O_RDONLY);
        !           282:                fstat(s, &stat1);
        !           283:                if( (stat1.st_mode>>12) == 02 )
        !           284:                        (void)usage();
        !           285:        }
        !           286: #else NOSPOOL
        !           287:        if(id_num == 0) (void)usage();
        !           288: #endif NOSPOOL
        !           289: 
        !           290:        /* get the file for screen pages */
        !           291:        if (pages) {
        !           292:                strcpy(screen_file, SCREEN_FILE);
        !           293:                mktemp(screen_file);
        !           294:                if ((screens = creat(screen_file, 0666)) <= 0){
        !           295:                        fprintf(stderr, "couldn't create: %s\n", screen_file);
        !           296:                        get_out();
        !           297:                }
        !           298:                (void)close(screens);
        !           299:                if ((screens = open(screen_file, 2)) <= 0){
        !           300:                        fprintf(stderr, "couldn't reopen: %s\n", screen_file);
        !           301:                        get_out();
        !           302:                }
        !           303:        }
        !           304: 
        !           305: #ifndef NOSPOOL
        !           306:        /*open up the network to get file from remote host */
        !           307:        sp = getservbyname(P_SERV, "tcp");
        !           308:        hp = gethostbyname(REMOTE_HOST);
        !           309:        if (hp == NULL) {
        !           310:                fprintf(stderr, "impv: nohost - %s\n", REMOTE_HOST);
        !           311:                get_out();
        !           312:        }
        !           313:        bzero((char *)&sin, sizeof (sin));
        !           314:        bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
        !           315:        sin.sin_family = hp->h_addrtype;
        !           316:        sin.sin_port = sp->s_port;
        !           317:        s = socket(AF_INET, SOCK_STREAM, 0);
        !           318:        if (s < 0) {
        !           319:                perror("impv: socket");
        !           320:                get_out();
        !           321:        }
        !           322:        (void)setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0);
        !           323:        if (connect(s, (char *)&sin, sizeof (sin)) < 0) {
        !           324:                perror("impv: connect");
        !           325:                get_out();
        !           326:        }
        !           327:        /* write the ipd file name to remote_host */
        !           328:        (void)sprintf(string, "P%c%03d", rq ? 'r' : 'n', id_num);
        !           329:        (void)write(s, string, strlen(string));
        !           330: #endif NOSPOOL
        !           331: 
        !           332:        in_bufp = in_buf;
        !           333:        family[0] = font0;
        !           334:        inicodes();
        !           335: 
        !           336: #ifdef XWIND
        !           337:        if (!XOpenDisplay(display)) {
        !           338:            fprintf(stderr, "%s: Can't open display '%s'\n",
        !           339:                 prog, XDisplayName(display));
        !           340:            exit(1);
        !           341:        }
        !           342:        if (reverse) {
        !           343:                forepix = WhitePixel;
        !           344:                backpix = BlackPixel;
        !           345:                backmap = BlackPixmap;
        !           346:                bdrmap = WhitePixmap;
        !           347:                mouspix = WhitePixel;
        !           348:        } else {
        !           349:                forepix = BlackPixel;
        !           350:                backpix = WhitePixel;
        !           351:                backmap = WhitePixmap;
        !           352:                bdrmap = BlackPixmap;
        !           353:                mouspix = BlackPixel;
        !           354:        }
        !           355:        if (DisplayCells() > 2) {
        !           356:                if (fore_color && XParseColor(fore_color, &cdef) &&
        !           357:                        XGetHardwareColor(&cdef))
        !           358:                        forepix = cdef.pixel;
        !           359:                if (back_color && XParseColor(back_color, &cdef) &&
        !           360:                        XGetHardwareColor(&cdef)) {
        !           361:                        backpix = cdef.pixel;
        !           362:                        backmap = XMakeTile(backpix);
        !           363:                }
        !           364:                if (brdr_color && XParseColor(brdr_color, &cdef) &&
        !           365:                        XGetHardwareColor(&cdef))
        !           366:                        bdrmap = XMakeTile(cdef.pixel);
        !           367:                if (mous_color && XParseColor(mous_color, &cdef) &&
        !           368:                        XGetHardwareColor(&cdef))
        !           369:                        mouspix = cdef.pixel;
        !           370:        }
        !           371:        win.bdrwidth = bwidth;
        !           372:        win.border = bdrmap;
        !           373:        win.background = backmap;
        !           374: 
        !           375:        sprintf(def, "=%dx%d+0+0", DisplayWidth() - (bwidth << 1),
        !           376:                DisplayHeight() - (bwidth << 1));
        !           377:        Win = XCreate (
        !           378:                "Imagen Previewer", argv[0], geometry, def, &win, 200, 200);
        !           379:        XSetResizeHint(Win, 100, 100, 1, 1);
        !           380:        XMapWindow (Win);
        !           381:        ptubew = win.width;
        !           382:        /* crock around crock */
        !           383:        if ((DisplayType() == XDEV_QDSS) && (bwidth < 4))
        !           384:                ptubew &= ~7;
        !           385:        if (ptubew > scr_x)
        !           386:                ptubew = scr_x;
        !           387:        ptubeh = win.height;
        !           388:        if (ptubeh > scr_y)
        !           389:                ptubeh = scr_y;
        !           390: 
        !           391:        XSelectInput (Win, KeyPressed|ButtonPressed|ExposeRegion|ExposeCopy);
        !           392:        XDefineCursor(Win,
        !           393:                XCreateCursor(impv_width, impv_height, impv_bits, impv_bits,
        !           394:                                7, 7, mouspix, backpix, GXcopy));
        !           395:        XSync(0);
        !           396:        Select_mask = 1 << dpyno();
        !           397:        maxplus1 = 1 + dpyno();
        !           398: #else XWIND
        !           399:        /* set up the raster pixrect functions */
        !           400:        if( slide ) {
        !           401: #ifdef COLOR
        !           402:                ptube = pr_open("/dev/cgone0");
        !           403:                tmp[0] = 0;
        !           404:                tmp[1] = 130;
        !           405:                tmp[2] = 180;
        !           406:                tmp[3] = 210;
        !           407:                tmp[4] = 235;
        !           408:                tmp[5] = 255;
        !           409:                l = 0;
        !           410:                for( i = 0; i < 6; i++ )
        !           411:                        for( j = 0; j < 6; j++ )
        !           412:                                for( k = 0; k < 6; k++ ) {
        !           413:                                        r[l] = tmp[i];
        !           414:                                        g[l] = tmp[j];
        !           415:                                        b[l++] = tmp[k];
        !           416:                                }
        !           417: 
        !           418:                pr_putcolormap(ptube,0,216,r,g,b);
        !           419: #endif COLOR
        !           420:        } 
        !           421:        else
        !           422:                ptube = pr_open("/dev/fb");
        !           423:        pscreen = mem_create(scr_x, scr_y, scr_d);
        !           424: #ifdef COLOR
        !           425:        if( slide ) {
        !           426:                backcolor = setcolor(0);
        !           427:                z = (unsigned char *)(mpr_d(pscreen)->md_image);
        !           428:                for (l = scr_size; l--; ) *z++ = backcolor;
        !           429:        } 
        !           430: #endif COLOR
        !           431:        picon = mem_create(46, 53, scr_d);
        !           432:        side = mem_create(ptubew-scr_x, ptubeh, scr_d);
        !           433:        ptubew = ptube->pr_size.x;
        !           434:        ptubeh = ptube->pr_size.y;
        !           435: #endif XWIND
        !           436: 
        !           437:        dofile();
        !           438:        (void)write(s, string, strlen(string));
        !           439:        get_out();
        !           440: }
        !           441: 
        !           442: #ifdef XWIND
        !           443: unsigned char rot8[] = {
        !           444:        0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 
        !           445:        0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 
        !           446:        0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 
        !           447:        0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 
        !           448:        0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 
        !           449:        0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 
        !           450:        0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 
        !           451:        0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 
        !           452:        0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 
        !           453:        0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 
        !           454:        0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 
        !           455:        0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 
        !           456:        0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 
        !           457:        0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 
        !           458:        0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 
        !           459:        0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 
        !           460:        0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 
        !           461:        0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 
        !           462:        0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 
        !           463:        0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 
        !           464:        0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 
        !           465:        0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 
        !           466:        0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 
        !           467:        0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 
        !           468:        0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 
        !           469:        0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 
        !           470:        0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 
        !           471:        0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 
        !           472:        0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 
        !           473:        0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 
        !           474:        0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 
        !           475:        0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
        !           476: };
        !           477: 
        !           478: static short current_page = -1;
        !           479: static short current_x = -1;
        !           480: #endif XWIND
        !           481: 
        !           482: ppause()
        !           483: {
        !           484:        short  y = 0;
        !           485:        short  x;
        !           486:        register int c, i;
        !           487:        register unsigned char *z, *scptr;
        !           488: #ifdef COLOR
        !           489:        unsigned char setcolor();
        !           490: #endif COLOR
        !           491: 
        !           492: #ifdef XWIND
        !           493:        short current_y = 0;
        !           494:        int select_mask;
        !           495:        XEvent event;
        !           496:        scptr = pscreen;
        !           497:        for (i = sizeof pscreen; i--; scptr++) *scptr = rot8[*scptr];
        !           498:        winker();
        !           499:        scptr = pscreen;
        !           500:        winker();
        !           501: #else XWIND
        !           502:        scptr = (unsigned char *)(mpr_d(pscreen)->md_image);
        !           503: #endif XWIND
        !           504:        if (current_x < 0)
        !           505:                if((current_x = (scr_x - ptubew)/2) < 0) current_x = 0;
        !           506:        x = current_x;
        !           507:        /*write the screen */
        !           508:        while(1) {
        !           509: #ifdef XWIND
        !           510:                if (page == current_page && x == current_x &&
        !           511:                    y < current_y && y + ptubeh > current_y) {
        !           512:                        int delta = current_y - y;
        !           513:                        XMoveArea(Win, 0, 0, 0, delta, ptubew, ptubeh - delta);
        !           514:                        BitsPut(x, y, 0, 0, ptubew, delta);
        !           515:                } else if (page == current_page && x == current_x &&
        !           516:                           y > current_y && current_y + ptubeh > y) {
        !           517:                        int delta = y - current_y;
        !           518:                        XMoveArea(Win, 0, delta, 0, 0, ptubew, ptubeh - delta);
        !           519:                        BitsPut(x, y + ptubeh - delta, 0, ptubeh - delta,
        !           520:                                ptubew, delta);
        !           521:                } else if (page == current_page && y == current_y &&
        !           522:                    x < current_x && x + ptubew > current_x) {
        !           523:                        int delta = current_x - x;
        !           524:                        XMoveArea(Win, 0, 0, delta, 0, ptubew - delta, ptubeh);
        !           525:                        BitsPut(x, y, 0, 0, delta, ptubeh);
        !           526:                } else if (page == current_page && y == current_y &&
        !           527:                           x > current_x && current_x + ptubew > x) {
        !           528:                        int delta = x - current_x;
        !           529:                        XMoveArea(Win, delta, 0, 0, 0, ptubew - delta, ptubeh);
        !           530:                        BitsPut(x + ptubew - delta, y, ptubew - delta, 0,
        !           531:                                delta, ptubeh);
        !           532:                } else if (y != current_y || x != current_x ||
        !           533:                           page != current_page)
        !           534:                        BitsPut(x, y, 0, 0, min(scr_x - x, ptubew),
        !           535:                                min(scr_y - y, ptubeh));
        !           536:                current_y = y;
        !           537:                current_x = x;
        !           538:                current_page = page;
        !           539:                XFlush();
        !           540:                select_mask = Select_mask;
        !           541:                if (select(maxplus1, &select_mask, NULL, NULL, 0) < 0) exit(1);
        !           542:                if (!(select_mask & Select_mask)) continue;
        !           543:                XPending();
        !           544:                do {
        !           545:                        XNextEvent (&event);
        !           546:                        switch (event.type) {
        !           547:                        case ExposeWindow:
        !           548:                                ptubeh = ((XExposeEvent *)(&event))->height;
        !           549:                                ptubew = ((XExposeEvent *)(&event))->width;
        !           550:                        case ExposeRegion: {
        !           551:                                short ex = ((XExposeEvent *)(&event))->x;
        !           552:                                short ew = ((XExposeEvent *)(&event))->width;
        !           553:                                short ey = ((XExposeEvent *)(&event))->y;
        !           554:                                short eh = ((XExposeEvent *)(&event))->height;
        !           555:                                BitsPut(x + ex, y + ey, ex, ey,
        !           556:                                        min(scr_x - (x + ex), ew),
        !           557:                                        min(scr_y - (y + ey), eh));
        !           558:                                continue;
        !           559:                        }
        !           560:                        case ExposeCopy:
        !           561:                                continue;
        !           562:                        case ButtonPressed:
        !           563:                        {
        !           564:                        short detail = ((XButtonPressedEvent *) (&event))->detail;
        !           565:                        switch (detail & ValueMask) {
        !           566:                        case LeftButton: if (detail & ShiftMask)
        !           567:                                                c = 'l';
        !           568:                                         else
        !           569:                                                c = 'u';
        !           570:                                         break;
        !           571:                        case MiddleButton: if (detail & ShiftMask) {
        !           572:                                           if (x < scr_x - (x + ptubew))
        !           573:                                                c = '6';
        !           574:                                           else
        !           575:                                                c = '4';
        !           576:                                           } else {
        !           577:                                           if (y < scr_y - (y + ptubeh))
        !           578:                                                c = '3';
        !           579:                                           else
        !           580:                                                c = '9';
        !           581:                                           }
        !           582:                                           break;
        !           583:                        case RightButton: if (detail & ShiftMask)
        !           584:                                                c = 'r';
        !           585:                                          else
        !           586:                                                c = 'd';
        !           587:                                          break;
        !           588:                        }
        !           589:                                break;
        !           590:                        }
        !           591:                        case KeyPressed:
        !           592:                        switch ((((XKeyPressedEvent *) (&event))->detail) & ValueMask) {
        !           593:                        case KC_E5: c = '-'; break; /* prev screen */
        !           594:                        case KC_E6: c = '+'; break; /* next screen */
        !           595:                        case KC_CURSOR_UP: c = 'u'; break; /* prev screen */
        !           596:                        case KC_CURSOR_DOWN: c = 'd'; break; /* next screen */
        !           597:                        case KC_CURSOR_LEFT: c = '<'; break; /* left screen */
        !           598:                        case KC_CURSOR_RIGHT: c = '>'; break; /* right screen */
        !           599:                        case KC_KEYPAD_0: c = '0'; break; /* R0 */
        !           600:                        case KC_KEYPAD_PERIOD: c = '.'; break; /* R. */
        !           601:                        case KC_KEYPAD_COMMA: c = ','; break; /* R, */
        !           602:                        case KC_KEYPAD_1: c = '1'; break; /* R1 */
        !           603:                        case KC_KEYPAD_2: c = '2'; break; /* R2 */
        !           604:                        case KC_KEYPAD_3: c = '3'; break; /* R3 */
        !           605:                        case KC_KEYPAD_4: c = '4'; break; /* R4 */
        !           606:                        case KC_KEYPAD_5: c = '5'; break; /* R5 */
        !           607:                        case KC_KEYPAD_6: c = '6'; break; /* R6 */
        !           608:                        case KC_KEYPAD_7: c = '7'; break; /* R7 */
        !           609:                        case KC_KEYPAD_8: c = '8'; break; /* R8 */
        !           610:                        case KC_KEYPAD_9: c = '9'; break; /* R9 */
        !           611:                        case KC_KEYPAD_MINUS: c = '-'; break; /* R- */
        !           612: 
        !           613:                        default:
        !           614:                                {
        !           615:                                char *string;
        !           616:                                int nbytes;
        !           617:                                string = XLookupMapping (&event, &nbytes);
        !           618:                                if (nbytes == 1)
        !           619:                                        c = *string;
        !           620:                                else
        !           621:                                        continue;
        !           622:                                }
        !           623:                        }
        !           624:                        }
        !           625: #else XWIND
        !           626:                /* adjust place of page on screen so it is centered */
        !           627:                /* will clip the edges of imagen300 pages  */
        !           628:                pr_rop(ptube, 0, 0, ptubew, ptubeh, PIX_SRC, pscreen, x, y);
        !           629:                if( !slide ) {
        !           630:                        pr_rop(ptube, scr_x, 0, 4, ptubeh, PIX_NOT(PIX_SRC),
        !           631:                                side, 0, 0);
        !           632:                        page_icon(y);
        !           633:                }
        !           634:                /* have a look */
        !           635:                c = getchar();
        !           636:                if( c == 033 ){ /* fixup for SUN 120 keypad */
        !           637:                        c = getchar();
        !           638:                        if(c == '[') c = getchar();
        !           639:                        if(c == '2') c = getchar();
        !           640:                        if(c == '2'){
        !           641:                                c = getchar() + 1;
        !           642:                                (void) getchar();
        !           643:                        }
        !           644:                        else if(c == '1'){
        !           645:                                c = getchar() + 3;
        !           646:                                (void) getchar();
        !           647:                        }
        !           648:                }
        !           649: #endif XWIND
        !           650:                switch(c){
        !           651:                case 04: 
        !           652:                case 03:
        !           653:                        return(-1);     /* quit on EOF or ^C */
        !           654:                case '1': 
        !           655:                        y++; 
        !           656:                        break;
        !           657:                case '7': 
        !           658:                        y--; 
        !           659:                        break;
        !           660:                case 0102: 
        !           661:                case '2': 
        !           662:                        y += 65; 
        !           663:                        break;
        !           664:                case 0101: 
        !           665:                case '8': 
        !           666:                        y -= 65; 
        !           667:                        break;
        !           668:                case '3': 
        !           669:                        y = scr_y - ptubeh -1; 
        !           670:                        break;
        !           671:                case '9': 
        !           672:                        y = 0; 
        !           673:                        break;
        !           674:                case '4': 
        !           675:                        x = 0;
        !           676:                        break;
        !           677:                case '5': 
        !           678:                        if((x = (scr_x - ptubew)/2) < 0) x = 0;
        !           679:                        break;
        !           680:                case '6': 
        !           681:                        if((x = scr_x - ptubew) < 0) x = 0;
        !           682:                        break;
        !           683:                case '<':
        !           684:                        x -= 65;
        !           685:                        break;
        !           686:                case '>':
        !           687:                        x += 65;
        !           688:                        break;
        !           689:                case 'l':
        !           690:                        x -= ptubew;
        !           691:                        break;
        !           692:                case 'r':
        !           693:                        x += ptubew;
        !           694:                        break;
        !           695:                case 'd':
        !           696:                        if (y < scr_y - 1 - ptubeh) {
        !           697:                                y += ptubeh;
        !           698:                                break;
        !           699:                        }
        !           700:                        /* falls into */
        !           701:                case '.':
        !           702:                        if (pages && page != finish) {
        !           703:                                page = (page +1)%pages;
        !           704:                                (void)lseek(screens, scr_size * page, 0);
        !           705:                                (void)read(screens, scptr, scr_size);
        !           706:                                y = 0;
        !           707:                                break;
        !           708:                        }
        !           709:                        /* falls into */
        !           710:                case '+':
        !           711:                case ',':
        !           712:                        if (pages && page == finish) {
        !           713:                                (void)lseek(screens, scr_size * page, 0);
        !           714:                                (void)write(screens, scptr, scr_size);
        !           715:                        }
        !           716:                        if (pages){
        !           717:                                page = finish = (finish +1)%pages;
        !           718:                                if(start == finish) start = (start + 1)%pages;
        !           719:                        }
        !           720:                        /*blank the memory where screen image is built*/
        !           721:                        z=scptr;
        !           722:                        for (i=scr_size;i--;) *z++ = backcolor;
        !           723:                        return(0);
        !           724:                case 'u':
        !           725:                        if (y > 0) {
        !           726:                                y -= ptubeh;
        !           727:                                break;
        !           728:                        }
        !           729:                        /* falls into */
        !           730:                case '-':
        !           731:                        if (pages == 0 || page == start) {
        !           732: #ifndef XWIND
        !           733:                            if (y == 0)
        !           734:                            fprintf(stderr, "can not back up more\n");
        !           735: #endif XWIND
        !           736:                            y = 0;
        !           737:                        }else{
        !           738:                                if(page == finish) {
        !           739:                                        (void)lseek(screens, scr_size * page, 0);
        !           740:                                        (void)write(screens, scptr, scr_size);
        !           741:                                }
        !           742:                                page = (page==0? (pages-1):(page -1))%pages;
        !           743:                                (void)lseek(screens, scr_size * page, 0);
        !           744:                                (void)read(screens, scptr, scr_size);
        !           745:                                if (c == '-')
        !           746:                                        y = 0;
        !           747:                                else
        !           748:                                        y = scr_y - 1 - ptubeh;
        !           749:                        }
        !           750:                        break;
        !           751:                default: 
        !           752:                        break;
        !           753:                }
        !           754:                if (x < 0) x = 0;
        !           755:                else if (x >= scr_x - ptubew) x = scr_x - 1 - ptubew;
        !           756:                if (y < 0) y = 0;
        !           757:                else if (y >= scr_y - ptubeh) y = scr_y - 1 - ptubeh;
        !           758: #ifdef XWIND
        !           759:                } while (QLength() > 0);
        !           760: #endif
        !           761:        }
        !           762: }
        !           763: 
        !           764: /* get a character from the input file */
        !           765: gc()
        !           766: {
        !           767:        static int len = 0;
        !           768: 
        !           769:        if(macro_on == TRUE) {
        !           770:                /* macro in effect read from its code*/
        !           771:                if(macro_length == macro_count+1) macro_on = FALSE;
        !           772:                return(mp[macro_count++]);
        !           773:        }
        !           774:        else {
        !           775:                /*read from the input file */
        !           776:                if(in_bufp <= &in_buf[len-1]) {
        !           777:                        return(*in_bufp++);
        !           778:                }
        !           779:                len = read(s, in_buf, 512);
        !           780:                if(len == 0) {
        !           781:                        fprintf(stderr,"No such job\n");
        !           782:                        (void)fflush(stderr);
        !           783:                        get_out();
        !           784:                }
        !           785:                else if(len < 0) {
        !           786:                        perror("impv: read failed");
        !           787:                        get_out();
        !           788:                }
        !           789: 
        !           790:                in_bufp = in_buf;
        !           791:                winker();
        !           792:                return(*in_bufp++);
        !           793:        }
        !           794: }
        !           795: 
        !           796: get_out()
        !           797: {
        !           798:        /*reset keyboard*/
        !           799: #ifdef XWIND
        !           800:        XDestroyWindow (Win);
        !           801: #else XWIND
        !           802:        (void)stty(0, &cbreak);
        !           803:        if(pscreen != NULL) pr_close(pscreen);
        !           804:        if(ptube != NULL) pr_close(ptube);
        !           805:        printf("\n");
        !           806: #endif XWIND
        !           807:        if(big || little)
        !           808:            printf("%d pixels/glyphs/lines would be off the page\n",
        !           809:        big + little);
        !           810:        if (screens && unlink(screen_file) < 0)
        !           811:            printf("%s not removed\n", screen_file);
        !           812:        exit(0);
        !           813: }
        !           814: 
        !           815: winker()
        !           816: {
        !           817: #ifdef XWIND
        !           818:        XPixFill(Win, ptubew / 2 - 8, ptubeh - 50, 16, 16, 0, NULL, GXinvert, 1);
        !           819:        XFlush();
        !           820: #else XWIND
        !           821:        pr_rop(ptube, 450, 780, 16, 16, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           822: #endif XWIND
        !           823: }
        !           824: 
        !           825: #ifdef XWIND
        !           826: unsigned char outbuf[CHUNKSIZE];
        !           827: 
        !           828: BitsPut (srcx, srcy, dstx, dsty, width, height)
        !           829:        int srcx, srcy, dstx, dsty, width, height;
        !           830: {
        !           831:        register unsigned char *data, *ptr;
        !           832:        register int i, per, delta;
        !           833:        int linesize;
        !           834: 
        !           835:        linesize = (scr_x + 7) >> 3;
        !           836:        dstx -= (srcx & 7);
        !           837:        width += (srcx & 7);
        !           838:        srcx &= ~7;
        !           839:        data = &pscreen[(srcy*linesize) + (srcx>>3)];
        !           840: 
        !           841:        per = BitmapSize(width, 1);
        !           842:        delta = CHUNKSIZE / per;
        !           843: 
        !           844:        while (height) {
        !           845:                if (height < delta)
        !           846:                        delta = height;
        !           847:                for (ptr = outbuf, i = delta;
        !           848:                     --i >= 0;
        !           849:                     data += linesize, ptr += per)
        !           850:                        bcopy(data, ptr, per);
        !           851:                XBitmapBitsPut(Win, dstx, dsty, width, delta, outbuf,
        !           852:                                forepix, backpix, NULL, GXcopy, AllPlanes);
        !           853:                dsty += delta;
        !           854:                height -= delta;
        !           855:        }
        !           856: }
        !           857: #endif XWIND
        !           858: 
        !           859: #ifndef XWIND
        !           860: page_icon(y)
        !           861: int y;
        !           862: {
        !           863:        int h, i;
        !           864: 
        !           865:        i = 43 * ptubeh / scr_y;
        !           866:        pr_rop(picon, 0 , 0, 46, 53, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           867:        pr_rop(picon, 2 , 2, 42, 49, PIX_CLR, NULL, 0, 0);
        !           868:        pr_rop(picon, 6 , 4, 34, 45, PIX_NOT(PIX_SRC), NULL, 0, 0);
        !           869:        h = 44 * y / scr_y;
        !           870:        pr_rop(picon, 5, 5+h, 36, i, PIX_NOT(PIX_SRC), picon, 5, 5+h);
        !           871:        pr_rop(ptube, ptubew-46, ptubeh/2, 46, 53, PIX_SRC, picon, 0, 0);
        !           872: }
        !           873: #endif
        !           874: 
        !           875: #ifdef COLOR
        !           876: /*
        !           877:        set color
        !           878: */
        !           879: unsigned char
        !           880: setcolor(code)
        !           881: register short int code;
        !           882: {
        !           883:        register unsigned char color;
        !           884:        register float c1,c2;
        !           885:        
        !           886:        c1 = (float)(5 - code) / 255.;
        !           887:        c2 = (float)code / 255.;
        !           888:        color = 36 * ((int)(bc.red * c1 + .5) + (int)(cc.red * c2 + .5))
        !           889:                + 6 * ((int)(bc.green * c1 + .5) + (int)(cc.green * c2 + .5))
        !           890:                + ((int)(bc.blue * c1 + .5) + (int)(cc.blue * c2 + .5));
        !           891:        return(color);
        !           892: }
        !           893: #endif COLOR
        !           894: 
        !           895: usage()
        !           896: {
        !           897: #ifdef NOSPOOL
        !           898: #ifdef COLOR
        !           899:                printf("usage: impv [-p#] [-s] [file]\n");
        !           900: #else COLOR
        !           901: #ifdef XWIND
        !           902:                printf("usage: ximpv [=<geometry>] [-p#] [-rv] [-fg <color>] [-bg <color>] [-bd <color>] [-ms <color>] [host:display] [file]\n");
        !           903: #else XWIND
        !           904:                printf("usage: impv [-p#] [file]\n");
        !           905: #endif XWIND
        !           906: #endif COLOR
        !           907:                (void)fflush(stdout);
        !           908:                exit(0);
        !           909: #else NOSPOOL
        !           910: #ifdef COLOR
        !           911:                printf("usage: impv [-p#] [-s] [-r] [idnumber | -n name]\n");
        !           912: #else COLOR
        !           913:                printf("usage: impv [-p#] [-r] [idnumber | -n name]\n");
        !           914: #endif COLOR
        !           915:                (void)fflush(stdout);
        !           916:                get_out();
        !           917: #endif NOSPOOL
        !           918: }

unix.superglobalmegacorp.com

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