Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!cs.utexas.edu!uunet!mcsun!hafro!gunnar From: gunnar@hafro.is (Gunnar Stefansson) Newsgroups: comp.sources.bugs Subject: Patch 2 to Reldb - Relational database and graphing tools Keywords: reldb, graphics, scat, plot, database Message-ID: <138@hafro.is> Date: 26 Sep 89 12:08:29 GMT Organization: Marine Research Institute, Reykjavik Lines: 1617 This is patch 2 to Reldb. These patches include some corrections to problems that occurred during distribution (in particular, a newline was missing in one of the doc-files, causing strange things). Also included are changes to the plot(1)-filters, xplot, hpglplot and plot itself. Xplot in now much better than before, and several new extensions have been added to the standard plot(5)-commands. Remember to apply patch 1 before this. cd to where you keep the Reldb programs and run this through 'patch -p'. Please let me know asap of any problems. *** patchlevel.h Tue Sep 26 11:26:00 1989 --- patchlevel.h Tue Sep 26 11:40:23 1989 Prereq: 1 *************** *** 1 **** ! #define PATCHLEVEL 1 --- 1 ---- ! #define PATCHLEVEL 2 *** doc/scat.1 Tue Sep 26 11:25:08 1989 --- doc/scat.1 Mon Sep 25 22:31:12 1989 *************** *** 59,60 **** --- 59,76 ---- [ + .B \-T + "x number" + ] + [ + .B \-T + "y number" + ] + [ + .B \-t + "x number" + ] + [ + .B \-t + "y number" + ] + [ .B \-d *************** *** 187,188 **** --- 203,217 ---- .I name. + .TP + .BI \-T\ xnumber + Number of large tick marks on x-axis. + .TP + .BI \-T\ ynumber + Number of large tick marks on y-axis. + .TP + .BI \-t\ xnumber + Number of small tick marks between large tick marks on x-axis. + .TP + .BI \-t\ xnumber + Number of small tick marks between large tick marks on y-axis. + .B .TP *** doc/subtotal.1 Tue Sep 26 11:25:09 1989 --- doc/subtotal.1 Mon Sep 25 21:01:49 1989 *************** *** 56,117 **** .I addcol ! to do the work. This is inefficient but the inefficiency is rarely noticable.\Rogue\Monster\ ! else ! echo "will not over write ./doc/subtotal.1" ! fi ! if `test ! -s ./doc/union.1` ! then ! echo "writting ./doc/union.1" ! cat > ./doc/union.1 << '\Rogue\Monster\' ! .\" Man page for union(1) ! .TH UNION 1 "1. April 1989" ! .SH NAME ! union - appends one table to another ! .SH SYNOPSIS ! .B union ! .I file1\ file2 ! [ ! .I >\ outputfile ! ] ! .SH DESCRIPTION ! .LP ! The ! .I union ! command simply concatenates two files, appending the second to the ! first, but using only the header of the first file. ! .LP ! With the two files, ! .I data1: ! .nf ! first second third ! ----- ------ ----- ! 1 3 0 ! 1 2 3 ! .fi ! and ! .I data2: ! .nf ! first second third ! ----- ------ ----- ! 2 3 4 ! 3 4 5 ! 4 5 6 ! .fi ! the ! command ! .BI union\ data1\ data2 ! yields: ! .nf ! first second third ! ----- ------ ----- ! 1 3 0 ! 1 2 3 ! 2 3 4 ! 3 4 5 ! 4 5 6 ! .fi ! on the standard output. ! .LP ! Note that the two input files must have the same columns, ! in the same order. ! .SH "SEE ALSO" ! .BR reldb(1)\ cat(1). --- 56,57 ---- .I addcol ! to do the work. This is inefficient but the inefficiency is rarely noticable. *** /dev/null Tue Sep 26 10:45:31 1989 --- doc/union.1 Wed Apr 19 10:58:05 1989 *************** *** 0 **** --- 1,53 ---- + .\" Man page for union(1) + .TH UNION 1 "1. April 1989" + .SH NAME + union - appends one table to another + .SH SYNOPSIS + .B union + .I file1\ file2 + [ + .I >\ outputfile + ] + .SH DESCRIPTION + .LP + The + .I union + command simply concatenates two files, appending the second to the + first, but using only the header of the first file. + .LP + With the two files, + .I data1: + .nf + first second third + ----- ------ ----- + 1 3 0 + 1 2 3 + .fi + and + .I data2: + .nf + first second third + ----- ------ ----- + 2 3 4 + 3 4 5 + 4 5 6 + .fi + the + command + .BI union\ data1\ data2 + yields: + .nf + first second third + ----- ------ ----- + 1 3 0 + 1 2 3 + 2 3 4 + 3 4 5 + 4 5 6 + .fi + on the standard output. + .LP + Note that the two input files must have the same columns, + in the same order. + .SH "SEE ALSO" + .BR reldb(1)\ cat(1). *** plot1.src/README Tue Sep 26 11:25:12 1989 --- plot1.src/README Thu Sep 21 21:27:48 1989 *************** *** 21,25 **** Graplot will take plot(5)-data and write output for the grap-program. ! This is extremely handy for putting into a troff-style paper. ! I (gunnar@hafro) apologize for not having gotten formal permission from previous authors (notable Jim Constantine and Scott Sutherland) --- 21,25 ---- Graplot will take plot(5)-data and write output for the grap-program. ! This is extremely handy for putting graphics into a troff-style paper. ! I (gunnar@hafro.is) apologize for not having gotten formal permission from previous authors (notable Jim Constantine and Scott Sutherland) *** plot1.src/hpglplot.c Tue Sep 26 11:25:12 1989 --- plot1.src/hpglplot.c Mon Sep 25 21:33:03 1989 *************** *** 1,2 **** --- 1,20 ---- + /* This is hpgl.c -- a collection of plot(3) routines */ + /* which are called upon by the plotfilter.c-program */ + /* */ + /* These routines output HPGL plotting commands */ + /* Some routines have been added to the standard */ + /* plot(3)-library -- see below */ + /* */ + /* Contributors: */ + /* */ + /* Modified July 1989 by Jon von Tetzchner Stephenson */ + /* Several mods added by asta@hafro.is, early 1989 */ + /* See also comments in xplot.c */ + /* HP-GL plot(5) library */ + /* - does NOT do line locking */ + /* - aspect ratio is not maintained */ + /* Originally by: Jim Constantine */ + /* Copyright 1985 Sun Microsystems Inc. */ + #include *************** *** 5,19 **** ! /* HP-GL plot(5) library */ ! /* - does NOT do line locking */ ! /* - aspect ratio is not maintained */ ! /* Jim Constantine */ ! /* Copyright 1985 Sun Microsystems Inc. */ ! /* Extensions by asta@hafro.is (March, 1989) */ ! /* Prepared for redistribution by gunnar@hafro.is */ ! /* Notable features, which are really bugs: This ! program assumes it is writing to a device. That ! causes problems when writing to e.g. hpgl2ps filters. ! Use of some special HPGL escape sequences may also cause ! problems */ openpl() --- 23,29 ---- ! int loX=-999999,loY=-999999,hiX=999999,hiY=999999; ! int OUT=0; ! int saveX=-100,saveY=-100; + openpl() *************** *** 32,35 **** ! /*printf("IN;\033.P1:"); /* out - gs */ ! printf("IN;"); fflush(stdout); --- 42,44 ---- ! printf("IN;\033.P1:"); fflush(stdout); *************** *** 42,44 **** { ! printf("PU %d,%d;\n", x, y); } --- 51,57 ---- { ! OUT=check(&x,&y); ! saveX=x; ! saveY=y; ! if(! OUT) ! printf("PU %d,%d;\n", x, y); } *************** *** 47,49 **** { ! printf("PU %d,%d PD %d,%d;\n", x1, y1, x2, y2); } --- 60,68 ---- { ! int out1,out2; ! out1=check(&x1,&y1); ! out2=check(&x2,&y2); ! if (! (out1 && out2)) ! printf("PU %d,%d PD %d,%d;\n", x1, y1, x2, y2); ! saveX=x2; ! saveY=y2; } *************** *** 53,54 **** --- 72,74 ---- { + printf("PU %d,%d;\n", saveX, saveY); printf("LB%s\03;\n", s); *************** *** 58,60 **** { ! printf("PG;AF;\n"); /* feed page if paper has been writen on */ } --- 78,80 ---- { ! printf("PG;AF;\n"); /* feed page if paper has been written on */ } *************** *** 63,65 **** { ! printf("PU %d,%d PD PU;\n", x, y); } --- 83,87 ---- { ! OUT=check(&x,&y); ! if (! OUT) ! printf("PU %d,%d PD PU;\n", x, y); } *************** *** 68,70 **** { ! printf("PD %d,%d;\n", x, y); } --- 90,101 ---- { ! int outside; ! outside=check(&x,&y); ! if (! (outside && OUT)) ! { ! OUT=outside; ! printf("PU %d,%d;\n", saveX, saveY); ! printf("PD %d,%d;\n", x, y); ! } ! saveX=x; ! saveY=y; } *************** *** 122,124 **** labelrotation(s) ! char *s; { --- 153,155 ---- labelrotation(s) ! char *s; { *************** *** 171,173 **** selectcolor(s) ! char *s; { --- 202,204 ---- selectcolor(s) ! int s; { *************** *** 174,178 **** ! switch(s[1]) { ! case '1': /* select pen 1 */ printf("SP 1;\n"); --- 205,209 ---- ! switch(s) { ! case 1: /* select pen 1 */ printf("SP 1;\n"); *************** *** 180,182 **** ! case '2': /* select pen 2 */ printf("SP 2;\n"); --- 211,213 ---- ! case 2: /* select pen 2 */ printf("SP 2;\n"); *************** *** 184,186 **** ! case '3': /* select pen 3 */ printf("SP 3;\n"); --- 215,217 ---- ! case 3: /* select pen 3 */ printf("SP 3;\n"); *************** *** 188,190 **** ! case '4': /* select pen 4 */ printf("SP 4;\n"); --- 219,221 ---- ! case 4: /* select pen 4 */ printf("SP 4;\n"); *************** *** 192,194 **** ! case '5': /* select pen 5 */ printf("SP 5;\n"); --- 223,225 ---- ! case 5: /* select pen 5 */ printf("SP 5;\n"); *************** *** 196,198 **** ! case '6': /* select pen 6 */ printf("SP 6;\n"); --- 227,229 ---- ! case 6: /* select pen 6 */ printf("SP 6;\n"); *************** *** 200,202 **** ! case '7': /* select pen 7 */ printf("SP 7;\n"); --- 231,233 ---- ! case 7: /* select pen 7 */ printf("SP 7;\n"); *************** *** 204,206 **** ! case '8': /* select pen 8 */ printf("SP 8;\n"); --- 235,237 ---- ! case 8: /* select pen 8 */ printf("SP 8;\n"); *************** *** 219 **** --- 250,314 ---- + + /*********************************************************************** + * check by jvts * + ***********************************************************************/ + + check(x,y) + int *x,*y; + { + int outside=0; + if (*x>hiX) {*x=hiX;outside=1;} + else if (*xhiY) {*y=hiY;outside=1;} + else if (*y + #include *************** *** 25,26 **** --- 29,46 ---- + #define NUMLINES 5 /* for linemod */ + #define DOTTED_LIST_LENGTH 2 + #define DOT_DASHED_LIST_LENGTH 4 + #define SHORT_DASHED_LIST_LENGTH 2 + #define LONG_DASHED_LIST_LENGTH 2 + + + /* When the window command is not called, these values are used . */ + /* I hope they are large(small) enaugh. */ + + int loX=-999999,loY=-999999,hiX=999999,hiY=999999,oldX,oldY; + + int OUT=0; /* was last drawing outside of window ? */ + + int gcnum=4; /* to chose linemod (4=linesolid) */ + /* plot stuff */ *************** *** 31,33 **** char *label_pl; ! int xheight, yheight, width; int winX, winY, winW, winH; --- 51,53 ---- char *label_pl; ! int xheight, yheight, width,xxwidth,xxheight; int winX, winY, winW, winH; *************** *** 65,67 **** Window win; /* Window ID */ ! GC gc; /* GC to draw with */ char *fontName; /* Name of the font to use */ --- 85,87 ---- Window win; /* Window ID */ ! GC gc[NUMLINES]; /* GCs to draw with */ char *fontName; /* Name of the font to use */ *************** *** 75,78 **** char *geomSpec; /* Window geometry string */ ! XSetWindowAttributes xswa; /* Temporary Set Window Attribute struct Window win; --- 95,164 ---- char *geomSpec; /* Window geometry string */ ! XSetWindowAttributes xswa; /* Temporary Set Window Attribute struct */ Window win; + int COLOR=0; /* Are we using a color displaay ?? */ + + #define MAX_COLORS 9 /* I use 9 colors, no problem to use more */ + int colors[MAX_COLORS]; /* definitions of colors */ + int VERTICAL=0; + + + /************************************************************************* + * get_colors is a routine that is called from openpl. It checks if the * + * display uses color and if so sets the COLOR variable to 1 (TRUE) * + *************************************************************************/ + + get_colors() + { + int depth; + Visual *visual; + static char *name[]={"Black","Blue","Red","Green","Yellow","Cyan","Pink","Orange","Gold"}; + XColor exact_def; + Colormap cmap; + int ncolors=MAX_COLORS; + + int i; + + /* printf("in get colors\n"); */ + + depth=DisplayPlanes(dpy,DefaultScreen(dpy)); + visual=DefaultVisual(dpy,DefaultScreen(dpy)); + cmap=DefaultColormap(dpy,DefaultScreen(dpy)); + + if (depth==1) + { + /* printf("monocrome\n"); */ + bd=BlackPixel(dpy,DefaultScreen(dpy)); + bg=WhitePixel(dpy,DefaultScreen(dpy)); + fg=BlackPixel(dpy,DefaultScreen(dpy)); + } + else + { + for (i=0;imax_bounds.ascent + fontstruct->max_bounds.descent; --- 193,206 ---- if ((fontName = XGetDefault(dpy, argv_copy[0], ARG_FONT)) == NULL) { ! fontName = FONT; ! } ! if ((fontstruct = XLoadQueryFont(dpy, fontName)) == NULL) { ! if ((fontstruct = XLoadQueryFont(dpy,fontname2))==NULL) ! { ! fprintf(stderr, "%s: display %s doesn't know font %s\n", ! argv_copy[0], DisplayString(dpy), fontname2); ! exit(1); ! } ! } ! fth = fontstruct->max_bounds.ascent + fontstruct->max_bounds.descent; *************** *** 116,118 **** ! /* * Select colors for the border, the window background, and the --- 209,211 ---- ! /* * Select colors for the border, the window background, and the *************** *** 120,124 **** */ ! bd = BlackPixel(dpy, DefaultScreen(dpy)); ! bg = WhitePixel(dpy, DefaultScreen(dpy)); ! fg = BlackPixel(dpy, DefaultScreen(dpy)); --- 213,216 ---- */ ! ! get_colors(); *************** *** 144,146 **** } ! win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), --- 236,241 ---- } ! ! xxwidth=xsh.width; ! xxheight=xsh.height; ! win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), *************** *** 171,184 **** ! /* ! * Create the GC for plotting. See Section 5.3. ! */ ! ! gcv.font = fontstruct->fid; ! gcv.foreground = fg; ! gcv.background = bg; ! /* gcv.function=GXand; ! gcv.plane_mask=BlackPixel(dpy,DefaultScreen(dpy)) ^ ! WhitePixel(dpy,DefaultScreen(dpy)); */ ! gc = XCreateGC(dpy, win, (GCFont | GCForeground | GCBackground ), &gcv); ! /* --- 266,269 ---- ! set_dashes(); ! /* *************** *** 187,189 **** */ ! XSelectInput(dpy, win, ExposureMask); --- 272,274 ---- */ ! XSelectInput(dpy, win, ExposureMask| StructureNotifyMask); *************** *** 193,197 **** XMapWindow(dpy, win); ! XNextEvent(dpy, &event); ! } /************************************************************************/ --- 278,358 ---- XMapWindow(dpy, win); ! ! while(! done1) ! { ! ! XNextEvent(dpy,&event); ! switch(event.type) ! { ! case Expose: ! ! while (XCheckTypedEvent(dpy,Expose,&event)) ; ! ! ! done1=1; ! ! break; ! ! case ConfigureNotify: ! ! xxwidth=event.xconfigure.width; ! xxheight=event.xconfigure.height; ! break; ! ! ! default: /* all events selected by StructureNotifyMask except ConfigureNotify are */ ! /* thrown away here, since nothing is done with them */ ! ! done1=1; /* because of some problems with hafro */ ! break; ! } ! } ! ! } + + /**********************************************************************/ + /* set_dashes sets 5 diffrent gcs to be able to alter linemod quickly */ + /* called by openpl */ + /**********************************************************************/ + set_dashes() + /* + * Create the GC for plotting. See Section 5.3. + */ + { + int i; + static int dash_list_length[]= + { + DOTTED_LIST_LENGTH, + DOT_DASHED_LIST_LENGTH, + SHORT_DASHED_LIST_LENGTH, + LONG_DASHED_LIST_LENGTH + }; + + static unsigned char dotted[DOTTED_LIST_LENGTH]={3,1}; + static unsigned char dot_dashed[DOT_DASHED_LIST_LENGTH]={3,4,3,1}; + static unsigned char short_dashed[SHORT_DASHED_LIST_LENGTH]={4,4}; + static unsigned char long_dashed[LONG_DASHED_LIST_LENGTH]={4,7}; + + static unsigned char *dash_list[]= + { + dotted,dot_dashed,short_dashed,long_dashed + }; + int dash_offset=0; + gcv.font = fontstruct->fid; + gcv.foreground = fg; + gcv.background = bg; + /* gcv.function=GXand; + gcv.plane_mask=BlackPixel(dpy,DefaultScreen(dpy)) ^ + WhitePixel(dpy,DefaultScreen(dpy)); */ + + gcv.line_style=LineOnOffDash; + for (i=0; imax_bounds.ascent; ! XDrawString(dpy, win, gc, x, y, s, strlen(s)); XFlush(dpy); --- 516,518 ---- y=y-fth/2+fontstruct->max_bounds.ascent; ! XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s)); XFlush(dpy); *************** *** 288,290 **** y=y-fth/2+fontstruct->max_bounds.ascent; ! XDrawString(dpy, win, gc, x, y, s, strlen(s)); XFlush(dpy); --- 523,525 ---- y=y-fth/2+fontstruct->max_bounds.ascent; ! XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s)); XFlush(dpy); *************** *** 296,298 **** /* y=y+fth/2; */ ! XDrawString(dpy, win, gc, x, y, s, strlen(s)); XFlush(dpy); --- 531,533 ---- /* y=y+fth/2; */ ! XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s)); XFlush(dpy); *************** *** 299,301 **** break; ! default: /* center the label at the point */ --- 534,536 ---- break; ! default: /* center the label at the point */ *************** *** 304,306 **** /* y=y+fth/2; */ ! XDrawString(dpy, win, gc, x, y, s, strlen(s)); XFlush(dpy); --- 539,541 ---- /* y=y+fth/2; */ ! XDrawString(dpy, win, gc[gcnum], x, y, s, strlen(s)); XFlush(dpy); *************** *** 316,318 **** { - switch(s[1]) { --- 551,552 ---- *************** *** 353,355 **** /* labelrotation - a homemade function */ ! /* not implemented */ /************************************************************************/ --- 587,589 ---- /* labelrotation - a homemade function */ ! /* by jvts */ /************************************************************************/ *************** *** 362,363 **** --- 596,598 ---- case 'h': /* horizontal */ + VERTICAL=0; break; *************** *** 365,366 **** --- 600,602 ---- case 'v': /* vertical */ + VERTICAL=1; break; *************** *** 371,373 **** /* selectcolor - a homemade function */ ! /* not implemented */ /************************************************************************/ --- 607,609 ---- /* selectcolor - a homemade function */ ! /* by jvts */ /************************************************************************/ *************** *** 374,407 **** selectcolor(s) ! char *s; { ! ! switch(s[1]) { ! ! case '1': /* select pen 1 */ ! break; ! ! case '2': /* select pen 2 */ ! break; ! ! case '3': /* select pen 3 */ ! break; ! ! case '4': /* select pen 4 */ ! break; ! ! case '5': /* select pen 5 */ ! break; ! ! case '6': /* select pen 6 */ ! break; ! ! case '7': /* select pen 7 */ ! break; ! ! case '8': /* select pen 8 */ ! break; ! ! default: /* select pen 1 */ ! break; ! } } --- 610,624 ---- selectcolor(s) ! int s; { ! int i; ! if (COLOR) ! { ! if (s>=0 && shiX) {*x=hiX;outside=1;} + else if (*xhiY) {*y=hiY;outside=1;} + else if (*y