rsalz@uunet.UU.NET (Rich Salz) (10/26/87)
Submitted-by: lee@uhccux.UUCP (Greg Lee)
Posting-number: Volume 12, Issue 42
Archive-name: hershtools/part03
# This is a shell archive. Remove anything before this line
# then unpack it by saving it in a file and typing "sh file"
# (Files unpacked will be owned by you and have default permissions).
# This archive contains the following files:
# ./hplot.c
#
if `test ! -s ./hplot.c`
then
echo "writing ./hplot.c"
sed 's/^X//' > ./hplot.c << '\Rogue\Monster\'
X
X
X#include <stdio.h>
X#include <sys/file.h>
X
X#define TRUE 1
X#define FALSE 0
X#define ERROR -1
X
Xint tty_fid;
Xextern char *term_name;
Xchar w300 = FALSE;
X
X#define movmem bcopy
X
X#define STSIZE 32000
X#define KEEPSIZE 20
X#define GRSIZE 160
X#define GROFF 80
X
Xchar debug, ins[90];
XFILE *ibuf;
Xint cnum;
X
Xint itempt, co1, co2, w, x, y;
Xint deltax, deltay, xinc, yinc;
Xint lx,llx,ly,lly, cx,ccx,cy,ccy, x1,x2,y1,y2, a1,a2,d1,d2, i1,i2;
Xint xx1,xx2,yy1,yy2;
Xint minx, miny, maxx, maxy, base, obase, xheight, ytop, ybot, serifs;
Xchar itemtype, linelet, retrace, openflag, lighten, hairflag, cvflag;
Xint lbear, rbear;
Xunsigned char letter;
Xint xheavy, xlight, yheavy, ylight, penwidth, pxdelta, pydelta,
X squarepen, shading, xshade, yshade;
Xint ppenw, blob, bblob, dblob;
Xint fgrey,fvertical,fhorizontal,fchecked,fhatched,fdiagonal,fwidth;
Xint bwidth,bedge,breverse;
X
X
X#define WYSE 1
X#define ESC 27
X
X#define FTSIZE 12000
X#define PRPTNL 2
X
X#define BLACK '1'
X#define BLUE '2'
X#define GREEN '3'
X#define CYAN '4'
X#define RED '5'
X#define MAGENTA '6'
X#define YELLOW '7'
X#define WHITE '8'
X
X#define UPPRDOT ','
X#define LOWRDOT '-'
X#define BOTHDOT '7'
X#define NODOT ' '
X
Xchar upperdot=UPPRDOT, lowerdot=LOWRDOT, bothdot=BOTHDOT;
X
Xchar cmd, currch, cch, cbyte, cbyteo, mxflag;
Xint col, row, currlen;
X
Xchar vkeep[GRSIZE][KEEPSIZE], gxoff, gyoff, ib;
Xchar ckeep[6][GRSIZE];
X
Xint i, fd;
Xchar ftname[30];
X
X
Xchar duplflag /*, ftlen[128]*/;
Xshort int fix[128];
Xchar ft[FTSIZE];
X
X
X
X
Xchar gr[GRSIZE][GRSIZE];
X
Xunsigned stsize, cindex[128], storept;
Xchar store[STSIZE];
X
X
X#include "vfont.c"
X
Xmain()
X{ char key();
X
X/* stuff from xum */
X
X if (term_setup() != 0)
X {
X printf("Warning: This program needs to have the\n");
X printf("TERM environment variable setup before\n");
X printf("being run. Make sure this is done before\n");
X printf("executing hplot again (set yourself up like\n");
X printf("you were going to use vi).\n");
X exit(1);
X }
X printf("Terminal is a %s.\n", term_name);
X if (!strcmp(term_name, "w300")) w300 = TRUE;
X if (!w300)
X { upperdot='^'; lowerdot='j'; bothdot='g';
X }
X
X tty_fid = cbreak_tty("/dev/tty");
X if (tty_fid == -1)
X {
X printf("Error opening terminal for cbreak i/o\n");
X exit(1);
X }
X
X debug = 0;
X
X stsize = STSIZE;
X
X printf("\nHplot - (c) Greg Lee, Oct. 1984\n\n");
X
X base = 9;
X ytop = 22;
X ybot = 7;
X cvflag = FALSE;
X lbear = rbear = 2;
X strcpy(ftname,"vwork");
X letter = currch = duplflag = 0;
X
X storept = x1 = x2 = y1 = y2 = a2 = d2 = 1;
X serifs = 2;
X
X do
X { printf("\n");
X if (currch > ' ') printf("%c",currch);
X else printf("^%c",currch+64);
X printf("* ");
X cmd = key();
X switch (cmd)
X {
X case 'r': rdchr(); break;
X case 'z': bzero(cindex, 128*sizeof(int));
X bzero(store, STSIZE);
X storept = 1;
X printf("zapped");
X break;
X case 'p': plotlet(); break;
X case 'g': printf("enerating the font\n");
X /*for (letter=1;letter<127;letter++)
X lplot(letter);*/
X vfont();
X cvflag = FALSE;
X break;
X#if WYSE
X case 'v': if (currch) showbits(); break;
X#endif
X case 'b': gvar("ase",&base); break;
X case 'h': gvar("eight",&ytop); break;
X case 'd': gvar("epth",&ybot); break;
X case 'f': printf("actors:\n");
X gvar("X1",&x1);
X gvar("X2",&x2);
X gvar("Y1",&y1);
X gvar("Y2",&y2);
X break;
X case '2': printf(" FACTORS (plot 2):\n");
X gvar("XX1",&xx1);
X gvar("XX2",&xx2);
X gvar("YY1",&yy1);
X gvar("YY2",&yy2);
X break;
X case 'A': printf("SCENDERS:\n");
X gvar("A1",&a1);
X gvar("A2",&a2);
X break;
X case 'D': printf("ESCENDERS:\n");
X gvar("D1",&d1);
X gvar("D2",&d2);
X break;
X case 'I': printf("^ITALIC:\n");
X gvar("I1",&i1);
X gvar("I2",&i2);
X break;
X case 't': if (duplflag) fix[0] &= ~PRPTNL;
X else fix[0] |= PRPTNL;
X chkdupl();
X if (!duplflag) printf("not "); printf("tall");
X break;
X case 'P': printf("EN STYLE:\n");
X gvar("Width",&penwidth);
X gvar("Delta X",&pxdelta);
X gvar("Delta Y",&pydelta);
X gvar("Square Pen",&squarepen);
X gvar("Blob",&blob);
X gvar("Delta Blob",&dblob);
X break;
X case 'H': printf(" SHADE:\n");
X gvar("Shading",&shading);
X gvar("X Shade",&xshade);
X gvar("Y Shade",&yshade);
X break;
X case 'F': printf("ILL:\n");
X gvar("Grey",&fgrey);
X gvar("Vertical",&fvertical);
X gvar("Horizontal",&fhorizontal);
X gvar("Checked",&fchecked);
X gvar("Hatched",&fhatched);
X gvar("Diagonal",&fdiagonal);
X gvar("Width",&fwidth);
X break;
X case 'w': printf("idth adjust:\n");
X gvar("Left Bearing",&lbear);
X gvar("Right Bearing",&rbear);
X break;
X case 'B': printf("OX:\n");
X gvar("Width",&bwidth);
X gvar("Edge",&bedge);
X gvar("Reverse",&breverse);
X break;
X case 'L': printf("INE STYLE:\n");
X gvar("X Heavy",&xheavy);
X gvar("X Light",&xlight);
X gvar("Y Heavy",&yheavy);
X gvar("Y Light",&ylight);
X break;
X case 'O': if (openflag) printf("not ");
X openflag = ~openflag;
X printf("open");
X break;
X case 'l': if (lighten) printf("not ");
X lighten = ~lighten;
X printf("light");
X break;
X case 's': gvar("erifs",&serifs);
X break;
X case 'R': if (retrace) printf(" not r");
X retrace = !retrace;
X printf("etrace");
X break;
X case 'n': printf("ame of font(%s) = ",ftname);
X scanf("%s",ftname);
X break;
X case '?': cmdinfo();
X printf("\nstore room %d, font room %d",
X stsize-storept,FTSIZE-fix[127]);
X break;
X case '\\': printf("debug");
X if (debug) printf(" off");
X debug = !debug;
X case 'q':
X case 'x': break;
X case 'c': loadft();
X cvflag = TRUE;
X break;
X default: conout('?'); break;
X }
X }
X while ((cmd != 'x') && (cmd != 'q'));
X
X reset_tty(tty_fid);
X
X}
X
Xcmdinfo()
X{
X printf("\nRead Plot Name font mag.Factors ^Pen style\n");
X printf("Zap Generate ^Ascenders ^Line style\n");
X printf("Base Vdisplay Serifs ^Descenders ^Open face\n");
X printf("Height eXit/Quit^Italic s^Hading Convert\n");
X printf("Depth ^Fill ^Box ^Retrace Width adjust\n");
X}
X
X
Xgvar(s,v)
Xchar *s; int *v;
X{ char is[80];
X
X printf(s);
X printf("(%d) = ", *v);
X gets(is);
X if (is[0] < '0' || is[0] > '9') return;
X sscanf(is, "%d", v);
X}
X
Xplotlet()
X{
X printf("lot a letter? : ");
X scanf("%c", &letter);
X lplot(letter);
X}
X
X
Xrdchr()
X{ char fname[20];
X
X
X printf("ead what .chr file? : "); scanf("%s", fname);
X if (!fname[0]) return;
X strcat(fname, ".chr");
X if ((ibuf = fopen(fname, "r")) == NULL) return;
X
X while (fgets(ins, 90, ibuf))
X { itempt = 0;
X while (itemtype = scnitem())
X switch(itemtype)
X {
X case 1: letter = 0;
X break;
X case 2: cindex[letter] = storept;
X lbear = rbear = 2;
X break;
X case 3: sto2(co1 + 64, co2 + 64);
X break;
X case 4: sto2(0, 64);
X break;
X case 5: sto2(0, 0);
X break;
X case 6: sto2(0, 'H');
X break;
X }
X }
X
X
X fclose(ibuf);
X
X printf("\nUsed %u of buffer (%d remaining).", storept,stsize-storept);
X}
X
Xsto2(x,y)
Xchar x, y;
X{
X if (letter < 1 || letter > 127) return;
X if (storept > stsize - 2) return;
X
X store[storept++] = x;
X store[storept++] = y;
X
X}
X
Xscnitem()
X{ char dc;
X
X while (ins[itempt] == ' ' || ins[itempt] == '\t') itempt++;
X
X if (!ins[itempt] || ins[itempt] == '\n') return(0);
X
X if (sscanf(ins + itempt, "%d:", &cnum))
X { match(':'); return(1); }
X
X if (sscanf(ins + itempt, "'%c':", &letter))
X { match(':'); return(2); }
X
X if (sscanf(ins + itempt, "^%c':", &letter))
X { match(':'); letter &= 0x1F; return(2); }
X
X if (sscanf(ins + itempt, "Bounds(%d,%d)", &co1, &co2))
X { match(')'); return(66); }
X
X if (sscanf(ins + itempt, "Bearings(%d,%d)", &lbear, &rbear))
X { match(')'); return(66); }
X
X if (sscanf(ins + itempt, "s(%d,%d)", &co1, &co2))
X { match(')'); if (serifs) return(3); return(66); }
X
X if (sscanf(ins + itempt, "S(%d,%d)", &co1, &co2))
X { match(')'); if (serifs>1) return(3); return(66); }
X
X if (sscanf(ins + itempt, "(%d,%d)", &co1, &co2))
X { match(')'); return(3); }
X
X if (sscanf(ins + itempt, "Pen Up%c", &dc))
X { match('p'); return(4); }
X
X if (sscanf(ins + itempt, "End Char%c", &dc))
X { match('r'); return(5); }
X
X if (sscanf(ins + itempt, "Hair%c", &dc))
X { match('r'); return(6); }
X
X if (sscanf(ins + itempt, "Base(%d)", &base))
X { match(')'); obase = base; return(66); }
X
X if (sscanf(ins + itempt, "x Height(%d)", &xheight))
X { match(')'); return(66); }
X
X if (sscanf(ins + itempt, "Height(%d)", &ytop))
X { match(')'); return(66); }
X
X if (sscanf(ins + itempt, "Depth(%d)", &ybot))
X { match(')'); return(66); }
X
X return(0);
X
X}
X
Xmatch(c)
Xchar c;
X{ while (ins[itempt++] != c);
X}
X
Xlplot(let)
Xchar let;
X{ int ox1,ox2,oy1,oy2;
X int oopen;
X
X if (xx1 || xx2 || yy1 || yy2)
X { ox1 = x1; oy1 = y1;
X ox2 = x2; oy2 = y2;
X oopen = openflag;
X
X if (xx1 || xx2)
X { x1 = xx1 ; x2 = xx2; }
X if (yy1 || yy2)
X { y1 = yy1 ; y2 = yy2; }
X
X openflag = FALSE;
X retrace = 2;
X llplot(let);
X openflag = oopen;
X
X x1 = ox1; y1 = oy1;
X x2 = ox2; y2 = oy2;
X retrace = TRUE;
X }
X
X llplot(let);
X}
X
X
Xllplot(let)
Xchar let;
X{ char c1, c2, penstate;
X unsigned xpt;
X
X currch = let;
X chkdupl();
X
X if (let < 0 || let > 128) return;
X
X if (!(xpt = cindex[let])) return;
X /*if (kbhit()) return;*/
X
X if (retrace != TRUE) cleargr();
X
X bblob = blob;
X
X for (penstate = 0 ; (c1 = store[xpt++])
X + (c2 = store[xpt++]) ; )
X if (!c1)
X { penstate = 0;
X if (c2 == 'H') hairflag = TRUE;
X
X bblob = blob;
X }
X
X else
X { lx = cx; ly = cy;
X cx = c1 - 64; cy = c2 - 64;
X
X if (penstate) drawline();
X
X penstate = 1;
X
X }
X
X
X showgr();
X
X retrace = 0;
X}
X
X
Xcleargr()
X{
X bzero(gr, GRSIZE * GRSIZE);
X linelet = '0';
X/* penwidth = abs(penwidth);*/
X}
X
X
Xdrawline()
X{
X if (debug) printf("\nDrawing from (%d,%d) to (%d,%d).", lx,ly,cx,cy);
X
X linelet++;
X if (linelet > '9' && linelet < 'A') linelet = 'A';
X else if (linelet > 'Z' && linelet < 'a') linelet = 'a';
X else if (linelet > 'z') linelet = '!'+1;
X
X if (abs(cy) <= abs(ly))
X { llx = lx;
X lly = ly;
X ccx = cx;
X ccy = cy;
X }
X else
X { llx = cx;
X lly = cy;
X ccx = lx;
X ccy = ly;
X }
X
X
X if (i1 && i2) llx += fadjust(lly,i1,i2)-GROFF;
X x = fadjust(llx,x1,x2);
X
X if (i1 && i2) ccx += fadjust(ccy,i1,i2)-GROFF;
X ccx = fadjust(ccx,x1,x2);
X
X deltax = abs(ccx - x);
X if (ccx >= x) xinc = 1; else xinc = -1;
X
X if (xheight && letter >= 'a' && letter <= 'z')
X { if (lly > obase) lly += ((lly-obase)*d1)/d2;
X else if (lly + xheight <= obase)
X lly -= ((obase+1-xheight-lly)*a1)/a2;
X if (ccy > obase) ccy += ((ccy-obase)*d1)/d2;
X else if (ccy + xheight <= obase)
X ccy -= ((obase+1-xheight-ccy)*a1)/a2;
X }
X
X y = fadjust(lly,y1,y2);
X ccy = fadjust(ccy,y1,y2);
X deltay = abs(ccy - y);
X if (ccy >= y) yinc = 1; else yinc = -1;
X
X drawdot();
X
X if (deltax >= deltay) doforx();
X else dofory();
X
X hairflag = FALSE;
X}
X
Xfadjust(u,f1,f2)
Xint u,f1,f2;
X{
X return( (u * f1 + f2-1)/f2 + GROFF);
X}
X
Xdrawdot()
X{
X dotset();
X
X if (bblob > 0) bblob -= dblob;
X else if (bblob < 0) bblob += dblob;
X
X ppenw = abs(penwidth + bblob/8);
X if (ppenw) doforpen();
X}
X
X
X
Xdoforpen()
X{ int sx,sy;
X
X if (hairflag) return;
X
X sx = x; sy = y;
X
X x -= ppenw * pxdelta / 2;
X y -= ppenw * pydelta / 2;
X
X w = ppenw;
X while(w--)
X { x += pxdelta;
X dotset();
X y += pydelta;
X dotset();
X }
X
X
X w = ppenw;
X if (squarepen)
X while(w--)
X { x -= pydelta;
X y -= pxdelta;
X dotset();
X }
X
X w = ppenw;
X if (squarepen > 1)
X while(w--)
X { x -= pxdelta;
X y -= pydelta;
X dotset();
X }
X
X w = ppenw;
X if (squarepen > 2)
X while(w--)
X { x += pydelta;
X y += pxdelta;
X dotset();
X }
X
X x = sx; y = sy;
X}
X
X
Xdotset()
X{
X
X if (x<0 || x>=GRSIZE || y<0 || y>=GRSIZE) return;
X if (gr[x][y]) return;
X gr[x][y] = linelet;
X
X}
X
X
X
Xdoforx()
X{ int err, i;
X
X err = deltax / 2;
X i = deltax;
X
X while (i--)
X { err += deltay;
X if (err >= deltax)
X { err -= deltax;
X y += yinc;
X if (xheavy) drawdot();
X if (xlight) {x += xinc; continue;}
X }
X x += xinc;
X if (hairflag && (i&1)) continue;
X drawdot();
X if (debug) printf("\n @(%d,%d) [%d,%d]",
X x-GROFF, y-GROFF, x,y);
X }
X
X}
X
Xdofory()
X{ int err, i;
X
X gr[x][y] = linelet;
X
X err = deltay / 2;
X i = deltay;
X
X while (i--)
X { err += deltax;
X if (err >= deltay)
X { err -= deltay;
X x += xinc;
X if (yheavy) drawdot();
X if (ylight) { y+= yinc; continue; }
X }
X y += yinc;
X if (hairflag && (i&1)) continue;
X drawdot();
X if (debug) printf("\n @(%d,%d) [%d,%d]",
X x-GROFF, y-GROFF, x,y);
X }
X
X}
X
Xshowgr()
X{ /* int x, y;*/
X
X minx = miny = GRSIZE-1;
X maxx = maxy = 0;
X
X for (y = 0; y < GRSIZE; y++)
X { for (x = 0; x < GRSIZE; x++)
X if (gr[x][y])
X { if (x < minx) minx = x;
X if (y < miny) miny = y;
X if (x > maxx) maxx = x;
X if (y > maxy) maxy = y;
X }
X }
X
X if (bwidth)
X { i = max(bedge+2, 1 + (bwidth + minx - maxx) / 2);
X minx = max(0, minx - i);
X maxx = min(GRSIZE-1, maxx + i);
X while (maxx - minx > GRSIZE) {minx++; maxx--; }
X miny = base + GROFF + 1 - ytop;
X maxy = miny + ybot;
X }
X
X printf("\n");
X
X if (openflag || lighten)
X { for (y = miny; y <= maxy; y++)
X for (x = minx; x <= maxx; x++)
X if (gr[x][y])
X {
X if (!gr[x+1][y] && !gr[x+2][y] && !gr[x+3][y]) continue;
X if (!gr[x][y+1] && !gr[x][y+2] && !gr[x][y+3]) continue;
X if (!gr[x-1][y] && !gr[x-2][y] && !gr[x-3][y]) continue;
X if (!gr[x][y-1] && !gr[x][y-2] && !gr[x][y-3]) continue;
X gr[x][y] = 1;
X }
X
X if (breverse)
X for (y = miny; y <= maxy; y++)
X for (x = minx; x <= maxx; x++)
X { if (!gr[x][y]) gr[x][y] = 1;
X else if (gr[x][y] == 1) gr[x][y] = 0;
X }
X
X for (y = miny; y <= maxy; y++)
X for (x = minx; x <= maxx; x++)
X if (gr[x][y])
X { gr[x][y]--;
X if (lighten)
X if (gr[x][y])
X { if (gr[x-1][y])
X { if (gr[x-1][y-1])
X gr[x-1][y] = 0;
X else gr[x][y] = 0;
X }
X }
X else if (!gr[x-1][y] && gr[x+1][y] < 2)
X gr[x][y] = '*';
X
X if (fgrey<0) gr[x][y] = 0;
X if (gr[x][y]) continue;
X
X if (fgrey)
X { if (x % fgrey) continue;
X if (y % fgrey) continue;
X if (!fwidth) gr[x][y] = '+';
X }
X
X if (fwidth)
X { if (t(x,fvertical)) continue;
X if (t(y,fhorizontal)) continue;
X if (fchecked &&
X (!t(x,fchecked) == !t(y,fchecked))) continue;
X if (t(x,fhatched) && t(y,fhatched)) continue;
X if (fdiagonal < 0)
X { if (t(abs(x-y),-fdiagonal)) continue; }
X else if (t(x+y, fdiagonal)) continue;
X
X gr[x][y] = '#';
X }
X }
X }
X
X
X if (shading && retrace != 2)
X { shading = abs(shading);
X xshade = abs(xshade);
X
X lx = minx + shading + yshade;
X ly = min(maxy + shading + yshade,GRSIZE-1);
X
X llx = maxx;
X
X while (lx <= llx)
X { raybounce();
X lx += 2 + xshade;
X }
X
X while (ly >= miny)
X { raybounce();
X ly -= 2 + xshade;
X }
X }
X
X
X if (bedge && retrace != 2)
X for (y = miny; y <= maxy; y++)
X for (x = minx; x <= maxx; x++)
X if ( y < miny+bedge
X || y > maxy-bedge
X || x < minx+bedge
X || x > maxx-bedge
X )
X gr[x][y] = '|';
X
X if (maxx - minx > GRSIZE-1) maxx = minx + GRSIZE-1;
X
X for (y = miny; y <= maxy; y++)
X { for (x = minx; x <= maxx; x++)
X { if (x-minx > 78) break;
X if (gr[x][y]) printf("%c",gr[x][y]);
X else if (y == base+GROFF) putchar('-');
X else putchar(' ');
X }
X /*if (y-miny == 23) key();*/
X printf("\n");
X }
X
X printf("\nHeight %d; Depth %d; Width %d\n",
X base+GROFF+1-miny, maxy-GROFF-base, maxx-minx+1);
X
X rdedf();
X}
X
X
Xt(a,period)
Xint a, period;
X{ if (!period) return(FALSE);
X a %= period;
X if (fwidth == 1) return(a);
X if (fwidth < 0) a = (a >= abs(period) / -fwidth);
X else a = (a < abs(period) / fwidth);
X
X if (period < 0) a = !a;
X
X return(a);
X}
X
X
X
Xradar()
X{ x = lx; y = ly;
X
X while ( !gr[x][y]
X && !gr[x-1][y]
X && !gr[x][y-1]
X && !gr[x-1][y-1] )
X { x--; y--;
X if (x < minx || y < miny) return(FALSE);
X }
X return(TRUE);
X}
X
Xraybounce()
X{
X if (!radar()) return;
X
X i = shading;
X cx = x + yshade; cy = y + yshade;
X
X while(i-- && cx<98 && cy<98 )
X { cx++; cy++;
X if (gr[cx][cy]) i = 0;
X else gr[cx][cy] = '.';
X }
X maxx = max(cx,maxx);
X maxy = max(cy,maxy);
X}
X
X
Xchar conin()
X{ return (0x7f & getchar());
X}
X
Xconout(c)
Xchar c;
X{ putchar(c);
X}
X
X
Xtokeep()
X{
X tokepp(0, currch);
X if (duplflag) tokepp(3, dtrans(currch, FALSE));
X}
X
Xtokepp(ib, currch)
Xunsigned char ib, currch;
X{ int i, j, cbase;
X
X cbase = fix[currch];
X currlen = (fix[currch+1] - cbase) / 3;
X
X if (currlen > GRSIZE) currlen = GRSIZE;
X for (i = 0; i < 3; i++)
X for (j = 0; j < GRSIZE; j++)
X if (j >= currlen) ckeep[ib+i][j] = 0;
X else ckeep[ib+i][j] = ft[cbase + j + i*currlen];
X}
X
X
X#if WYSE
Xfromkeep()
X{
X frommkeep(0,currch);
X if (duplflag) frommkeep(3, dtrans(currch, FALSE));
X}
X
Xfrommkeep(ib, currch)
Xchar ib, currch;
X#else
Xfromkeep()
X#endif
X{ int i, j, cend, cbase, cnext, mlen;
X
X cbase = fix[currch];
X cnext = fix[currch+1];
X
X cend = cbase + currlen * 3;
X mlen = (cend-cnext) ? FTSIZE - 1 - max(cnext,cend)
X : 0;
X if (fix[127] + cend - cnext >= FTSIZE)
X { printf("\nfont overflow\n"); return; }
X
X if (mlen)
X { movmem(ft+cnext, ft+cend, mlen);
X for (i = currch+1; i < 128; i++)
X fix[i] = fix[i] + cend - cnext;
X /*for (i = 0; i < 127; i++)
X ftlen[i] = (fix[i+1] - fix[i])/3;*/
X /*if (fix[127] >= FTSIZE) ovlflag = TRUE;*/
X }
X
X if (currlen)
X for (i = 0; i < 3; i++)
X for (j = 0; j < currlen; j++)
X ft[cbase + j + i*currlen] = vkeep[ib+i][j];
X}
X
X
Xchar key()
X{ char c;
X
X c = conin();
X if (c < ' ') c += '@';
X else if (c >='A' && c <= 'Z')
X c += ' ';
X if (c == 'J') return(key());
X return(c);
X}
X
X
Xdtrans(c, upper)
Xchar c, upper;
X{ if (c == 0x20 || c == 0x5F) return(c);
X
X if (c >= 0x60) c -= 0x20;
X else if (c < 0x20) c += 0x20;
X
X if (upper) return(c);
X
X if (c < 0x40) c -= 0x20;
X else c += 0x20;
X
X return(c);
X}
X
Xchkdupl()
X{
X duplflag = fix[0] & PRPTNL;
X#if WYSE
X if (duplflag) currch = dtrans(currch, TRUE);
X#endif
X}
X
Xrdedf()
X{ char c;
X int i, y, lasty, dcurrlen;
X
X
X if (duplflag) currch = dtrans(currch, TRUE);
X
X
X lbear = rbear = 0;
X
X
X bzero(vkeep, KEEPSIZE*GRSIZE);
X row = currlen = 0; dcurrlen = 10000;
X
X y = base + GROFF + 1 - ytop;
X lasty = y + ytop + ybot;
X if (lasty >= GRSIZE) lasty = GRSIZE-1;
X
X for ( ; y <= lasty; row++,y++)
X {
X for (i = minx, col = lbear; i <= maxx; col++,i++)
X if (gr[i][y]) chngbit(TRUE);
X
X if (currlen < col + rbear)
X currlen = col + rbear;
X }
X
X/* fromkeep();*/
X}
X
X
Xchngbit(biton)
Xchar biton;
X{ unsigned char bit, mask;
X
X bit = col % 8;
X mask = 128 >> bit;
X cbyte = vkeep[row][col/8];
X if (biton) cbyte |= mask;
X else cbyte &= ~mask;
X vkeep[row][col/8] = cbyte;
X}
X
X
X
X
X
X
Xgxy(x,y)
Xchar x,y;
X{ if (w300)
X { conout(ESC); conout('=');
X conout(y+' '); conout(x+' ');
X } else mov_cur(x,y);
X}
X
Xshowbits()
X{
X/* conout(0x1A);
X sleep(1);
X*/ cls();
X graph(TRUE);
X/* tokeep();*/
X
X gxoff = (78 - currlen)/2;
X gyoff = (46 - ytop - ybot)/4;
X sshowbits();
X graph(FALSE);
X gxy(0,22);
X}
X
Xsshowbits()
X{ unsigned char i, j, bit, mask, r;
X
X r = gyoff + (ytop + ybot + 1)/2;
X
X if (currlen > 0)
X {
X color(RED,WHITE);
X gxy(gxoff-1,gyoff-1);
X conout(w300 ? '2':'+');
X for (i = 0; i < currlen; i++) conout(w300 ? ':':'-');
X conout(w300 ? '3':'+');
X
X for (i = gyoff; i < r; i++)
X {
X gxy(gxoff-1,i); conout(w300 ? '6':'|');
X gxy(currlen+gxoff,i); conout(w300 ? '6':'|');
X }
X gxy(gxoff-1,r);
X conout(w300 ? '1':'+');
X for (i = 0; i < currlen; i++) conout(w300 ? ':':'-');
X conout(w300 ? '5':'+');
X
X color(BLACK,WHITE);
X }
X
X for (i = 0; i < ytop + ybot; i++,i++)
X for (j = 0; j < currlen; j += 8)
X { cbyte = vkeep[i][j/8];
X cbyteo = vkeep[i+1][j/8];
X mask = 128;
X for (bit = 0; bit < 8; bit++, mask >>= 1)
X if ( /* there is a dot in this row or the next */
X (mask & cbyte) | (mask & cbyteo)
X )
X { gxy(j+bit+gxoff, i/2+gyoff);
X /* both dots? */
X if ((mask & cbyte)&& (mask & cbyteo))
X conout(bothdot);
X /* dot in this row only? */
X else if (mask & cbyte)
X conout(upperdot);
X else conout(lowerdot); /* must be dot in next row */
X }
X }
X}
X
X
Xgraph(yes)
Xchar yes;
X{ if (!w300) return;
X
X conout(ESC); conout('H');
X if (yes) conout(2); else conout(3);
X conout(ESC); conout('`'); /* cursor off/on */
X if (yes) conout('0'); else conout('1');
X if (!yes) color(BLACK, WHITE);
X}
X
Xcolor(fc, bc)
Xchar fc, bc;
X{ if (!w300) return;
X
X conout(ESC); conout('g');
X conout(fc); conout(bc);
X}
X
X
Xmax(x,y)
Xint x,y;
X{ if (x >= y) return(x);
X return(y);
X}
X
Xmin(x,y)
Xint x,y;
X{ if (x >= y) return(y);
X return(x);
X}
X
Xctovkeep()
X{ bzero(vkeep,KEEPSIZE*GRSIZE);
X
X for (row = 0; row < 24; row++)
X for (col = 0; col < currlen+lbear; col++)
X if (chkcbit()) chngbit(TRUE);
X currlen += lbear + rbear;
X}
X
Xchkcbit()
X{ if (duplflag && row > 23)
X return( cchkcbit(3, row - 24));
X else return( cchkcbit(0, row));
X}
X
Xcchkcbit(ib, row)
Xchar ib, row;
X{ unsigned char bit, mask, cbyte;
X
X if (col < lbear) return(0);
X bit = row / 3;
X mask = 128 >> bit;
X cbyte = ckeep[ib + (row % 3)][col-lbear];
X if (cbyte & mask) return(1);
X return(0);
X}
X
X
X
Xloadft()
X{ int fdft, i, ftrecs;
X char fname[20];
X
X strcpy(fname,ftname); strcat(fname,".fn2");
X
X if ((fdft = open(fname,O_RDONLY,"r")) == ERROR)
X {printf("no font"); return;}
X if (read(fdft, fix, 2*128) != 2*128)
X {printf("bad font"); return;}
X
X /* only read enough of the font to get info for char's
X up to ascii nul (which is not used) */
X ftrecs = (fix[127]+127)/128;
X
X if (read(fdft, ft, ftrecs*128) != ftrecs*128)
X {printf("bad font"); return;}
X close(fdft);
X/*
X if (ftrecs > FTSIZE/128) ovlflag = TRUE;
X for (i = 1; i < 127; i++)
X ftlen[i] = (fix[i+1] - fix[i])/3;
X*/
X chkdupl();
X
X}
X
X
X
\Rogue\Monster\
else
echo "will not over write ./hplot.c"
fi
if [ `wc -c ./hplot.c | awk '{printf $1}'` -ne 20996 ]
then
echo `wc -c ./hplot.c | awk '{print "Got " $1 ", Expected " 20996}'`
fi
echo "Finished archive 3 of 4"
# if you want to concatenate archives, remove anything after this line
exit