home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume7
/
thack
/
thack.c
< prev
Wrap
C/C++ Source or Header
|
1989-06-03
|
10KB
|
543 lines
#include "th.h"
int xpos, ypos, cx, cy;
int font, cfont, size, csize, tfont, tsize;
char *pstr, *cstr();
main()
{
int c, i;
int sflag;
int hdist, vdist;
int esc, lead;
int fh;
hdist = vdist = 0;
cfont = csize = -1;
tfont = font = 0;
tsize = size = 12;
esc = lead = 1;
cy = ypos = 1692;
cx = xpos = 0;
sflag = 0;
prolog();
newpage();
while ((c = getchar()) != EOF) {
font = tfont;
size = tsize;
if (c & 0x80)
hdist += ~c & 0x7f;
else if ((c & 0xe0) == 0x60)
vdist += ~c & 0x1f;
if ((c & 0xc0) == 0) {
if ((c & 0x3f) != 0) {
if (hdist || vdist) {
xpos += esc * hdist;
ypos -= lead * vdist;
if (ypos <= 0) {
endpage();
newpage();
while (ypos < 0)
ypos += 1584;
}
hdist = 0;
vdist = 0;
}
sflag = 1;
if (table[(font % 4) == 3][fh][c & 0x3f] == ' ') {
if (font % 4 != 3)
if (fh == 0)
switch (c & 0x3f) {
case 18:
pstr = "\\320";
break; /* \(em */
case 28:
illegal("1/4");
break; /* \(14 */
case 30:
illegal("1/2");
break; /* \(12 */
case 38:
illegal("3/4");
break; /* \(34 */
default:
fprintf(stderr, ">>>>> L%d/%d\n", font, c & 0x3f);
}
else
switch (c & 0x3f) {
case 19:
pstr = "\\320";
break; /* \- */
case 20:
pstr = "\\256";
break; /* fi */
case 21:
pstr = "\\257";
break; /* fl */
case 22:
pstr = "ff";
break; /* ff */
case 23:
pstr = "\\242";
break; /* cent */
case 24:
pstr = "f\\257";
break; /* ffl */
case 25:
pstr = "f\\256";
break; /* ffi */
case 30:
fontps(3, size, "\\260");
break; /* degree */
case 31:
pstr = "\\262";
break; /* dagger */
case 33:
fontps(3, size, "\\322");
break; /* reg */
case 38:
pstr = "\\267";
break; /* bullet */
case 40:
fontps(3, size, "\\242");
break; /* footmark */
case 43:
fontps(3, size, "\\323");
break; /* c'right */
case 44:
pstr = "\\250";
break; /* square ? */
default:
fprintf(stderr, ">>>>> U%d/%d\n", font, c & 0x3f);
}
else if (fh == 0)
switch (c & 0x3f) {
case 18:
fontps(0, size, "@");
break; /* @ */
case 19:
pstr = "\\257";
break; /* down arrow */
case 22:
pstr = cstr('|');
break; /* OR */
case 24:
fontps(0, size, "\"");
break; /* " */
case 28:
pstr = "\\254";
break; /* <- */
case 30:
pstr = "\\255";
break; /* up arrow */
case 33:
fontps(0, size, "\\\\");
break; /* Backslash ! */
case 35:
illegal("Bell Logo");
break; /* Bell Logo */
case 36:
pstr = "\\245";
break; /* infinity */
case 38:
pstr = "\\312";
break; /* impr. super */
case 39:
pstr = "\\265";
break; /* proportional */
case 40:
pstr = "\\336";
break; /* right hand */
case 43:
pstr = "\\321";
break; /* grad */
case 48:
pstr = "\\310";
break; /* union */
case 49:
pstr = "\\140";
break; /* sqrtroof */
case 54:
pstr = "\\362";
break; /* integral */
case 56:
pstr = "\\314";
break; /* subset */
case 57:
pstr = "\\311";
break; /* superset */
case 58:
pstr = cstr('~');
break; /* approximate */
case 59:
pstr = "\\256";
break; /* partial */
case 61:
pstr = "\\326";
break; /* sqrt */
case 63:
pstr = "\\273";
break; /* ~= */
default:
fprintf(stderr, ">>>>> L%d/%d\n", font, c & 0x3f);
}
else
switch (c & 0x3f) {
case 5:
pstr = "\\307";
break; /* intersect */
case 7:
pstr = "\\330";
break; /* not */
case 8:
pstr = "\\371";
break; /* righceil, sq */
case 9:
pstr = "\\354";
break; /* leftop, curly */
case 10:
pstr = "\\357";
break; /* bold vertical */
case 11:
pstr = "\\355";
break; /* lefcent, curly */
case 12:
pstr = "\\356";
break; /* leftbot, curly */
case 13:
pstr = "\\374";
break; /* rightop, curly */
case 14:
pstr = "\\375";
break; /* righcen, curly */
case 15:
pstr = "\\376";
break; /* rightbot, curly */
case 16:
pstr = "\\373";
break; /* rigfloor, sq */
case 17:
pstr = "\\353";
break; /* lefloor, sq */
case 18:
pstr = "\\351";
break; /* leftceil, sq */
case 19:
pstr = "\\264";
break; /* times */
case 20:
pstr = "\\270";
break; /* divide */
case 21:
pstr = "\\261";
break; /* +- */
case 22:
pstr = "\\243";
break; /* <= */
case 23:
pstr = "\\263";
break; /* >= */
case 24:
pstr = "\\272";
break; /* ident. equ */
case 25:
pstr = "\\271";
break; /* != */
case 28:
fontps(0, size, "\\302");
break; /* acute */
case 29:
fontps(0, size, "\\301");
break; /* grave */
case 30:
fontps(0, size, "^");
break; /* ^ */
case 32:
pstr = "\\334";
break; /* left hand */
case 33:
pstr = "\\316";
break; /* Member of */
case 35:
pstr = "\\306";
break; /* Empty set */
case 37:
fontps(0, size, "\\263");
break; /* doubdagg */
case 38:
pstr = "\\275";
break; /* box vertical */
case 40:
pstr = "\\315";
break; /* impr. subset */
case 41:
illegal("circle");
break; /* circle */
case 44:
pstr = "\\256";
break; /* -> */
case 45:
fontps(0, size, "\\247");
break; /* section */
default:
fprintf(stderr, ">>>>> U%d/%d\n", font, c & 0x3f);
}
}
else {
switch (table[(font % 4) == 3][fh][c & 0x3f]) {
case '(':
pstr = "\\(";
break;
case ')':
pstr = "\\)";
break;
default:
pstr = cstr(table[(font % 4) == 3][fh][c & 0x3f]);
break;
}
}
tprint();
}
}
else if ((c & 0xf0) == 0x50) {
switch (c & 0x0f) {
case 0:
size = 7;
break;
case 1:
size = 8;
break;
case 2:
size = 10;
break;
case 3:
size = 11;
break;
case 4:
size = 12;
break;
case 5:
size = 14;
break;
case 6:
size = 18;
break;
case 7:
size = 9;
break;
case 8:
size = 6;
break;
case 9:
size = 16;
break;
case 10:
size = 20;
break;
case 11:
size = 22;
break;
case 12:
size = 24;
break;
case 13:
size = 28;
break;
case 14:
size = 36;
break;
default:
fprintf(stderr, "Size: %x\n", c & 0x0f);
}
crsize(csize, size);
tsize = size;
}
else if ((c & 0xf0) == 0x40) {
c &= 0xf;
switch (c) {
case 0:/* fprintf(stderr,"INIT\n"); */
break;
case 1:
font &= 30;
break;
case 2:
font |= 1;
break;
case 3:
font |= 2;
break;
case 4:
font &= 29;
break;
case 5:
fh = 0;
break;
case 6:
fh = 1;
break;
case 7:
esc = 1;
break;
case 8:
esc = -1;
break;
case 9:/* fprintf(stderr,"STOP\n"); */
break;
case 10:
lead = 1;
break;
case 12:
lead = -1;
break;
case 14:
font |= 4;
break;
case 15:
font &= 27;
break;
default:
fprintf(stderr, "ILLEGAL\n");
break;
}
tfont = font;
}
}
if (sflag)
endpage();
}
tprint()
{
if (font != cfont || size != csize) {
printf("%d ", size * 6);
switch (font) {
case 0:
printf("TR");
break;
case 1:
printf("TI");
break;
case 2:
printf("TB");
break;
case 3:
printf("S");
break;
case 8:
printf("H");
break;
case 9:
printf("HO");
break;
case 10:
printf("HB");
break;
case 11:
printf("S");
break;
case 16:
printf("C");
break;
case 17:
printf("CO");
break;
case 18:
printf("CB");
break;
case 19:
printf("S");
break;
case 24:
printf("TBI");
break;
case 25:
printf("HBO");
break;
case 26:
printf("CBO");
break;
case 27:
printf("S");
break;
default:
fprintf(stderr, "Illegal Font %d\n", font);
}
printf(" F\n");
cfont = font;
csize = size;
}
if (ypos == cy)
printf("(%s)%d X\n", pstr, xpos);
else
printf("(%s)%d %d P\n", pstr, xpos, 3 * ypos);
cx = xpos;
cy = ypos;
}
fontps(f1, ps, str)
char *str;
{
tfont = cfont;
tsize = csize;
pstr = str;
size = ps;
font = f1;
}
illegal(s)
char *s;
{
fprintf(stderr, "Sequence %s is not allowed\n", s);
}
crsize(old, new)
{
if ((old == 16 || old >= 20) && (new != 16 && new < 20))
xpos += 55;
else if ((new == 16 || new >= 20) && (old != 16 && old < 20))
xpos -= 55;
}
char *
cstr(c)
char c;
{
static char s[2] = " ";
*s = c;
return s;
}
newpage()
{
printf("save\n");
}
prolog()
{
printf("/P {moveto show} def\n");
printf("/X {currentpoint exch pop moveto show} def\n");
printf("/F {findfont exch scalefont setfont} def\n");
printf("/TR /Times-Roman def\n");
printf("/TI /Times-Italic def\n");
printf("/TB /Times-Bold def\n");
printf("/S /Symbol def\n");
printf("/H /Helvetica def\n");
printf("/HO /Helvetica-Oblique def\n");
printf("/HB /Helvetica-Bold def\n");
printf("/C /Courier def\n");
printf("/CO /Courier-Oblique def\n");
printf("/CB /Courier-Bold def\n");
printf("/TBI /Times-BoldItalic def\n");
printf("/HBO /Helvetica-BoldOblique def\n");
printf("/CBO /Courier-BoldOblique def\n");
printf("1 6 div dup scale\n");
}
endpage()
{
printf("showpage\n");
printf("restore\n");
cfont = csize = -1; /* Doing this will cause a new font message */
}