Subject: v12i043: Hershey font manipulation tools and data, Part04/05 Newsgroups: comp.sources.unix Sender: sources Approved: rs@uunet.UU.NET Submitted-by: lee@uhccux.UUCP (Greg Lee) Posting-number: Volume 12, Issue 43 Archive-name: hershtools/part04 # 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: # ./Makefile # ./README # ./eplot.c # if `test ! -s ./Makefile` then echo "writing ./Makefile" sed 's/^X//' > ./Makefile << '\Rogue\Monster\' X# Makefile 1.0 6/5/87 X# X# make file for font programs X# X# X XCFLAGS= -O -s XOBJS= termio.o XSOURCES= termio.c eplot.c hplot.c X Xall: eplot hplot htrans X Xhtrans: htrans.c X ${CC} ${CFLAGS} -o htrans htrans.c X Xeplot: ${OBJS} eplot.o X ${CC} ${CFLAGS} -o eplot ${OBJS} eplot.o -ltermlib X Xhplot: ${OBJS} hplot.o X ${CC} ${CFLAGS} -o hplot ${OBJS} hplot.o -ltermlib X Xeplot.o: eplot.c X ${CC} ${CFLAGS} -c eplot.c X Xhplot.o: hplot.c vfont.c X ${CC} ${CFLAGS} -c hplot.c X X${OBJS}: termio.h X Xclean: X rm -f *.o X \Rogue\Monster\ else echo "will not over write ./Makefile" fi if [ `wc -c ./Makefile | awk '{printf $1}'` -ne 492 ] then echo `wc -c ./Makefile | awk '{print "Got " $1 ", Expected " 492}'` fi if `test ! -s ./README` then echo "writing ./README" sed 's/^X//' > ./README << '\Rogue\Monster\' XHere are some programs for making use of the Hershey character data. Eplot Xand hplot allow the editing of vector fonts and the creation of other fonts Xfrom them -- vfont format raster fonts, PostScript analytic fonts -- as Xwell as tfm files for TeX. The file format for vector fonts is idiosyncratic, XI'm sorry to say. I have not had access to the Hershey data in the usual Xformats. I have included two sets of four files each containing the Hershey Xsimplex and triplex Roman characters in the format required for these Xprograms -- these are sr?.chr and tr?.chr, where the ? is c for capital Xletters, s for small letters, d for digits, or p for punctuation. Just Xin case anyone has the Hershey data in the compressed form I have it in X(similar the National Bureau of Standards form) I included the utility Xhtrans, which converts from the compressed form to my form. (By the way, XI would really like to have the Hershey data for oriental characters.) X XThese programs have compiled ok in the Ultrix 1.2 and Sun 3.0 versions of XBSD 4.2. X XParts of the source (termio.c, termio.h) were taken from the Xum package Xdistributed in net.sources by John Paul O'Brien, Nova University, Fort XLauderdale, Florida, {allegra, ucf-cs, usfvax2}!novavax!john, and (vfont.c) from Xthe Hfont package by William LeFebvre, Department of Computer Science, XRice University, . These appear to be in the public domain. XI am grateful to the above for the use of their code, and I hereby place Xthe rest of the code and documents for these programs in the public domain. X XGreg Lee, Sept 12, 1987. XU.S.mail: 562 Moore Hall, Dept. of Linguistics, Univ. of Hawaii, HONO, HI 96822 XINTERNET: lee@uhccux.uhcc.hawaii.edu XUUCP: {ihnp4,dcdwest,ucbvax}!sdcsvax!nosc!uhccux!lee XBITNET: lee%uhccux.uhcc.hawaii.edu@rutgers.edu \Rogue\Monster\ else echo "will not over write ./README" fi if [ `wc -c ./README | awk '{printf $1}'` -ne 1811 ] then echo `wc -c ./README | awk '{print "Got " $1 ", Expected " 1811}'` fi if `test ! -s ./eplot.c` then echo "writing ./eplot.c" sed 's/^X//' > ./eplot.c << '\Rogue\Monster\' X X#include X#define TRUE 1 X#define FALSE 0 X Xextern char *term_name; Xchar w300 = FALSE; X X#define STSIZE 32000 X#define KEEPSIZE 80 X X#define getnam(nm) cook_tty(tty_fid);scanf("%s",nm);uncook_tty(tty_fid); X Xint tty_fid; X Xchar penstate, debug, /*ibuf[BUFSIZ],*/ ins[90]; XFILE *ibuf; Xint cnum; X Xint itempt, co1, co2, co3, lebear, ribear, 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 minx, miny, maxx, maxy, base, obase, xheight, ytop, ybot, serifs; Xint begy,begx; Xchar itemtype, letter, linelet, retrace, openflag, lighten, hairflag; X Xint xheavy, xlight, yheavy, ylight, penwidth, pxangle, pyangle, X squarepen, shading, xshade, yshade; X X X#define ESC 27 X#define RIGHTCOL 79 X#define LEFTCOL 0 X#define BOTROW 23 X 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 ' ' Xchar upperdot=UPPRDOT, lowerdot=LOWRDOT, bothdot=BOTHDOT; X Xchar currlet, reallet; Xunsigned currlines[96]; Xunsigned xpt, penplace,oldpplace, lastplace; X X Xchar cmd, currch, cch, cbyte, cbyteo, mxflag; Xint col, row, xpos, ypos, currlen; Xchar erow,ecol, pxc,pyc, penchar; X Xchar ckeep[6][KEEPSIZE], gxoff, gyoff, ib; X Xint i, fd; Xchar ftname[30]; Xchar duplflag; X X/******************/ X X X/* char obuf[BUFSIZ];*/ XFILE *obuf; Xint cocnt; Xunsigned char sletter; Xunsigned svpt; X X/***************/ X Xchar gr[100][100]; X Xchar *_stsz; Xunsigned stsize, cindex[128], storept; Xunsigned char psxoff[128], pswidth[128]; Xchar store[STSIZE]; X X/*****************/ X Xsavechr() X{ char fname[30]; X X if (storept< 2) {printf("nothing to save\r\n"); return; } X X strcpy(fname,ftname); X strcat(fname,".chr"); X if ((obuf = fopen(fname, "w")) == NULL) exit(1); X X fprintf(obuf, "Height(%d)\n", ytop); X if (xheight) fprintf(obuf, "x Height(%d)\n", xheight); X if (base) fprintf(obuf, "Base(%d)\n", base); X X X cocnt = 0; X X for (sletter = 0; sletter < 128 ; sletter++) X { X if (!(svpt = cindex[sletter])) continue; X /*if (kbhit()) return;*/ X X if (sletter < ' ') fprintf(obuf, "^%c': ", sletter); X else fprintf(obuf, "'%c': ", sletter); X X while (!(dspc(store[svpt], store[svpt+1]))) svpt +=2; X X } X X fprintf(obuf, "\n"); X fclose(obuf); X X} X Xdspc(b1, b2) Xchar b1, b2; X{ X co1 = b1 - 64; co2 = b2 - 64; X X if (co1 == -64 && co2 == -64) X { fprintf(obuf," End Char\n"); X cocnt = 0; X return(TRUE); X } X X X if (co1 == -64) X { if (!co2) fprintf(obuf," Pen Up\n "); X else if (b2 == 'H') fprintf(obuf,"\n Hair "); X cocnt = 0; X } X else X { if (cocnt >8) {cocnt = 0; fprintf(obuf,"\n ");} X X fprintf(obuf,"(%d,%d)", co1,co2); X cocnt++; X } X X return(FALSE); X} X X X Xsaveasm() X{ char fname[30]; X X if (storept< 2) {printf("nothing to save\r\n"); return; } X X strcpy(fname,ftname); X strcat(fname,".a"); X if ((obuf = fopen(fname, "w")) == NULL) exit(1); X X fprintf(obuf, "\n\tsection font,data\n"); X fprintf(obuf, "\tdc.w %d,%d\n", ytop, base); X fprintf(obuf, "\txdef\t%s\n%s\n\n", ftname, ftname); X fprintf(obuf, "\tinclude\t\"chrdir\"\n\n"); X fprintf(obuf, ".h20\n\tdc.b -6,6\n endchar\n"); X X X X for (sletter = 33; sletter < 128 ; sletter++) X { X X if ( (sletter >= 'A' && sletter <= 'Z') X || (sletter >= 'a' && sletter <= 'z') ) X fprintf(obuf, ".%c\n", sletter); X else if (sletter >= '0' && sletter <= '9') X fprintf(obuf, ".d%c\n", sletter); X else fprintf(obuf, ".h%02.2x\n", sletter); X X if (!(svpt = cindex[sletter])) X { fprintf(obuf, "\tdc.b 0,0\n endchar\n"); X continue; X } X X X minx = 63; maxx = -63; X while ( (x=store[svpt]) + (y=store[svpt+1]) ) X { svpt += 2; X if (!(x)) continue; X minx = min(minx, x-64); X maxx = max(maxx, x-64); X } X fprintf(obuf, "\tdc.b %d,%d\n", minx-lebear, maxx+ribear); X X svpt = cindex[sletter]; X X while (!(dspca(store[svpt], store[svpt+1]))) svpt +=2; X X } X X fprintf(obuf, "\n\tend\n"); X fclose(obuf); X X} X Xdspca(b1, b2) Xchar b1, b2; X{ X co1 = b1 - 64; co2 = b2 - 64; X X if (co1 == -64 && co2 == -64) X { fprintf(obuf," endchar\n"); X return(TRUE); X } X X X if (co1 == -64) X { if (!co2) fprintf(obuf," penup\n"); X /* else if (b2 != 'H') X fprintf(obuf,"\tdc.b -%d,%d\n", co2,co2); */ X } X else X { X fprintf(obuf,"\tdc.b %d,%d\n", co1,co2); X } X X return(FALSE); X} X X X Xsaveps() X{ char fname[30]; X char *nameoflet(); X int letcount; X int fbb[4]; X X if (storept< 2) {printf("nothing to save\r\n"); return; } X X strcpy(fname,ftname); X strcat(fname,".ps"); X if ((obuf = fopen(fname, "w")) == NULL) exit(1); X X fprintf(obuf, "10 dict dup begin\n"); X fprintf(obuf, "/FontType 3 def\n"); X fprintf(obuf, "/FontMatrix [.03 0 0 .03 0 0] def\n"); X fprintf(obuf, "/Encoding 256 array def\n"); X fprintf(obuf, "0 1 255 {Encoding exch/.notdef put} for\n"); X fprintf(obuf, "Encoding\n"); X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X fprintf(obuf, "dup %d /%s put\n", sletter, nameoflet(sletter)); X } X fprintf(obuf, "pop\n"); X X#define HLWIDTH 1 X letcount = 0; X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X letcount++; X } X X fprintf(obuf, "/BBox %d dict def\nBBox begin\n", letcount+1); X fprintf(obuf, " /.notdef [0 0 0 0] def\n"); X fbb[0] = fbb[1] = 63; fbb[2] = fbb[3] = -63; X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X co2 = minx = miny = 63; co3 = maxx = maxy = -63; X while ( (x=store[svpt]) + (y=store[svpt+1]) ) X { svpt += 2; X if (!(co1=x)) continue; X if (i1 && i2) co1 += fadjust(-base+y-64,i1,i2)-50; X co2 = min(co2, co1-64); X minx = min(minx, x-64); X miny = min(miny, y-64); X co3 = max(co3, co1-64); X maxx = max(maxx, x-64); X maxy = max(maxy, y-64); X } X psxoff[sletter] = lebear - minx; X pswidth[sletter] = lebear + maxx - minx + 1 + ribear; X fprintf(obuf, " /%s [%d %d %d %d] def\n", nameoflet(sletter), X co2 + psxoff[sletter] - HLWIDTH, X -maxy + base - HLWIDTH, X co3 + psxoff[sletter] + HLWIDTH, X -miny + base + HLWIDTH); X fbb[0] = min(fbb[0], co2 + psxoff[sletter] - HLWIDTH); X fbb[1] = min(fbb[1], -maxy + base - HLWIDTH); X fbb[2] = max(fbb[2], co3 + psxoff[sletter] + HLWIDTH); X fbb[3] = max(fbb[3], -miny + base + HLWIDTH); X } X fprintf(obuf, "end\n"); X fprintf(obuf, "/FontBBox [%d %d %d %d] def\n",fbb[0],fbb[1], X fbb[2],fbb[3]); X X fprintf(obuf, "/Metrics %d dict def\nMetrics begin\n", letcount+1); X fprintf(obuf, " /.notdef 0 def\n"); X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X fprintf(obuf, " /%s %d def\n", nameoflet(sletter), X pswidth[sletter]); X } X fprintf(obuf, "end\n"); X X X fprintf(obuf, "/CharacterDefs %d dict def\nCharacterDefs begin\n", X letcount+1); X fprintf(obuf, "/.notdef {} def\n"); X cocnt = 0; X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X fprintf(obuf, "/%s\n { newpath\n ", nameoflet(sletter)); X penstate = 0; X while (!(dsps(store[svpt], store[svpt+1]))) svpt +=2; X } X fprintf(obuf, "end\n"); X X pbuildchar(); X X fprintf(obuf, "/UniqueID %d def\n\nend\n", ftname[0]); X X fprintf(obuf, "/%s exch definefont pop\n", ftname); X X fclose(obuf); X X} X X Xdsps(b1, b2) Xchar b1, b2; X{ X co1 = b1 - 64; co2 = b2 - 64; X X if (co1 == -64 && co2 == -64) X { X fprintf(obuf, " stroke } def\n"); X cocnt = 0; X return(TRUE); X } X X X if (co1 == -64) X { if (!co2) penstate = 0; X /*else if (b2 == 'H') fprintf(obuf,"\n Hair ");*/ X } X else X { if (cocnt >3) {cocnt = 0; fprintf(obuf,"\n ");} X X if (i1 && i2) co1 += fadjust(-base+co2,i1,i2) - 50; X X fprintf(obuf," %d %d ", co1+psxoff[sletter],base-co2); X if (penstate) fprintf(obuf,"lineto"); X else fprintf(obuf,"moveto"); X penstate = 1; X cocnt++; X } X X return(FALSE); X} X Xchar *nameoflet(c) Xchar c; X{ static char *npc[] = { X "A", "ctl@", X "esc", "fs", "gs", "rs", "us", X "space", "exclam", "quotedbl", "numbersign", "dollar", X "percent", "ampersand", "quoteright", "parenleft", X "parenright", "asterisk", "plus", "comma", "hyphen", X "period", "slash", X "zero", "one", "two", "three", "four", "five", "six", "seven", X "eight", "nine", "colon", "semicolon", "less", "equal", X "greater", "question", "at", X "bracketleft", "backslash", "bracketright", "asciicircum", X "underscore", "quoteleft", X "braceleft", "bar", "braceright", "asciitilde", "del" X }; X X if (c < 0x1B) { npc[1][3] = c + 0x40; return(npc[1]); } X if (c < 'A') return(npc[c - 0x19]); X if (c <= 'Z') { npc[0][0] = c; return(npc[0]); } X if (c < 'a') { return(npc[c + 39 - 'Z']); } X if (c <= 'z') { npc[0][0] = c; return(npc[0]); } X return(npc[c + 45 - 'z']); X} X Xpbuildchar() X{ X fprintf(obuf,"/BuildChar\n"); X fprintf(obuf,"{ 0 begin\n"); X fprintf(obuf," /char exch def\n /fontdict exch def\n"); X fprintf(obuf," /charname fontdict /Encoding get char get def\n"); X fprintf(obuf," fontdict begin\n"); X fprintf(obuf," Metrics charname get 0\n"); X fprintf(obuf," BBox charname get aload pop\n"); X fprintf(obuf," setcachedevice\n"); X fprintf(obuf," %1.1f setlinewidth\n", 2.0*HLWIDTH); X fprintf(obuf," CharacterDefs charname get exec\n"); X fprintf(obuf," end\nend\n} def\n"); X fprintf(obuf,"/BuildChar load 0 3 dict put\n"); X} X X Xsavetfm() X{ char fname[30]; X char *nameoflet(); X X if (storept< 2) {printf("nothing to save\r\n"); return; } X X strcpy(fname,ftname); X strcat(fname,".pl"); X if ((obuf = fopen(fname, "w")) == NULL) exit(1); X X fprintf(obuf, "\n"); X X fprintf(obuf,"(DESIGNSIZE R 10.0)\n"); X fprintf(obuf,"(COMMENT DESIGNSIZE IS IN POINTS)\n"); X fprintf(obuf,"(COMMENT OTHER SIZES ARE MULTIPLES OF DESIGNSIZE)\n"); X fprintf(obuf,"(FONTDIMEN\n"); X if (i1 && i2) X fprintf(obuf," (SLANT R %1.6f)\n", (float)-i1/i2); X fprintf(obuf," (SPACE R 0.357776)\n"); X fprintf(obuf," (STRETCH R 0.153333)\n"); X fprintf(obuf," (SHRINK R 0.1022215)\n"); X if (xheight) X fprintf(obuf," (XHEIGHT R %1.6f)\n", (float)xheight/33.33); X else X fprintf(obuf," (XHEIGHT R 0.430555)\n"); X fprintf(obuf," (QUAD R 1.022217)\n"); X fprintf(obuf," (EXTRASPACE R 0.1022215)\n"); X fprintf(obuf," )\n"); X X for (sletter = 0; sletter < 128 ; sletter++) X { if (!(svpt = cindex[sletter])) continue; X fprintf(obuf,"(CHARACTER O %o\n", sletter); X minx = miny = 63; co2 = maxx = maxy = -63; X while ( (x=store[svpt]) + (y=store[svpt+1]) ) X { svpt += 2; X if (!(co1=x)) continue; X if (i1 && i2) co1 += fadjust(-base+y-64,i1,i2)-50; X minx = min(minx, x-64); X miny = min(miny, y-64); X maxx = max(maxx, x-64); X maxy = max(maxy, y-64); X co2 = max(co2, co1-64); X } X if ((x = lebear + maxx - minx + 1 + ribear) > 0) X fprintf(obuf, " (CHARWD R %1.6f)\n", (float)x/33.33); X if ((x = -miny + base + 1 + HLWIDTH) > 0) X fprintf(obuf, " (CHARHT R %1.6f)\n", (float)x/33.33); X if ((x = maxy - base ) > 0) X fprintf(obuf, " (CHARDP R %1.6f)\n", (float)x/33.33); X if ((x = co2 - maxx ) > 0) X fprintf(obuf, " (CHARIC R %1.6f)\n", (float)x/33.33); X fprintf(obuf, " )\n"); X } X X fclose(obuf); X X} X X/******************/ X Xmain() X{ char sp; X char key(), conin(); 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 eplot again (set yourself up like\n"); X printf("you were going to use vi).\n"); X exit(1); X } 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 = raw_tty("/dev/tty"); X if (tty_fid == -1) X { X printf("Error opening terminal for raw i/o\n"); X exit(1); X } X X X debug = 0; X X stsize = STSIZE; X X printf("\r\nEplot - (c) Greg Lee, Oct. 1984\r\n\n"); X X base = 9; X ytop = 22; X lebear = ribear = 2; X strcpy(ftname,"Work"); X letter = currch = duplflag = 0; X X storept = x1 = x2 = y1 = y2 = a2 = d2 = 1; X serifs = 2; X X begy = 50-12; begx = 50-39; X X do X { printf("\r\n"); X if (currlet > ' ') printf("%c* ",currlet); X else printf("^%c* ",currlet+64); X cmd = key(); X switch (cmd) X { X case 'e': edit(); break; X case 'c': printf("Create letter? : "); X /*scanf("%c",&letter);*/ letter = conin(); putchar(letter); X cindex[letter] = storept; X sto2(0,0); X break; X case 'r': rdchr(); break; X case 'z': /* setmem(cindex, 128*2+2+stsize, 0);*/ X bzero(cindex, 128*sizeof(int)); X bzero(store, STSIZE); X storept = 1; X printf("zapped"); X break; X case 'p': plotlet(); break; X case 'v': showgr(); showbits(); break; X case 'b': gvar("Base",&base); break; X case 'h': gvar("Height",&ytop); break; X case 'd': gvar("Depth",&ybot); break; X case 'f': printf("FACTORS:\r\n"); X gvar("X1",&x1); X gvar("X2",&x2); X gvar("Y1",&y1); X gvar("Y2",&y2); X break; X case 't': duplflag = !duplflag; X chkdupl(); X if (!duplflag) printf("not "); printf("tall"); X break; X case 'L': printf("LINE STYLE:\r\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 'I': printf("ITALIC:\r\n"); X gvar("I1",&i1); X gvar("I2",&i2); X break; X case 'B': printf("BEARINGS:\r\n"); X gvar("Left",&lebear); X gvar("Right",&ribear); X break; X case 'S': gvar("serifs",&serifs); X break; X case 'n': printf(".chr name(%s) = ",ftname); X getnam(ftname); X /*strcat(ftname,".chr");*/ X break; X case 's': savechr(); break; X case 'a': saveasm(); break; X case 'P': saveps(); break; X case 'T': savetfm(); break; X case '?': cmdinfo(); X printf("\r\nstore room %d", X stsize-storept); X break; X case '\\': printf("debug"); X if (debug) printf(" off"); X debug = !debug; X case 'q': X case 'x': break; X default: conout('?'); printf("%c cmd %d?",cmd,cmd); break; X } X } X while (cmd != 'x' && cmd != 'q'); X X reset_tty(tty_fid); X X} X Xcmdinfo() X{ X printf("\r\nRead Plot Name .chr mag.Factors\r\n"); X printf("Zap Edit Save .chr ^Line style\r\n"); X printf("Base Vdisplay ^Serifs ^Ps file\r\n"); X printf("Height eXit/Quit Tall ^Tfm file\r\n"); X printf("Depth ^Italic ^Bearings Asm file\r\n"); X} X X Xgvar(s,v) Xchar *s; int *v; X{ char is[80]; X X printf(s); X printf("(%d) = ", *v); X cook_tty(tty_fid); X gets(is); X if (is[0] >= '0' && is[0] <= '9') sscanf(is,"%d",v); X uncook_tty(tty_fid); X} X Xplotlet() X{ X printf("Plot a letter? : "); X /*scanf("%c", &letter);*/ X letter = 0x7f & getchar(); putchar(letter); X currlet = letter; X lplot(letter); X} X X Xedit() X{ /*if (!currlet) plotlet(); X else*/ lplot(currlet); X X penplace = 0; X X edscr(); X X gxy(0,22); X} X Xdispline(row) Xchar row; X{ X y = begy + row; X X for (x = begx; x <= begx+79; x++) X if (gr[x][y]) X { at(x,y); X gxy(ecol, erow); X putchar(gr[x][y]); X } X} X X Xat(x,y) Xint x,y; X{ x -= begx; y -= begy; X if (x >= 0 && x <= 79 && y >= 0 && y <= 23) X { ecol = x; erow = y; return(TRUE); } X return(FALSE); X X} X Xrdchr() X{ char fname[20]; X X X printf(".chr file? : "); X getnam(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: if (debug) printf("\r\nCnum %d: ", cnum); X letter = 0; X break; X case 2: if (debug) printf("\r\nChar '%c': ", letter); X cindex[letter] = storept; X break; X case 3: if (debug) printf("(%d,%d)", co1, co2); X X if (i1 && i2) co1 += fadjust(co2,i1,i2)-50; X X co1 = fadjust(co1,x1,x2) - 50; X co2 = fadjust(co2,y1,y2) - 50; X sto2(co1 + 64, co2 + 64); X break; X case 4: if (debug) printf(" Pen Up\r\n "); X sto2(0, 64); X break; X case 5: if (debug) printf(" End Char"); X sto2(0, 0); X break; X case 6: if (debug) printf(" Hair"); X sto2(0, 'H'); X break; X case 65:/* if (debug) printf(" Bounds (-%d,%d)", co1, co2); X co2 = fadjust(co2,x1,x2) - 50; X sto2(0, co2 + 64); X break; */ X case 66:if (debug) printf("(ignored)"); X break; X } X } X X X fclose(ibuf); X X printf("\r\nUsed %u of buffer (%d remaining).", storept,stsize-storept); X} X Xsto2(x,y) Xchar x, y; X{ X if (letter < 0 || 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]) return(0); X if (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(65); } 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{ char c1, c2, penstate; X X currch = let; X chkdupl(); X X /*if (let <= 1 || let > 127) return;*/ X if (let < 0 || let > 127) return; X X if (!(xpt = cindex[let])) return; X /*if (kbhit()) return;*/ X X cleargr(); 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 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 lastplace = xpt - 2; X X X/* showgr(); */ X X} X Xgoline(here) Xunsigned here; X{ char c1, c2; X X if (!here) return(0); X X c1 = store[here]; X c2 = store[here + 1]; X if (!c1) return(0); X X penplace = here; X X X if (at(fadjust(c1-64,x1,x2), fadjust(c2-64,y1,y2))) X { xpos = c1-64; X ypos = c2-64; X return(TRUE); X } X return(0); X} X Xchangeit() X{ X if (!penplace) return; X X if (!store[penplace]) return; X X store[penplace] = xpos + 64; X store[penplace+1] = ypos + 64; X} X Xdelline() X{ if (!penplace) return; X if (!store[penplace-2] || !store[penplace+2]) delpoint(); X else X { store[penplace] = 0; X store[penplace+1] = 64; X penplace = 0; X penchar = 0; X } X} X X Xdelpoint() X{ X if (!penplace || !store[penplace]) return; X X/* movmem(store+penplace+2, store+penplace, storept-penplace-2);*/ X bcopy(store+penplace+2, store+penplace, storept-penplace-2); X storept -= 2; X X for (letter = 0; letter < 128; letter++) X if (cindex[letter] > penplace) X cindex[letter] -= 2; X X lastplace -= 2; X} X Xmakeroom(r) Xint r; X{ X bcopy(store+penplace, store+penplace+r, storept-penplace); X storept += r; X X for (letter = 0; letter < 128; letter++) X if (cindex[letter] > penplace) X cindex[letter] += r; X lastplace += r; X} X Xnewpoint() X{ char puflag; X X X if (!penplace) X { X penplace = lastplace; X makeroom(6); X X store[penplace] = 0; X store[penplace+1] = 64; X store[penplace+2] = xpos + 64; X store[penplace+3] = ypos + 64; X store[penplace+4] = xpos + 64; X store[penplace+5] = ypos + 64; X X penplace += 4; X } X else X { X if (store[penplace]) penplace += 2; X makeroom(2); X store[penplace] = xpos + 64; X store[penplace+1] = ypos + 64; X X } X} X X Xmakehair() X{ char prev; X X X if (!penplace || !store[penplace] || !store[penplace+2]) return; X X if (store[penplace-2]) prev = 2; else prev = 0; X X penplace += prev; X makeroom(prev + 2); X X store[penplace] = 0; X store[penplace+1] = 'H'; X X if (prev) X { store[penplace+2] = store[penplace-2]; X store[penplace+3] = store[penplace-1]; X } X X penplace += 2; X} X Xxcontract() X{ unsigned pt; X char key(); X X key(); X X for (pt = currlines['1'-' ']; store[pt] || store[pt+1]; pt += 2) X if (store[pt]) X switch (reallet) X { X case 'r': if (store[pt] > xpos + 64) store[pt]--; X break; X case 'R': if (store[pt] > xpos + 64) store[pt]++; X break; X case 'l': if (store[pt] < xpos + 64) store[pt]++; X break; X case 'L': if (store[pt] < xpos + 64) store[pt]--; X break; X case 'u': if (store[pt+1] < ypos + 64) store[pt+1]++; X break; X case 'U': if (store[pt+1] < ypos + 64) store[pt+1]--; X break; X case 'd': if (store[pt+1] > ypos + 64) store[pt+1]--; X break; X case 'D': if (store[pt+1] > ypos + 64) store[pt+1]++; X break; X default: break; X } X} X X Xsetpos() X{ X return(at(fadjust(xpos,x1,x2), fadjust(ypos,y1,y2))); X} X X Xcleargr() X{ X clrscrn(); X bzero(gr, 100 * 100); X bzero(currlines, 96*2); X linelet = '0'; X penwidth = abs(penwidth); X} X X Xdrawline() X{ X if (debug) printf("\r\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 currlines[linelet-' '] = xpt-4; X 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 x = fadjust(llx,x1,x2); X ccx = fadjust(ccx,x1,x2); X deltax = abs(ccx - x); X if (ccx >= x) xinc = 1; else xinc = -1; 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 = 0; X} X Xfadjust(u,f1,f2) Xint u,f1,f2; X{ X return( (u * f1 + f2-1)/f2 + 50); X} X X X Xdrawdot() X{ X if (x<0 || x>99 || y<0 || y>99) return; X if (gr[x][y]) return; X gr[x][y] = linelet; X if (at(x,y)) X { gxy(ecol,erow); X putchar(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("\r\n @(%d,%d) [%d,%d]", x-50, y-50, 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("\r\n @(%d,%d) [%d,%d]", x-50, y-50, x,y); X } X X} X Xshowgr() X{ int x, y; X X minx = miny = 99; X maxx = maxy = 0; X X for (y = 0; y < 100; y++) X { for (x = 0; x < 100; 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 (maxx - minx > KEEPSIZE-1) maxx = minx + KEEPSIZE-1; X rdedf(); X} X X X X Xchar conin() X{ return (0x7f & getchar()); X} X Xconout(c) Xchar c; X{ putchar(c); X} X X X Xchar key() X{ char c; X X reallet = c = 0x7f & getchar(); 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 (duplflag) currch = dtrans(currch, TRUE); X} X Xrdedf() X{ char c; X int lbear, rbear; X int i, y, lasty, dcurrlen; X X if (duplflag) currch = dtrans(currch, TRUE); X X lbear = rbear = 0; X X bzero(ckeep, 6*KEEPSIZE); X row = currlen = 0; dcurrlen = 10000; X X y = base + 51 - ytop; X lasty = y + (duplflag ? 47 : 23); X if (lasty >= 100) lasty = 99; 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 Xchngbit(biton) Xchar biton; X{ if (duplflag && row > 23) cchngbit(3, row - 24, biton); X else cchngbit(0, row, biton); X} X Xcchngbit(ib, row, biton) Xchar ib, row; Xchar biton; X{ unsigned char bit, mask; X X bit = row / 3; X mask = 128 >> bit; X cbyte = ckeep[ib + (row % 3)][col]; X if (biton) cbyte |= mask; X else cbyte &= ~mask; X ckeep[ib + (row % 3)][col] = cbyte; 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 Xclrscrn() X{ X if (w300) conout(0x1A); else cls(); X penchar = 0; X sleep(1); X} X Xshowbits() X{ X clrscrn(); X graph(TRUE); X gxoff = 4; X X if (duplflag) gyoff = 0; else gyoff = 6; X sshowbits(0); X if (duplflag) X { gyoff = 12; X sshowbits(3); X gyoff = 0; X } X graph(FALSE); X gxy(0,22); X} X Xsshowbits(ib) Xchar ib; X{ unsigned char i, j, bit, mask, r; X X if (currlen > 0) X { X color(RED,WHITE); X if (gyoff == 6) X { gxy(gxoff-1,gyoff-1); X conout(w300 ? '2':'+'); X for (i = 0; i < currlen; i++) X conout(w300 ? ':':'-'); X conout(w300 ? '3':'+'); X } X for (i = gyoff; i < (gyoff+12); i++) X { X gxy(gxoff-1,i); conout(w300 ? '6':'|'); X gxy(currlen+gxoff,i); conout(w300 ? '6':'|'); X } X if (gyoff == 6) X { gxy(gxoff-1,gyoff+12); X conout(w300 ? '1':'+'); X for (i = 0; i < currlen; i++) X conout(w300 ? ':':'-'); X conout(w300 ? '5':'+'); X } X color(BLACK,WHITE); X } X X for (i = 0; i < 3; i++) X for (j = 0; j < currlen; j++) X { cbyte = ckeep[ib+i][j]; X cbyteo = ckeep[ib + ((i+1) % 3)][j]; X mask = 0x80; X for (bit = 0; bit < 8; bit++, mask >>= 1) X if ( X /* if row is even */ X !((r = i + bit*3) & 1) X /* and there is a dot in this row or the next */ X && ((mask & cbyte) | ((i==2 ? mask>>1: mask) & cbyteo)) X ) X { gxy(j+gxoff, r/2+gyoff); X /* both dots? */ X if ((mask & cbyte)&& ((i==2 ? mask>>1: 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 Xcheckpoint() X{ int sx, sy; X X if (!penplace) return; X sx = xpos; sy = ypos; X if (!goline(penplace)) return; X penchar = gr[begx+(pxc=ecol)][begy+(pyc=erow)]; X xpos = sx; ypos = sy; X gxy(pxc,pyc); X conout(penchar); X} X X Xedscr() X{ char key(); X X oldpplace = 0; X xpos = 0; ypos = 1; X cmd = 'E'; X while (cmd != 'M') X { if (cmd >= 'A' && cmd <= 'Z') X switch (cmd) X { X case 'S': xpos--; break; X case 'D': xpos++; break; X case 'E': ypos--; break; X case 'X': ypos++; break; X case 'R': ypos -= 8; break; X case 'C': ypos += 8; break; X case 'A': xpos -= 8; break; X case 'F': xpos += 8; break; X case 'L': key(); currlet = reallet; penplace = 0; X case 'N': lplot(currlet); break; X case 'W': begy--; X gxy(0,0); printf(" "); X conout(ESC); conout('E'); X displine(0); X break; X case 'Z': begy++; X gxy(0,0); conout(ESC); conout('R'); X displine(23); X break; X case 'B': if (penplace) goline(penplace-2); break; X case 'P': changeit(); X lplot(currlet); break; X case 'I': newpoint(); X lplot(currlet); break; X case 'U': penplace = 0; break; X case 'G': delpoint(); X lplot(currlet); break; X case 'Y': delline(); X lplot(currlet); break; X case 'T': xcontract(); X lplot(currlet); break; X case 'Q': begy = 50-12; begx = 50-39; X lplot(currlet); break; X case 'H': makehair(); X lplot(currlet); break; X default: conout(7); X } X else switch(cmd) X { X case ' ': if (penplace) goline(penplace+2); break; X default: goline(currlines[reallet-' ']); X } X X if (penplace != oldpplace && penchar) X { gxy(pxc,pyc); X conout(penchar); X penchar = pxc = pyc = 0; X } X X if (penplace) X { X color(WHITE,BLUE); X checkpoint(); X } X else color(RED,YELLOW); X gxy(0,0); X printf(" (%3d,%3d) ", xpos, ypos); X color(BLACK,WHITE); X oldpplace = penplace; X X if (!setpos()) { xpos = 0; ypos = 0; setpos(); } X X gxy(ecol, erow); X X cmd = key(); X } X} 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 \Rogue\Monster\ else echo "will not over write ./eplot.c" fi if [ `wc -c ./eplot.c | awk '{printf $1}'` -ne 28121 ] then echo `wc -c ./eplot.c | awk '{print "Got " $1 ", Expected " 28121}'` fi echo "Finished archive 4 of 4" # if you want to concatenate archives, remove anything after this line exit