gnuplot.shar.3: GNUPLOT version 1.10A, part 3/7
Augustine Cano
canoaf at ntvax.uucp
Wed Sep 6 07:25:40 AEST 1989
#! /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 <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 3 (of 7)."
# Contents: make.msc makefile.3b1 makefile.tc makefile.unx misc.c
# parse.c pc.trm pcgraph.asm
# Wrapped by install at shibaya on Mon Sep 4 20:56:49 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'make.msc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'make.msc'\"
else
echo shar: Extracting \"'make.msc'\" \(1136 characters\)
sed "s/^X//" >'make.msc' <<'END_OF_FILE'
XOBJS = command.obj eval.obj graphics.obj internal.obj misc.obj parse.obj plot.obj scanner.obj standard.obj term.obj util.obj version.obj pcgraph.asm corgraph.asm hrcgraph.asm
X
X# /AC means use compact model (small code, large data)
XCFLAGS = /AC /DPC #/Zi #/Od
X
XTERMFLAGS = /DHERCULES /DATT6300 /DCORONA /DPOSTSCRIPT /DHP75 /DTEK /DV384 /DEGALIB
X
XLINKFLAGS = #/codeview
X
X# default rules
X.c.obj:
X msc $(CFLAGS) $*;
X
X.asm.obj:
X masm $*;
X
Xpcgraph.obj: pcgraph.asm header.mac lineproc.mac
X
Xcorgraph.obj: corgraph.asm header.mac lineproc.mac
X
Xhrcgraph.obj: hrcgraph.asm header.mac lineproc.mac
X
Xcommand.obj: command.c plot.h
X
Xeval.obj: eval.c plot.h
X
Xgraphics.obj: graphics.c plot.h
X
Xinternal.obj: internal.c plot.h
X
Xmisc.obj: misc.c plot.h
X
Xparse.obj: parse.c plot.h
X
Xplot.obj: plot.c plot.h
X
Xscanner.obj: scanner.c plot.h
X
Xstandard.obj: standard.c plot.h
X
Xterm.obj: term.c plot.h
X msc $(CFLAGS) $(TERMFLAGS) term;
X
Xutil.obj: util.c plot.h
X
Xversion.obj: version.c
X
X
X# use link.opt to avoid command-line overflow
X
Xgnuplot.exe: $(OBJS)
X link$(LINKFLAGS) @link.opt
X exepack gnuplot.exe gnupack.exe
X del gnuplot.exe
X ren gnupack.exe gnuplot.exe
END_OF_FILE
if test 1136 -ne `wc -c <'make.msc'`; then
echo shar: \"'make.msc'\" unpacked with wrong size!
fi
# end of 'make.msc'
fi
if test -f 'makefile.3b1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makefile.3b1'\"
else
echo shar: Extracting \"'makefile.3b1'\" \(3932 characters\)
sed "s/^X//" >'makefile.3b1' <<'END_OF_FILE'
X# "make all" will compile all the necessary programs, gnuplot itself, the
X# help system and helptree (to make the help tree out of the flat file.)
X#
X# "make install will install all the necessary pieces to run gnuplot
X# successfully. This includes creating the help tree in /usr/local/help.
X
X# If you do not wish the destinations of the executable and manual page to
X# be at the default locations (see below), feel free to change them.
X# The location of the help system and help tree also have default values.
X# If you want them somewhere else or would like to test the whole system
X# before you run "make install", you have to set environment variables so
X# that gnuplot finds them. See README.3B1 for details.
X
X# where to install executable on 'make install'
XDEST=/usr/local/bin/gnuplot
X# where to install man page on 'make man_install'
XMANDEST=/usr/man/man1/gnuplot.1
X
X# -DFORK if you have vfork()
X# -DBCOPY if your memcpy() is called bcopy() (a Berkeleyism, right?)
X# -DNOCOPY if you don't have a memcpy() by any name
X# -DGAMMA if you've got gamma(3)
X# -O if you trust your compiler's optimizer
XCFLAGS = -DGAMMA -DUNIXPC -O # -gx # debug it.
X
X# -D<terminal> in TERMFLAGS iff you wish to support <terminal>
X# -DAED AED 512 and AED 767
X# -DBITGRAPH BBN BitGraph
X# -DHP26 HP2623A and maybe others
X# -DHP75 HP7580, and probably other HPs
X# -DHPLJET HP LaserJet laserprinter
X# -DPOSTSCRIPT Postscript
X# -DQMS QMS/QUIC laserprinter (Talaris 1200 and others)
X# -DREGIS ReGis graphics (vt125, vt220, vt240, Gigis...)
X# -DSELANAR Selanar
X# -DTEK Tektronix 4010, and probably others
X# -DUNIXPC unixpc (ATT 3b1 or ATT 7300)
X# -DUNIXPLOT unixplot
X# -DV384 Vectrix 384 and tandy color printer
X
XTERMFLAGS = -DUNIXPC -DUNIXPLOT
X
X
XOBJS = command.o eval.o graphics.o internal.o misc.o parse.o plot.o scanner.o\
X standard.o term.o util.o
X
X# -lplot if you have -DUNIXPLOT
XLIBS = -lm -lplot
X
X# If you do not wish to compile the help system or make the help directory
X# tree, feel free to comment out the appropriate lines that do it.
X
Xall: gnuplot help_system doc_tree
X
Xgnuplot: $(OBJS) version.o
X ld /lib/crt0s.o /lib/shlib.ifile $(OBJS) version.o $(LIBS) -o gnuplot
X
Xhelp_system:
X ( cd help ; make )
X
Xdoc_tree:
X ( cd docs ; make helptree )
X
X# note that directory /usr/local/help must exist for the help tree
X# to be created
Xinstall: gnuplot help_system doc_tree man_install
X cp gnuplot $(DEST)
X strip $(DEST)
X docs/helptree -t /usr/local/help/gnuplot < docs/gnuplot.hlp
X cd help; make install
X
Xman_install: gnuplot.1
X cp gnuplot.1 $(MANDEST)
X
Xterm.o: term.c aed.trm bitgraph.trm hp26.trm hp75.trm hpljet.trm pc.trm \
X postscpt.trm qms.trm regis.trm selanar.trm tek.trm unixpc.trm \
X unixplot.trm v384.trm
X cc $(CFLAGS) $(TERMFLAGS) -c term.c
X
X
X$(OBJS): plot.h
X
Xclean:
X rm -f *.o gnuplot
X
X ( cd help ; make clean )
X ( cd docs ; make clean )
X
Xspotless:
X rm -f *.o gnuplot Makefile help/Makefile
X
X ( cd help ; make clean -f makefile.unx )
X ( cd docs ; make clean )
X
X#
X# if you have the Rich $alz shar package, you can use this make shar section.
X#
X
Xshars: spotless shar/gnuplot.shar.1 shar/gnuplot.shar.2 \
X shar/gnuplot.shar.3 shar/gnuplot.shar.4 shar/gnuplot.shar.5 \
X shar/gnuplot.shar.6 shar/gnuplot.shar.7
X
Xshar/gnuplot.shar.1: [1-9]* [A-Z]* [a-f]*
X shar -n1 -e7 [1-9]* [A-Z]* [a-f]* > shar/gnuplot.shar.1
X
Xshar/gnuplot.shar.2: [g-l]*
X shar -n2 -e7 [g-l]* > shar/gnuplot.shar.2
X
Xshar/gnuplot.shar.3: [m-o]* p[a-i]*
X shar -n3 -e7 [m-o]* p[a-i]* > shar/gnuplot.shar.3
X
Xshar/gnuplot.shar.4: p[j-z]* [q-t]*
X shar -n4 -e7 p[j-z]* [q-t]* > shar/gnuplot.shar.4
X
Xshar/gnuplot.shar.5: [u-z]*
X shar -n5 -e7 [u-z]* > shar/gnuplot.shar.5
X
Xshar/gnuplot.shar.6: docs/[A-Z]* docs/[a-g]*
X cd docs; make clean; cd ..
X shar -n6 -e7 docs docs/[A-Z]* docs/[a-g]* > shar/gnuplot.shar.6
X
Xshar/gnuplot.shar.7: docs/[h-z]* help/*
X shar -n7 -e7 docs/[h-z]* help help/* > shar/gnuplot.shar.7
END_OF_FILE
if test 3932 -ne `wc -c <'makefile.3b1'`; then
echo shar: \"'makefile.3b1'\" unpacked with wrong size!
fi
# end of 'makefile.3b1'
fi
if test -f 'makefile.tc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makefile.tc'\"
else
echo shar: Extracting \"'makefile.tc'\" \(1127 characters\)
sed "s/^X//" >'makefile.tc' <<'END_OF_FILE'
X# make file for Turbo C
X# Modified from MSC make by John Campbell and Bill Wilson
X# The compile and link includes debug flags. Take them out if you
X# do not want them included
X
XOBJS = command.obj eval.obj graphics.obj internal.obj misc.obj parse.obj plot.obj scanner.obj standard.obj term.obj util.obj version.obj
X
Xgnuplot.exe: $(OBJS)
X tlink /m /s /v /l @link.otc
X
X# /AC means use compact model (small code, large data)
XCFLAGS = -c -f -ml -M -y -v -I\tc\include -DMSDOS -DPC
XTERMFLAGS =
X# -DHERCULES -DCGA
X
X# default rules
X.c.obj:
X tcc $(CFLAGS) $*
X
Xcommand.obj: command.c plot.h
X
Xeval.obj: eval.c plot.h
X
Xgraphics.obj: graphics.c plot.h
X
Xinternal.obj: internal.c plot.h
X
Xmisc.obj: misc.c plot.h
X
Xparse.obj: parse.c plot.h
X
Xplot.obj: plot.c plot.h
X
Xscanner.obj: scanner.c plot.h
X
Xstandard.obj: standard.c plot.h
X
Xterm.obj: term.c plot.h \
X aed.trm bitgraph.trm hp26.trm hp75.trm hpljet.trm pc.trm \
X postscpt.trm qms.trm regis.trm selanar.trm tek.trm unixpc.trm \
X unixplot.trm v384.trm
X tcc $(CFLAGS) $(TERMFLAGS) term.c
X
Xutil.obj: util.c plot.h
X
Xversion.obj: version.c
X
X
X# use link.opt to avoid command-line overflow
X
END_OF_FILE
if test 1127 -ne `wc -c <'makefile.tc'`; then
echo shar: \"'makefile.tc'\" unpacked with wrong size!
fi
# end of 'makefile.tc'
fi
if test -f 'makefile.unx' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makefile.unx'\"
else
echo shar: Extracting \"'makefile.unx'\" \(3969 characters\)
sed "s/^X//" >'makefile.unx' <<'END_OF_FILE'
X# "make all" will compile all the necessary programs, gnuplot itself, the
X# help system and helptree (to make the help tree out of the flat file.)
X#
X# "make install will install all the necessary pieces to run gnuplot
X# successfully. This includes creating the help tree in /usr/local/help.
X
X# If you do not wish the destinations of the executable and manual page to
X# be at the default locations (see below), feel free to change them.
X# The location of the help system and help tree also have default values.
X# If you want them somewhere else or would like to test the whole system
X# before you run "make install", you have to set environment variables so
X# that gnuplot finds them. See README.3B1 for details.
X
X# where to install executable on 'make install'
XDEST=/usr/local/bin/gnuplot
X# where to install man page on 'make man_install'
XMANDEST=/usr/man/man1/gnuplot.1
X
X# -DFORK if you have vfork()
X# -DBCOPY if your memcpy() is called bcopy() (a Berkeleyism, right?)
X# -DNOCOPY if you don't have a memcpy() by any name
X# -DGAMMA if you've got gamma(3)
X# -O if you trust your compiler's optimizer
XCFLAGS = -DVFORK -DBCOPY -DGAMMA #-gx #-O
X
X# -D<terminal> in TERMFLAGS iff you wish to support <terminal>
X# -DAED AED 512 and AED 767
X# -DBITGRAPH BBN BitGraph
X# -DHP26 HP2623A and maybe others
X# -DHP75 HP7580, and probably other HPs
X# -DHPLJET HP LaserJet laserprinter
X# -DPOSTSCRIPT Postscript
X# -DQMS QMS/QUIC laserprinter (Talaris 1200 and others)
X# -DREGIS ReGis graphics (vt125, vt220, vt240, Gigis...)
X# -DSELANAR Selanar
X# -DTEK Tektronix 4010, and probably others
X# -DUNIXPC unixpc (ATT 3b1 or ATT 7300)
X# -DUNIXPLOT unixplot
X# -DV384 Vectrix 384 and tandy color printer
X
XTERMFLAGS = -DAED -DBITGRAPH -DHP26 -DHP75 -DPOSTSCRIPT -DQMS -DREGIS -DSELANAR -DTEK -DUNIXPLOT -DV384
X
X
XOBJS = command.o eval.o graphics.o internal.o misc.o parse.o plot.o scanner.o\
X standard.o term.o util.o
X
X# -lplot if you have -DUNIXPLOT
XLIBS = -lm -lplot
X
X# If you do not wish to compile the help system or make the help directory
X# tree, feel free to comment out the appropriate lines that do it.
X
Xall: gnuplot help_system doc_tree
X
Xgnuplot: $(OBJS) version.o
X cc $(OBJS) version.o $(LIBS) -o gnuplot
X
Xhelp_system:
X ( cd help ; make )
X
Xdoc_tree:
X ( cd docs ; make helptree )
X
X# note that directory /usr/local/help must exist for the help tree
X# to be created
Xinstall: gnuplot help_system doc_tree man_install
X cp gnuplot $(DEST)
X strip $(DEST)
X docs/helptree -t /usr/local/help/gnuplot < docs/gnuplot.hlp
X cd help; make install
X
Xman_install: gnuplot.1
X cp gnuplot.1 $(MANDEST)
X
Xterm.o: term.c aed.trm bitgraph.trm hp26.trm hp75.trm hpljet.trm pc.trm \
X postscpt.trm qms.trm regis.trm selanar.trm tek.trm unixpc.trm \
X unixplot.trm v384.trm
X cc $(CFLAGS) $(TERMFLAGS) -c term.c
X
X
X$(OBJS): plot.h
X
Xclean:
X rm -f *.o gnuplot
X
X ( cd help ; make clean )
X ( cd docs ; make clean )
X
Xspotless:
X rm -f *.o gnuplot Makefile help/Makefile
X
X ( cd help ; make clean -f makefile.unx )
X ( cd docs ; make clean )
X
X#
X# if you have the Rich $alz shar package, you can use this make shar section.
X#
X
Xshars: spotless shar/gnuplot.shar.1 shar/gnuplot.shar.2 \
X shar/gnuplot.shar.3 shar/gnuplot.shar.4 shar/gnuplot.shar.5 \
X shar/gnuplot.shar.6 shar/gnuplot.shar.7
X
Xshar/gnuplot.shar.1: [1-9]* [A-Z]* [a-f]*
X shar -n1 -e7 [1-9]* [A-Z]* [a-f]* > shar/gnuplot.shar.1
X
Xshar/gnuplot.shar.2: [g-l]*
X shar -n2 -e7 [g-l]* > shar/gnuplot.shar.2
X
Xshar/gnuplot.shar.3: [m-o]* p[a-i]*
X shar -n3 -e7 [m-o]* p[a-i]* > shar/gnuplot.shar.3
X
Xshar/gnuplot.shar.4: p[j-z]* [q-t]*
X shar -n4 -e7 p[j-z]* [q-t]* > shar/gnuplot.shar.4
X
Xshar/gnuplot.shar.5: [u-z]*
X shar -n5 -e7 [u-z]* > shar/gnuplot.shar.5
X
Xshar/gnuplot.shar.6: docs/[A-Z]* docs/[a-g]*
X cd docs; make clean; cd ..
X shar -n6 -e7 docs docs/[A-Z]* docs/[a-g]* > shar/gnuplot.shar.6
X
Xshar/gnuplot.shar.7: docs/[h-z]* help/*
X shar -n7 -e7 docs/[h-z]* help help/* > shar/gnuplot.shar.7
END_OF_FILE
if test 3969 -ne `wc -c <'makefile.unx'`; then
echo shar: \"'makefile.unx'\" unpacked with wrong size!
fi
# end of 'makefile.unx'
fi
if test -f 'misc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'misc.c'\"
else
echo shar: Extracting \"'misc.c'\" \(6275 characters\)
sed "s/^X//" >'misc.c' <<'END_OF_FILE'
X/*
X *
X * G N U P L O T -- misc.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 <stdio.h>
X#include "plot.h"
X#ifdef __TURBOC__
X#include <graphics.h>
X#endif
X
Xextern BOOLEAN autoscale;
Xextern BOOLEAN polar;
Xextern BOOLEAN log_x, log_y;
Xextern FILE* outfile;
Xextern char outstr[];
Xextern int samples;
Xextern int term;
Xextern double zero;
Xextern double roff, loff, toff, boff;
X
Xextern BOOLEAN screen_ok;
X
Xextern int c_token;
Xextern struct at_type at;
Xextern struct ft_entry ft[];
Xextern struct udft_entry *first_udf;
Xextern struct udvt_entry *first_udv;
Xextern struct termentry term_tbl[];
X
Xchar *malloc();
X
Xstruct at_type *temp_at();
X
X
X/*
X * cp_free() releases any memory which was previously malloc()'d to hold
X * curve points.
X */
Xcp_free(cp)
Xstruct curve_points *cp;
X{
X if (cp) {
X cp_free(cp->next_cp);
X if (cp->title)
X free((char *)cp->title);
X free((char *)cp);
X }
X}
X
X
X
Xsave_functions(fp)
XFILE *fp;
X{
Xregister struct udft_entry *udf = first_udf;
X
X if (fp) {
X while (udf) {
X if (udf->definition)
X fprintf(fp,"%s\n",udf->definition);
X udf = udf->next_udf;
X }
X (void) fclose(fp);
X } else
X os_error("Cannot open save file",c_token);
X}
X
X
Xsave_variables(fp)
XFILE *fp;
X{
Xregister struct udvt_entry *udv = first_udv->next_udv; /* skip pi */
X
X if (fp) {
X while (udv) {
X if (!udv->udv_undef) {
X fprintf(fp,"%s = ",udv->udv_name);
X disp_value(fp,&(udv->udv_value));
X (void) putc('\n',fp);
X }
X udv = udv->next_udv;
X }
X (void) fclose(fp);
X } else
X os_error("Cannot open save file",c_token);
X}
X
X
Xsave_all(fp)
XFILE *fp;
X{
Xregister struct udft_entry *udf = first_udf;
Xregister struct udvt_entry *udv = first_udv->next_udv; /* skip pi */
X
X if (fp) {
X while (udf) {
X if (udf->definition)
X fprintf(fp,"%s\n",udf->definition);
X udf = udf->next_udf;
X }
X while (udv) {
X if (!udv->udv_undef) {
X fprintf(fp,"%s = ",udv->udv_name);
X disp_value(fp,&(udv->udv_value));
X (void) putc('\n',fp);
X }
X udv = udv->next_udv;
X }
X (void) fclose(fp);
X } else
X os_error("Cannot open save file",c_token);
X}
X
X
Xload_file(fp)
XFILE *fp;
X{
Xregister int len;
Xextern char input_line[];
X
X if (fp) {
X while (fgets(input_line,MAX_LINE_LEN,fp)) {
X len = strlen(input_line) - 1;
X if (input_line[len] == '\n')
X input_line[len] = '\0';
X
X screen_ok = FALSE; /* make sure command line is
X echoed on error */
X do_line();
X }
X (void) fclose(fp);
X } else
X os_error("Cannot open load file",c_token);
X}
X
X
Xshow_style(name,style)
Xchar name[];
Xenum PLOT_STYLE style;
X{
X fprintf(stderr,"\t%s are plotted with ",name);
X switch (style) {
X case LINES: fprintf(stderr,"lines\n"); break;
X case POINTS: fprintf(stderr,"points\n"); break;
X case IMPULSES: fprintf(stderr,"impulses\n"); break;
X }
X}
X
Xshow_range(name,min,max)
Xchar name;
Xdouble min,max;
X{
X fprintf(stderr,"\t%crange is [%g : %g]\n",name,min,max);
X}
X
Xshow_zero()
X{
X fprintf(stderr,"\tzero is %g\n",zero);
X}
X
Xshow_offsets()
X{
X fprintf(stderr,"\toffsets are %g, %g, %g, %g\n",roff,loff,toff,boff);
X}
X
Xshow_samples()
X{
X fprintf(stderr,"\tsampling rate is %d\n",samples);
X}
X
Xshow_output()
X{
X fprintf(stderr,"\toutput is sent to %s\n",outstr);
X}
X
Xshow_term()
X{
X fprintf(stderr,"\tterminal type is %s\n",term_tbl[term].name);
X}
X
Xshow_polar()
X{
X if (polar)
X fprintf(stderr,"\tPolar coordinates are in effect\n");
X else
X fprintf(stderr,"\tRectangular coordinates are in effect\n");
X}
X
Xshow_autoscale()
X{
X fprintf(stderr,"\tautoscaling is %s\n",(autoscale)? "ON" : "OFF");
X}
X
Xshow_logscale()
X{
X if (log_x && log_y)
X fprintf(stderr,"\tlogscaling both x and y axes\n");
X else if (log_x)
X fprintf(stderr,"\tlogscaling x axis\n");
X else if (log_y)
X fprintf(stderr,"\tlogscaling y axis\n");
X else
X fprintf(stderr,"\tno logscaling\n");
X}
X
Xshow_variables()
X{
Xregister struct udvt_entry *udv = first_udv;
X
X fprintf(stderr,"\n\tVariables:\n");
X while (udv) {
X fprintf(stderr,"\t%-*s ",MAX_ID_LEN,udv->udv_name);
X if (udv->udv_undef)
X fputs("is undefined\n",stderr);
X else {
X fputs("= ",stderr);
X disp_value(stderr,&(udv->udv_value));
X (void) putc('\n',stderr);
X }
X udv = udv->next_udv;
X }
X}
X
X
Xshow_functions()
X{
Xregister struct udft_entry *udf = first_udf;
X
X fprintf(stderr,"\n\tUser-Defined Functions:\n");
X
X while (udf) {
X if (udf->definition)
X fprintf(stderr,"\t%s\n",udf->definition);
X else
X fprintf(stderr,"\t%s is undefined\n",udf->udf_name);
X udf = udf->next_udf;
X }
X}
X
X
Xshow_at()
X{
X (void) putc('\n',stderr);
X disp_at(temp_at(),0);
X}
X
X
Xdisp_at(curr_at, level)
Xstruct at_type *curr_at;
Xint level;
X{
Xregister int i, j;
Xregister union argument *arg;
X
X for (i = 0; i < curr_at->a_count; i++) {
X (void) putc('\t',stderr);
X for (j = 0; j < level; j++)
X (void) putc(' ',stderr); /* indent */
X
X /* print name of instruction */
X
X fputs(ft[(int)(curr_at->actions[i].index)].f_name,stderr);
X arg = &(curr_at->actions[i].arg);
X
X /* now print optional argument */
X
X switch(curr_at->actions[i].index) {
X case PUSH: fprintf(stderr," %s\n", arg->udv_arg->udv_name);
X break;
X case PUSHC: (void) putc(' ',stderr);
X disp_value(stderr,&(arg->v_arg));
X (void) putc('\n',stderr);
X break;
X case PUSHD: fprintf(stderr," %s dummy\n",
X arg->udf_arg->udf_name);
X break;
X case CALL: fprintf(stderr," %s", arg->udf_arg->udf_name);
X if (arg->udf_arg->at) {
X (void) putc('\n',stderr);
X disp_at(arg->udf_arg->at,level+2); /* recurse! */
X } else
X fputs(" (undefined)\n",stderr);
X break;
X case JUMP:
X case JUMPZ:
X case JUMPNZ:
X case JTERN:
X fprintf(stderr," +%d\n",arg->j_arg);
X break;
X default:
X (void) putc('\n',stderr);
X }
X }
X}
X
X
Xshow_version()
X{
Xextern char version[];
Xextern char date[];
Xstatic char *authors[] = {"Thomas Williams","Colin Kelley"};
Xint x;
Xlong time();
X
X x = time((long *)NULL) & 1;
X fprintf(stderr,"\n\t%s\n\t%sversion %s\n\tlast modified %s\n",
X PROGRAM, OS, version, date);
X fprintf(stderr,"\tCopyright (C) 1986, 1987 %s, %s\n\n",
X authors[x],authors[1-x]);
X}
END_OF_FILE
if test 6275 -ne `wc -c <'misc.c'`; then
echo shar: \"'misc.c'\" unpacked with wrong size!
fi
# end of 'misc.c'
fi
if test -f 'parse.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'parse.c'\"
else
echo shar: Extracting \"'parse.c'\" \(7828 characters\)
sed "s/^X//" >'parse.c' <<'END_OF_FILE'
X/*
X *
X * G N U P L O T -- parse.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 <stdio.h>
X#include <setjmp.h>
X#include <signal.h>
X#include <errno.h>
X#include "plot.h"
X
Xextern BOOLEAN undefined;
X
X#ifndef vms
Xextern int errno;
X#endif
X
Xextern int num_tokens,c_token;
Xextern struct lexical_unit token[];
Xextern char c_dummy_var[]; /* name of current dummy variable */
Xextern struct udft_entry *dummy_func; /* pointer to dummy variable's func */
X
Xchar *malloc();
X
Xstruct value *pop(),*integer(),*complex();
Xstruct at_type *temp_at(), *perm_at();
Xstruct udft_entry *add_udf();
Xstruct udvt_entry *add_udv();
Xunion argument *add_action();
X
Xstruct at_type at;
Xstatic jmp_buf fpe_env;
X
X#define dummy (struct value *) 0
X#ifdef __TURBOC__
Xvoid fpe(int xXx)
X#else
Xfpe()
X#endif
X{
X#ifdef PC /* thanks to lotto at wjh12.UUCP for telling us about this */
X _fpreset();
X#endif
X (void) signal(SIGFPE, fpe);
X undefined = TRUE;
X longjmp(fpe_env, TRUE);
X}
X
X
Xevaluate_at(at_ptr,val_ptr)
Xstruct at_type *at_ptr;
Xstruct value *val_ptr;
X{
X undefined = FALSE;
X errno = 0;
X reset_stack();
X if (setjmp(fpe_env))
X return; /* just bail out */
X (void) signal(SIGFPE, fpe); /* catch core dumps on FPEs */
X
X execute_at(at_ptr);
X
X (void) signal(SIGFPE, SIG_DFL);
X
X if (errno == EDOM || errno == ERANGE) {
X undefined = TRUE;
X } else {
X (void) pop(val_ptr);
X check_stack();
X }
X}
X
X
Xstruct value *
Xconst_express(valptr)
Xstruct value *valptr;
X{
Xregister int tkn = c_token;
X if (END_OF_COMMAND)
X int_error("constant expression required",c_token);
X evaluate_at(temp_at(),valptr); /* run it and send answer back */
X if (undefined) {
X int_error("undefined value",tkn);
X }
X return(valptr);
X}
X
X
Xstruct at_type *
Xtemp_at() /* build a static action table and return its pointer */
X{
X at.a_count = 0; /* reset action table !!! */
X express();
X return(&at);
X}
X
X
X/* build an action table, put it in dynamic memory, and return its pointer */
X
Xstruct at_type *
Xperm_at()
X{
Xregister struct at_type *at_ptr;
Xregister unsigned int len;
X
X (void) temp_at();
X len = sizeof(struct at_type) -
X (MAX_AT_LEN - at.a_count)*sizeof(struct at_entry);
X if (at_ptr = (struct at_type *) malloc(len))
X (void) memcpy(at_ptr,&at,len);
X return(at_ptr);
X}
X
X
X#ifdef NOCOPY
X/*
X * cheap and slow version of memcpy() in case you don't have one
X */
Xmemcpy(dest,src,len)
Xchar *dest,*src;
Xunsigned int len;
X{
X while (len--)
X *dest++ = *src++;
X}
X#endif /* NOCOPY */
X
X
Xexpress() /* full expressions */
X{
X xterm();
X xterms();
X}
X
Xxterm() /* ? : expressions */
X{
X aterm();
X aterms();
X}
X
X
Xaterm()
X{
X bterm();
X bterms();
X}
X
X
Xbterm()
X{
X cterm();
X cterms();
X}
X
X
Xcterm()
X{
X dterm();
X dterms();
X}
X
X
Xdterm()
X{
X eterm();
X eterms();
X}
X
X
Xeterm()
X{
X fterm();
X fterms();
X}
X
X
Xfterm()
X{
X gterm();
X gterms();
X}
X
X
Xgterm()
X{
X hterm();
X hterms();
X}
X
X
Xhterm()
X{
X unary(); /* - things */
X iterms(); /* * / % */
X}
X
X
Xfactor()
X{
Xregister int value;
X
X if (equals(c_token,"(")) {
X c_token++;
X express();
X if (!equals(c_token,")"))
X int_error("')' expected",c_token);
X c_token++;
X }
X else if (isnumber(c_token)) {
X convert(&(add_action(PUSHC)->v_arg),c_token);
X c_token++;
X }
X else if (isletter(c_token)) {
X if ((c_token+1 < num_tokens) && equals(c_token+1,"(")) {
X value = standard(c_token);
X if (value) { /* it's a standard function */
X c_token += 2;
X express();
X if (!equals(c_token,")"))
X int_error("')' expected",c_token);
X c_token++;
X (void) add_action(value);
X }
X else {
X value = c_token;
X c_token += 2;
X express();
X if (!equals(c_token,")"))
X int_error("')' expected",c_token);
X c_token++;
X add_action(CALL)->udf_arg = add_udf(value);
X }
X }
X else {
X if (equals(c_token,c_dummy_var)) {
X c_token++;
X add_action(PUSHD)->udf_arg = dummy_func;
X }
X else {
X add_action(PUSH)->udv_arg = add_udv(c_token);
X c_token++;
X }
X }
X } /* end if letter */
X else
X int_error("invalid expression ",c_token);
X
X /* add action code for ! (factorial) operator */
X while (equals(c_token,"!")) {
X c_token++;
X (void) add_action(FACTORIAL);
X }
X /* add action code for ** operator */
X if (equals(c_token,"**")) {
X c_token++;
X unary();
X (void) add_action(POWER);
X }
X
X}
X
X
X
Xxterms()
X{ /* create action code for ? : expressions */
X
X if (equals(c_token,"?")) {
X register int savepc1, savepc2;
X register union argument *argptr1,*argptr2;
X c_token++;
X savepc1 = at.a_count;
X argptr1 = add_action(JTERN);
X express();
X if (!equals(c_token,":"))
X int_error("expecting ':'",c_token);
X c_token++;
X savepc2 = at.a_count;
X argptr2 = add_action(JUMP);
X argptr1->j_arg = at.a_count - savepc1;
X express();
X argptr2->j_arg = at.a_count - savepc2;
X }
X}
X
X
Xaterms()
X{ /* create action codes for || operator */
X
X while (equals(c_token,"||")) {
X register int savepc;
X register union argument *argptr;
X c_token++;
X savepc = at.a_count;
X argptr = add_action(JUMPNZ); /* short-circuit if already TRUE */
X aterm();
X argptr->j_arg = at.a_count - savepc;/* offset for jump */
X (void) add_action(BOOL);
X }
X}
X
X
Xbterms()
X{ /* create action code for && operator */
X
X while (equals(c_token,"&&")) {
X register int savepc;
X register union argument *argptr;
X c_token++;
X savepc = at.a_count;
X argptr = add_action(JUMPZ); /* short-circuit if already FALSE */
X bterm();
X argptr->j_arg = at.a_count - savepc;/* offset for jump */
X (void) add_action(BOOL);
X }
X}
X
X
Xcterms()
X{ /* create action code for | operator */
X
X while (equals(c_token,"|")) {
X c_token++;
X cterm();
X (void) add_action(BOR);
X }
X}
X
X
Xdterms()
X{ /* create action code for ^ operator */
X
X while (equals(c_token,"^")) {
X c_token++;
X dterm();
X (void) add_action(XOR);
X }
X}
X
X
Xeterms()
X{ /* create action code for & operator */
X
X while (equals(c_token,"&")) {
X c_token++;
X eterm();
X (void) add_action(BAND);
X }
X}
X
X
Xfterms()
X{ /* create action codes for == and != operators */
X
X while (TRUE) {
X if (equals(c_token,"==")) {
X c_token++;
X fterm();
X (void) add_action(EQ);
X }
X else if (equals(c_token,"!=")) {
X c_token++;
X fterm();
X (void) add_action(NE);
X }
X else break;
X }
X}
X
X
Xgterms()
X{ /* create action code for < > >= or <= operators */
X
X while (TRUE) {
X /* I hate "else if" statements */
X if (equals(c_token,">")) {
X c_token++;
X gterm();
X (void) add_action(GT);
X }
X else if (equals(c_token,"<")) {
X c_token++;
X gterm();
X (void) add_action(LT);
X }
X else if (equals(c_token,">=")) {
X c_token++;
X gterm();
X (void) add_action(GE);
X }
X else if (equals(c_token,"<=")) {
X c_token++;
X gterm();
X (void) add_action(LE);
X }
X else break;
X }
X
X}
X
X
X
Xhterms()
X{ /* create action codes for + and - operators */
X
X while (TRUE) {
X if (equals(c_token,"+")) {
X c_token++;
X hterm();
X (void) add_action(PLUS);
X }
X else if (equals(c_token,"-")) {
X c_token++;
X hterm();
X (void) add_action(MINUS);
X }
X else break;
X }
X}
X
X
Xiterms()
X{ /* add action code for * / and % operators */
X
X while (TRUE) {
X if (equals(c_token,"*")) {
X c_token++;
X unary();
X (void) add_action(MULT);
X }
X else if (equals(c_token,"/")) {
X c_token++;
X unary();
X (void) add_action(DIV);
X }
X else if (equals(c_token,"%")) {
X c_token++;
X unary();
X (void) add_action(MOD);
X }
X else break;
X }
X}
X
X
Xunary()
X{ /* add code for unary operators */
X if (equals(c_token,"!")) {
X c_token++;
X unary();
X (void) add_action(LNOT);
X }
X else if (equals(c_token,"~")) {
X c_token++;
X unary();
X (void) add_action(BNOT);
X }
X else if (equals(c_token,"-")) {
X c_token++;
X unary();
X (void) add_action(UMINUS);
X }
X else
X factor();
X}
END_OF_FILE
if test 7828 -ne `wc -c <'parse.c'`; then
echo shar: \"'parse.c'\" unpacked with wrong size!
fi
# end of 'parse.c'
fi
if test -f 'pc.trm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'pc.trm'\"
else
echo shar: Extracting \"'pc.trm'\" \(15550 characters\)
sed "s/^X//" >'pc.trm' <<'END_OF_FILE'
X#ifdef __TURBOC__
X#include <graphics.h>
X#include <dos.h>
X#include <string.h>
X int g_driver, g_mode, g_error;
X char far *path;
X char *pathp, path_s[128];
X
Xget_path()
X{
X path=getenv("BGI");
X if (path==NULL) {
X strcpy(path_s,_argv[0]);
X pathp=strrchr(path_s,'\\');
X *pathp=0x00;
X path=path_s;
X }
X}
X
X#endif
X
X/* all of the Turbo C routines for the different graphics devices go here */
X
X#define EGALIB_XMAX 640
X#define EGALIB_YMAX 350
X
X#define EGALIB_XLAST (EGA_XMAX - 1)
X#define EGALIB_YLAST (EGA_YMAX - 1)
X
X#define EGALIB_VCHAR 14
X#define EGALIB_HCHAR 8
X#define EGALIB_VTIC 4
X#define EGALIB_HTIC 5
X
Xstatic int ega64color[] = {1,1,5,4,3,5,4,3, 5, 4, 3, 5, 4, 3,5};
Xstatic int ega256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *egacolor;
X
Xstatic char near buf[80]; /* kludge since EGA.LIB is compiled SMALL */
X
Xstatic int pattern[] = {0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f};
X
Xstatic int graphics_on = FALSE;
Xint startx, starty;
X
Xpause() /* press any key to continue... */
X{
X while (kbhit())
X (void) getch(); /* flush the keyboard buffer */
X while (!kbhit())
X ;
X}
X
X
XPC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef __TURBOC__
X gotoxy(78-strlen(str),24-row);
X puts(str);
X#else
X PC_curloc(24-row,78-strlen(str));
X PC_puts(str);
X#endif
X}
X
XPC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef __TURBOC__
X gotoxy(2,row+1);
X puts(str);
X#else
X PC_curloc(row+1,2);
X PC_puts(str);
X#endif
X}
X
XPC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X#ifdef __TURBOC__
X closegraph();
X#else
X Vmode(3);
X#endif
X}
X
XPC_reset()
X{
X#ifdef __TURBOC__
X closegraph();
X#endif
X}
X
X
X#ifdef __TURBOC__
X
X#define VGA_XMAX 640
X#define VGA_YMAX 480
X
X#define VGA_XLAST (VGA_XMAX - 1)
X#define VGA_YLAST (VGA_YMAX - 1)
X
X#define VGA_VCHAR 14
X#define VGA_HCHAR 8
X#define VGA_VTIC 4
X#define VGA_HTIC 5
X
Xstatic int vga256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *vgacolor;
X
XVGA_init()
X{
X g_driver=VGA;
X g_mode=2;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver!=9){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X/* int_error("color EGA board not found",NO_CARET);*/
X }
X if(g_driver==VGA) vgacolor=vga256color;
X}
X
XVGA_graphics()
X{ g_driver=VGA;
X g_mode=2;
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
XVGA_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X setcolor(vgacolor[linetype+2]);
X}
X
XVGA_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),450-row*16,buf);
X}
X
X#define VGA_reset EGALIB_reset
X#define VGA_text EGALIB_text
X#define VGA_move EGALIB_move
X#define VGA_vector EGALIB_vector
X#define VGA_ulput_text EGALIB_ulput_text
X
XVGAMONO_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X setlinestyle(4,pattern[linetype+2],1);
X}
X
X#define MCGA_XMAX 640
X#define MCGA_YMAX 480
X
X#define MCGA_XLAST (MCGA_XMAX - 1)
X#define MCGA_YLAST (MCGA_YMAX - 1)
X
X#define MCGA_VCHAR 14
X#define MCGA_HCHAR 8
X#define MCGA_VTIC 4
X#define MCGA_HTIC 5
X
Xstatic int *MCGAcolor;
X
XMCGA_init()
X{
X g_driver=MCGA;
X g_mode=5;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver!=2){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X }
X}
X
XMCGA_graphics()
X{ g_driver=MCGA;
X g_mode=5;
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
X
XMCGA_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),450-row*16,buf);
X}
X
X#define MCGA_reset EGALIB_reset
X#define MCGA_text EGALIB_text
X#define MCGA_move EGALIB_move
X#define MCGA_vector EGALIB_vector
X#define MCGA_ulput_text EGALIB_ulput_text
X
XMCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X setlinestyle(4,pattern[linetype+2],1);
X}
X
X
XEGALIB_init()
X{
X g_driver=EGA;
X g_mode=1;
X initgraph(&g_driver,&g_mode,path);
X if(g_driver<3 || g_driver>4){
X term=0;
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X
X/* int_error("color EGA board not found",NO_CARET);*/
X }
X if(g_driver==EGA) egacolor=ega256color;
X if(g_driver==EGA64) egacolor=ega64color;
X}
X
XEGALIB_graphics()
X{
X graphics_on = TRUE;
X initgraph(&g_driver,&g_mode,path);
X}
X
XEGALIB_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X closegraph();
X}
X
XEGALIB_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X setcolor(egacolor[linetype+2]);
X}
X
XEGALIB_move(x,y)
X{
X moveto(x,getmaxy()-y);
X}
X
X
XEGALIB_vector(x,y)
X{
X lineto(x,getmaxy()-y);
X}
X
X
XEGALIB_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(630-(strlen(str)*8),320-row*16,buf);
X}
X
XEGALIB_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X outtextxy(10,row*16+16,buf);
X}
X
XEGALIB_reset()
X{
X closegraph();
X}
X
X#define CGA_XMAX 640
X#define CGA_YMAX 200
X
X#define CGA_XLAST (CGA_XMAX - 1)
X#define CGA_YLAST (CGA_YMAX - 1)
X
X#define CGA_VCHAR 8
X#define CGA_HCHAR 8
X#define CGA_VTIC 2
X#define CGA_HTIC 3
X
XCGA_init()
X{
X g_driver=CGA;
X g_mode=4;
X initgraph(&g_driver,&g_mode,path);
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X/* PC_color(1); monochrome */
X
X}
X
XCGA_graphics()
X{
X graphics_on = TRUE;
X g_driver=CGA;
X g_mode=4;
X initgraph(&g_driver,&g_mode,path);
X /* Vmode(6);*/
X}
X
X#define CGA_text PC_text
X
XCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X/* PC_mask(pattern[linetype+2]); */
X setlinestyle(4,pattern[linetype+2],1);
X}
X
XCGA_move(x,y)
X{
X moveto(x,y);
X}
X
X
XCGA_vector(x,y)
X{
X lineto(x,y);
X}
X
X#define CGA_lrput_text PC_lrput_text
X#define CGA_ulput_text PC_ulput_text
X
X
X#define CGA_reset PC_reset
X
X#define HERC_XMAX 720
X#define HERC_YMAX 348
X
X#define HERC_XLAST (HERC_XMAX - 1)
X#define HERC_YLAST (HERC_YMAX - 1)
X
X#define HERC_VCHAR 8
X#define HERC_HCHAR 8
X#define HERC_VTIC 4
X#define HERC_HTIC 4
X
XHERC_init()
X{
X g_driver=HERCMONO;
X g_mode=0;
X initgraph(&g_driver,&g_mode,path);
X switch (g_driver){
X case -2: fprintf(stderr,"Graphics card not detected.\n");
X break;
X case -3: fprintf(stderr,"BGI driver file cannot be found.\n");
X break;
X case -4: fprintf(stderr,"Invalid BGI driver file.\n");
X break;
X case -5: fprintf(stderr,"Insufficient memory to load ",
X "graphics driver.");
X break;
X }
X}
X
XHERC_graphics()
X{
X g_driver=HERCMONO;
X g_mode=0;
X initgraph(&g_driver,&g_mode,path);
X graphics_on = TRUE;
X}
X
XHERC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X closegraph();
X}
X
XHERC_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X
X setlinestyle(linetype,0,1);
X}
X
XHERC_move(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X moveto(x,y);
X}
X
XHERC_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X
X lineto(x,y);
X}
X
X/*
X Thanks to James Dugal (jpd at usl.edu) for patching these two HERC
X routines. (We need to remove the OLD (probably bad) code someday.)
X*/
X
XHERC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef OLDHERC
X gotoxy(79-strlen(str),24-row);
X puts(str);
X#else
X strcpy((char far *)buf,str);
X outtextxy(710-(strlen(str)*8),318-row*10,buf);
X#endif
X}
X
XHERC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X#ifdef OLDHERC
X gotoxy(2,row+1);
X puts(str);
X#else
X strcpy((char far *)buf,str);
X outtextxy(10,row*10+10,buf);
X#endif
X}
X
X#define HERC_reset PC_reset
X
X
X#else
X
Xpause() /* press any key to continue... */
X{
X while (kbhit())
X (void) getch(); /* flush the keyboard buffer */
X while (!kbhit())
X ;
X}
X
X
XPC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X PC_curloc(24-row,78-strlen(str));
X PC_puts(str);
X}
X
XPC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X PC_curloc(row+1,2);
X PC_puts(str);
X}
X
XPC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X Vmode(3);
X}
X
XPC_reset()
X{
X}
X#define CGA_XMAX 640
X#define CGA_YMAX 200
X
X#define CGA_XLAST (CGA_XMAX - 1)
X#define CGA_YLAST (CGA_YMAX - 1)
X
X#define CGA_VCHAR 8
X#define CGA_HCHAR 8
X#define CGA_VTIC 2
X#define CGA_HTIC 3
X
XCGA_init()
X{
X PC_color(1); /* monochrome */
X}
X
XCGA_graphics()
X{
X graphics_on = TRUE;
X Vmode(6);
X}
X
X#define CGA_text PC_text
X
XCGA_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X PC_mask(pattern[linetype+2]);
X}
X
XCGA_move(x,y)
X{
X startx = x;
X starty = y;
X}
X
X
XCGA_vector(x,y)
X{
X PC_line(startx,CGA_YLAST-starty,x,CGA_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define CGA_lrput_text PC_lrput_text
X#define CGA_ulput_text PC_ulput_text
X
X
X#define CGA_reset PC_reset
X
X
X#define EGA_XMAX 640
X#define EGA_YMAX 350
X
X#define EGA_XLAST (EGA_XMAX - 1)
X#define EGA_YLAST (EGA_YMAX - 1)
X
X#define EGA_VCHAR 14
X#define EGA_HCHAR 8
X#define EGA_VTIC 5
X#define EGA_HTIC 5
X
Xstatic int ega64color[] = {1,1,5,4,3,5,4,3, 5, 4, 3, 5, 4, 3,5};
Xstatic int ega256color[] = {1,8,2,3,4,5,9,14,12,15,13,10,11,7,6};
X
Xstatic int *egacolor;
X
X
XEGA_init()
X{
X PC_mask(0xffff);
X egacolor = ega256color; /* should be smarter */
X}
X
XEGA_graphics()
X{
X graphics_on = TRUE;
X Vmode(16);
X}
X
X#define EGA_text PC_text
X
XEGA_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X PC_color(egacolor[linetype+2]);
X}
X
XEGA_move(x,y)
X{
X startx = x;
X starty = y;
X}
X
XEGA_vector(x,y)
X{
X PC_line(startx,EGA_YLAST-starty,x,EGA_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define EGA_lrput_text PC_lrput_text
X#define EGA_ulput_text PC_ulput_text
X
X
X#define EGA_reset PC_reset
X
X
X
X#ifdef EGALIB
X
X#define EGALIB_XMAX 640
X#define EGALIB_YMAX 350
X
X#define EGALIB_XLAST (EGA_XMAX - 1)
X#define EGALIB_YLAST (EGA_YMAX - 1)
X
X#define EGALIB_VCHAR 14
X#define EGALIB_HCHAR 8
X#define EGALIB_VTIC 4
X#define EGALIB_HTIC 5
X
X#include "mcega.h"
X
XEGALIB_init()
X{
X GPPARMS();
X if (GDTYPE != 5) {
X term = 0;
X int_error("color EGA board not found",NO_CARET);
X }
X egacolor = (GDMEMORY < 256) ? ega64color : ega256color;
X}
X
XEGALIB_graphics()
X{
X graphics_on = TRUE;
X GPINIT();
X}
X
XEGALIB_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X GPTERM();
X}
X
XEGALIB_linetype(linetype)
X{
X if (linetype >= 13)
X linetype %= 13;
X GPCOLOR(egacolor[linetype+2]);
X}
X
XEGALIB_move(x,y)
X{
X GPMOVE(x,GDMAXROW-y);
X}
X
X
XEGALIB_vector(x,y)
X{
X GPLINE(x,GDMAXROW-y);
X}
X
X
XEGALIB_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X GotoXY(78-strlen(str),24-row);
X gprintf(buf);
X}
X
XEGALIB_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X strcpy((char far *)buf,str);
X GotoXY(2,row+1);
X gprintf(buf);
X}
X
X#define EGALIB_reset PC_reset
X
X#endif /* EGALIB */
X
X
X#ifdef HERCULES
X
X#define HERC_XMAX 720
X#define HERC_YMAX 348
X
X#define HERC_XLAST (HERC_XMAX - 1)
X#define HERC_YLAST (HERC_YMAX - 1)
X
X#define HERC_VCHAR 8
X#define HERC_HCHAR 8
X#define HERC_VTIC 4
X#define HERC_HTIC 4
X
X
XHERC_init()
X{
X}
X
XHERC_graphics()
X{
X HVmode(1);
X graphics_on = TRUE;
X}
X
XHERC_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X HVmode(0);
X}
X
XHERC_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X H_mask(pattern[linetype+2]);
X}
X
XHERC_move(x,y)
X{
X if (x < 0)
X startx = 0;
X else if (x > HERC_XLAST)
X startx = HERC_XLAST;
X else
X startx = x;
X
X if (y < 0)
X starty = 0;
X else if (y > HERC_YLAST)
X starty = HERC_YLAST;
X else
X starty = y;
X}
X
XHERC_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > HERC_XLAST)
X x = HERC_XLAST;
X if (y < 0)
X y = 0;
X else if (y > HERC_YLAST)
X y = HERC_YLAST;
X
X H_line(startx,HERC_YLAST-starty,x,HERC_YLAST-y);
X startx = x;
X starty = y;
X}
X
XHERC_lrput_text(row,str)
Xint row;
Xchar str[];
X{
X H_puts(str, 41-row, 87-strlen(str));
X}
X
XHERC_ulput_text(row,str)
Xint row;
Xchar str[];
X{
X H_puts(str, row+1, 2);
X}
X
X#define HERC_reset PC_reset
X
X#endif /* HERCULES */
X
X
X/* thanks to sask!macphed (Geoff Coleman and Ian Macphedran) for the
X ATT 6300 driver */
X
X
X#ifdef ATT6300
X
X#define ATT_XMAX 640
X#define ATT_YMAX 400
X
X#define ATT_XLAST (ATT_XMAX - 1)
X#define ATT_YLAST (ATT_YMAX - 1)
X
X#define ATT_VCHAR 8
X#define ATT_HCHAR 8
X#define ATT_VTIC 3
X#define ATT_HTIC 3
X
X#define ATT_init CGA_init
X
XATT_graphics()
X{
X graphics_on = TRUE;
X Vmode(0x40); /* 40H is the magic number for the AT&T driver */
X}
X
X#define ATT_text CGA_text
X
X#define ATT_linetype CGA_linetype
X
X#define ATT_move CGA_move
X
XATT_vector(x,y)
X{
X PC_line(startx,ATT_YLAST-starty,x,ATT_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define ATT_lrput_text PC_lrput_text
X#define ATT_ulput_text PC_ulput_text
X
X
X#define ATT_reset CGA_reset
X
X#endif /* ATT6300 */
X
X
X#ifdef CORONA
X
X#define COR_XMAX 640
X#define COR_YMAX 325
X
X#define COR_XLAST (COR_XMAX - 1)
X#define COR_YLAST (COR_YMAX - 1)
X
X#define COR_VCHAR 13
X#define COR_HCHAR 8
X#define COR_VTIC 4
X#define COR_HTIC 4
X
X
Xstatic int corscreen; /* screen number, 0 - 7 */
X
XCOR_init()
X{
Xregister char *p;
X if (!(p = getenv("CORSCREEN")))
X int_error("must run CORPLOT for Corona graphics",NO_CARET);
X corscreen = *p - '0';
X}
X
XCOR_graphics()
X{
X graphics_on = TRUE;
X Vmode(3); /* clear text screen */
X grinit(corscreen);
X grandtx();
X}
X
XCOR_text()
X{
X if (graphics_on) {
X graphics_on = FALSE;
X pause();
X }
X grreset();
X txonly();
X Vmode(3);
X}
X
XCOR_linetype(linetype)
X{
X if (linetype >= 5)
X linetype %= 5;
X Cor_mask(pattern[linetype+2]);
X}
X
XCOR_move(x,y)
X{
X if (x < 0)
X startx = 0;
X else if (x > COR_XLAST)
X startx = COR_XLAST;
X else
X startx = x;
X
X if (y < 0)
X starty = 0;
X else if (y > COR_YLAST)
X starty = COR_YLAST;
X else
X starty = y;
X}
X
XCOR_vector(x,y)
X{
X if (x < 0)
X x = 0;
X else if (x > COR_XLAST)
X x = COR_XLAST;
X if (y < 0)
X y = 0;
X else if (y > COR_YLAST)
X y = COR_YLAST;
X
X Cor_line(startx,COR_YLAST-starty,x,COR_YLAST-y);
X startx = x;
X starty = y;
X}
X
X#define COR_lrput_text PC_lrput_text
X#define COR_ulput_text PC_ulput_text
X
X#define COR_reset PC_reset
X
X#endif /* CORONA */
X
X#endif /* __TURBOC__ */
X
END_OF_FILE
if test 15550 -ne `wc -c <'pc.trm'`; then
echo shar: \"'pc.trm'\" unpacked with wrong size!
fi
# end of 'pc.trm'
fi
if test -f 'pcgraph.asm' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'pcgraph.asm'\"
else
echo shar: Extracting \"'pcgraph.asm'\" \(3165 characters\)
sed "s/^X//" >'pcgraph.asm' <<'END_OF_FILE'
XTITLE PC graphics module
X; Colin Kelley
X; December 22, 1986
X; modified January 1987 to use LINEPROC.MAC
X
Xinclude header.mac
X
Xif1
Xinclude lineproc.mac
Xendif
X
X
X_text segment
X
X public _PC_line, _PC_color, _PC_mask, _PC_curloc, _PC_puts, _Vmode
X public _save_stack, _ss_interrupt
X extrn _interrupt:near
X
Xpcpixel proc near
X ror word ptr linemask,1
X jc cont
X ret
Xcont:
X push ax
X push bx
X push cx
X push dx
X push bp
X mov cx,ax ; x
X mov dx,bx ; y
X mov ah,0ch ; ah = write pixel
X mov al,byte ptr color
X
X mov bh, 0 ; page 0
X int 10h
X pop bp
X pop dx
X pop cx
X pop bx
X pop ax
X ret
Xpcpixel endp
X
Xlineproc _PC_line, pcpixel
X
X_PC_color proc near
X push bp
X mov bp,sp
X mov al,[bp+X] ; color
X mov byte ptr color,al
X pop bp
X ret
X_PC_color endp
X
X_PC_mask proc near
X push bp
X mov bp,sp
X mov ax,[bp+X] ; mask
X mov word ptr linemask,ax
X pop bp
X ret
X_PC_mask endp
X
X_Vmode proc near
X push bp
X mov bp,sp
X push si
X push di
X mov ax,[bp+X]
X int 10h
X pop di
X pop si
X pop bp
X ret
X_Vmode endp
X
X_PC_curloc proc near
X push bp
X mov bp,sp
X mov dh, byte ptr [bp+X] ; row number
X mov dl, byte ptr [bp+X+2] ; col number
X mov bh, 0
X mov ah, 2
X int 10h
X pop bp
X ret
X_PC_curloc endp
X
X;
X; thanks to watale!broehl for finding a bug here--I wasn't pushing BP
X; and reloading AH before INT 10H, which is necessary on genuine IBM
X; boards...
X;
X_PC_puts proc near
X push bp
X mov bp,sp
X push si
X mov bl,byte ptr color
X mov si,[bp+X] ; offset
X
Xifdef LARGE_DATA
X mov es,[bp+X+2] ; segment if large or compact data model
Xendif
X
Xputs2:
X
Xifdef LARGE_DATA
X mov al,es:[si]
Xelse
X mov al,[si]
Xendif
X or al,al
X jz puts3
X mov ah,0eh ; write TTY char
X int 10h
X inc si
X jmp short puts2
Xputs3: pop si
X pop bp
X ret
X_PC_puts endp
X
X
X; int kbhit();
X; for those without MSC 4.0
X; Use BIOS interrupt 16h to determine if a key is waiting in the buffer.
X; Return nonzero if so.
X;
X
Xbeginproc _kbhit
X mov ah, 1 ; function code 1 is keyboard test
X int 16h ; keyboard functions
X jnz kbfin ; Exit if char available
X xor ax, ax ; No char: return zero.
Xkbfin: ret
X_kbhit endp
X
X
X; _save_stack and _ss_interrupt are needed due to a bug in the MSC 4.0
X; code when run under MS-DOS 3.x. Starting with 3.0, MS-DOS automatically
X; switches to an internal stack during system calls. This leaves SS:SP
X; pointing at MS-DOS's stack when the ^C interrupt (INT 23H) is triggered.
X; MSC should restore its own stack before calling the user signal() routine,
X; but it doesn't.
X;
X; Presumably this code will be unnecessary in later releases of the compiler.
X;
X
X; _save_stack saves the current SS:SP to be loaded later by _ss_interrupt.
X;
X
Xbeginproc _save_stack
X mov ax,ss
X mov cs:save_ss,ax
X mov ax,sp
X mov cs:save_sp,ax
X ret
X_save_stack endp
X
X
X; _ss_interrupt is called on ^C (INT 23H). It restores SS:SP as saved in
X; _save_stack and then jumps to the C routine interrupt().
X;
Xbeginproc _ss_interrupt
X cli ; no interrupts while the stack is changed!
X mov ax,-1 ; self-modifying code again
Xsave_ss equ this word - 2
X mov ss,ax
X mov sp,-1 ; here too
Xsave_sp equ this word - 2
X sti
X jmp _interrupt ; now it's safe to call the real routine
X_ss_interrupt endp
X
X
X_text ends
X
X
Xconst segment
Xlinemask dw -1
Xcolor db 1
Xconst ends
X
X end
END_OF_FILE
if test 3165 -ne `wc -c <'pcgraph.asm'`; then
echo shar: \"'pcgraph.asm'\" unpacked with wrong size!
fi
# end of 'pcgraph.asm'
fi
echo shar: End of archive 3 \(of 7\).
cp /dev/null ark3isdone
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
More information about the Comp.sys.att
mailing list