From decwrl!polyslo!uakari.primate.wisc.edu!ctrsol!ginosko!uunet!allbery Sun Sep 10 15:09:40 PDT 1989 Article 1077 of comp.sources.misc: Path: decwrl!polyslo!uakari.primate.wisc.edu!ctrsol!ginosko!uunet!allbery From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Newsgroups: comp.sources.misc Subject: v08i035: GnuPlot v1.10A (part 1 of 7) Message-ID: <66999@uunet.UU.NET> Date: 9 Sep 89 18:18:54 GMT Sender: allbery@uunet.UU.NET Reply-To: canoaf@ntvax.UUCP (Augustine Cano) Lines: 2253 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 8, Issue 35 Submitted-by: canoaf@ntvax.UUCP (Augustine Cano) Archive-name: gnuplot1.10A/part01 [OOPS!!! I had to patch these after receiving them -- and managed to lose the name of the person who submitted them in the process. Duh. The name shown is a "best guess". Submitter, please correct me. ++bsa] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh '1.dat' <<'END_OF_FILE' X-20.000000 -3.041676 X-19.000000 -3.036427 X-18.000000 -3.030596 X-17.000000 -3.024081 X-16.000000 -3.016755 X-15.000000 -3.008456 X-14.000000 -2.998978 X-13.000000 -2.988049 X-12.000000 -2.975310 X-11.000000 -2.960273 X-10.000000 -2.942255 X-9.000000 -2.920278 X-8.000000 -2.892883 X-7.000000 -2.857799 X-6.000000 -2.811295 X-5.000000 -2.746802 X-4.000000 -2.651635 X-3.000000 -2.498092 X-2.000000 -2.214297 X-1.000000 -1.570796 X0.000000 0.000000 X1.000000 1.570796 X2.000000 2.214297 X3.000000 2.498092 X4.000000 2.651635 X5.000000 2.746802 X6.000000 2.811295 X7.000000 2.857799 X8.000000 2.892883 X9.000000 2.920278 X10.000000 2.942255 X11.000000 2.960273 X12.000000 2.975310 X13.000000 2.988049 X14.000000 2.998978 X15.000000 3.008456 X16.000000 3.016755 X17.000000 3.024081 X18.000000 3.030596 X19.000000 3.036427 END_OF_FILE if test 781 -ne `wc -c <'1.dat'`; then echo shar: \"'1.dat'\" unpacked with wrong size! fi # end of '1.dat' fi if test -f '2.dat' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'2.dat'\" else echo shar: Extracting \"'2.dat'\" \(781 characters\) sed "s/^X//" >'2.dat' <<'END_OF_FILE' X-20.000000 -6.083352 X-19.000000 -6.072853 X-18.000000 -6.061191 X-17.000000 -6.048162 X-16.000000 -6.033510 X-15.000000 -6.016913 X-14.000000 -5.997955 X-13.000000 -5.976098 X-12.000000 -5.950620 X-11.000000 -5.920546 X-10.000000 -5.884511 X-9.000000 -5.840556 X-8.000000 -5.785765 X-7.000000 -5.715597 X-6.000000 -5.622591 X-5.000000 -5.493603 X-4.000000 -5.303271 X-3.000000 -4.996183 X-2.000000 -4.428595 X-1.000000 -3.141593 X0.000000 0.000000 X1.000000 3.141593 X2.000000 4.428595 X3.000000 4.996183 X4.000000 5.303271 X5.000000 5.493603 X6.000000 5.622591 X7.000000 5.715597 X8.000000 5.785765 X9.000000 5.840556 X10.000000 5.884511 X11.000000 5.920546 X12.000000 5.950620 X13.000000 5.976098 X14.000000 5.997955 X15.000000 6.016913 X16.000000 6.033510 X17.000000 6.048162 X18.000000 6.061191 X19.000000 6.072853 END_OF_FILE if test 781 -ne `wc -c <'2.dat'`; then echo shar: \"'2.dat'\" unpacked with wrong size! fi # end of '2.dat' fi if test -f '3.dat' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'3.dat'\" else echo shar: Extracting \"'3.dat'\" \(781 characters\) sed "s/^X//" >'3.dat' <<'END_OF_FILE' X-20.000000 -9.125028 X-19.000000 -9.109280 X-18.000000 -9.091787 X-17.000000 -9.072243 X-16.000000 -9.050265 X-15.000000 -9.025369 X-14.000000 -8.996933 X-13.000000 -8.964147 X-12.000000 -8.925931 X-11.000000 -8.880819 X-10.000000 -8.826766 X-9.000000 -8.760835 X-8.000000 -8.678648 X-7.000000 -8.573396 X-6.000000 -8.433886 X-5.000000 -8.240405 X-4.000000 -7.954906 X-3.000000 -7.494275 X-2.000000 -6.642892 X-1.000000 -4.712389 X0.000000 0.000000 X1.000000 4.712389 X2.000000 6.642892 X3.000000 7.494275 X4.000000 7.954906 X5.000000 8.240405 X6.000000 8.433886 X7.000000 8.573396 X8.000000 8.678648 X9.000000 8.760835 X10.000000 8.826766 X11.000000 8.880819 X12.000000 8.925931 X13.000000 8.964147 X14.000000 8.996933 X15.000000 9.025369 X16.000000 9.050265 X17.000000 9.072243 X18.000000 9.091787 X19.000000 9.109280 END_OF_FILE if test 781 -ne `wc -c <'3.dat'`; then echo shar: \"'3.dat'\" unpacked with wrong size! fi # end of '3.dat' fi if test -f '3b1.dem' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'3b1.dem'\" else echo shar: Extracting \"'3b1.dem'\" \(493 characters\) sed "s/^X//" >'3b1.dem' <<'END_OF_FILE' Xset yrange [-40:40] Xset samples 8 Xplot -20,-18,-16,-14,-4,-6,-8,-10 Xset yrange [-1.4:1.4] Xset xrange [-3*pi:3*pi] Xset samples 90 Xplot sin(x),sin(x+1),sin(x+2),sin(x+3) Xset yrange [-3:3] Xplot sin(x)**2+cos(x)**2,sin(x)**2,cos(x)**2 Xplot cos(x), 3*exp(-x**2.0/3.0), -1/cos(x)**2 Xnormal(x) = 1/sqrt(2*pi)*exp(-x**2/(2*pi)) Xset autoscale Xplot normal(x) Xset samples 360 Xset yrange [-.2:.5] Xset function style impulse Xreplot Xset xrange [-10:10] Xset autoscale Xset function style line Xset samples 160 END_OF_FILE if test 493 -ne `wc -c <'3b1.dem'`; then echo shar: \"'3b1.dem'\" unpacked with wrong size! fi # end of '3b1.dem' fi if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(7021 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X--------- Version 1.10A (Polar) README file --------- X XVersion 1.1.0A (Polar) of GNUPLOT includes ATT3b1 support and the commands XSET POLAR, SET OFFSETS, and PAUSE. Additionally, some bugs were fixed Xand new improved IBM-PC drivers were written in TURBO-C. The file version.c Xcontains a synopsis of differences between this GNUPLOT and version 1.1.0. X XAll that is needed to make gnuplot work is the gnuplot executable. Every Xthing else can be removed. The help command, however, won't work without a Xhelp executable and a gnuplot help directory tree. Gnuplot actually executes Xsystem(GNUHELP) to run the help command where GNUHELP is an environment Xvariable that contains the string to be executed. On unix this string might Xbe GNUHELP="/usr/local/bin/help gnuplot". X XNote that there is no file called "Makefile" in the main directory. Three Xdifferent makefiles are used for the 3 varieties of system where GNUPLOT Xis known to run: makefile.unx for UNIX systems (tested on ULTRIX), Xmakefile.3b1 for the UNIX PC (tested on System V 3.51a) and makefile.tc Xfor PC compatibles running DOS and Turbo C. Copy the appropriate one for Xyour system to "Makefile" and "make" the system. X XIn the help system directory, 2 makefiles are provided: makefile.unx Xfor all UNIX systems (including the UNIX PC) and makefile.tc for Turbo C. XAs above, copy the correct one for your system to "Makefile". X XThe help system supplied with this distribution will look first for an Xenvironment variable called HELPDIR and then in /usr/local/help for the Xdirectory tree requested. PC users will probably want to define HELPDIR Xto be the root directory that contains the gnuplot directory tree. X XOh yes, our attempts to reach vu-vlsi!plot failed. This seems to also Xbe the case for David F. Kotz who has developed another Xvariant of Gnuplot: GnuTeX. We discussed a merger of these efforts, but Xhis LaTeX version started from an earlier Gnuplot and has been added to Xextensively. X XWe turn you over now to your regularly scheduled release notes... X X--------- Version 1.10 README file --------- XThe GNUPLOT source code and executables may be copied and/or modified freely Xas long as the copyright messages are left intact. X XGNUPLOT has been tested on a Pyramid 90x (ucb 4.2 and att V), a VAX 8200 X(VMS 4.3), IBM PC's and AT's (MS-DOS 3.1, Microsoft C 4.0). The code is Xwritten with portability in mind, and it passes lint! If you have Xproblems, send mail to vu-vlsi!plot. And please send any modifications Xyou make so they can be #ifdef'd into later releases. X X X GNUPLOT 1.1 RELEASE NOTES X XNew terminal drivers: AED 512, BBN BitGraph, HP2623, POSTSCRIPT, Selanar, XVectrix 384. The PC version now supports Hercules and ATT 6300 monochrome Xgraphics. Thanks to those who sent these drivers in. X XNew commands: 'set dummy' and 'show dummy' to select the dummy variable Xname; 'replot' to repeat the last 'plot' command. X XThe exclamation point (!) is now accepted as postfix factorial operator. XThe gamma() function is also included, if your C library has gamma(). See XGAMMA below. X XLogical AND (&&) and OR (||) now short-circuit the way they do in C. That Xis, the second && operand is not evaluated if the first is false; the Xsecond || operand is not evaluated if the first is true. The ternary operator X(?:) also does not evaluate the unused operand. This change allows for the Xdefinition of recursive functions, e.g. a synonym for the ! factorial operator: X X fact(x) = (x<=1) ? 1 : x*fact(x-1) X XGNUPLOT now has a much better memory allocation scheme, replacing Xmost fixed-size arrays with malloc()'d linked lists. There is no longer Xany artificial maximum on the number of simultaneous plots, number of Xpoints in those plots, or the number of user-defined functions or Xvariables. All these are limited only by the memory available to Xmalloc(). This is a big improvement for memory-starved machines like XPDP-11s or PCs. X XLines beginning with # (also ! in VMS) are treated as comments. Only the X$ may now be used for a shell escape in VMS, since ! is a comment. X XThe PC version now has the 'help' command, thanks to code posted by XRobert Scott. X XSeveral old bugs have been superseded by new ones. X X X PREPROCESSOR #DEFINES X XThese #defines should be checked before compilation: X XVFORK Makefile define if you've got vfork() system call XGAMMA Makefile define if you've got gamma(3) XBCOPY Makefile define if your memcpy() is called bcopy() XNOCOPY Makefile define if you've don't have a memcpy() by any name Xbcopy() plot.h define if you've got a memcpy() by some OTHER name X (see example in plot.h) Xvms Makefile define if compiling under VMS; X automatically defined by DEC C XPC Makefile define if compiling on a PClone XMSDOS Makefile define if compiling under MSDOS; X automatically defined by Microsoft C 4.0 XAED Makefile define these if you want this terminal driver X included XBITGRAPH . (TEK must also be defined) XHP26 . XHP75 . XPOSTSCRIPT . XQMS . XREGIS . XSELANAR . (TEK must also be defined) XTEK . XUNIXPLOT . XV384 . X XHERCULES . same, but only if PC is defined XATT . XCORONA . X XHUGE plot.h define to be largest double if not defined X in XGNUTERM plot.h default terminal type if GNUTERM environment X variable not found at run-time XHELP plot.h default command spawned by 'help' command X if GNUHELP environment variable not found X at run-time XSHELL plot.h default shell to spawn if SHELL environment X variable not found at run-time X X X TO COMPILE X Xunder UNIX: type 'make' X Xunder VMS: type '@compile', then '@link'. Use the gnuplot.hlp file in the Xdocs directory to build the GNUPLOT.HLB file. X Xunder MSDOS: use 'make make.msc' for Microsoft C 4.0 or make makefile.tc Xfor Borland Turbo C. If you've got another compiler, you're on your own! XFor MSDOS help, use the gnuplot.hlp file to build the gnuplot subtree using Xthe HELPTREE program. Borland Turbo-C is the most recent support package, Xsee README.TC for more information. X X X ENVIRONMENT VARIABLES X XIf the environment variable GNUTERM is found, it is used as the terminal Xtype. X XIf the environment variable GNUHELP exists, it is used as the command to Xspawn for help. X XThe PC version looks for the environment variable GNUPLOT to contain Xthe name of the directory from which to load the initialization file XGNUPLOT.INI. See the help on 'start_up' for more information. END_OF_FILE if test 7021 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'README.3B1' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README.3B1'\" else echo shar: Extracting \"'README.3B1'\" \(6524 characters\) sed "s/^X//" >'README.3B1' <<'END_OF_FILE' X X GNUPLOT X Additional notes for users of X AT&T Unix PC 7300/3b1 X by X Augustine Cano X X X INTRODUCTION X X The following notes address peculiarities, problems, possible X improvements and instructions specific the the Unix PC version X of GNUPLOT. The port to the Unix PC was done by John Campbell X (CAMPBELL@NAUVAX.bitnet), who also integrated the help system, X added polar coordinates and fixed miscellaneous bugs. I X (Augustine Cano, canoaf@dept.csci.unt.edu) made the makefiles X easier to use and was a beta tester. X X The "README" file in this directory contains important information X about the different makefiles and how to rename them to "make" X GNUPLOT on the various systems supported. Reading that file X and at least the following INSTALLATION section will make it X much easier to configure and install GNUPLOT. X X X INSTALLATION X X The much friendlier makefile.3b1 makes it very easy to install X this package. All that is needed is to "make all" and "make X install". As usual, look over the makefile to make sure that X the default destinations do not conflict with anything on your X system. X X The distribution consists essentially of three parts: gnuplot X itself, the help program and the documentation (which is used to X build the help tree used by the help program). If you want to X look over the details of the sub-systems, look at the makefiles X in ./help and ./docs respectively; otherwise, the top-level X makefile will take care of compiling and installing everything. X It is important that the directory /usr/local/help exist, X otherwise the creation of the help tree will fail. X The default destinations are as follows: X X gnuplot - /usr/local/bin X manual page - /usr/man/man1 X help system - /usr/local/help X help tree root - /usr/local/help/gnuplot X X Note that this is only relevant to "make install". If you want to X test the system in your current directory, before final installation, X you can "make all" and then go to ./docs and create the help tree X there. You will then have to define the following environment X variables so that gnuplot knows about the non-standard locations: X X GNUHELP='./help/help gnuplot' X HELPDIR='./docs' X X An easy way of testing GNUPLOT is to "load" the .dem files. X Typing help at the "gnuplot>" prompt will enter the help system. X Step by step instructions are given there. goes to the X previous level and returns you to GNUPLOT from any level. X Two consecutive s at the top level of the help tree will X also return to the "gnuplot>" prompt. X X Given that the help system does not have its own Unix-PC specific X makefile, if you want to compile it with the shared library, you will X have to uncomment the appropriate 'ld' line in help system Makefile. X X X PROBLEMS, UNIX PC PECULIARITIES, IMPROVEMENTS X X In an attempt to get the program out as soon as possible, it was X decided that certain minor problems, incompatibilities with other X programs and improvements would be dealt with later. If you have X suggestions, fixes or improvements, send them to John Campbell X (jdc@naucse.uucp). X X The primary area of conflict is the larger than 24 lines display X of the Unix PC. Ideally, as much of it should be used in a way X that would not make this version radically different from that of X other machines. X X One problem was caused by contention between GNUPLOT and sysinfo, X the program written by Lenny Tropiano (lenny@icus.islp.ny.us). This X program updates the two bottom lines of the screen (the same ones X used by the UA to display the soft key labels) every 15 seconds with X miscellaneous system information. GNUPLOT uses these two lines X to display range information, and it would be invariably overwritten X in less than 15 seconds. John created a patch for sysinfo available X for FTP access from dept.csci.unt.edu (IP number 129.120.1.2). The X file is called sysinfo.patch. It prevents sysinfo from updating the X two bottom lines if they are being used by another program (this works X with the UA too.) X X In order to have the largest graphics window possible, GNUPLOT uses X the uppermost status line, where the date, time, and various icons X reside. When switching to another window, the date, time and icons X are not restored and they should be. X X The "gnuplot>" prompt appears inside the graphics window. Any input X makes this window scroll upwards. It would be much more elegant to X to use the line immediately below the graphics screen for input. X One possible solution, that would solve this and also free the two X bottom lines for sysinfo and the UA, would configure the 4 bottom X lines of the screen like this: X X| bottom of the graphics screen | X_______________________________________________________________________________ Xgnuplot > < this area for input > < first line of range info > |working| X< this area for error messages > < second line of range info> | icon | X< this line used by sysinfo and for soft key labeling > X< this line used by sysinfo and for soft key labeling > X_______________________________________________________________________________ X X One problem is that the input area is not very big. A solution X (other than overwriting the first line of the range info) would be X to use the scheme that ksh uses to edit the command line (if you X get to column 80, a '<' appears there and your command gets shifted X to the left.) This way, you could use vi for command line editing. X Neat, but it could be more trouble than it's worth, and you would X not see long formulas all at once. Alternatively, the range info X could be left where it is and the input area and error messages X line extended up to the "working" icon, or the "working" icon X suppressed until the line is no longer needed (is this possible X without hacking the kernel?) X X Yet another option would be to have a text window pop up when input X is required or help text needs to be output. The range information X would stay where it currently is. This solution would, of course, X use real tam windows and thus allow switching from one window to X another if gnuplot were in "text" mode. X X Ideally, when gnuplot exits, it should leave the two bottom lines X alone (not clearing them) if what is in them was not written by it. X X Finally, and this is a matter of preference, some people might want X gnuplot to clear the screen (the graphics window) or restore the X previous contents when exiting. END_OF_FILE if test 6524 -ne `wc -c <'README.3B1'`; then echo shar: \"'README.3B1'\" unpacked with wrong size! fi # end of 'README.3B1' fi if test -f 'aed.trm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'aed.trm'\" else echo shar: Extracting \"'aed.trm'\" \(1946 characters\) sed "s/^X//" >'aed.trm' <<'END_OF_FILE' X#define AED_XMAX 768 X#define AED_YMAX 575 X X#define AED_XLAST (AED_XMAX - 1) X#define AED_YLAST (AED_YMAX - 1) X X#define AED_VCHAR 13 X#define AED_HCHAR 8 X#define AED_VTIC 8 X#define AED_HTIC 7 X X/* slightly different for AED 512 */ X#define AED5_XMAX 512 X#define AED5_XLAST (AED5_XMAX - 1) X XAED_init() X{ X fprintf(outfile, X "\033SEN3DDDN.SEC.7.SCT.0.1.80.80.90.SBC.0.AAV2.MOV.0.9.CHR.0.FFD"); X/* 2 3 4 5 7 6 1 X 1. Clear Screen X 2. Set Encoding X 3. Set Default Color X 4. Set Backround Color Table Entry X 5. Set Backround Color X 6. Move to Bottom Lefthand Corner X 7. Anti-Alias Vectors X*/ X} X X XAED_graphics() X{ X fprintf(outfile,"\033FFD\033"); X} X X XAED_text() X{ X fprintf(outfile,"\033MOV.0.9.SEC.7.XXX"); X} X X X XAED_linetype(linetype) Xint linetype; X{ Xstatic int color[2+9] = { 7, 1, 6, 2, 3, 5, 1, 6, 2, 3, 5 }; Xstatic int type[2+9] = { 85, 85, 255, 255, 255, 255, 255, 85, 85, 85, 85 }; X X if (linetype >= 10) X linetype %= 10; X fprintf(outfile,"\033SLS%d.255.",type[linetype+2]); X fprintf(outfile,"\033SEC%d.",color[linetype+2]); X} X X X XAED_move(x,y) Xint x,y; X{ X fprintf(outfile,"\033MOV%d.%d.",x,y); X} X X XAED_vector(x,y) Xint x,y; X{ X fprintf(outfile,"\033DVA%d.%d.",x,y); X} X X XAED_lrput_text(row,str) /* write text to screen while still in graphics mode */ Xint row; Xchar str[]; X{ X AED_move(AED_XMAX-((strlen(str)+2)*AED_HCHAR),AED_VTIC+AED_VCHAR*(row+1)); X fprintf(outfile,"\033XXX%s\033",str); X} X X XAED5_lrput_text(row,str) /* same, but for AED 512 */ Xint row; Xchar str[]; X{ X AED_move(AED5_XMAX-((strlen(str)+2)*AED_HCHAR),AED_VTIC+AED_VCHAR*(row+1)); X fprintf(outfile,"\033XXX%s\033",str); X} X X XAED_ulput_text(row,str) /* write text to screen while still in graphics mode */ Xint row; Xchar str[]; X{ X AED_move(AED_HTIC*2,AED_YMAX-AED_VTIC-AED_VCHAR*(row+1)); X fprintf(outfile,"\033XXX%s\033",str); X} X X X#define hxt (AED_HTIC/2) X#define hyt (AED_VTIC/2) X XAED_reset() X{ X fprintf(outfile,"\033SCT0.1.0.0.0.SBC.0.FFD"); X} X X END_OF_FILE if test 1946 -ne `wc -c <'aed.trm'`; then echo shar: \"'aed.trm'\" unpacked with wrong size! fi # end of 'aed.trm' fi if test -f 'bitgraph.trm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'bitgraph.trm'\" else echo shar: Extracting \"'bitgraph.trm'\" \(1025 characters\) sed "s/^X//" >'bitgraph.trm' <<'END_OF_FILE' X/* thanks to dukecdu!evs (Ed Simpson) for the BBN BitGraph driver */ X#define BG_XMAX 768 /* width of plot area */ X#define BG_YMAX 768 /* height of plot area */ X#define BG_SCREEN_HEIGHT 1024 /* full screen height */ X X#define BG_XLAST (BG_XMAX - 1) X#define BG_YLAST (BG_YMAX - 1) X X#define BG_VCHAR 16 X#define BG_HCHAR 9 X#define BG_VTIC 8 X#define BG_HTIC 8 X X X#define BG_init TEK40init X X#define BG_graphics TEK40graphics X X X#define BG_linetype TEK40linetype X X#define BG_move TEK40move X X#define BG_vector TEK40vector X X XBG_text() X{ X BG_move(0, BG_SCREEN_HEIGHT - 2 * BG_VCHAR); X fprintf(outfile,"\037"); X/* 1 X 1. into alphanumerics X*/ X} X X XBG_lrput_text(row,str) Xunsigned int row; Xchar str[]; X{ X BG_move(BG_XMAX - BG_HTIC - BG_HCHAR*(strlen(str)+1), X BG_VTIC + BG_VCHAR*(row+1)); X fprintf(outfile,"\037%s\n",str); X} X X XBG_ulput_text(row,str) Xunsigned int row; Xchar str[]; X{ X BG_move(BG_HTIC, BG_YMAX - BG_VTIC - BG_VCHAR*(row+1)); X fprintf(outfile,"\037%s\n",str); X} X X X#define BG_reset TEK40reset X X END_OF_FILE if test 1025 -ne `wc -c <'bitgraph.trm'`; then echo shar: \"'bitgraph.trm'\" unpacked with wrong size! fi # end of 'bitgraph.trm' fi if test -f 'command.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'command.c'\" else echo shar: Extracting \"'command.c'\" \(23912 characters\) sed "s/^X//" >'command.c' <<'END_OF_FILE' X/* X * X * G N U P L O T -- command.c X * X * Copyright (C) 1986, 1987 Thomas Williams, Colin Kelley X * X * You may use this code as you wish if credit is given and this message X * is retained. X * X * Please e-mail any useful additions to vu-vlsi!plot so they may be X * included in later releases. X * X * This file should be edited with 4-column tabs! (:set ts=4 sw=4 in vi) X */ X X#include X#include X X#ifdef MSDOS X#include X#endif X X#include "plot.h" X X#ifndef STDOUT X#define STDOUT 1 X#endif X X/* X * global variables to hold status of 'set' options X * X */ XBOOLEAN polar = FALSE; XBOOLEAN autoscale = TRUE; Xchar dummy_var[MAX_ID_LEN+1] = "x"; Xenum PLOT_STYLE data_style = POINTS, X func_style = LINES; XBOOLEAN log_x = FALSE, X log_y = FALSE; XFILE* outfile; Xchar outstr[MAX_ID_LEN+1] = "STDOUT"; Xint samples = SAMPLES; Xint term = 0; /* unknown term is 0 */ Xdouble xmin = -10.0, X xmax = 10.0, X ymin = -10.0, X ymax = 10.0; Xdouble loff = 0.0, X roff = 0.0, X toff = 0.0, X boff = 0.0; Xdouble zero = ZERO; /* zero threshold, not 0! */ X X XBOOLEAN screen_ok; XBOOLEAN term_init; XBOOLEAN undefined; X X/* X * instead of X */ X Xchar *gets(),*getenv(); Xchar *strcpy(),*strncpy(),*strcat(); X Xchar *malloc(); X Xdouble magnitude(),angle(),real(),imag(); Xstruct value *const_express(), *pop(), *complex(); Xstruct at_type *temp_at(), *perm_at(); Xstruct udft_entry *add_udf(); Xstruct udvt_entry *add_udv(); X Xextern struct termentry term_tbl[]; X Xstruct lexical_unit token[MAX_TOKENS]; Xchar input_line[MAX_LINE_LEN+1] = "set term "; Xchar c_dummy_var[MAX_ID_LEN+1]; /* current dummy var */ Xint num_tokens, c_token; X Xstruct curve_points *first_plot = NULL; Xstruct udft_entry plot_func, *dummy_func; X Xstatic char replot_line[MAX_LINE_LEN+1]; Xstatic int plot_token; /* start of 'plot' command */ Xstatic char help[MAX_LINE_LEN] = HELP; X Xcom_line() X{ X read_line(); X X screen_ok = TRUE; /* so we can flag any new output */ X X do_line(); X} X X Xdo_line() /* also used in load_file */ X{ X if (is_comment(input_line[0])) X return; X if (is_system(input_line[0])) { X do_system(); X fputs("!\n",stderr); X return; X } X num_tokens = scanner(input_line); X c_token = 0; X while(c_token < num_tokens) { X command(); X if (c_token < num_tokens) /* something after command */ X if (equals(c_token,";")) X c_token++; X else X int_error("';' expected",c_token); X } X} X X X Xcommand() X{ Xstatic char sv_file[MAX_LINE_LEN+1]; X /* string holding name of save or load file */ X X c_dummy_var[0] = '\0'; /* no dummy variable */ X X if (is_definition(c_token)) X define(); X else if (equals(c_token,"help") || equals(c_token,"?")) { X register int len; X register char *help_ptr; X X c_token++; X if ((help_ptr = getenv("GNUHELP"))) /* initial command */ X (void) strncpy(help,help_ptr,sizeof(help) - 1); X else X (void) strncpy(help,HELP,sizeof(help) - 1); X X while (!(END_OF_COMMAND)) { X len = strlen(help); X help[len] = ' '; /* put blank between help segments */ X copy_str(help+len+1,c_token++); X } X do_help(); X screen_ok = FALSE; X c_token++; X } X else if (almost_equals(c_token,"pa$use")) { X struct value a; X int stime, text=0, len; X char buf[MAX_LINE_LEN+1], *ptr; X X c_token++; X stime = (int )real(const_express(&a)); X if (!(END_OF_COMMAND)) { X if (!isstring(c_token)) X int_error("expecting string",c_token); X else { X /* Unfortunately, quote_str has a ID limit. */ X len = token[c_token].length - 2; X ptr = &input_line[token[c_token].start_index+1]; X fprintf (stderr, "%.*s", len,ptr); X text = 1; X } X } X if (stime < 0) fgets (buf,MAX_LINE_LEN,stdin); /* Hold until CR hit. */ X if (stime > 0) sleep(stime); X if (text != 0 && stime >= 0) fprintf (stderr,"\n"); X c_token++; X screen_ok = FALSE; X } X else if (almost_equals(c_token,"pr$int")) { X struct value a; X X c_token++; X (void) const_express(&a); X (void) putc('\t',stderr); X disp_value(stderr,&a); X (void) putc('\n',stderr); X screen_ok = FALSE; X } X else if (almost_equals(c_token,"p$lot")) { X plot_token = c_token++; X plotrequest(); X } X else if (almost_equals(c_token,"rep$lot")) { X if (replot_line[0] == '\0') X int_error("no previous plot",c_token); X (void) strcpy(input_line,replot_line); X screen_ok = FALSE; X num_tokens = scanner(input_line); X c_token = 1; /* skip the 'plot' part */ X plotrequest(); X } X else if (almost_equals(c_token,"se$t")) X set_stuff(); X else if (almost_equals(c_token,"sh$ow")) X show_stuff(); X else if (almost_equals(c_token,"cl$ear")) { X if (!term_init) { X (*term_tbl[term].init)(); X term_init = TRUE; X } X (*term_tbl[term].graphics)(); X (*term_tbl[term].text)(); X (void) fflush(outfile); X screen_ok = FALSE; X c_token++; X } X else if (almost_equals(c_token,"she$ll")) { X do_shell(); X screen_ok = FALSE; X c_token++; X } X else if (almost_equals(c_token,"sa$ve")) { X if (almost_equals(++c_token,"f$unctions")) { X if (!isstring(++c_token)) X int_error("expecting filename",c_token); X else { X quote_str(sv_file,c_token); X save_functions(fopen(sv_file,"w")); X } X } X else if (almost_equals(c_token,"v$ariables")) { X if (!isstring(++c_token)) X int_error("expecting filename",c_token); X else { X quote_str(sv_file,c_token); X save_variables(fopen(sv_file,"w")); X } X } X else if (isstring(c_token)) { X quote_str(sv_file,c_token); X save_all(fopen(sv_file,"w")); X } X else { X int_error( X "filename or keyword 'functions' or 'variables' expected",c_token); X } X c_token++; X } X else if (almost_equals(c_token,"l$oad")) { X if (!isstring(++c_token)) X int_error("expecting filename",c_token); X else { X quote_str(sv_file,c_token); X load_file(fopen(sv_file,"r")); X /* input_line[] and token[] now destroyed! */ X c_token = num_tokens = 0; X } X } X else if (almost_equals(c_token,"ex$it") || X almost_equals(c_token,"q$uit")) { X done(IO_SUCCESS); X } X else if (!equals(c_token,";")) { /* null statement */ X int_error("invalid command",c_token); X } X} X X Xenum PLOT_STYLE Xget_style() X{ Xregister enum PLOT_STYLE ps; X X c_token++; X if (almost_equals(c_token,"l$ines")) X ps = LINES; X else if (almost_equals(c_token,"i$mpulses")) X ps = IMPULSES; X else if (almost_equals(c_token,"p$oints")) X ps = POINTS; X else X int_error("expecting 'lines', 'points', or 'impulses'",c_token); X c_token++; X return(ps); X} X X Xset_stuff() X{ Xstatic char testfile[MAX_LINE_LEN+1]; X X if (almost_equals(++c_token,"a$utoscale")) { X autoscale = TRUE; X c_token++; X } X else if (almost_equals(c_token,"noa$utoscale")) { X autoscale = FALSE; X c_token++; X } X else if (almost_equals(c_token,"po$lar")) { X polar = TRUE; X xmin = 0.0; X xmax = 2*Pi; X c_token++; X } X else if (almost_equals(c_token,"nopo$lar")) { X polar = FALSE; X xmin = -10.0; X xmax = 10.0; X c_token++; X } X else if (almost_equals(c_token,"d$ata")) { X c_token++; X if (!almost_equals(c_token,"s$tyle")) X int_error("expecting keyword 'style'",c_token); X data_style = get_style(); X } X else if (almost_equals(c_token,"d$ummy")) { X c_token++; X copy_str(dummy_var,c_token++); X } X else if (almost_equals(c_token,"f$unction")) { X c_token++; X if (!almost_equals(c_token,"s$tyle")) X int_error("expecting keyword 'style'",c_token); X func_style = get_style(); X } X else if (almost_equals(c_token,"l$ogscale")) { X c_token++; X if (equals(c_token,"x")) { X log_y = FALSE; X log_x = TRUE; X c_token++; X } X else if (equals(c_token,"y")) { X log_x = FALSE; X log_y = TRUE; X c_token++; X } X else if (equals(c_token,"xy") || equals(c_token,"yx")) { X log_x = log_y = TRUE; X c_token++; X } X else X int_error("expecting 'x', 'y', or 'xy'",c_token); X } X else if (almost_equals(c_token,"nol$ogscale")) { X log_x = log_y = FALSE; X c_token++; X } X else if (almost_equals(c_token,"of$fsets")) { X c_token++; X if (END_OF_COMMAND) { X loff = roff = toff = boff = 0.0; /* Reset offsets */ X } X else { X load_offsets (&loff,&roff,&toff,&boff); X } X } X else if (almost_equals(c_token,"o$utput")) { X register FILE *f; X X c_token++; X if (END_OF_COMMAND) { /* no file specified */ X UP_redirect (4); X#ifdef VMS X if (outfile != stdout) /* Never close stdout */ X#endif X (void) fclose(outfile); X#ifdef VMS X outfile = stdout; /* Avoid the dup... */ X#else X outfile = fdopen(dup(STDOUT), "w"); X#endif X term_init = FALSE; X (void) strcpy(outstr,"STDOUT"); X } else if (!isstring(c_token)) X int_error("expecting filename",c_token); X else { X quote_str(testfile,c_token); X if (!(f = fopen(testfile,"w"))) { X os_error("cannot open file; output not changed",c_token); X } X#ifdef VMS X if (outfile != stdout) /* Never close stdout */ X#endif X (void) fclose(outfile); X outfile = f; X term_init = FALSE; X outstr[0] = '\''; X (void) strcat(strcpy(outstr+1,testfile),"'"); X UP_redirect (1); X } X c_token++; X } X else if (almost_equals(c_token,"sa$mples")) { X register int tsamp; X struct value a; X X c_token++; X tsamp = (int)magnitude(const_express(&a)); X if (tsamp < 1) X int_error("sampling rate must be > 0; sampling unchanged", X c_token); X else { X register struct curve_points *f_p = first_plot; X X first_plot = NULL; X cp_free(f_p); X samples = tsamp; X } X } X else if (almost_equals(c_token,"t$erminal")) { X c_token++; X if (END_OF_COMMAND) { X list_terms(); X screen_ok = FALSE; X } X else X term = set_term(c_token); X c_token++; X } X else if (almost_equals(c_token,"x$range")) { X c_token++; X if (!equals(c_token,"[")) X int_error("expecting '['",c_token); X c_token++; X load_range(&xmin,&xmax); X if (!equals(c_token,"]")) X int_error("expecting ']'",c_token); X c_token++; X } X else if (almost_equals(c_token,"y$range")) { X c_token++; X if (!equals(c_token,"[")) X int_error("expecting '['",c_token); X c_token++; X load_range(&ymin,&ymax); X autoscale = FALSE; X if (!equals(c_token,"]")) X int_error("expecting ']'",c_token); X c_token++; X } X else if (almost_equals(c_token,"z$ero")) { X struct value a; X c_token++; X zero = magnitude(const_express(&a)); X } X else X int_error( X "valid set options: '[no]autoscale', 'data', 'dummy', 'function',\n\ X'[no]logscale', 'offsets', 'output', '[no]polar', 'samples',\n\ X'terminal', 'xrange', 'yrange', 'zero'", X c_token); X} X X Xshow_stuff() X{ X if (almost_equals(++c_token,"ac$tion_table") || X equals(c_token,"at") ) { X c_token++; X show_at(); X c_token++; X } X else if (almost_equals(c_token,"au$toscale")) { X (void) putc('\n',stderr); X show_autoscale(); X c_token++; X } X else if (almost_equals(c_token,"d$ata")) { X c_token++; X if (!almost_equals(c_token,"s$tyle")) X int_error("expecting keyword 'style'",c_token); X (void) putc('\n',stderr); X show_style("data",data_style); X c_token++; X } X else if (almost_equals(c_token,"d$ummy")) { X fprintf(stderr,"\n\tdummy variable is %s\n",dummy_var); X c_token++; X } X else if (almost_equals(c_token,"f$unctions")) { X c_token++; X if (almost_equals(c_token,"s$tyle")) { X (void) putc('\n',stderr); X show_style("functions",func_style); X c_token++; X } X else X show_functions(); X } X else if (almost_equals(c_token,"l$ogscale")) { X (void) putc('\n',stderr); X show_logscale(); X c_token++; X } X else if (almost_equals(c_token,"of$fsets")) { X (void) putc('\n',stderr); X show_offsets(); X c_token++; X } X else if (almost_equals(c_token,"o$utput")) { X (void) putc('\n',stderr); X show_output(); X c_token++; X } X else if (almost_equals(c_token,"po$lar")) { X (void) putc('\n',stderr); X show_polar(); X c_token++; X } X else if (almost_equals(c_token,"sa$mples")) { X (void) putc('\n',stderr); X show_samples(); X c_token++; X } X else if (almost_equals(c_token,"t$erminal")) { X (void) putc('\n',stderr); X show_term(); X c_token++; X } X else if (almost_equals(c_token,"v$ariables")) { X show_variables(); X c_token++; X } X else if (almost_equals(c_token,"ve$rsion")) { X show_version(); X c_token++; X } X else if (almost_equals(c_token,"x$range")) { X (void) putc('\n',stderr); X show_range('x',xmin,xmax); X c_token++; X } X else if (almost_equals(c_token,"y$range")) { X (void) putc('\n',stderr); X show_range('y',ymin,ymax); X c_token++; X } X else if (almost_equals(c_token,"z$ero")) { X (void) putc('\n',stderr); X show_zero(); X c_token++; X } X else if (almost_equals(c_token,"a$ll")) { X c_token++; X show_version(); X show_polar(); X fprintf(stderr,"\tdummy variable is %s\n",dummy_var); X show_style("data",data_style); X show_style("functions",func_style); X show_output(); X show_term(); X show_samples(); X show_logscale(); X show_autoscale(); X show_zero(); X show_range('x',xmin,xmax); X show_range('y',ymin,ymax); X show_offsets(); X show_variables(); X show_functions(); X c_token++; X } X else X int_error( X "valid show options: 'action_table', 'all', 'autoscale', 'data',\n\ X'dummy', 'function', 'logscale', 'offsets', 'output', 'polar',\n\ X'samples', 'terminal', 'variables', 'version', 'xrange', 'yrange', 'zero'", Xc_token); X screen_ok = FALSE; X (void) putc('\n',stderr); X} X X Xload_offsets (a, b, c, d) Xdouble *a,*b, *c, *d; X{ Xstruct value t; X X *a = real (const_express(&t)); /* loff value */ X c_token++; X if (equals(c_token,",")) X c_token++; X if (END_OF_COMMAND) X return; X X *b = real (const_express(&t)); /* roff value */ X c_token++; X if (equals(c_token,",")) X c_token++; X if (END_OF_COMMAND) X return; X X *c = real (const_express(&t)); /* toff value */ X c_token++; X if (equals(c_token,",")) X c_token++; X if (END_OF_COMMAND) X return; X X *d = real (const_express(&t)); /* boff value */ X c_token++; X} X X Xload_range(a,b) Xdouble *a,*b; X{ Xstruct value t; X X if (equals(c_token,"]")) X return; X if (END_OF_COMMAND) { X int_error("starting range value or ':' expected",c_token); X } else if (!equals(c_token,"to") && !equals(c_token,":")) { X *a = real(const_express(&t)); X } X if (!equals(c_token,"to") && !equals(c_token,":")) X int_error("':' expected",c_token); X c_token++; X if (!equals(c_token,"]")) X *b = real(const_express(&t)); X} X X Xplotrequest() X{ X X if (!term) /* unknown */ X int_error("use 'set term' to set terminal type first",c_token); X X if (equals(c_token,"[")) { X c_token++; X if (isletter(c_token)) { X copy_str(c_dummy_var,c_token++); X if (equals(c_token,"=")) X c_token++; X else X int_error("'=' expected",c_token); X } X load_range(&xmin,&xmax); X if (!equals(c_token,"]")) X int_error("']' expected",c_token); X c_token++; X } X X if (equals(c_token,"[")) { /* set optional y ranges */ X c_token++; X load_range(&ymin,&ymax); X autoscale = FALSE; X if (!equals(c_token,"]")) X int_error("']' expected",c_token); X c_token++; X } X X eval_plots(); X} X X Xdefine() X{ Xregister int start_token; /* the 1st token in the function definition */ Xregister struct udvt_entry *udv; Xregister struct udft_entry *udf; X X if (equals(c_token+1,"(")) { X /* function ! */ X start_token = c_token; X copy_str(c_dummy_var, c_token + 2); X c_token += 5; /* skip (, dummy, ) and = */ X if (END_OF_COMMAND) X int_error("function definition expected",c_token); X udf = dummy_func = add_udf(start_token); X if (udf->at) /* already a dynamic a.t. there */ X free((char *)udf->at); /* so free it first */ X if (!(udf->at = perm_at())) X int_error("not enough memory for function",start_token); X m_capture(&(udf->definition),start_token,c_token-1); X } X else { X /* variable ! */ X start_token = c_token; X c_token +=2; X udv = add_udv(start_token); X (void) const_express(&(udv->udv_value)); X udv->udv_undef = FALSE; X } X} X X Xget_data(this_plot) Xstruct curve_points *this_plot; X{ Xstatic char data_file[MAX_LINE_LEN+1], line[MAX_LINE_LEN+1]; Xregister int i, overflow, l_num; Xregister FILE *fp; Xfloat x, y; X X quote_str(data_file, c_token); X this_plot->plot_type = DATA; X if (!(fp = fopen(data_file, "r"))) X os_error("can't open data file", c_token); X X l_num = 0; X X overflow = i = 0; X X while (fgets(line, MAX_LINE_LEN, fp)) { X l_num++; X if (is_comment(line[0]) || ! line[1]) /* line[0] will be '\n' */ X continue; /* ignore comments and blank lines */ X X if (i == samples+1) { X overflow = i; /* keep track for error message later */ X i--; /* so we don't fall off end of points[i] */ X } X switch (sscanf(line, "%f %f", &x, &y)) { X case 1: /* only one number on the line */ X y = x; /* so use it as the y value, */ X x = i; /* and use the index as the x */ X /* no break; !!! */ X case 2: X this_plot->points[i].undefined = TRUE; X if (x >= xmin && x <= xmax && (autoscale || X (y >= ymin && y <= ymax))) { X if (log_x) { X if (x <= 0.0) X break; X this_plot->points[i].x = log10(x); X } else X this_plot->points[i].x = x; X if (log_y) { X if (y <= 0.0) X break; X this_plot->points[i].y = log10(y); X } else X this_plot->points[i].y = y; X if (autoscale) { X if (y < ymin) ymin = y; X if (y > ymax) ymax = y; X } X X this_plot->points[i].undefined = FALSE; X } X if (overflow) X overflow++; X else X i++; X break; X X default: X (void) sprintf(line, "bad data on line %d", l_num); X int_error(line,c_token); X } X } X if (overflow) { X (void) sprintf(line, X "%d data points found--samples must be set at least this high",overflow); X /* actually, samples can be one less! */ X int_error(line,c_token); X } X this_plot->p_count = i; X (void) fclose(fp); X} X X Xeval_plots() X{ Xregister int i; Xregister struct curve_points *this_plot, **tp_ptr; Xregister int start_token, mysamples; Xregister double x_min, x_max, y_min, y_max, x; Xregister double xdiff, temp; Xregister int plot_num; Xstatic struct value a; X X /* don't sample higher than output device can handle! */ X mysamples = (samples <= term_tbl[term].xmax) ?samples :term_tbl[term].xmax; X X if (log_x) { X if (xmin < 0.0 || xmax < 0.0) X int_error("x range must be above 0 for log scale!",NO_CARET); X x_min = log10(xmin); X x_max = log10(xmax); X } else { X x_min = xmin; X x_max = xmax; X } X X if (autoscale) { X ymin = HUGE; X ymax = -HUGE; X } else if (log_y && (ymin <= 0.0 || ymax <= 0.0)) X int_error("y range must be above 0 for log scale!", X NO_CARET); X X xdiff = (x_max - x_min) / mysamples; X X tp_ptr = &(first_plot); X plot_num = 0; X X while (TRUE) { X if (END_OF_COMMAND) X int_error("function to plot expected",c_token); X X start_token = c_token; X X if (is_definition(c_token)) { X define(); X } else { X plot_num++; X if (*tp_ptr) X this_plot = *tp_ptr; X else { /* no memory malloc()'d there yet */ X this_plot = (struct curve_points *) X malloc((unsigned int) (sizeof(struct curve_points) - X (MAX_POINTS - (samples+1))*sizeof(struct coordinate))); X if (!this_plot) X int_error("out of memory",c_token); X this_plot->next_cp = NULL; X this_plot->title = NULL; X *tp_ptr = this_plot; X } X X if (isstring(c_token)) { /* data file to plot */ X this_plot->plot_type = DATA; X this_plot->plot_style = data_style; X get_data(this_plot); X c_token++; X } X else { /* function to plot */ X this_plot->plot_type = FUNC; X this_plot->plot_style = func_style; X X (void) strcpy(c_dummy_var,dummy_var); X dummy_func = &plot_func; X X plot_func.at = temp_at(); X X for (i = 0; i <= mysamples; i++) { X if (i == samples+1) X int_error("number of points exceeded samples", X NO_CARET); X x = x_min + i*xdiff; X if (log_x) X x = pow(10.0,x); X (void) complex(&plot_func.dummy_value, x, 0.0); X X evaluate_at(plot_func.at,&a); X X if (this_plot->points[i].undefined = X undefined || (fabs(imag(&a)) > zero)) X continue; X /* X The old code used plot_type to generate x, but with X polar and offset concepts we need to record the x X value. X */ X this_plot->points[i].x = x; X X temp = real(&a); X X if (log_y && temp <= 0.0) { X this_plot->points[i].undefined = TRUE; X continue; X } X if (autoscale) { X if (temp < ymin) ymin = temp; X if (temp > ymax) ymax = temp; X } else if (temp < ymin || temp > ymax) { X this_plot->points[i].undefined = TRUE; X continue; X } X X this_plot->points[i].y = log_y ? log10(temp) : temp; X } X this_plot->p_count = i; /* mysamples + 1 */ X } X m_capture(&(this_plot->title),start_token,c_token-1); X if (almost_equals(c_token,"w$ith")) X this_plot->plot_style = get_style(); X tp_ptr = &(this_plot->next_cp); X } X X if (equals(c_token,",")) X c_token++; X else X break; X } X X if (autoscale && (ymin == ymax)) X ymax += 1.0; /* kludge to avoid divide-by-zero in do_plot */ X X if (log_y) { X y_min = log10(ymin); X y_max = log10(ymax); X } else { X y_min = ymin; X y_max = ymax; X } X capture(replot_line,plot_token,c_token); X do_plot(first_plot,plot_num,x_min,x_max,y_min,y_max); X} X X X Xdone(status) Xint status; X{ X if (term) X (*term_tbl[term].reset)(); X exit(status); X} X X X#ifdef vms X X#include X#include X#include X Xextern lib$get_input(), lib$put_output(); X Xint vms_len; X Xunsigned int status[2] = {1, 0}; X X$DESCRIPTOR(prompt_desc,PROMPT); X$DESCRIPTOR(line_desc,input_line); X X$DESCRIPTOR(help_desc,help); X$DESCRIPTOR(helpfile_desc,"GNUPLOT$HELP"); X X Xread_line() X{ X switch(status[1] = lib$get_input(&line_desc, &prompt_desc, &vms_len)){ X case RMS$_EOF: X done(IO_SUCCESS); /* ^Z isn't really an error */ X break; X case RMS$_TNS: /* didn't press return in time */ X vms_len--; /* skip the last character */ X break; /* and parse anyway */ X case RMS$_BES: /* Bad Escape Sequence */ X case RMS$_PES: /* Partial Escape Sequence */ X sys$putmsg(status); X vms_len = 0; /* ignore the line */ X break; X case SS$_NORMAL: X break; /* everything's fine */ X default: X done(status[1]); /* give the error message */ X } X input_line[vms_len] = '\0'; X} X X Xdo_help() X{ X help_desc.dsc$w_length = strlen(help); X if ((vaxc$errno = lbr$output_help(lib$put_output,0,&help_desc, X &helpfile_desc,0,lib$get_input)) != SS$_NORMAL) X os_error("can't open GNUPLOT$HELP"); X} X X Xdo_shell() X{ X if ((vaxc$errno = lib$spawn()) != SS$_NORMAL) { X os_error("spawn error",NO_CARET); X } X} X X Xdo_system() X{ X input_line[0] = ' '; /* an embarrassment, but... */ X X if ((vaxc$errno = lib$spawn(&line_desc)) != SS$_NORMAL) X os_error("spawn error",NO_CARET); X X (void) putc('\n',stderr); X} X X#else /* vms */ X Xdo_help() X{ X if (system(help)) X os_error("can't spawn help",c_token); X} X X Xdo_system() X{ X if (system(input_line + 1)) X os_error("system() failed",NO_CARET); X} X X#ifdef MSDOS X Xread_line() X{ Xregister int i; X X input_line[0] = MAX_LINE_LEN - 1; X cputs(PROMPT); X cgets(input_line); /* console input so CED will work */ X (void) putc('\n',stderr); X if (input_line[2] == 26) { X (void) putc('\n',stderr); /* end-of-file */ X done(IO_SUCCESS); X } X X i = 0; X while (input_line[i] = input_line[i+2]) X i++; /* yuck! move everything down two characters */ X} X X Xdo_shell() X{ Xregister char *comspec; X if (!(comspec = getenv("COMSPEC"))) X comspec = "\command.com"; X if (spawnl(P_WAIT,comspec,NULL) == -1) X os_error("unable to spawn shell",NO_CARET); X} X X#else /* MSDOS */ X /* plain old Unix */ X Xread_line() X{ X fputs(PROMPT,stderr); X if (!fgets(input_line, MAX_LINE_LEN, stdin)) { X (void) putc('\n',stderr); /* end-of-file */ X done(IO_SUCCESS); X } X else { X input_line[strlen(input_line)-1] = '\0'; /* Remove trailing \n */ X } X} X X#ifdef VFORK X Xdo_shell() X{ Xregister char *shell; Xregister int p; Xstatic int execstat; X if (!(shell = getenv("SHELL"))) X shell = SHELL; X if ((p = vfork()) == 0) { X execstat = execl(shell,shell,NULL); X _exit(1); X } else if (p == -1) X os_error("vfork failed",c_token); X else X while (wait(NULL) != p) X ; X if (execstat == -1) X os_error("shell exec failed",c_token); X (void) putc('\n',stderr); X} X#else /* VFORK */ X X#define EXEC "exec " Xdo_shell() X{ Xstatic char exec[100] = EXEC; Xregister char *shell; X if (!(shell = getenv("SHELL"))) X shell = SHELL; X X if (system(strncpy(&exec[sizeof(EXEC)-1],shell, X sizeof(exec)-sizeof(EXEC)-1))) X os_error("system() failed",NO_CARET); X X (void) putc('\n',stderr); X} X#endif /* VFORK */ X#endif /* MSDOS */ X#endif /* vms */ END_OF_FILE if test 23912 -ne `wc -c <'command.c'`; then echo shar: \"'command.c'\" unpacked with wrong size! fi # end of 'command.c' fi if test -f 'compile.com' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'compile.com'\" else echo shar: Extracting \"'compile.com'\" \(567 characters\) sed "s/^X//" >'compile.com' <<'END_OF_FILE' X$! make sure you SET TERM/NOWRAP before running GNUPLOT! X$ CFLAGS = "NOTHING" X$ TERMFLAGS = "AED,HP26,HP75,POSTSCRIPT,QMS,REGIS,TEK,V384,HPLJET" X$ set verify X$ cc/define=('CFLAGS') command.c X$ cc/define=('CFLAGS') eval.c X$ cc/define=('CFLAGS') graphics.c X$ cc/define=('CFLAGS') internal.c X$ cc/define=('CFLAGS') misc.c X$ cc/define=('CFLAGS') parse.c X$ cc/define=('CFLAGS') plot.c X$ cc/define=('CFLAGS') scanner.c X$ cc/define=('CFLAGS') standard.c X$ cc/define=('CFLAGS','TERMFLAGS') term.c X$ cc/define=('CFLAGS') util.c X$ cc/define=('CFLAGS') version.c X$ set noverify END_OF_FILE if test 567 -ne `wc -c <'compile.com'`; then echo shar: \"'compile.com'\" unpacked with wrong size! fi # end of 'compile.com' fi if test -f 'controls.dem' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'controls.dem'\" else echo shar: Extracting \"'controls.dem'\" \(598 characters\) sed "s/^X//" >'controls.dem' <<'END_OF_FILE' X# X# warning: this demo is SLOW on PCs without math coprocessors! X# X# From _Automatic_Control_Systems_, fourth ed., figure 6-14 X# transient response of a second-order system to a unit step input function X# Xdamp(t) = exp(-s*wn*t)/sqrt(1.0-s*s) Xper(t) = sin(wn*sqrt(1.0-s**2)*t - atan(-sqrt(1.0-s**2)/s)) Xc(t) = 1-damp(t)*per(t) X# X# wn is natural undamped frequency X# s is damping factor X# Xwn = 1.0 Xset xrange [0:13] Xset samples 50 Xset dummy t X# X# plot c(t) for several different damping factors s X# Xplot s=.1,c(t),s=.3,c(t),s=.5,c(t),s=.7,c(t),s=.9,c(t),s=1.0,c(t),s=1.5,c(t),s=2.0,c(t) Xset dummy x END_OF_FILE if test 598 -ne `wc -c <'controls.dem'`; then echo shar: \"'controls.dem'\" unpacked with wrong size! fi # end of 'controls.dem' fi if test -f 'corgraph.asm' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'corgraph.asm'\" else echo shar: Extracting \"'corgraph.asm'\" \(2272 characters\) sed "s/^X//" >'corgraph.asm' <<'END_OF_FILE' XTITLE Corona graphics module X; Colin Kelley X; January 1987 X Xinclude header.mac X Xif1 Xinclude lineproc.mac Xendif X X X_text segment X Xpublic _GrInit,_GrReset,_GrOnly,_TxOnly,_GrandTx,_Cor_line,_Cor_mask X Xcorpixel proc near X ror word ptr linemask,1 X jc cont X ret Xcont: push bp X mov bp,sp X push ax X push bx X push cx X mov es,ScSeg X shl bx,1 ; y X mov bx,word ptr LookUp[bx] ; bx has y mem address X mov cl,al ; x X and cl,7 X shr ax,1 X shr ax,1 X shr ax,1 ; ax /= 8 X add bx,ax X mov al,1 X shl al,cl ; al contains bit mask X or byte ptr es:[bx],al X pop cx X pop bx X pop ax X pop bp X ret X Xlineproc _Cor_line, corpixel X Xbeginproc _GrInit X push bp X mov bp,sp X push di X mov ax, [bp+X] ; screen number (0 - 7) X mov cl,11 X shl ax,cl ; multiply by 2048 to get segment X mov ScSeg,ax ; save segment for later X push ax X mov es, ax X xor ax,ax X mov di,ax X mov cx, 4000h X cld X rep stosw X pop cx X call near ptr GrAddr X mov ax,es X pop di X pop bp X ret X_GrInit endp X Xbeginproc _GrReset X mov cx, 0 X call near ptr GrAddr X ret X_GrReset endp X XGrAddr proc near X mov dx,3b4h ; address of 6845 X mov al,0ch ; register 12 X out dx,al X inc dx X mov al,ch ; Graphics Segment High X out dx,al X dec dx X mov al,0dh ; register 13 X out dx,al X mov al,cl ; Graphics Segment Low X inc dx X out dx,al X ret XGrAddr endp X Xbeginproc _GrOnly X mov dx,3b8h X mov al,0a0h X out dx,al X ret X_GrOnly endp X Xbeginproc _TxOnly X mov dx,3b8h X mov al,28h X out dx,al X ret X_TxOnly endp X Xbeginproc _GrandTx X mov dx,3b8h X mov al,0a8h X out dx,al X ret X_GrandTx endp X Xbeginproc _Cor_mask X push bp X mov bp,sp X mov ax,[bp+x] ; mask X mov linemask,ax X pop bp X ret X_Cor_mask endp X Xcorpixel endp X X_text ends X X X_data segment Xlinemask dw -1 XScSeg dw 0 X_data ends X Xconst segment X XK equ 1024 X Xmem_mac MACRO x X dw x,2*K+x,4*K+x,6*K+x,8*K+x,10*K+x,12*K+x,14*K+x,16*K+x X dw 18*K+x,20*K+x,22*K+x,24*K+x X ENDM XLookUp equ $ X mem_mac 0 X mem_mac 80 X mem_mac (80*2) X mem_mac (80*3) X mem_mac (80*4) X mem_mac (80*5) X mem_mac (80*6) X mem_mac (80*7) X mem_mac (80*8) X mem_mac (80*9) X mem_mac (80*10) X mem_mac (80*11) X mem_mac (80*12) X mem_mac (80*13) X mem_mac (80*14) X mem_mac (80*15) X mem_mac (80*16) X mem_mac (80*17) X mem_mac (80*18) X mem_mac (80*19) X mem_mac (80*20) X mem_mac (80*21) X mem_mac (80*22) X mem_mac (80*23) X mem_mac (80*24) X Xconst ends X X end END_OF_FILE if test 2272 -ne `wc -c <'corgraph.asm'`; then echo shar: \"'corgraph.asm'\" unpacked with wrong size! fi # end of 'corgraph.asm' fi if test -f 'corplot.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'corplot.c'\" else echo shar: Extracting \"'corplot.c'\" \(839 characters\) sed "s/^X//" >'corplot.c' <<'END_OF_FILE' X#include X#include X#include X X#define BOUNDARY 32768 X#define segment(addr) (FP_SEG(m) + ((FP_OFF(m)+15) >> 4)); X#define round(value,boundary) (((value) + (boundary) - 1) & ~((boundary) - 1)) X Xchar *malloc(),*realloc(); X Xchar prog[] = "gnuplot"; Xchar corscreen[] = "CORSCREEN=0"; X Xmain() X{ Xregister unsigned int segm,start; Xchar *m; X if (!(m = malloc(BOUNDARY))) { X printf("malloc() failed\n"); X exit(1); X } X segm = segment(m); X start = round(segm,BOUNDARY/16); X X if (realloc(m,BOUNDARY+(start-segm)*16) != m) { X printf("can't realloc() memory\n"); X exit(2); X } X X if ((segm = start >> 11) >= 8) { X printf("not enough room in first 256K\n"); X exit(3); X } X X corscreen[sizeof(corscreen)-2] = '0' + segm; X if (putenv(corscreen)) X perror("putenv"); X X if (spawnlp(P_WAIT,prog,prog,NULL)) X perror("spawnlp"); X} END_OF_FILE if test 839 -ne `wc -c <'corplot.c'`; then echo shar: \"'corplot.c'\" unpacked with wrong size! fi # end of 'corplot.c' fi if test ! -d 'docs' ; then echo shar: Creating directory \"'docs'\" mkdir 'docs' fi if test -f 'eval.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'eval.c'\" else echo shar: Extracting \"'eval.c'\" \(3101 characters\) sed "s/^X//" >'eval.c' <<'END_OF_FILE' X/* X * X * G N U P L O T -- eval.c X * X * Copyright (C) 1986, 1987 Colin Kelley, Thomas Williams X * X * You may use this code as you wish if credit is given and this message X * is retained. X * X * Please e-mail any useful additions to vu-vlsi!plot so they may be X * included in later releases. X * X * This file should be edited with 4-column tabs! (:set ts=4 sw=4 in vi) X */ X X#include X#include "plot.h" X Xchar *malloc(); X Xextern int c_token; Xextern struct ft_entry ft[]; Xextern struct udvt_entry *first_udv; Xextern struct udft_entry *first_udf; Xextern struct at_type at; Xextern struct lexical_unit token[]; X Xstruct value *integer(); X X X Xstruct udvt_entry * Xadd_udv(t_num) /* find or add value and return pointer */ Xint t_num; X{ Xregister struct udvt_entry **udv_ptr = &first_udv; X X /* check if it's already in the table... */ X X while (*udv_ptr) { X if (equals(t_num,(*udv_ptr)->udv_name)) X return(*udv_ptr); X udv_ptr = &((*udv_ptr)->next_udv); X } X X if (!(*udv_ptr = (struct udvt_entry *) X malloc((unsigned int)sizeof(struct udvt_entry)))) X int_error("not enought memory for value",t_num); X (*udv_ptr)->next_udv = NULL; X copy_str((*udv_ptr)->udv_name,t_num); X (*udv_ptr)->udv_value.type = INT; /* not necessary, but safe! */ X (*udv_ptr)->udv_undef = TRUE; X return(*udv_ptr); X} X X Xstruct udft_entry * Xadd_udf(t_num) /* find or add function and return pointer */ Xint t_num; /* index to token[] */ X{ Xregister struct udft_entry **udf_ptr = &first_udf; X X while (*udf_ptr) { X if (equals(t_num,(*udf_ptr)->udf_name)) X return(*udf_ptr); X udf_ptr = &((*udf_ptr)->next_udf); X } X if (!(*udf_ptr = (struct udft_entry *) X malloc((unsigned int)sizeof(struct udft_entry)))) X int_error("not enought memory for function",t_num); X (*udf_ptr)->next_udf = (struct udft_entry *) NULL; X (*udf_ptr)->definition = NULL; X (*udf_ptr)->at = NULL; X copy_str((*udf_ptr)->udf_name,t_num); X (void) integer(&((*udf_ptr)->dummy_value), 0); X return(*udf_ptr); X} X X Xunion argument * Xadd_action(sf_index) Xenum operators sf_index; /* index of p-code function */ X{ X if (at.a_count >= MAX_AT_LEN) X int_error("action table overflow",NO_CARET); X at.actions[at.a_count].index = sf_index; X return(&(at.actions[at.a_count++].arg)); X} X X Xint standard(t_num) /* return standard function index or 0 */ X{ Xregister int i; X for (i = (int)SF_START; ft[i].f_name != NULL; i++) { X if (equals(t_num,ft[i].f_name)) X return(i); X } X return(0); X} X X X Xexecute_at(at_ptr) Xstruct at_type *at_ptr; X{ Xregister int i,index,count,offset; X X count = at_ptr->a_count; X for (i = 0; i < count;) { X index = (int)at_ptr->actions[i].index; X offset = (*ft[index].func)(&(at_ptr->actions[i].arg)); X if (is_jump(index)) X i += offset; X else X i++; X } X} X X/* X X 'ft' is a table containing C functions within this program. X X An 'action_table' contains pointers to these functions and arguments to be X passed to them. X X at_ptr is a pointer to the action table which must be executed (evaluated) X X so the iterated line exectues the function indexed by the at_ptr and X passes the address of the argument which is pointed to by the arg_ptr X X*/ END_OF_FILE if test 3101 -ne `wc -c <'eval.c'`; then echo shar: \"'eval.c'\" unpacked with wrong size! fi # end of 'eval.c' fi echo shar: End of archive 1 \(of 7\). cp /dev/null ark1isdone MISSING="" for I in 1 2 3 4 5 6 7 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 7 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0