10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 50Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 60Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 70Sstevel@tonic-gate * with the License. 80Sstevel@tonic-gate * 90Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 100Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 110Sstevel@tonic-gate * See the License for the specific language governing permissions 120Sstevel@tonic-gate * and limitations under the License. 130Sstevel@tonic-gate * 140Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 150Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 160Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 170Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 180Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 190Sstevel@tonic-gate * 200Sstevel@tonic-gate * CDDL HEADER END 210Sstevel@tonic-gate */ 220Sstevel@tonic-gate /* 230Sstevel@tonic-gate * Copyright 2002 Sun Microsystems, Inc. All rights reserved. 240Sstevel@tonic-gate * Use is subject to license terms. 250Sstevel@tonic-gate */ 260Sstevel@tonic-gate 270Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 280Sstevel@tonic-gate /* All Rights Reserved */ 290Sstevel@tonic-gate 300Sstevel@tonic-gate 310Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 320Sstevel@tonic-gate 330Sstevel@tonic-gate #include <stdio.h> 340Sstevel@tonic-gate #include <signal.h> 350Sstevel@tonic-gate #include <values.h> 360Sstevel@tonic-gate #include <sys/types.h> 370Sstevel@tonic-gate #include <sys/stat.h> 380Sstevel@tonic-gate #include <fcntl.h> 390Sstevel@tonic-gate #include <sgtty.h> 40*335Smuffin #include <stdlib.h> 410Sstevel@tonic-gate 420Sstevel@tonic-gate #define NB 88 430Sstevel@tonic-gate #define BSIZ 512 440Sstevel@tonic-gate #define mapx(x) ((1536*((x)-botx)/del)+centx) 450Sstevel@tonic-gate #define mapy(y) ((1536*(del-(y)+boty)/del)-centy) 460Sstevel@tonic-gate #define SOLID -1 470Sstevel@tonic-gate #define DOTTED 014 480Sstevel@tonic-gate #define SHORTDASHED 034 490Sstevel@tonic-gate #define DOTDASHED 054 500Sstevel@tonic-gate #define LONGDASHED 074 510Sstevel@tonic-gate #define SETSTATE (('v'<<8)+1) 520Sstevel@tonic-gate #define NEG_MASK (MAXINT<<(2*BITS(char))) 530Sstevel@tonic-gate #define MAXCHAR ((char)~((char)(1<<BITS(char)-1))) 540Sstevel@tonic-gate #define BUILDINT(ubyte, lbyte) \ 550Sstevel@tonic-gate ubyte > MAXCHAR \ 560Sstevel@tonic-gate ? (ubyte << BITS(char))|lbyte|NEG_MASK \ 570Sstevel@tonic-gate : (ubyte << BITS(char))|lbyte 580Sstevel@tonic-gate 590Sstevel@tonic-gate int linmod = SOLID; 600Sstevel@tonic-gate int again; 610Sstevel@tonic-gate int done1; 620Sstevel@tonic-gate extern char chrtab[][16]; 630Sstevel@tonic-gate short plotcom[] = { 0200, 0, 0, 0 }; 640Sstevel@tonic-gate short eotcom[] = { 0210, 0, 0, 0 }; 650Sstevel@tonic-gate char blocks [NB][BSIZ]; 660Sstevel@tonic-gate short obuf[264]; 670Sstevel@tonic-gate int lastx; 680Sstevel@tonic-gate int lasty; 690Sstevel@tonic-gate double topx = 1536; 700Sstevel@tonic-gate double topy = 1536; 710Sstevel@tonic-gate double botx = 0; 720Sstevel@tonic-gate double boty = 0; 730Sstevel@tonic-gate int centx; 740Sstevel@tonic-gate int centy; 750Sstevel@tonic-gate double delx = 1536; 760Sstevel@tonic-gate double dely = 1536; 770Sstevel@tonic-gate double del = 1536; 780Sstevel@tonic-gate int bflag; 790Sstevel@tonic-gate int fflag; 800Sstevel@tonic-gate char *banname; 810Sstevel@tonic-gate FILE *vpstr; 820Sstevel@tonic-gate 830Sstevel@tonic-gate struct buf { 840Sstevel@tonic-gate int bno; 850Sstevel@tonic-gate char *block; 860Sstevel@tonic-gate }; 870Sstevel@tonic-gate struct buf bufs[NB]; 880Sstevel@tonic-gate 890Sstevel@tonic-gate int in, out; 900Sstevel@tonic-gate char picname[] = "/var/tmp/rasterXXXXXX"; 910Sstevel@tonic-gate char *picture; 920Sstevel@tonic-gate 93*335Smuffin void getpict(void); 94*335Smuffin void plotch(int); 95*335Smuffin void putpict(void); 96*335Smuffin void line(int, int, int, int); 97*335Smuffin void point(int, int); 98*335Smuffin void getblk(int); 99*335Smuffin void onintr(void); 100*335Smuffin 101*335Smuffin int 102*335Smuffin main(int argc, char **argv) 1030Sstevel@tonic-gate { 104*335Smuffin int i; 105*335Smuffin int c; 1060Sstevel@tonic-gate char *fname; 1070Sstevel@tonic-gate 1080Sstevel@tonic-gate while ((c = getopt(argc, argv, "e:b:")) != EOF) 1090Sstevel@tonic-gate switch (c) { 1100Sstevel@tonic-gate case 'b': 1110Sstevel@tonic-gate bflag++; 1120Sstevel@tonic-gate banname = optarg; 1130Sstevel@tonic-gate break; 1140Sstevel@tonic-gate 1150Sstevel@tonic-gate case 'e': 1160Sstevel@tonic-gate fname = optarg; 1170Sstevel@tonic-gate fflag++; 1180Sstevel@tonic-gate break; 1190Sstevel@tonic-gate 1200Sstevel@tonic-gate case '?': 1210Sstevel@tonic-gate fprintf(stderr, 1220Sstevel@tonic-gate "usage: vplot [ -f raster ] [ file ]\n"); 1230Sstevel@tonic-gate exit(1); 1240Sstevel@tonic-gate } 1250Sstevel@tonic-gate if (fflag) { 1260Sstevel@tonic-gate if ((in = open(fname, O_RDONLY)) < 0) { 1270Sstevel@tonic-gate fprintf(stderr, "vplot: cannot open %s\n", fname); 1280Sstevel@tonic-gate exit(1); 1290Sstevel@tonic-gate } 1300Sstevel@tonic-gate putpict(); 1310Sstevel@tonic-gate exit(0); 1320Sstevel@tonic-gate } 1330Sstevel@tonic-gate if (optind < argc) 1340Sstevel@tonic-gate if (freopen(argv[optind], "r", stdin) == NULL) { 1350Sstevel@tonic-gate fprintf(stderr, 1360Sstevel@tonic-gate "vplot: cannot open %s\n", argv[optind]); 1370Sstevel@tonic-gate exit(1); 1380Sstevel@tonic-gate } 139*335Smuffin signal(SIGTERM, (void (*)(int))onintr); 1400Sstevel@tonic-gate if (signal(SIGINT, SIG_IGN) != SIG_IGN) 141*335Smuffin signal(SIGINT, (void (*)(int))onintr); 1420Sstevel@tonic-gate if (signal(SIGHUP, SIG_IGN) != SIG_IGN) 143*335Smuffin signal(SIGHUP, (void (*)(int))onintr); 1440Sstevel@tonic-gate another: 1450Sstevel@tonic-gate for (i = 0; i < NB; i++) { 1460Sstevel@tonic-gate bufs[i].bno = -1; 1470Sstevel@tonic-gate bufs[i].block = blocks[i]; 1480Sstevel@tonic-gate } 1490Sstevel@tonic-gate 1500Sstevel@tonic-gate if ((picture = mktemp(picname)) == NULL) { 1510Sstevel@tonic-gate fprintf(stderr, "vplot: cannot create unique tmp. file name\n"); 1520Sstevel@tonic-gate exit(1); 1530Sstevel@tonic-gate } 1540Sstevel@tonic-gate 1550Sstevel@tonic-gate if ((out = open(picture, (O_WRONLY|O_CREAT|O_TRUNC|O_EXCL), 1560Sstevel@tonic-gate (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH))) == -1) { 1570Sstevel@tonic-gate fprintf(stderr, "vplot: cannot open %s\n", picture); 1580Sstevel@tonic-gate exit(1); 1590Sstevel@tonic-gate } 1600Sstevel@tonic-gate 1610Sstevel@tonic-gate zseek(out, 32*32); 1620Sstevel@tonic-gate write(out, blocks[0], BSIZ); 1630Sstevel@tonic-gate /* 1640Sstevel@tonic-gate * delete following code when filsys deals properly with 1650Sstevel@tonic-gate * holes in files 1660Sstevel@tonic-gate */ 1670Sstevel@tonic-gate for (i = 0; i < 512; i++) 1680Sstevel@tonic-gate blocks[0][i] = 0; 1690Sstevel@tonic-gate zseek(out, 0); 1700Sstevel@tonic-gate for (i = 0; i < 32*32; i++) 1710Sstevel@tonic-gate write(out, blocks[0], 512); 1720Sstevel@tonic-gate getpict(); 1730Sstevel@tonic-gate for (i = 0; i < NB; i++) 1740Sstevel@tonic-gate if (bufs[i].bno != -1) { 1750Sstevel@tonic-gate zseek(out, bufs[i].bno); 1760Sstevel@tonic-gate write(out, bufs[i].block, BSIZ); 1770Sstevel@tonic-gate } 1780Sstevel@tonic-gate putpict(); 1790Sstevel@tonic-gate if (again) { 1800Sstevel@tonic-gate close(out); 1810Sstevel@tonic-gate goto another; 1820Sstevel@tonic-gate } 1830Sstevel@tonic-gate unlink(picture); 184*335Smuffin return (0); 1850Sstevel@tonic-gate } 1860Sstevel@tonic-gate 187*335Smuffin void 188*335Smuffin getpict(void) 1890Sstevel@tonic-gate { 190*335Smuffin int x1, y1; 1910Sstevel@tonic-gate 1920Sstevel@tonic-gate again = 0; 1930Sstevel@tonic-gate for (;;) 1940Sstevel@tonic-gate switch (x1 = getc(stdin)) { 1950Sstevel@tonic-gate case 's': 1960Sstevel@tonic-gate botx = getw(stdin); 1970Sstevel@tonic-gate boty = getw(stdin); 1980Sstevel@tonic-gate topx = getw(stdin); 1990Sstevel@tonic-gate topy = getw(stdin); 2000Sstevel@tonic-gate delx = topx-botx; 2010Sstevel@tonic-gate dely = topy-boty; 2020Sstevel@tonic-gate if (dely/delx > 1536./2048.) 2030Sstevel@tonic-gate del = dely; 2040Sstevel@tonic-gate else 2050Sstevel@tonic-gate del = delx * (1566./2048.); 2060Sstevel@tonic-gate centx = 0; 2070Sstevel@tonic-gate centx = (2048 - mapx(topx)) / 2; 2080Sstevel@tonic-gate centy = 0; 2090Sstevel@tonic-gate centy = mapy(topy) / 2; 2100Sstevel@tonic-gate continue; 2110Sstevel@tonic-gate 2120Sstevel@tonic-gate case 'l': 2130Sstevel@tonic-gate done1 |= 01; 2140Sstevel@tonic-gate x1 = mapx(getw(stdin)); 2150Sstevel@tonic-gate y1 = mapy(getw(stdin)); 2160Sstevel@tonic-gate lastx = mapx(getw(stdin)); 2170Sstevel@tonic-gate lasty = mapy(getw(stdin)); 2180Sstevel@tonic-gate line(x1, y1, lastx, lasty); 2190Sstevel@tonic-gate continue; 2200Sstevel@tonic-gate 2210Sstevel@tonic-gate case 'm': 2220Sstevel@tonic-gate lastx = mapx(getw(stdin)); 2230Sstevel@tonic-gate lasty = mapy(getw(stdin)); 2240Sstevel@tonic-gate continue; 2250Sstevel@tonic-gate 2260Sstevel@tonic-gate case 't': 2270Sstevel@tonic-gate done1 |= 01; 2280Sstevel@tonic-gate while ((x1 = getc(stdin)) != '\n') 2290Sstevel@tonic-gate plotch(x1); 2300Sstevel@tonic-gate continue; 2310Sstevel@tonic-gate 2320Sstevel@tonic-gate case 'e': 2330Sstevel@tonic-gate if (done1) { 2340Sstevel@tonic-gate again++; 2350Sstevel@tonic-gate return; 2360Sstevel@tonic-gate } 2370Sstevel@tonic-gate continue; 2380Sstevel@tonic-gate 2390Sstevel@tonic-gate case 'p': 2400Sstevel@tonic-gate done1 |= 01; 2410Sstevel@tonic-gate lastx = mapx(getw(stdin)); 2420Sstevel@tonic-gate lasty = mapy(getw(stdin)); 2430Sstevel@tonic-gate point(lastx, lasty); 2440Sstevel@tonic-gate point(lastx+1, lasty); 2450Sstevel@tonic-gate point(lastx, lasty+1); 2460Sstevel@tonic-gate point(lastx+1, lasty+1); 2470Sstevel@tonic-gate continue; 2480Sstevel@tonic-gate 2490Sstevel@tonic-gate case 'n': 2500Sstevel@tonic-gate done1 |= 01; 2510Sstevel@tonic-gate x1 = mapx(getw(stdin)); 2520Sstevel@tonic-gate y1 = mapy(getw(stdin)); 2530Sstevel@tonic-gate line(lastx, lasty, x1, y1); 2540Sstevel@tonic-gate lastx = x1; 2550Sstevel@tonic-gate lasty = y1; 2560Sstevel@tonic-gate continue; 2570Sstevel@tonic-gate 2580Sstevel@tonic-gate case 'f': 2590Sstevel@tonic-gate getw(stdin); 2600Sstevel@tonic-gate getc(stdin); 2610Sstevel@tonic-gate switch (getc(stdin)) { 2620Sstevel@tonic-gate case 't': 2630Sstevel@tonic-gate linmod = DOTTED; 2640Sstevel@tonic-gate break; 2650Sstevel@tonic-gate default: 2660Sstevel@tonic-gate case 'i': 2670Sstevel@tonic-gate linmod = SOLID; 2680Sstevel@tonic-gate break; 2690Sstevel@tonic-gate case 'g': 2700Sstevel@tonic-gate linmod = LONGDASHED; 2710Sstevel@tonic-gate break; 2720Sstevel@tonic-gate case 'r': 2730Sstevel@tonic-gate linmod = SHORTDASHED; 2740Sstevel@tonic-gate break; 2750Sstevel@tonic-gate case 'd': 2760Sstevel@tonic-gate linmod = DOTDASHED; 2770Sstevel@tonic-gate break; 2780Sstevel@tonic-gate } 2790Sstevel@tonic-gate while ((x1 = getc(stdin)) != '\n') 2800Sstevel@tonic-gate if (x1 == -1) 2810Sstevel@tonic-gate return; 2820Sstevel@tonic-gate continue; 2830Sstevel@tonic-gate 2840Sstevel@tonic-gate case 'd': 2850Sstevel@tonic-gate getw(stdin); 2860Sstevel@tonic-gate getw(stdin); 2870Sstevel@tonic-gate getw(stdin); 2880Sstevel@tonic-gate x1 = getw(stdin); 2890Sstevel@tonic-gate while (--x1 >= 0) 2900Sstevel@tonic-gate getw(stdin); 2910Sstevel@tonic-gate continue; 2920Sstevel@tonic-gate 2930Sstevel@tonic-gate case -1: 2940Sstevel@tonic-gate return; 2950Sstevel@tonic-gate 2960Sstevel@tonic-gate default: 2970Sstevel@tonic-gate printf("Botch\n"); 2980Sstevel@tonic-gate return; 2990Sstevel@tonic-gate } 3000Sstevel@tonic-gate } 3010Sstevel@tonic-gate 302*335Smuffin void 303*335Smuffin plotch(int c) 3040Sstevel@tonic-gate { 305*335Smuffin int j; 306*335Smuffin char *cp; 3070Sstevel@tonic-gate int i; 3080Sstevel@tonic-gate 3090Sstevel@tonic-gate if (c < ' ' || c > 0177) 3100Sstevel@tonic-gate return; 3110Sstevel@tonic-gate cp = chrtab[c-' ']; 3120Sstevel@tonic-gate for (i = -16; i < 16; i += 2) { 3130Sstevel@tonic-gate c = *cp++; 3140Sstevel@tonic-gate for (j = 7; j >= 0; --j) 3150Sstevel@tonic-gate if ((c>>j)&1) { 3160Sstevel@tonic-gate point(lastx+6-j*2, lasty+i); 3170Sstevel@tonic-gate point(lastx+7-j*2, lasty+i); 3180Sstevel@tonic-gate point(lastx+6-j*2, lasty+i+1); 3190Sstevel@tonic-gate point(lastx+7-j*2, lasty+i+1); 3200Sstevel@tonic-gate } 3210Sstevel@tonic-gate } 3220Sstevel@tonic-gate lastx += 16; 3230Sstevel@tonic-gate } 3240Sstevel@tonic-gate 3250Sstevel@tonic-gate int f; /* versatec file number */ 326*335Smuffin 327*335Smuffin void 328*335Smuffin putpict(void) 3290Sstevel@tonic-gate { 330*335Smuffin int x; 331*335Smuffin short *ip, *op; 3320Sstevel@tonic-gate int y; 3330Sstevel@tonic-gate 3340Sstevel@tonic-gate if (f == 0) { 3350Sstevel@tonic-gate f = open("/dev/vp", O_WRONLY); 3360Sstevel@tonic-gate if (f < 0) { 3370Sstevel@tonic-gate fprintf(stderr, "Cannot open vp\n"); 3380Sstevel@tonic-gate unlink(picture); 3390Sstevel@tonic-gate exit(1); 3400Sstevel@tonic-gate } 3410Sstevel@tonic-gate vpstr = fdopen(f, "w"); 3420Sstevel@tonic-gate if (bflag) { 3430Sstevel@tonic-gate banner(vpstr, banname); 3440Sstevel@tonic-gate fflush(vpstr); 3450Sstevel@tonic-gate } 3460Sstevel@tonic-gate ioctl(f, TIOCSETP, plotcom); 3470Sstevel@tonic-gate } 3480Sstevel@tonic-gate op = obuf; 3490Sstevel@tonic-gate lseek(in, 0L, 0); 3500Sstevel@tonic-gate for (y = 0; y < 2048; y++) { 3510Sstevel@tonic-gate if ((y&077) == 0) 3520Sstevel@tonic-gate read(in, blocks[0], 32*BSIZ); 3530Sstevel@tonic-gate for (x = 0; x < 32; x++) { 3540Sstevel@tonic-gate ip = (short *)&blocks[x][(y&077)<<3]; 3550Sstevel@tonic-gate *op++ = *ip++; 3560Sstevel@tonic-gate *op++ = *ip++; 3570Sstevel@tonic-gate *op++ = *ip++; 3580Sstevel@tonic-gate *op++ = *ip++; 3590Sstevel@tonic-gate } 3600Sstevel@tonic-gate *op++ = 0; 3610Sstevel@tonic-gate *op++ = 0; 3620Sstevel@tonic-gate *op++ = 0; 3630Sstevel@tonic-gate *op++ = 0; 3640Sstevel@tonic-gate if (y&1) { 3650Sstevel@tonic-gate write(f, (char *)obuf, sizeof (obuf)); 3660Sstevel@tonic-gate op = obuf; 3670Sstevel@tonic-gate } 3680Sstevel@tonic-gate } 3690Sstevel@tonic-gate } 3700Sstevel@tonic-gate 371*335Smuffin void 372*335Smuffin line(int x0, int y0, int x1, int y1) 3730Sstevel@tonic-gate { 3740Sstevel@tonic-gate int dx, dy; 3750Sstevel@tonic-gate int xinc, yinc; 376*335Smuffin int res1; 3770Sstevel@tonic-gate int res2; 3780Sstevel@tonic-gate int slope; 3790Sstevel@tonic-gate 3800Sstevel@tonic-gate xinc = 1; 3810Sstevel@tonic-gate yinc = 1; 3820Sstevel@tonic-gate if ((dx = x1-x0) < 0) { 3830Sstevel@tonic-gate xinc = -1; 3840Sstevel@tonic-gate dx = -dx; 3850Sstevel@tonic-gate } 3860Sstevel@tonic-gate if ((dy = y1-y0) < 0) { 3870Sstevel@tonic-gate yinc = -1; 3880Sstevel@tonic-gate dy = -dy; 3890Sstevel@tonic-gate } 3900Sstevel@tonic-gate slope = xinc*yinc; 3910Sstevel@tonic-gate res1 = 0; 3920Sstevel@tonic-gate res2 = 0; 3930Sstevel@tonic-gate if (dx >= dy) 3940Sstevel@tonic-gate while (x0 != x1) { 3950Sstevel@tonic-gate if ((x0 + slope*y0) & linmod) 3960Sstevel@tonic-gate if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno) 3970Sstevel@tonic-gate bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07)); 3980Sstevel@tonic-gate else 3990Sstevel@tonic-gate point(x0, y0); 4000Sstevel@tonic-gate if (res1 > res2) { 4010Sstevel@tonic-gate res2 += dx - res1; 4020Sstevel@tonic-gate res1 = 0; 4030Sstevel@tonic-gate y0 += yinc; 4040Sstevel@tonic-gate } 4050Sstevel@tonic-gate res1 += dy; 4060Sstevel@tonic-gate x0 += xinc; 4070Sstevel@tonic-gate } else while (y0 != y1) { 4080Sstevel@tonic-gate if ((x0 + slope * y0) & linmod) 4090Sstevel@tonic-gate if (((x0 >> 6) + ((y0 & ~077) >> 1)) == bufs[0].bno) 4100Sstevel@tonic-gate bufs[0].block[((y0 & 077) << 3)+((x0 >> 3) & 07)] 4110Sstevel@tonic-gate |= 1 << (7 - (x0& 07)); 4120Sstevel@tonic-gate else 4130Sstevel@tonic-gate point(x0, y0); 4140Sstevel@tonic-gate if (res1 > res2) { 4150Sstevel@tonic-gate res2 += dy - res1; 4160Sstevel@tonic-gate res1 = 0; 4170Sstevel@tonic-gate x0 += xinc; 4180Sstevel@tonic-gate } 4190Sstevel@tonic-gate res1 += dx; 4200Sstevel@tonic-gate y0 += yinc; 4210Sstevel@tonic-gate } 4220Sstevel@tonic-gate if ((x1+slope*y1)&linmod) 4230Sstevel@tonic-gate if (((x1>>6) + ((y1&~077)>>1)) == bufs[0].bno) 4240Sstevel@tonic-gate bufs[0].block[((y1&077)<<3)+((x1>>3)&07)] |= 1 << (7-(x1&07)); 4250Sstevel@tonic-gate else 4260Sstevel@tonic-gate point(x1, y1); 4270Sstevel@tonic-gate } 4280Sstevel@tonic-gate 429*335Smuffin void 430*335Smuffin point(int x, int y) 4310Sstevel@tonic-gate { 432*335Smuffin int bno; 4330Sstevel@tonic-gate 4340Sstevel@tonic-gate bno = ((x&03700)>>6) + ((y&03700)>>1); 4350Sstevel@tonic-gate if (bno != bufs[0].bno) { 4360Sstevel@tonic-gate if (bno < 0 || bno >= 1024) 4370Sstevel@tonic-gate return; 4380Sstevel@tonic-gate getblk(bno); 4390Sstevel@tonic-gate } 4400Sstevel@tonic-gate bufs[0].block[((y&077)<<3)+((x>>3)&07)] |= 1 << (7-(x&07)); 4410Sstevel@tonic-gate } 4420Sstevel@tonic-gate 443*335Smuffin void 444*335Smuffin getblk(int b) 4450Sstevel@tonic-gate { 446*335Smuffin struct buf *bp1, *bp2; 447*335Smuffin char *tp; 4480Sstevel@tonic-gate 4490Sstevel@tonic-gate loop: 4500Sstevel@tonic-gate for (bp1 = bufs; bp1 < &bufs[NB]; bp1++) { 4510Sstevel@tonic-gate if (bp1->bno == b || bp1->bno == -1) { 4520Sstevel@tonic-gate tp = bp1->block; 4530Sstevel@tonic-gate for (bp2 = bp1; bp2 > bufs; --bp2) { 4540Sstevel@tonic-gate bp2->bno = (bp2-1)->bno; 4550Sstevel@tonic-gate bp2->block = (bp2-1)->block; 4560Sstevel@tonic-gate } 4570Sstevel@tonic-gate bufs[0].bno = b; 4580Sstevel@tonic-gate bufs[0].block = tp; 4590Sstevel@tonic-gate return; 4600Sstevel@tonic-gate } 4610Sstevel@tonic-gate } 4620Sstevel@tonic-gate zseek(out, bufs[NB-1].bno); 4630Sstevel@tonic-gate write(out, bufs[NB-1].block, BSIZ); 4640Sstevel@tonic-gate zseek(in, b); 4650Sstevel@tonic-gate read(in, bufs[NB-1].block, BSIZ); 4660Sstevel@tonic-gate bufs[NB-1].bno = b; 4670Sstevel@tonic-gate goto loop; 4680Sstevel@tonic-gate } 4690Sstevel@tonic-gate 4700Sstevel@tonic-gate void 471*335Smuffin onintr(void) 4720Sstevel@tonic-gate { 4730Sstevel@tonic-gate unlink(picture); 4740Sstevel@tonic-gate exit(1); 4750Sstevel@tonic-gate } 4760Sstevel@tonic-gate 477*335Smuffin 478*335Smuffin int 479*335Smuffin zseek(int a, int b) 4800Sstevel@tonic-gate { 4810Sstevel@tonic-gate return (lseek(a, (long)b*512, 0)); 4820Sstevel@tonic-gate } 483