|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 52084 (0xcb74) Types: TextFile Names: »term.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦c319c2751⟧ »unix3.0/TeX3.0.tar.Z« └─⟦036c765ac⟧ └─⟦this⟧ »TeX3.0/TeXcontrib/gnutex/term.c«
/* * * G N U P L O T -- term.c * * Copyright (C) 1986 Colin Kelley, Thomas Williams * * You may use this code as you wish if credit is given and this message * is retained. * * Please e-mail any useful additions to vu-vlsi!plot so they may be * included in later releases. * * This file should be edited with 4-column tabs! (:set ts=4 sw=4 in vi) */ /* * Modifications for LaTeX and other support by David Kotz, 1988. * Department of Computer Science, Duke University, Durham, NC 27706. * Mail to dfk@cs.duke.edu. */ /* modified 1/14/89 for Microsoft C5.1 by JDM (mcdonald@uxe.cso.uiuc.edu) */ /* * Modification for direct Imagen output (but retaining many of the * LaTeX extensions) by Paul E. McKenney, 1989. * Information Science and Technology Division, SRI International, * 333 Ravenswood Ave, Menlo Park, CA 94025. * Mail to mckenney@sri.com. */ /* * Modification for Fig code output by Micah Beck, 1989 * Department of Computer Science, Cornell University */ #include <stdio.h> #include "plot.h" #define NICE_LINE 0 #define POINT_TYPES 6 #ifdef MSDOS int PC_color = 7; #include <dos.h> #include <graph.h> #endif extern FILE *outfile; extern BOOLEAN term_init; extern int term; extern BOOLEAN clipping; extern char input_line[]; extern struct lexical_unit token[]; extern struct termentry term_tbl[]; #ifdef PC static int pattern[] = {0xffff, 0x0f0f, 0xffff, 0x3333, 0x3f3f}; #ifdef CORONA char screen[65535]; #endif /* CORONA */ int mask; static int graphics_on = FALSE; int startx, starty; #define EGA_XMAX 640 #define EGA_YMAX 350 #define EGA_XLAST (EGA_XMAX - 1) #define EGA_YLAST (EGA_YMAX - 1) #define EGA_VCHAR 14 #define EGA_HCHAR 8 #define EGA_VTIC 5 #define EGA_HTIC 5 #define CGA_XMAX 640 #define CGA_YMAX 200 #define CGA_XLAST (CGA_XMAX - 1) #define CGA_YLAST (CGA_YMAX - 1) #define CGA_VCHAR 8 #define CGA_HCHAR 8 #define CGA_VTIC 3 #define CGA_HTIC 3 #ifdef CORONA #define COR_XMAX 640 #define COR_YMAX 325 #define COR_XLAST (COR_XMAX - 1) #define COR_YLAST (COR_YMAX - 1) #define COR_VCHAR 13 #define COR_HCHAR 8 #define COR_VTIC 4 #define COR_HTIC 4 #endif /* CORONA */ #endif /* PC */ /* * general point routine */ line_and_point(x,y,number) int x,y,number; { /* temporary(?) kludge to allow terminals with bad linetypes to make nice marks */ (*term_tbl[term].linetype)(NICE_LINE); do_point(x,y,number); } do_point(x,y,number) int x,y; int number; { register struct termentry *t; register int htic,vtic; t = &term_tbl[term]; /* do just a DOT? */ if (number == -1) { (*t->move)(x,y); (*t->vector)(x,y); return; } number %= POINT_TYPES; htic = (t->h_tic/2); /* should be in term_tbl[] in later version */ vtic = (t->v_tic/2); if (clipping && (x < t->h_tic || y < t->v_tic || x >= t->xmax-t->h_tic || y >= t->ymax-t->v_tic) ) return; /* add clipping in later version !!! */ switch(number) { case 0: /* do diamond */ (*t->move)(x-htic,y); (*t->vector)(x,y-vtic); (*t->vector)(x+htic,y); (*t->vector)(x,y+vtic); (*t->vector)(x-htic,y); (*t->move)(x,y); (*t->vector)(x,y); break; case 1: /* do plus */ (*t->move)(x-htic,y); (*t->vector)(x+htic,y); (*t->move)(x,y-vtic); (*t->vector)(x,y+vtic); (*t->move)(x,y); /* DFK */ break; case 2: /* do box */ (*t->move)(x-htic,y-vtic); (*t->vector)(x+htic,y-vtic); (*t->vector)(x+htic,y+vtic); (*t->vector)(x-htic,y+vtic); (*t->vector)(x-htic,y-vtic); (*t->move)(x,y); (*t->vector)(x,y); break; case 3: /* do X */ (*t->move)(x-htic,y-vtic); (*t->vector)(x+htic,y+vtic); (*t->move)(x-htic,y+vtic); (*t->vector)(x+htic,y-vtic); (*t->move)(x,y); /* DFK */ break; case 4: /* do triangle */ (*t->move)(x,y+(4*vtic/3)); (*t->vector)(x-(4*htic/3),y-(2*vtic/3)); (*t->vector)(x+(4*htic/3),y-(2*vtic/3)); (*t->vector)(x,y+(4*vtic/3)); (*t->move)(x,y); (*t->vector)(x,y); break; case 5: /* do star */ (*t->move)(x-htic,y); (*t->vector)(x+htic,y); (*t->move)(x,y-vtic); (*t->vector)(x,y+vtic); (*t->move)(x-htic,y-vtic); (*t->vector)(x+htic,y+vtic); (*t->move)(x-htic,y+vtic); (*t->vector)(x+htic,y-vtic); (*t->move)(x,y); /* DFK */ break; } } #define AED_XMAX 768 #define AED_YMAX 575 #define AED_XLAST (AED_XMAX - 1) #define AED_YLAST (AED_YMAX - 1) #define AED_VCHAR 13 #define AED_HCHAR 8 #define AED_VTIC 8 #define AED_HTIC 7 #define HP75_XMAX 6000 #define HP75_YMAX 6000 #define HP75_XLAST (HP75_XMAX - 1) #define HP75_YLAST (HP75_XMAX - 1) /* HP75_VCHAR, HP75_HCHAR are not used */ #define HP75_VCHAR (HP75_YMAX/20) #define HP75_HCHAR (HP75_XMAX/20) #define HP75_VTIC (HP75_YMAX/70) #define HP75_HTIC (HP75_XMAX/75) #define REGISXMAX 800 #define REGISYMAX 440 #define REGISXLAST (REGISXMAX - 1) #define REGISYLAST (REGISYMAX - 1) #define REGISVCHAR 20 #define REGISHCHAR 8 #define REGISVTIC 8 #define REGISHTIC 6 #define QMS_XMAX 9000 #define QMS_YMAX 6000 #define QMS_XLAST (QMS_XMAX - 1) #define QMS_YLAST (QMS_YMAX - 1) #define QMS_VCHAR 120 #define QMS_HCHAR 75 #define QMS_VTIC 70 #define QMS_HTIC 70 #define TEK40XMAX 1024 #define TEK40YMAX 780 #define TEK40XLAST (TEK40XMAX - 1) #define TEK40YLAST (TEK40YMAX - 1) #define TEK40VCHAR 25 #define TEK40HCHAR 14 #define TEK40VTIC 11 #define TEK40HTIC 11 #define HALFTEK40XMAX 780 #define HALFTEK40YMAX 512 #define HALFTEK40XMID 390 #define HALFTEK40YMID 256 #define HALFTEK40XLAST (HALFTEK40XMAX - 1) #define HALFTEK40YLAST (HALFTEK40YMAX - 1) #define HALFTEK40VCHAR 25 #define HALFTEK40HCHAR 14 #define HALFTEK40VTIC 11 #define HALFTEK40HTIC 11 #ifdef UNIXPLOT #define UP_XMAX 4096 #define UP_YMAX 4096 #define UP_XLAST (UP_XMAX - 1) #define UP_YLAST (UP_YMAX - 1) #define UP_VCHAR (UP_YMAX/30) #define UP_HCHAR (UP_XMAX/72) /* just a guess--no way to know this! */ #define UP_VTIC (UP_YMAX/80) #define UP_HTIC (UP_XMAX/80) #endif /* UNIXPLOT */ #define TERMCOUNT (sizeof(term_tbl)/sizeof(struct termentry)) #ifdef PC void PC_curloc(row,col) int row, col; { union REGS rg; rg.h.ah = 2; rg.h.bh = 0; rg.h.dh = row; rg.h.dl = col; int86(16,&rg,&rg); } PC_lrput_text(row,str) int row; char str[]; { PC_curloc(23-row,78-strlen(str)); /*PC_*/puts(str); } PC_ulput_text(row,str) int row; char str[]; { PC_curloc(row+1,2); /*PC_*/puts(str); } #ifdef CORONA COR_init() { } COR_graphics() { graphics_on = TRUE; setmod(3); grinit(screen); grandtx(); } COR_text() { if (graphics_on) { graphics_on = FALSE; while (!kbhit()) ; } grreset(); txonly(); setmod(3); } COR_linetype(linetype) { if (linetype > 2) linetype %= 3; mask = pattern[linetype+2]; } COR_move(x,y) { if (x < 0) startx = 0; else if (x > COR_XLAST) startx = COR_XLAST; else startx = x; if (y < 0) starty = 0; else if (y > COR_YLAST) starty = COR_YLAST; else starty = y; } COR_vector(x,y) { if (x < 0) x = 0; else if (x > COR_XLAST) x = COR_XLAST; if (y < 0) y = 0; else if (y > COR_YLAST) y = COR_YLAST; Cor_line(startx,COR_YLAST-starty,x,COR_YLAST-y); startx = x; starty = y; } #define COR_lrput_text PC_lrput_text #define COR_ulput_text PC_ulput_text COR_reset() { } #endif /* CORONA */ CGA_init() { PC_color = 1; /* monochrome */ } CGA_graphics() { graphics_on = TRUE; _setvideomode(_HRESBW); } CGA_text() { if (graphics_on) { graphics_on = FALSE; while (!kbhit()); _setvideomode(_DEFAULTMODE); } } CGA_linetype(linetype) { if (linetype > 2) linetype %= 3; _setlinestyle(pattern[linetype+2]); } CGA_move(x,y) { startx = x; starty = y; } CGA_vector(x,y) { (void)_moveto(startx,CGA_YLAST-starty); (void)_lineto(x,CGA_YLAST-y); startx = x; starty = y; } #define CGA_lrput_text PC_lrput_text #define CGA_ulput_text PC_ulput_text CGA_reset() { } EGA_init() { } EGA_graphics() { graphics_on = TRUE; _setvideomode(_ERESCOLOR); } EGA_text() { PC_curloc(24,0); if (graphics_on) { graphics_on = FALSE; while (!kbhit()) ; } } EGA_linetype(linetype) { static int c[] = {9, 8, 10, 11, 12, 13, 14, 15, 7, 5, 4, 3, 2, 6}; PC_color = c[linetype+2]; } EGA_move(x,y) { startx = x; starty = y; } EGA_vector(x,y) { (void)_setcolor(PC_color); (void)_moveto(startx,EGA_YLAST-starty); (void)_lineto(x,EGA_YLAST-y); startx = x; starty = y; } #define EGA_lrput_text PC_lrput_text #define EGA_ulput_text PC_ulput_text EGA_reset() { _setvideomode(_DEFAULTMODE); } #endif /* PC */ #ifdef AED AED_init() { fprintf(outfile, "\033SEN3DDDN.SEC.7.SCT.0.1.80.80.90.SBC.0.AAV2.MOV.0.9.CHR.0.FFD"); /* 2 3 4 5 7 6 1 1. Clear Screen 2. Set Encoding 3. Set Default Color 4. Set Backround Color Table Entry 5. Set Backround Color 6. Move to Bottom Lefthand Corner 7. Anti-Alias Vectors */ } AED_graphics() { fprintf(outfile,"\033FFD\033"); } AED_text() { fprintf(outfile,"\033MOV.0.9.SEC.7.XXX"); } AED_linetype(linetype) int linetype; { static int color[9+2] = { 7, 1, 6, 2, 3, 5, 1, 6, 2, 3, 5 }; static int type[9+2] = { 85, 85, 255, 255, 255, 255, 255, 85, 85, 85, 85 }; fprintf(outfile,"\033SLS%d.255.",type[linetype+2]); fprintf(outfile,"\033SEC%d.",color[linetype+2]); } AED_move(x,y) int x,y; { fprintf(outfile,"\033MOV%d.%d.",x,y); } AED_vector(x,y) int x,y; { fprintf(outfile,"\033DVA%d.%d.",x,y); } AED_lrput_text(row,str) /* write text to screen while still in graphics mode */ int row; char str[]; { AED_move(AED_XMAX-((strlen(str)+2)*AED_HCHAR),AED_VTIC+AED_VCHAR*(row+1)); fprintf(outfile,"\033XXX%s\033",str); } AED_ulput_text(row,str) /* write text to screen while still in graphics mode */ int row; char str[]; { AED_move(AED_HTIC*2,AED_YMAX-AED_VTIC-AED_VCHAR*(row+1)); fprintf(outfile,"\033XXX%s\033",str); } #define hxt (AED_HTIC/2) #define hyt (AED_VTIC/2) AED_reset() { fprintf(outfile,"\033SCT0.1.0.0.0.SBC.0.FFD"); } #endif /* AED */ #ifdef HP75 HP75_init() { fprintf(outfile, "\033.Y;IN;\033.P1:SC0,%d,0,%d;\nRO90;IP;CS20;SI0.2137,0.2812;\n", HP75_XMAX,HP75_YMAX); /* 1 2 3 4 5 6 7 1. turn on eavesdropping 2. reset to power-up defaults 3. enable XON/XOFF flow control 4. set SCaling to 2000 x 2000 5. rotate page 90 degrees 6. ??? 7. set some character set stuff */ } HP75_graphics() { fputs("\033.Y",outfile); /* 1 1. enable eavesdropping */ } HP75_text() { fputs("NR;\033.Z",outfile); /* 1 2 1. go into 'view' mode 2. disable plotter eavesdropping */ } HP75_linetype(linetype) int linetype; { fprintf(outfile,"SP%d;\n",3+(linetype%8)); } HP75_move(x,y) int x,y; { fprintf(outfile,"PU%d,%d;\n",x,y); } HP75_vector(x,y) int x,y; { fprintf(outfile,"PD%d,%d;\n",x,y); } HP75_lrput_text(row,str) int row; char str[]; { HP75_move(HP75_XMAX-HP75_HTIC*2,HP75_VTIC*2+HP75_VCHAR*row); fprintf(outfile,"LO17;LB%s\003\n",str); } HP75_ulput_text(row,str) int row; char str[]; { HP75_move(HP75_HTIC*2,HP75_YMAX-HP75_VTIC*2-HP75_VCHAR*row); fprintf(outfile,"LO13;LB%s\003\n",str); } HP75_reset() { } #endif /* HP75 */ #ifdef REGIS REGISinit() { fprintf(outfile,"\033[r\033[24;1H"); /* 1 2 1. reset scrolling region 2. locate cursor on bottom line */ } REGISgraphics() { fprintf(outfile,"\033[2J\033P1pS(C0)"); /* 1 2 3 1. clear screen 2. enter ReGIS graphics 3. turn off graphics diamond cursor */ } REGIStext() { fprintf(outfile,"\033[24;1H"); /* 1 1. locate cursor on last line of screen (and leave ReGIS) */ } REGISlinetype(linetype) int linetype; { static int in_map[9+2] = {2,2,3,2,3,2,3,2,1,1,1}; static int lt_map[9+2] = {1,4,1,1,4,4,6,6,1,4,6}; fprintf(outfile,"W(I%d)",in_map[linetype+2]); fprintf(outfile,"W(P%d)",lt_map[linetype+2]); } REGISmove(x,y) int x,y; { fprintf(outfile,"P[%d,%d]v[]",x,REGISYLAST-y,x,REGISYLAST-y); } REGISvector(x,y) int x,y; { fprintf(outfile,"v[%d,%d]",x,REGISYLAST - y); } REGISlrput_text(row,str) int row; char *str; { REGISmove(REGISXMAX-REGISHTIC-REGISHCHAR*(strlen(str)+3), REGISVTIC+REGISVCHAR*(row+1)); (void) putc('T',outfile); (void) putc('\'',outfile); while (*str) { (void) putc(*str,outfile); if (*str == '\'') (void) putc('\'',outfile); /* send out another one */ str++; } (void) putc('\'',outfile); } REGISulput_text(row,str) int row; char *str; { REGISmove(REGISVTIC,REGISYMAX-REGISVTIC*2-REGISVCHAR*row); (void) putc('T',outfile); (void) putc('\'',outfile); while (*str) { (void) putc(*str,outfile); if (*str == '\'') (void) putc('\'',outfile); /* send out another one */ str++; } (void) putc('\'',outfile); } REGISreset() { fprintf(outfile,"\033[2J\033[24;1H"); } #endif /* REGIS */ #ifdef QMS QMS_init() { fprintf(outfile,"^IOL\n"); } QMS_graphics() { fprintf(outfile,"^IGV\n"); } QMS_text() { fprintf(outfile,"^IGE\n^,"); } QMS_linetype(linetype) int linetype; { static int width[9+2] = {7, 3, 3, 3, 3, 5, 5, 5, 7, 7, 7}; static int type[9+2] = {0, 0, 0, 2, 5, 0, 2, 5, 0, 2, 5}; fprintf(outfile,"^PW%02d\n^V%x\n",width[linetype+2], type[linetype+2]); } QMS_move(x,y) int x,y; { fprintf(outfile,"^U%05d:%05d\n", 1000 + x, QMS_YLAST + 1000 - y); } QMS_vector(x2,y2) int x2,y2; { fprintf(outfile,"^D%05d:%05d\n", 1000 + x2, QMS_YLAST + 1000 - y2); } QMS_lrput_text(row,str) int row; char str[]; { QMS_move(QMS_XMAX-QMS_HTIC-QMS_HCHAR*(strlen(str)+1), QMS_VTIC+QMS_VCHAR*(row+1)); fprintf(outfile,"^IGE\n%s\n^IGV\n",str); } QMS_ulput_text(row,str) int row; char str[]; { QMS_move(QMS_HTIC*2,QMS_YMAX-QMS_VTIC-QMS_VCHAR*(row+1)); fprintf(outfile,"^IGE\n%s\n^IGV\n",str); } QMS_reset() { fprintf(outfile,"^,\n"); } #endif /* QMS */ #ifdef TEK #define HX 0x20 /* bit pattern to OR over 5-bit data */ #define HY 0x20 #define LX 0x40 #define LY 0x60 #define LOWER5 31 #define UPPER5 (31<<5) TEK40init() { } TEK40graphics() { fprintf(outfile,"\033\014"); /* 1 1. clear screen */ } TEK40text() { TEK40move(0,12); fprintf(outfile,"\037"); /* 1 1. into alphanumerics */ } TEK40linetype(linetype) int linetype; { } TEK40move(x,y) unsigned int x,y; { (void) putc('\035', outfile); /* into graphics */ TEK40vector(x,y); } TEK40vector(x,y) unsigned int x,y; { (void) putc((HY | (y & UPPER5)>>5), outfile); (void) putc((LY | (y & LOWER5)), outfile); (void) putc((HX | (x & UPPER5)>>5), outfile); (void) putc((LX | (x & LOWER5)), outfile); } TEK40lrput_text(row,str) unsigned int row; char str[]; { TEK40move(TEK40XMAX - TEK40HTIC - TEK40HCHAR*(strlen(str)+1), TEK40VTIC + TEK40VCHAR*(row+1)); fprintf(outfile,"\037%s\n",str); } TEK40ulput_text(row,str) unsigned int row; char str[]; { TEK40move(TEK40HTIC, TEK40YMAX - TEK40VTIC - TEK40VCHAR*(row+1)); fprintf(outfile,"\037%s\n",str); } TEK40reset() { } #endif /* TEK */ #ifdef HALFTEK #define HALF_HX 0x20 /* bit pattern to OR over 5-bit data */ #define HALF_HY 0x20 #define HALF_LX 0x40 #define HALF_LY 0x60 #define HALF_LOWER5 31 #define HALF_UPPER5 (31<<5) HALFTEK40init() { } HALFTEK40graphics() { fprintf(outfile,"\033\014"); /* 1 1. clear screen */ } BOTTEK40text() { BOTTEK40move(0,12); fprintf(outfile,"\037"); /* 1 1. into alphanumerics */ } TOPTEK40text() { TOPTEK40move(0,12); fprintf(outfile,"\037"); /* 1 1. into alphanumerics */ } HALFTEK40linetype(linetype) int linetype; { } TOPTEK40move(x,y) unsigned int x,y; { (void) putc('\035', outfile); /* into graphics */ TOPTEK40vector(x,y); } BOTTEK40move(x,y) unsigned int x,y; { (void) putc('\035', outfile); /* into graphics */ BOTTEK40vector(x,y); } BOTTEK40vector(x,y) unsigned int x,y; { (void) putc((HALF_HY | (x & HALF_UPPER5)>>5), outfile); (void) putc((HALF_LY | (x & HALF_LOWER5)), outfile); (void) putc((HALF_HX | (((HALFTEK40YLAST-y)+HALFTEK40YMAX) & HALF_UPPER5)>>5), outfile); (void) putc((HALF_LX | (((HALFTEK40YLAST-y)+HALFTEK40YMAX) & HALF_LOWER5)), outfile); } TOPTEK40vector(x,y) unsigned int x,y; { (void) putc((HALF_HY | (x & HALF_UPPER5)>>5), outfile); (void) putc((HALF_LY | (x & HALF_LOWER5)), outfile); (void) putc((HALF_HX | (((HALFTEK40YMID-y)+HALFTEK40YMID) & HALF_UPPER5)>>5), outfile); (void) putc((HALF_LX | (((HALFTEK40YMID-y)+HALFTEK40YMID) & HALF_LOWER5)), outfile); } HALFTEK40lrput_text(row,str) unsigned int row; char str[]; { } HALFTEK40ulput_text(row,str) unsigned int row; char str[]; { } HALFTEK40reset() { } #endif /* HALFTEK */ #ifdef UNIXPLOT UP_init() { openpl(); space(0, 0, UP_XMAX, UP_YMAX); } UP_graphics() { erase(); } UP_text() { } UP_linetype(linetype) int linetype; { static char *lt[] = {"solid", "longdashed", "solid", "dotted", "shortdashed", "dotdashed", "longdashed"}; if (linetype >= 5) linetype %= 5; linemod(lt[linetype+2]); } UP_move(x,y) unsigned int x,y; { move(x,y); } UP_vector(x,y) unsigned int x,y; { cont(x,y); } UP_lrput_text(row,str) unsigned int row; char str[]; { move(UP_XMAX - UP_HTIC - UP_HCHAR*(strlen(str)+1), UP_VTIC + UP_VCHAR*(row+1)); label(str); } UP_ulput_text(row,str) unsigned int row; char str[]; { UP_move(UP_HTIC, UP_YMAX - UP_VTIC - UP_VCHAR*(row+1)); label(str); } UP_reset() { closepl(); } #endif /* UNIXPLOT */ #ifdef LATEX #define LATEX_PTS_PER_INCH (72.27) #define LATEX_UNIT (.01) /* points */ #define LATEX_HTIC (5./LATEX_UNIT) #define LATEX_VTIC (5./LATEX_UNIT) #define LATEX_HCHAR (4./LATEX_UNIT) #define LATEX_VCHAR (12./LATEX_UNIT) #define LATEX_TICSIZ 101 /* no more than 100 chars in a tic label */ #define LATEX_FORMAT "$%g$" /* default format for tic marks */ static long LATEX_posx; static long LATEX_posy; static BOOLEAN LATEX_inplot; static long LATEX_xmax; static long LATEX_ymax; static char *LATEX_xlabel = NULL; static LATEX_endplot(); extern char *malloc(); #define sign(x) ((x) >= 0 ? 1 : -1) #define abs(x) ((x) >= 0 ? (x) : -(x)) #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) /* Default line-drawing character */ #define LATEX_DOT_SPACING (2.0/LATEX_UNIT) #define LATEX_DOT "\\circle*{1}" #define LATEX_TINY_DOT "{\\sevrm $\\cdot$}" static int LATEX_type; /* negative types use real lines */ static struct st_entry *LATEX_style = NULL; /* NULL => use default styles */ static LATEX_seq_pos; /* position in sequence */ #define LATEX_POINT_TYPES POINT_TYPES /* we use the same points */ static char *LATEX_points[] = { "$\\Diamond$", "$+$", "$\\Box$", "$\\times$", "$\\triangle$", "$\\star$" }; LATEX_init() { LATEX_posx = LATEX_posy = 0; LATEX_inplot = FALSE; LATEX_style = NULL; LATEX_type = -1; fprintf(outfile, "\\setlength{\\unitlength}{%fpt}\n", LATEX_UNIT); } LATEX_graphics(xmax, ymax, t, xlabel, ylabel, yskip, title) float xmax, ymax; /* in inches */ struct termentry *t; char *xlabel; /* x-axis label */ char *ylabel; /* y-axis label */ int yskip; /* y-axis label skip factor */ char *title; /* plot title */ { /* computed margin of plot */ long bot_margin, left_margin, top_margin, right_margin; if (LATEX_inplot) LATEX_endplot(); /* Convert inches to points to coordinates */ LATEX_xmax = (long) (xmax * LATEX_PTS_PER_INCH / LATEX_UNIT + 0.5); LATEX_ymax = (long) (ymax * LATEX_PTS_PER_INCH / LATEX_UNIT + 0.5); /* store these away for the use of plotting routines */ t->xmax = LATEX_xmax; t->ymax = LATEX_ymax; /* Compute the margins, based on the positioning of tick labels */ left_margin = LATEX_VTIC + 2*LATEX_HCHAR; right_margin = 0; bot_margin = LATEX_HTIC + LATEX_VCHAR; top_margin = LATEX_VTIC; /* Construct the image from the labels and the plot, as a table */ fprintf(outfile, "\\begin{tabular}{r@{}c}\n"); if (title && *title != '\0') fprintf(outfile, " & \\shortstack{%s} \\\\ \n", title); if (ylabel && *ylabel != '\0') { fprintf(outfile, "\\raisebox{%gpt}{\\begin{tabular}[c]{@{}c@{}}\n", ((float)(LATEX_ymax-1) / 2. + bot_margin) * LATEX_UNIT); fprintf(outfile, "%s\n", ylabel); fprintf(outfile, "\\end{tabular} \\hspace*{%dem}}\n", yskip); } /* Define the plot, computing the total size and the lower-left corner*/ fprintf(outfile, " & \\begin{picture}(%ld,%ld)(%ld,%ld)\n", (long)(LATEX_xmax + left_margin + right_margin), (long)(LATEX_ymax + bot_margin + top_margin), (long)(-left_margin), (long)(-bot_margin)); LATEX_inplot = TRUE; LATEX_posx = LATEX_posy = 0; /* Remember x label for use after plot is defined */ if (xlabel && *xlabel != '\0') { LATEX_xlabel = malloc(strlen(xlabel)+1); strcpy(LATEX_xlabel, xlabel); } else LATEX_xlabel = NULL; } static LATEX_endplot() { /* Complete the plot */ fprintf(outfile, "\\end{picture}\n"); /* Now finish that line of the table and do the x label */ if (LATEX_xlabel) { fprintf(outfile, "\\\\\n"); fprintf(outfile, " & \\shortstack{%s}\n", LATEX_xlabel); free(LATEX_xlabel); } fprintf(outfile, "\\end{tabular}\n\n"); } LATEX_text() { } LATEX_linetype(linetype) int linetype; { LATEX_type = linetype; LATEX_style = NULL; } LATEX_plotstyle(stp) struct st_entry *stp; { LATEX_style = stp; LATEX_seq_pos = 0; } LATEX_move(x,y) unsigned int x,y; { LATEX_posx = x; LATEX_posy = y; } LATEX_point(x,y, number, special) /* version of line_and_point */ unsigned int x,y; int number; /* type of point */ char *special; /* overrides number as the character to use */ { if (clipping && (x < LATEX_HTIC || y < LATEX_VTIC || x >= LATEX_xmax-LATEX_HTIC || y >= LATEX_ymax-LATEX_VTIC) ) return; LATEX_move(x,y); /* Print the special character, if given, otherwise use the one */ /* defined by 'number'; number < 0 means to use a dot, otherwise */ /* one of the defined points. */ fprintf(outfile, "\\put(%d,%d){\\makebox(0,0){%s}}\n", x, y, special != NULL ? special : (number < 0 ? LATEX_TINY_DOT : LATEX_points[number % LATEX_POINT_TYPES])); } LATEX_vector(ux,uy) unsigned int ux,uy; { int x=ux, y=uy; /* Negative linestyles are straight lines for frame and axes. */ /* These are vertical and horizontal lines only. */ if (LATEX_type < 0) { if (x == LATEX_posx) { /* vertical */ fprintf(outfile, "\\put(%ld,%ld){\\line(0,%ld){%ld}}\n", LATEX_posx, LATEX_posy, sign((long)y - LATEX_posy), abs((long)y - LATEX_posy)); } else if (y == LATEX_posy) { /* horizontal */ fprintf(outfile, "\\put(%ld,%ld){\\line(%ld,0){%ld}}\n", LATEX_posx, LATEX_posy, sign((long)x - LATEX_posx), abs((long)x - LATEX_posx)); } } else { /* drawing real curves */ long deltax = x - LATEX_posx; long deltay = y - LATEX_posy; long n = max(abs(deltax), abs(deltay)) / (LATEX_style ? LATEX_style->st_spacing/LATEX_UNIT : LATEX_DOT_SPACING) + 1; float dx = (float)deltax / n; float dy = (float)deltay / n; float curx = LATEX_posx, cury = LATEX_posy; BOOLEAN first = TRUE; while (curx != x || cury != y) { if (LATEX_style) if (!first) LATEX_seq_pos = (LATEX_seq_pos + 1) % LATEX_style->st_length; else first = FALSE; fprintf(outfile, "\\put(%ld,%ld){%s}\n", (long)(curx + .5), (long)(cury + .5), LATEX_style ? LATEX_style->st_seq[LATEX_seq_pos] : LATEX_DOT); if (abs(dx) > abs(x - curx)) curx = x; else curx += dx; if (abs(dy) > abs(y - cury)) cury = y; else cury += dy; } } LATEX_posx = x; LATEX_posy = y; } LATEX_lrput_text(row,str) unsigned int row; char str[]; { fprintf(outfile, "\\put(%ld,%ld){$%s$}\n", (long)(LATEX_xmax - 2*LATEX_HTIC - LATEX_HCHAR*(strlen(str)+1)), (long)(LATEX_VTIC + 3 + LATEX_VCHAR*row), str); } LATEX_ulput_text(row,str) unsigned int row; char str[]; { fprintf(outfile, "\\put(%ld,%ld){%s}\n", (long)(LATEX_HTIC+3), (long)(LATEX_ymax - LATEX_VTIC - LATEX_VCHAR*(row+1)), str); } LATEX_xyput_text(x, y, str, pos, length, dx, dy) unsigned int x,y; /* reference point of string */ char str[]; /* the text */ char pos[]; /* for optional [pos] to \makebox */ unsigned int length; /* optional arrow length */ int dx, dy; /* optional slopes for arrow */ { if (!LATEX_inplot) return; if (pos != NULL && *pos != NULL) { fprintf(outfile, "\\put(%d,%d){\\makebox(0,0)[%s]{%s}", x, y, pos, str); } else { fprintf(outfile, "\\put(%d,%d){\\makebox(0,0){%s}", x, y, str); } /* optional arrow */ if (length != 0 && pos != NULL && *pos != NULL) { if (dx == 0 && dy == 0) { /* determine slope from pos */ if (INDEX(pos, 'l') != NULL) dx = -1; if (INDEX(pos, 'r') != NULL) dx = 1; if (INDEX(pos, 't') != NULL) dy = 1; if (INDEX(pos, 'b') != NULL) dy = -1; } fprintf(outfile, "\\vector(%d,%d){%u}\n", dx, dy, length); } fprintf(outfile, "}\n"); /* finish the \put */ } LATEX_key(x, y, style, names) unsigned int x,y; int style[]; char *names[]; { int curve; int pcount = 0; /* counter of point-like styles */ char *point; /* string representing type */ static char *LATEX_key_point(); BOOLEAN first = TRUE; /* Plot all of the curves in a shortstack */ /* Each curve has two boxes, the left right-justified, */ /* the right left-justified, so they line up at the middle. */ fprintf(outfile, "\\put(%d,%d){\\shortstack{\n", x, y); for (curve = 0; names[curve] != NULL; curve++) { /* Get a string that describes this style */ point = LATEX_key_point(style[curve], &pcount); /* But don't print it out if the description is empty */ if (*names[curve] != '\0') { if (!first) fprintf(outfile, "\\\\\n"); else first = FALSE; fprintf(outfile, " \\makebox[0pt][r]{%s}", point); fprintf(outfile, " \\makebox[0pt][l]{ %s}", names[curve]); } } fprintf(outfile, "\n}}\n"); } static char * /* pointer to static storage */ LATEX_key_point(style, pcount) int style; /* style number to describe */ int *pcount; /* running counter of point-like styles */ { static char s[MAX_ID_LEN]; /* the string representing the style */ struct st_entry *stp; /* the style description of this style */ int seq; /* sequence in a style */ int p; /* loop variable */ extern struct st_entry st[]; /* all style descriptions */ switch(style) { case IMPULSES: { strcpy(s, "|"); /* hack */ break; } case LINES: { *s = NULL; for (p=0; p < 5; p++) sprintf(s, "%s%s\\hspace{%gpt}", s, LATEX_DOT, LATEX_DOT_SPACING * LATEX_UNIT); break; } case POINTS: { /* hack */ strcpy(s, LATEX_points[(*pcount)++ % LATEX_POINT_TYPES]); break; } case DOTS: { strcpy(s, LATEX_TINY_DOT); break; } case LINESPOINTS: { *s = NULL; for (p=0; p < 5; p++) { sprintf(s, "%s%s\\hspace{%gpt}", s, LATEX_DOT, LATEX_DOT_SPACING * LATEX_UNIT); if (p == 2) strcat(s, LATEX_points[(*pcount)++ % LATEX_POINT_TYPES]); } break; } default: { *s = NULL; /* Plot points if the style has a line pattern */ stp = &(st[style]); if (stp->st_length > 0) { for (p=0, seq=0; p < 5; p++) { sprintf(s, "%s%s\\hspace{%gpt}", s, stp->st_seq[seq], stp->st_spacing); seq = (seq + 1) % stp->st_length; if (p == 2 && stp->st_point != NULL) strcat(s, stp->st_point); } } else { /* and plot the data point if the style has that */ if (stp->st_point != NULL) strcat(s, stp->st_point); } break; } } return (s); } LATEX_xtick_text(x, number, format) unsigned int x; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[LATEX_TICSIZ]; if (*format == '\0') format = LATEX_FORMAT; sprintf(mark, format, number); fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[t]{%s}}\n", (long)x, (long)(-LATEX_HTIC), mark); } LATEX_ytick_text(y, number, format) unsigned int y; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[LATEX_TICSIZ]; if (*format == '\0') format = LATEX_FORMAT; sprintf(mark, format, number); fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[r]{%s}}\n", (long)(-LATEX_VTIC), (long)y, mark); } LATEX_reset() { if (LATEX_inplot) { LATEX_endplot(); LATEX_inplot = FALSE; } LATEX_posx = LATEX_posy = 0; } #endif /* LATEX */ #ifdef FIG #include "object.h" /* from the TransFig distribution */ #ifndef FIG_RES /* Must be 80 for the Fig editor, but may be increased if used * only by TransFig filters */ #define FIG_RES 80 #endif #define FIG_COORD_SYS 2 #define FIG_MAGIC "#FIG 1.4-TFX" #define FIG_HTIC 5 #define FIG_VTIC 5 #define FIG_HCHAR 8 #define FIG_VCHAR 16 #define FIG_TICSIZ 101 /* no more than 100 chars in a tic label */ #define FIG_FORMAT "%g" /* default format for tic marks */ static long FIG_xbase = FIG_RES/2; static long FIG_ybase = FIG_RES/2; static long FIG_posx; static long FIG_posy; static BOOLEAN FIG_inplot; static long FIG_xmax; static long FIG_ymax; static FIG_endplot(); extern char *malloc(); #define sign(x) ((x) >= 0 ? 1 : -1) #define abs(x) ((x) >= 0 ? (x) : -(x)) #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) static int FIG_type; /* negative types use real lines */ static struct st_entry *FIG_style = NULL; /* NULL => use default styles */ static FIG_seq_pos; /* position in sequence */ #define FIG_POINT_TYPES POINT_TYPES /* we use the same points */ FIG_init() { FIG_posx = FIG_posy = 0; FIG_inplot = FALSE; FIG_style = NULL; FIG_type = -1; fprintf(outfile, "%s\n", FIG_MAGIC); fprintf(outfile, "%d %d\n", FIG_RES, FIG_COORD_SYS); } FIG_graphics(xmax, ymax, t, xlabel, ylabel, yskip, title) float xmax, ymax; /* in inches */ struct termentry *t; char *xlabel; /* x-axis label */ char *ylabel; /* y-axis label */ int yskip; /* y-axis label skip factor */ char *title; /* plot title */ { /* computed margin of plot */ long bot_margin, left_margin, top_margin, right_margin; if (FIG_inplot) FIG_endplot(); /* Convert inches to points to coordinates */ FIG_xmax = (long) (xmax * FIG_RES + 0.5); FIG_ymax = (long) (ymax * FIG_RES + 0.5); /* store these away for the use of plotting routines */ t->xmax = FIG_xmax; t->ymax = FIG_ymax; /* Compute the margins, based on the positioning of tick labels */ left_margin = FIG_VTIC + 4*FIG_HCHAR; right_margin = 0; bot_margin = FIG_HTIC + FIG_VCHAR; top_margin = FIG_VTIC; FIG_xbase += left_margin; FIG_ybase += top_margin; /* Place the title and labels */ if (ylabel && *ylabel != '\0') { FIG_xbase += (strlen(ylabel)+1)*FIG_HCHAR; FIG_xy_text(-left_margin, (FIG_ymax-1)/2, ylabel, "r"); } if (title && *title != '\0') FIG_xy_text((FIG_xmax-1)/2, FIG_ymax + top_margin, title, "cb"); if (xlabel && *xlabel != '\0') FIG_xy_text((FIG_xmax-1)/2, -bot_margin, xlabel, "tc"); FIG_inplot = TRUE; FIG_posx = FIG_posy = 0; } static FIG_endplot() { } FIG_text() { } FIG_linetype(linetype) int linetype; { FIG_type = linetype; FIG_style = NULL; } FIG_plotstyle(stp) struct st_entry *stp; { FIG_style = stp; FIG_seq_pos = 0; } FIG_move(x,y) unsigned int x,y; { FIG_posx = x; FIG_posy = y; } FIG_vector(ux,uy) unsigned int ux,uy; { int x=ux, y=uy; fprintf(outfile, "%d %d %d %d %d %d %d %d %6.3f %d %d\n", O_POLYLINE, T_POLYLINE, SOLID_LINE, 1, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0, 0, 0); fprintf(outfile, "%d %d %d %d 9999 9999\n", FIG_xbase+FIG_posx, FIG_ybase+FIG_ymax-FIG_posy, FIG_xbase+x, FIG_ybase+FIG_ymax-y); FIG_posx = x; FIG_posy = y; } FIG_lrput_text(row,str) unsigned int row; char str[]; { FIG_xy_text(FIG_xmax - 2*FIG_HTIC - FIG_HCHAR*(strlen(str)+1), FIG_VTIC + FIG_VCHAR*row, str, NULL); } FIG_ulput_text(row,str) unsigned int row; char str[]; { FIG_xy_text(FIG_HTIC, FIG_ymax - FIG_VTIC - FIG_VCHAR*(row+1), str, NULL); } FIG_xyput_text(x, y, str, pos, length, dx, dy) unsigned int x,y; /* reference point of string */ char str[]; /* the text */ char pos[]; /* for optional [pos] to \makebox */ unsigned int length; /* optional arrow length */ int dx, dy; /* optional slopes for arrow */ { if (!FIG_inplot) return; FIG_xy_text(x, y, str, pos); /* optional arrow */ if (length != 0 && pos != NULL && *pos != NULL) { if (dx == 0 && dy == 0) { /* determine slope from pos */ if (INDEX(pos, 'l') != NULL) dx = -1; if (INDEX(pos, 'r') != NULL) dx = 1; if (INDEX(pos, 't') != NULL) dy = 1; if (INDEX(pos, 'b') != NULL) dy = -1; } fprintf(outfile, "%d %d %d %d %d %d %d %d %6.3f %d %d\n", O_POLYLINE, T_POLYLINE, SOLID_LINE, 1, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0, 1, 0); fprintf(outfile, "%d %d %d %d %d\n", DEFAULT, DEFAULT, DEFAULT, 4, 8); fprintf(outfile, "%d %d %d %d 9999 9999\n", x, y, x+dx, y+dy); } } /* internally called, just dumps out string */ FIG_xy_text(x, y, str, pos) long x, y; char *str, *pos; { int j = T_CENTER_JUSTIFIED; y = y - FIG_VCHAR/2; if (pos != NULL) { if (INDEX(pos, 'l') != NULL) j = T_LEFT_JUSTIFIED; if (INDEX(pos, 'r') != NULL) j = T_RIGHT_JUSTIFIED; if (INDEX(pos, 't') != NULL) y = y - FIG_VCHAR/2; if (INDEX(pos, 'b') != NULL) y = y + FIG_VCHAR/2; } fprintf(outfile, "%d %d %d %d %d %d %d %6.3f %d %d %d %d %d %s\01\n", O_TEXT, j, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 0.0, DEFAULT, 16, 8*strlen(str), FIG_xbase+x, FIG_ybase+FIG_ymax-y, str); } FIG_key(x, y, style, names) unsigned int x,y; int style[]; char *names[]; { /* Not for now... */ } static char * /* pointer to static storage */ FIG_key_point(style, pcount) int style; /* style number to describe */ int *pcount; /* running counter of point-like styles */ { /* Not for now... */ } FIG_xtick_text(x, number, format) unsigned int x; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[FIG_TICSIZ]; if (*format == '\0') format = FIG_FORMAT; sprintf(mark, format, number); FIG_xy_text(x, -FIG_HTIC, mark, "t"); } FIG_ytick_text(y, number, format) unsigned int y; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[FIG_TICSIZ]; if (*format == '\0') format = FIG_FORMAT; sprintf(mark, format, number); FIG_xy_text(-FIG_VTIC, y, mark, "r"); } FIG_reset() { if (FIG_inplot) { FIG_endplot(); FIG_inplot = FALSE; } FIG_posx = FIG_posy = 0; } #endif /* FIG */ #ifdef IMAGEN #include "imPcodes.h" #define IMAGEN_PTS_PER_INCH (300) #define IMAGEN_UNIT (.01) /* points */ #define IMAGEN_HTIC 20 #define IMAGEN_VTIC 20 #define IMAGEN_HCHAR (4./IMAGEN_UNIT) #define IMAGEN_VCHAR (12./IMAGEN_UNIT) #define IMAGEN_TICSIZ 101 /* no more than 100 chars in a tic label */ #define IMAGEN_FORMAT "%g" /* default tick mark format */ static int IMAGEN_orgx; /* absolute-pixel-ORIgin of graph. */ static int IMAGEN_orgy; static int IMAGEN_posx; /* current drawing position (lines). */ static int IMAGEN_posy; static int IMAGEN_inplot; static int IMAGEN_xmax; /* width of graph in pixels. */ static int IMAGEN_ymax; /* height of graph in pixels. */ static int IMAGEN_hchar; /* Height of CHAR in current font. */ static int IMAGEN_wchar; /* Width of CHAR in current font. */ static int IMAGEN_blofs; /* BaseLine OFfSet from bounding box. */ static int IMAGEN_rotated = -1; /* text printing is ROTATED (y-axis label) */ static int IMAGEN_titlefsz = 15; static int IMAGEN_axisfsz = 12; static int IMAGEN_labelfsz = 10; static int IMAGEN_tickfsz = 9; static int IMAGEN_cursize = -1; /* pointer to one of above. */ static IMAGEN_endplot(); extern char *malloc(); #ifndef sign #define sign(x) ((x) >= 0 ? 1 : -1) #define abs(x) ((x) >= 0 ? (x) : -(x)) #define max(a,b) ((a) > (b) ? (a) : (b)) #define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* sign */ /* Default line-drawing character */ #define IMAGEN_DOT_SPACING (2.0/IMAGEN_UNIT) static int IMAGEN_type; /* negative types use real lines */ static struct st_entry *IMAGEN_style = NULL; /* NULL => use default styles */ static IMAGEN_seq_pos; /* position in sequence */ IMAGEN_init() { IMAGEN_posx = IMAGEN_posy = 0; IMAGEN_inplot = FALSE; IMAGEN_style = NULL; IMAGEN_type = -1; IMAGEN_rotated = -1; fputs("@document(language impress)", outfile); putc(imP_SET_HV_SYSTEM, outfile); putc((3<<3)|5, outfile); putc(imP_SET_ADV_DIRS, outfile); /* up and to the right, landscape. */ putc(7, outfile); IMAGEN_createfamily("cour06", 6); IMAGEN_createfamily("cour07", 7); IMAGEN_createfamily("cour08", 8); IMAGEN_createfamily("cour09", 9); IMAGEN_createfamily("cour10", 10); IMAGEN_createfamily("cour12", 12); IMAGEN_createfamily("cour14", 14); IMAGEN_createfamily("cour15", 15); IMAGEN_setfont(IMAGEN_titlefsz); IMAGEN_unrotate(); putc(imP_SET_ABS_H, outfile); IMAGEN_putwd(0); putc(imP_SET_ABS_V, outfile); IMAGEN_putwd(0); } IMAGEN_putwd(w) { putc(w>>8, outfile); putc(w, outfile); } IMAGEN_createfamily(c, sz) char *c; int sz; { putc(imP_CREATE_FAMILY_TABLE, outfile); putc(sz, outfile); putc(1, outfile); putc(0, outfile); fputs(c, outfile); putc(0, outfile); } IMAGEN_setfont(sz) int sz; { if (IMAGEN_cursize == sz) return; IMAGEN_hchar = sz * 5; IMAGEN_wchar = IMAGEN_hchar / 2; IMAGEN_blofs = IMAGEN_hchar / 3; putc(imP_SET_FAMILY, outfile); putc(sz, outfile); putc(imP_SET_SP, outfile); IMAGEN_putwd(IMAGEN_wchar); putc(imP_SET_IL, outfile); IMAGEN_putwd(IMAGEN_hchar); IMAGEN_cursize = sz; } IMAGEN_graphics(xmax, ymax, t, xlabel, ylabel, yskip, title) float xmax, ymax; /* in inches */ struct termentry *t; char *xlabel; /* x-axis label */ char *ylabel; /* y-axis label */ int yskip; /* y-axis label skip factor */ char *title; /* plot title */ { int h, w; char *s; if (IMAGEN_inplot) IMAGEN_newpage(); IMAGEN_inplot = TRUE; /* Convert inches to points to coordinates */ IMAGEN_xmax = (int) (xmax * IMAGEN_PTS_PER_INCH); IMAGEN_ymax = (int) (ymax * IMAGEN_PTS_PER_INCH); IMAGEN_orgx = ((int) (11.0 - xmax)) * IMAGEN_PTS_PER_INCH / 2; IMAGEN_orgy = ((int) (8.5 - ymax)) * IMAGEN_PTS_PER_INCH / 2; /* store these away for the use of plotting routines */ t->xmax = IMAGEN_xmax; t->ymax = IMAGEN_ymax; /* Construct the image from the labels and the plot, as a table */ if (title && *title != '\0') { IMAGEN_unrotate(); IMAGEN_setfont(IMAGEN_titlefsz); IMAGEN_xy_text(IMAGEN_xmax / 2, IMAGEN_ymax + 2 * IMAGEN_hchar, title, "b"); } if (ylabel && *ylabel != '\0') { IMAGEN_rotate(); IMAGEN_setfont(IMAGEN_axisfsz); IMAGEN_xy_text((-yskip - 3) * IMAGEN_wchar, IMAGEN_ymax / 2, ylabel, "r"); } if (xlabel && *xlabel != '\0') { IMAGEN_unrotate(); IMAGEN_setfont(IMAGEN_axisfsz); IMAGEN_xy_text(IMAGEN_xmax / 2, -2 * IMAGEN_hchar, xlabel, "t"); } IMAGEN_move(0, 0); } static IMAGEN_newpage() { putc(imP_ENDPAGE, outfile); } static IMAGEN_endplot() { putc(imP_EOF, outfile); } IMAGEN_text() { } IMAGEN_linetype(linetype) int linetype; { static int lastlinetype = -1; IMAGEN_type = linetype; if (linetype < 0) linetype = -linetype; else linetype = 1; if (lastlinetype == linetype) return; lastlinetype = linetype; putc(imP_SET_PEN, outfile); putc(linetype, outfile); IMAGEN_style = NULL; } IMAGEN_plotstyle(stp) struct st_entry *stp; { IMAGEN_style = stp; IMAGEN_seq_pos = 0; } IMAGEN_move(x,y) unsigned int x,y; { IMAGEN_posx = x; IMAGEN_posy = y; } IMAGEN_vector(ux,uy) unsigned int ux,uy; { int x=ux, y=uy; /* Create path. */ putc(imP_CREATE_PATH, outfile); IMAGEN_putwd(2); IMAGEN_putwd(IMAGEN_posx + IMAGEN_orgx); IMAGEN_putwd(IMAGEN_posy + IMAGEN_orgy); IMAGEN_putwd(ux + IMAGEN_orgx); IMAGEN_putwd(uy + IMAGEN_orgy); /* Draw path with black pen. */ putc(imP_DRAW_PATH, outfile); putc(15, outfile); /* Set current position to end of line. */ IMAGEN_move(ux, uy); } IMAGEN_setpos(ux, uy) int ux,uy; { /* Set x and y position, also set beginning-of-line. */ putc(imP_SET_ABS_H, outfile); IMAGEN_putwd(ux + IMAGEN_orgx); putc(imP_SET_ABS_V, outfile); IMAGEN_putwd(uy + IMAGEN_orgy); putc(imP_SET_BOL, outfile); if (IMAGEN_rotated) IMAGEN_putwd(uy + IMAGEN_orgx); else IMAGEN_putwd(ux + IMAGEN_orgx); } IMAGEN_rotate() { if (IMAGEN_rotated == 1) return; /* Cause text to run from bottom to top. */ putc(imP_SET_ADV_DIRS, outfile); putc(7, outfile); IMAGEN_rotated = 1; } IMAGEN_unrotate() { if (IMAGEN_rotated == 0) return; /* Cause text to run from left to right. */ putc(imP_SET_ADV_DIRS, outfile); putc(0, outfile); IMAGEN_rotated = 0; } char * IMAGEN_cvts(str, width, height) char *str; int *width; int *height; { char *cp1; char *cp2; static char *buf = NULL; int h; int maxw; int w; /* Free up old buffer, if there is one, get a new one. Since */ /* all transformations shorten the string, get a buffer that is */ /* the same size as the input string. */ if (buf != NULL) (void)free(buf); buf = (char *)malloc(strlen(str)); /* Do the transformations. */ cp1 = str; cp2 = buf; h = 1; maxw = 0; w = 0; while (*cp1 != NULL) { switch (*cp1) { case ' ' : /* Space character. */ *cp2++ = imP_SP; w++; break; case '\\' : /* Escape sequence. */ if (*++cp1 == '\\') { /* Begin new line. */ h++; if (w > maxw) maxw = w; w = 0; *cp2++ = imP_CRLF; break; } /* Fall through to just copy next char out. */ default : *cp2++ = *cp1; w++; break; } cp1++; } *cp2 = '\0'; if (w > maxw) maxw = w; if (height != NULL) *height = IMAGEN_rotated ? IMAGEN_wchar * maxw : IMAGEN_hchar * h; if (width != NULL) *width = IMAGEN_rotated ? IMAGEN_hchar * h : IMAGEN_wchar * maxw; return (buf); } IMAGEN_puts(str) char *str; { str = IMAGEN_cvts(str, NULL, NULL); fputs(str, outfile); } IMAGEN_lrput_text(row,str) unsigned int row; char str[]; { char *imstr; int width; imstr = IMAGEN_cvts(str, &width, NULL); IMAGEN_setpos((int)(IMAGEN_xmax - IMAGEN_HTIC - width), (int)(IMAGEN_VTIC + 3 + IMAGEN_hchar*row)); fputs(imstr, outfile); } IMAGEN_ulput_text(row,str) unsigned int row; char str[]; { IMAGEN_setpos((int)(IMAGEN_HTIC+3), (int)(IMAGEN_ymax - IMAGEN_VTIC - IMAGEN_hchar*(row+1))); IMAGEN_puts(str); } /* Invoked from gnutex, puts out optional arrow and forces font. */ IMAGEN_xyput_text(ref_x, ref_y, str, pos, length, dx, dy) int ref_x,ref_y; /* reference point of string */ char str[]; /* the text */ char pos[]; /* for optional [pos] to \makebox */ unsigned int length; /* optional arrow length */ int dx, dy; /* optional slopes for arrow */ { IMAGEN_unrotate(); IMAGEN_setfont(IMAGEN_labelfsz); IMAGEN_xy_text(ref_x, ref_y, str, pos); if (length != 0 && pos != NULL && *pos != '\0') { if (dx == 0 && dy == 0) { if (INDEX(pos, 'l')) dx = -1; if (INDEX(pos, 'r')) dx = 1; if (INDEX(pos, 't')) dy = 1; if (INDEX(pos, 'b')) dy = -1; } IMAGEN_move(ref_x, ref_y); IMAGEN_vector(ref_x + dx * length, ref_y + dy * length); } } /* Called internally, just dumps string. */ IMAGEN_xy_text(ref_x, ref_y, str, pos) int ref_x,ref_y; /* reference point of string */ char str[]; /* the text */ char pos[]; /* for optional [pos] to \makebox */ { char *cvstr; int dy = 0; int height; int width; int x = ref_x; int y = ref_y; if (!IMAGEN_inplot) return; cvstr = IMAGEN_cvts(str, &width, &height); x -= width / 2; dy += height / 2; if (pos != NULL) { if (INDEX(pos, 'l')) x += width / 2; if (INDEX(pos, 'r')) x -= width / 2; if (INDEX(pos, 't')) dy -= height / 2; if (INDEX(pos, 'b')) dy += height / 2; } if (IMAGEN_rotated) { x += IMAGEN_hchar; y -= dy; } else y += dy - IMAGEN_hchar; IMAGEN_setpos(x, y + IMAGEN_blofs); fputs(cvstr, outfile); } IMAGEN_key(x, y, style, names) unsigned int x,y; int style[]; char *names[]; { /* @@@ maybe someday . . . */ } static char * /* pointer to static storage */ IMAGEN_key_point(style, pcount) int style; /* style number to describe */ int *pcount; /* running counter of point-like styles */ { /* @@@ Maybe someday . . . */ } IMAGEN_xtick_text(x, number, format) unsigned int x; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[IMAGEN_TICSIZ]; if (*format == '\0') format = IMAGEN_FORMAT; IMAGEN_unrotate(); IMAGEN_setfont(IMAGEN_tickfsz); sprintf(mark, format, number); IMAGEN_xy_text(x, (int)(-IMAGEN_HTIC), mark, "t"); } IMAGEN_ytick_text(y, number, format) int y; /* place to put on axis */ double number; /* the number to be written at that tick */ char *format; { char mark[IMAGEN_TICSIZ]; if (*format == '\0') format = IMAGEN_FORMAT; IMAGEN_unrotate(); IMAGEN_setfont(IMAGEN_tickfsz); sprintf(mark, format, number); IMAGEN_xy_text((int)(-IMAGEN_VTIC), y, mark, "r"); } IMAGEN_reset() { if (IMAGEN_inplot) { IMAGEN_endplot(); IMAGEN_inplot = FALSE; } IMAGEN_posx = IMAGEN_posy = 0; } #endif /* IMAGEN */ UNKNOWN_null() { int_error("you must set your terminal type before plotting!",NO_CARET); } ALL_nop() /* i.e. doesn't support this feature */ { } /* * term_tbl[] contains an entry for each terminal. "unknown" must be the * first, since term is initialized to 0. */ struct termentry term_tbl[] = { {"unknown", 100, 100, 1, 1, 1, 1, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null, UNKNOWN_null} #ifdef PC ,{"cga", CGA_XMAX, CGA_YMAX, CGA_VCHAR, CGA_HCHAR, CGA_VTIC, CGA_HTIC, CGA_init, CGA_reset, CGA_text, CGA_graphics, CGA_move, CGA_vector, CGA_linetype, CGA_lrput_text, CGA_ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} ,{"ega", EGA_XMAX, EGA_YMAX, EGA_VCHAR, EGA_HCHAR, EGA_VTIC, EGA_HTIC, EGA_init, EGA_reset, EGA_text, EGA_graphics, EGA_move, EGA_vector, EGA_linetype, EGA_lrput_text, EGA_ulput_text, do_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #ifdef CORONA ,{"corona", COR_XMAX, COR_YMAX, COR_VCHAR, COR_HCHAR, COR_VTIC, COR_HTIC, COR_init, COR_reset, COR_text, COR_graphics, COR_move, COR_vector, COR_linetype, COR_lrput_text, COR_ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif /* CORONA */ #endif /* PC */ #ifdef AED ,{"aed767", AED_XMAX, AED_YMAX, AED_VCHAR, AED_HCHAR, AED_VTIC, AED_HTIC, AED_init, AED_reset, AED_text, AED_graphics, AED_move, AED_vector, AED_linetype, AED_lrput_text, AED_ulput_text, do_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef HP75 ,{"hp75xx",HP75_XMAX,HP75_YMAX, HP75_VCHAR, HP75_HCHAR,HP75_VTIC,HP75_HTIC, HP75_init,HP75_reset,HP75_text, HP75_graphics, HP75_move, HP75_vector, HP75_linetype, HP75_lrput_text, HP75_ulput_text, do_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef QMS ,{"qms",QMS_XMAX,QMS_YMAX, QMS_VCHAR, QMS_HCHAR, QMS_VTIC, QMS_HTIC, QMS_init,QMS_reset, QMS_text, QMS_graphics, QMS_move, QMS_vector, QMS_linetype,QMS_lrput_text,QMS_ulput_text,line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef REGIS ,{"regis", REGISXMAX, REGISYMAX, REGISVCHAR, REGISHCHAR, REGISVTIC, REGISHTIC, REGISinit, REGISreset, REGIStext, REGISgraphics, REGISmove,REGISvector,REGISlinetype, REGISlrput_text, REGISulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef TEK ,{"tek40xx",TEK40XMAX,TEK40YMAX,TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, TEK40init,TEK40reset, TEK40text, TEK40graphics, TEK40move, TEK40vector,TEK40linetype,TEK40lrput_text, TEK40ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef HALFTEK ,{"toptek",HALFTEK40XMAX,HALFTEK40YMAX,HALFTEK40VCHAR, HALFTEK40HCHAR, HALFTEK40VTIC, HALFTEK40HTIC, HALFTEK40init,HALFTEK40reset, TOPTEK40text, HALFTEK40graphics, TOPTEK40move, TOPTEK40vector,HALFTEK40linetype,HALFTEK40lrput_text, HALFTEK40ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} ,{"bottek",HALFTEK40XMAX,HALFTEK40YMAX,HALFTEK40VCHAR, HALFTEK40HCHAR, HALFTEK40VTIC, HALFTEK40HTIC, HALFTEK40init,HALFTEK40reset, BOTTEK40text, HALFTEK40graphics, BOTTEK40move, BOTTEK40vector,HALFTEK40linetype,HALFTEK40lrput_text, HALFTEK40ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef UNIXPLOT ,{"unixplot", UP_XMAX, UP_YMAX, UP_VCHAR, UP_HCHAR, UP_VTIC, UP_HTIC, UP_init, UP_reset, UP_text, UP_graphics, UP_move, UP_vector, UP_linetype, UP_lrput_text, UP_ulput_text, line_and_point, ALL_nop, ALL_nop, ALL_nop, ALL_nop} #endif #ifdef LATEX /* xmax and ymax are filled in by LATEX_graphics */ /* We supply the absolute maximum here */ ,{"latex", (int)(8.5*LATEX_PTS_PER_INCH), (int)(11*LATEX_PTS_PER_INCH), (int)LATEX_VCHAR, (int)LATEX_HCHAR, (int)LATEX_VTIC, (int)LATEX_HTIC, LATEX_init, LATEX_reset, LATEX_text, LATEX_graphics, LATEX_move, LATEX_vector, LATEX_linetype, LATEX_lrput_text, LATEX_ulput_text, LATEX_point, LATEX_xyput_text, LATEX_xtick_text, LATEX_ytick_text, LATEX_plotstyle} #endif #ifdef FIG /* xmax and ymax are filled in by FIG_graphics */ /* We supply the absolute maximum here */ ,{"fig", (int)(8.5*FIG_RES), 11*FIG_RES, FIG_VCHAR, FIG_HCHAR, FIG_VTIC, FIG_HTIC, FIG_init, FIG_reset, FIG_text, FIG_graphics, FIG_move, FIG_vector, FIG_linetype, FIG_lrput_text, FIG_ulput_text, do_point, FIG_xyput_text, FIG_xtick_text, FIG_ytick_text, FIG_plotstyle} #endif #ifdef IMAGEN /* xmax and ymax are filled in by IMAGEN_graphics */ /* We supply the absolute maximum here */ ,{"imagen", 11*IMAGEN_PTS_PER_INCH, 8.5*IMAGEN_PTS_PER_INCH, IMAGEN_VCHAR, IMAGEN_HCHAR, IMAGEN_VTIC, IMAGEN_HTIC, IMAGEN_init, IMAGEN_reset, IMAGEN_text, IMAGEN_graphics, IMAGEN_move, IMAGEN_vector, IMAGEN_linetype, IMAGEN_lrput_text, IMAGEN_ulput_text, do_point, IMAGEN_xyput_text, IMAGEN_xtick_text, IMAGEN_ytick_text, IMAGEN_plotstyle} #endif }; list_terms() { register int i; (void) putc('\n',stderr); fprintf(stderr,"available terminal types: \n"); for (i = 0; i < TERMCOUNT; i++) fprintf(stderr,"\t%s\n",term_tbl[i].name); (void) putc('\n',stderr); } set_term(c_token) int c_token; { register int i,t; if (!token[c_token].is_token) int_error("terminal name expected",c_token); t = -1; for (i = 0; i < TERMCOUNT; i++) { if (!strncmp(input_line + token[c_token].start_index,term_tbl[i].name, token[c_token].length)) { if (t != -1) int_error("ambiguous terminal name",c_token); t = i; } } if (t == -1) int_error("unknown terminal type; type just 'set terminal' for a list", c_token); term_init = FALSE; return(t); }