61 changed files with 21673 additions and 4 deletions
-
2Makefile.am
-
28configure.in
-
190xgraph/INSTALL
-
57xgraph/Makefile.am
-
444xgraph/Makefile.in
-
26xgraph/README
-
84xgraph/README.ANNOUNCE
-
74xgraph/README.GENERAL
-
288xgraph/README.HARDCOPY
-
79xgraph/README.INSTALL
-
43xgraph/README.NEWFEATURES
-
146xgraph/aclocal.m4
-
284xgraph/alloc.c
-
35xgraph/autoconf.h.in
-
4xgraph/bitmaps/dot.11
-
6xgraph/bitmaps/gray
-
6xgraph/bitmaps/mark1.11
-
6xgraph/bitmaps/mark2.11
-
6xgraph/bitmaps/mark3.11
-
6xgraph/bitmaps/mark4.11
-
6xgraph/bitmaps/mark5.11
-
6xgraph/bitmaps/mark6.11
-
6xgraph/bitmaps/mark7.11
-
6xgraph/bitmaps/mark8.11
-
2442xgraph/configure
-
34xgraph/configure.in
-
65xgraph/copyright.h
-
130xgraph/derivative.c
-
942xgraph/dialog.c
-
1263xgraph/draw.c
-
2047xgraph/examples/Animation.xg
-
21xgraph/examples/bar.xg
-
1805xgraph/examples/surface.xg
-
631xgraph/examples/surface2.xg
-
667xgraph/examples/surface3.xg
-
725xgraph/examples/xgtest.xg
-
0xgraph/general.h
-
97xgraph/hard_devices.c
-
41xgraph/hard_devices.h
-
337xgraph/hpgl.c
-
498xgraph/idraw.c
-
622xgraph/init.c
-
251xgraph/install-sh
-
190xgraph/missing
-
40xgraph/mkinstalldirs
-
567xgraph/params.c
-
127xgraph/params.h
-
60xgraph/plotter.h
-
620xgraph/ps.c
-
365xgraph/read.c
-
571xgraph/st.c
-
119xgraph/st.h
-
1xgraph/stamp-h.in
-
329xgraph/tgif.c
-
480xgraph/xgX.c
-
65xgraph/xgout.h
-
1279xgraph/xgraph.c
-
210xgraph/xgraph.h
-
389xgraph/xgraph.man
-
1617xgraph/xtb.c
-
192xgraph/xtb.h
@ -0,0 +1,190 @@ |
|||||
|
|
||||
|
XGRAPH INSTALLATION |
||||
|
=================== |
||||
|
|
||||
|
|
||||
|
Quick Start |
||||
|
----------- |
||||
|
|
||||
|
- download the source code |
||||
|
- extract tar file with gzip (gnu zip, not pkzip) and tar |
||||
|
(typically "gunzip <xgraph.tar.gz | tar xvf -") |
||||
|
- run "./configure" |
||||
|
see the file README.CONFIGURE for |
||||
|
- run "make" |
||||
|
- run "make install" |
||||
|
|
||||
|
To install xgraph in a special location (perhaps if you don't have |
||||
|
root access), or if you're not familiar with GNU configure, see "Basic |
||||
|
Installation" below. |
||||
|
|
||||
|
If you have installation problems or questions, check: |
||||
|
|
||||
|
<http://www-mash.cs.berkeley.edu/ns/ns-problems.html#xgraph> |
||||
|
|
||||
|
BEFORE posting to the mailing list. Mailing list info can be found at |
||||
|
the xgraph web page. |
||||
|
|
||||
|
|
||||
|
Xgraph-specific configure options |
||||
|
--------------------------------- |
||||
|
|
||||
|
Use |
||||
|
--with-additional-includes=/path/to/includes |
||||
|
and |
||||
|
--with-additional-libs=/path/to/libs |
||||
|
|
||||
|
if configure can't find particular includes or libraries on your |
||||
|
system. |
||||
|
|
||||
|
|
||||
|
Basic Installation |
||||
|
================== |
||||
|
|
||||
|
These are generic installation instructions. |
||||
|
|
||||
|
The `configure' shell script attempts to guess correct values for |
||||
|
various system-dependent variables used during compilation. It uses |
||||
|
those values to create a `Makefile' in each directory of the package. |
||||
|
It may also create one or more `.h' files containing system-dependent |
||||
|
definitions. Finally, it creates a shell script `config.status' that |
||||
|
you can run in the future to recreate the current configuration, a file |
||||
|
`config.cache' that saves the results of its tests to speed up |
||||
|
reconfiguring, and a file `config.log' containing compiler output |
||||
|
(useful mainly for debugging `configure'). |
||||
|
|
||||
|
If you need to do unusual things to compile the package, please try |
||||
|
to figure out how `configure' could check whether to do them, and mail |
||||
|
diffs or instructions to the address given in the `README' so they can |
||||
|
be considered for the next release. If at some point `config.cache' |
||||
|
contains results you don't want to keep, you may remove or edit it. |
||||
|
|
||||
|
The file `configure.in' is used to create `configure' by a program |
||||
|
called `autoconf'. You only need `configure.in' if you want to change |
||||
|
it or regenerate `configure' using a newer version of `autoconf'. |
||||
|
|
||||
|
The simplest way to compile this package is: |
||||
|
|
||||
|
1. `cd' to the directory containing the package's source code and type |
||||
|
`./configure' to configure the package for your system. If you're |
||||
|
using `csh' on an old version of System V, you might need to type |
||||
|
`sh ./configure' instead to prevent `csh' from trying to execute |
||||
|
`configure' itself. |
||||
|
|
||||
|
Running `configure' takes awhile. While running, it prints some |
||||
|
messages telling which features it is checking for. |
||||
|
|
||||
|
2. Type `make' to compile the package. |
||||
|
|
||||
|
3. Optionally, type `make check' to run any self-tests that come with |
||||
|
the package. |
||||
|
|
||||
|
4. Type `make install' to install the programs and any data files and |
||||
|
documentation. |
||||
|
|
||||
|
5. You can remove the program binaries and object files from the |
||||
|
source code directory by typing `make clean'. To also remove the |
||||
|
files that `configure' created (so you can compile the package for |
||||
|
a different kind of computer), type `make distclean'. |
||||
|
|
||||
|
Compilers and Options |
||||
|
===================== |
||||
|
|
||||
|
Some systems require unusual options for compilation or linking that |
||||
|
the `configure' script does not know about. You can give `configure' |
||||
|
initial values for variables by setting them in the environment. Using |
||||
|
a Bourne-compatible shell, you can do that on the command line like |
||||
|
this: |
||||
|
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure |
||||
|
|
||||
|
Or on systems that have the `env' program, you can do it like this: |
||||
|
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure |
||||
|
|
||||
|
Compiling For Multiple Architectures |
||||
|
==================================== |
||||
|
|
||||
|
You can compile the package for more than one kind of computer at the |
||||
|
same time, by placing the object files for each architecture in their |
||||
|
own directory. To do this, you must use a version of `make' that |
||||
|
supports the `VPATH' variable, such as GNU `make'. `cd' to the |
||||
|
directory where you want the object files and executables to go and run |
||||
|
the `configure' script. `configure' automatically checks for the |
||||
|
source code in the directory that `configure' is in and in `..'. |
||||
|
|
||||
|
If you have to use a `make' that does not supports the `VPATH' |
||||
|
variable, you have to compile the package for one architecture at a time |
||||
|
in the source code directory. After you have installed the package for |
||||
|
one architecture, use `make distclean' before reconfiguring for another |
||||
|
architecture. |
||||
|
|
||||
|
Installation Names |
||||
|
================== |
||||
|
|
||||
|
By default, `make install' will install the package's files in |
||||
|
`/usr/local/bin', `/usr/local/man', etc. You can specify an |
||||
|
installation prefix other than `/usr/local' by giving `configure' the |
||||
|
option `--prefix=PATH'. |
||||
|
|
||||
|
You can specify separate installation prefixes for |
||||
|
architecture-specific files and architecture-independent files. If you |
||||
|
give `configure' the option `--exec-prefix=PATH', the package will use |
||||
|
PATH as the prefix for installing programs and libraries. |
||||
|
Documentation and other data files will still use the regular prefix. |
||||
|
|
||||
|
In addition, if you use an unusual directory layout you can give |
||||
|
options like `--bindir=PATH' to specify different values for particular |
||||
|
kinds of files. Run `configure --help' for a list of the directories |
||||
|
you can set and what kinds of files go in them. |
||||
|
|
||||
|
Optional Features |
||||
|
================= |
||||
|
|
||||
|
Some packages pay attention to `--enable-FEATURE' options to |
||||
|
`configure', where FEATURE indicates an optional part of the package. |
||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE |
||||
|
is something like `gnu-as' or `x' (for the X Window System). The |
||||
|
`README' should mention any `--enable-' and `--with-' options that the |
||||
|
package recognizes. |
||||
|
|
||||
|
Sharing Defaults |
||||
|
================ |
||||
|
|
||||
|
If you want to set default values for `configure' scripts to share, |
||||
|
you can create a site shell script called `config.site' that gives |
||||
|
default values for variables like `CC', `cache_file', and `prefix'. |
||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then |
||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the |
||||
|
`CONFIG_SITE' environment variable to the location of the site script. |
||||
|
A warning: not all `configure' scripts look for a site script. |
||||
|
|
||||
|
Operation Controls |
||||
|
================== |
||||
|
|
||||
|
`configure' recognizes the following options to control how it |
||||
|
operates. |
||||
|
|
||||
|
`--cache-file=FILE' |
||||
|
Use and save the results of the tests in FILE instead of |
||||
|
`./config.cache'. Set FILE to `/dev/null' to disable caching, for |
||||
|
debugging `configure'. |
||||
|
|
||||
|
`--help' |
||||
|
Print a summary of the options to `configure', and exit. |
||||
|
|
||||
|
`--quiet' |
||||
|
`--silent' |
||||
|
`-q' |
||||
|
Do not print messages saying which checks are being made. To |
||||
|
suppress all normal output, redirect it to `/dev/null' (any error |
||||
|
messages will still be shown). |
||||
|
|
||||
|
`--srcdir=DIR' |
||||
|
Look for the package's source code in directory DIR. Usually |
||||
|
`configure' can determine that directory automatically. |
||||
|
|
||||
|
`--version' |
||||
|
Print the version of Autoconf used to generate the `configure' |
||||
|
script, and exit. |
||||
|
|
||||
|
`configure' also accepts some other, not widely useful, options. |
||||
|
|
||||
@ -0,0 +1,57 @@ |
|||||
|
## Process this file with automake to produce Makefile.in
|
||||
|
|
||||
|
# Copyright (C) 1999 by John Heidemann <johnh@isi.edu>
|
||||
|
|
||||
|
## shallow
|
||||
|
AUTOMAKE_OPTIONS = 1.0 foreign |
||||
|
|
||||
|
bin_PROGRAMS = xgraph |
||||
|
xgraph_c_sources = \
|
||||
|
xgraph.c xgX.c hard_devices.c dialog.c hpgl.c \
|
||||
|
ps.c idraw.c xtb.c st.c params.c alloc.c draw.c \
|
||||
|
init.c read.c tgif.c derivative.c \
|
||||
|
copyright.h \
|
||||
|
general.h \
|
||||
|
hard_devices.h \
|
||||
|
params.h \
|
||||
|
plotter.h \
|
||||
|
st.h \
|
||||
|
xgout.h \
|
||||
|
xgraph.h \
|
||||
|
xtb.h |
||||
|
xgraph_SOURCES = $(xgraph_c_sources) |
||||
|
|
||||
|
man_MANS = xgraph.man |
||||
|
|
||||
|
EXTRA_DIST=\
|
||||
|
$(man_MANS) \
|
||||
|
README.ANNOUNCE \
|
||||
|
README.GENERAL \
|
||||
|
README.HARDCOPY \
|
||||
|
README.INSTALL \
|
||||
|
README.NEWFEATURES \
|
||||
|
bitmaps/dot.11 \
|
||||
|
bitmaps/gray \
|
||||
|
bitmaps/mark1.11 \
|
||||
|
bitmaps/mark2.11 \
|
||||
|
bitmaps/mark3.11 \
|
||||
|
bitmaps/mark4.11 \
|
||||
|
bitmaps/mark5.11 \
|
||||
|
bitmaps/mark6.11 \
|
||||
|
bitmaps/mark7.11 \
|
||||
|
bitmaps/mark8.11 \
|
||||
|
examples/Animation.xg \
|
||||
|
examples/bar.xg \
|
||||
|
examples/surface.xg \
|
||||
|
examples/surface2.xg \
|
||||
|
examples/surface3.xg \
|
||||
|
examples/xgtest.xg |
||||
|
|
||||
|
|
||||
|
# C_WARNINGS = -Wall
|
||||
|
C_WARNINGS = |
||||
|
CFLAGS=$(ADDITIONAL_INCLUDES) $(C_WARNINGS) -g $(X_CFLAGS) |
||||
|
|
||||
|
xgraph_LDADD= $(ADDITIONAL_LIBS) $(X_LIBS) $(X_PRE_LIBS) $(X_EXTRA_LIBS) -lX11 -lm |
||||
|
|
||||
|
|
||||
@ -0,0 +1,444 @@ |
|||||
|
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
|
|
||||
|
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
|
# This Makefile.in is free software; the Free Software Foundation
|
||||
|
# gives unlimited permission to copy and/or distribute it,
|
||||
|
# with or without modifications, as long as this notice is preserved.
|
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful,
|
||||
|
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
|
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
|
# PARTICULAR PURPOSE.
|
||||
|
|
||||
|
# Copyright (C) 1999 by John Heidemann <johnh@isi.edu>
|
||||
|
|
||||
|
|
||||
|
SHELL = @SHELL@ |
||||
|
|
||||
|
srcdir = @srcdir@ |
||||
|
top_srcdir = @top_srcdir@ |
||||
|
VPATH = @srcdir@ |
||||
|
prefix = @prefix@ |
||||
|
exec_prefix = @exec_prefix@ |
||||
|
|
||||
|
bindir = @bindir@ |
||||
|
sbindir = @sbindir@ |
||||
|
libexecdir = @libexecdir@ |
||||
|
datadir = @datadir@ |
||||
|
sysconfdir = @sysconfdir@ |
||||
|
sharedstatedir = @sharedstatedir@ |
||||
|
localstatedir = @localstatedir@ |
||||
|
libdir = @libdir@ |
||||
|
infodir = @infodir@ |
||||
|
mandir = @mandir@ |
||||
|
includedir = @includedir@ |
||||
|
oldincludedir = /usr/include |
||||
|
|
||||
|
DESTDIR = |
||||
|
|
||||
|
pkgdatadir = $(datadir)/@PACKAGE@ |
||||
|
pkglibdir = $(libdir)/@PACKAGE@ |
||||
|
pkgincludedir = $(includedir)/@PACKAGE@ |
||||
|
|
||||
|
top_builddir = . |
||||
|
|
||||
|
ACLOCAL = @ACLOCAL@ |
||||
|
AUTOCONF = @AUTOCONF@ |
||||
|
AUTOMAKE = @AUTOMAKE@ |
||||
|
AUTOHEADER = @AUTOHEADER@ |
||||
|
|
||||
|
INSTALL = @INSTALL@ |
||||
|
INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) |
||||
|
INSTALL_DATA = @INSTALL_DATA@ |
||||
|
INSTALL_SCRIPT = @INSTALL_SCRIPT@ |
||||
|
transform = @program_transform_name@ |
||||
|
|
||||
|
NORMAL_INSTALL = : |
||||
|
PRE_INSTALL = : |
||||
|
POST_INSTALL = : |
||||
|
NORMAL_UNINSTALL = : |
||||
|
PRE_UNINSTALL = : |
||||
|
POST_UNINSTALL = : |
||||
|
ADDITIONAL_INCLUDES = @ADDITIONAL_INCLUDES@ |
||||
|
ADDITIONAL_LIBS = @ADDITIONAL_LIBS@ |
||||
|
CC = @CC@ |
||||
|
MAKEINFO = @MAKEINFO@ |
||||
|
PACKAGE = @PACKAGE@ |
||||
|
VERSION = @VERSION@ |
||||
|
|
||||
|
AUTOMAKE_OPTIONS = 1.0 foreign |
||||
|
|
||||
|
bin_PROGRAMS = xgraph |
||||
|
xgraph_c_sources = xgraph.c xgX.c hard_devices.c dialog.c hpgl.c ps.c idraw.c xtb.c st.c params.c alloc.c draw.c init.c read.c tgif.c derivative.c copyright.h general.h hard_devices.h params.h plotter.h st.h xgout.h xgraph.h xtb.h |
||||
|
|
||||
|
xgraph_SOURCES = $(xgraph_c_sources) |
||||
|
|
||||
|
man_MANS = xgraph.man |
||||
|
|
||||
|
EXTRA_DIST = $(man_MANS) README.ANNOUNCE README.GENERAL README.HARDCOPY README.INSTALL README.NEWFEATURES bitmaps/dot.11 bitmaps/gray bitmaps/mark1.11 bitmaps/mark2.11 bitmaps/mark3.11 bitmaps/mark4.11 bitmaps/mark5.11 bitmaps/mark6.11 bitmaps/mark7.11 bitmaps/mark8.11 examples/Animation.xg examples/bar.xg examples/surface.xg examples/surface2.xg examples/surface3.xg examples/xgtest.xg |
||||
|
|
||||
|
|
||||
|
# C_WARNINGS = -Wall
|
||||
|
C_WARNINGS = |
||||
|
CFLAGS = $(ADDITIONAL_INCLUDES) $(C_WARNINGS) -g $(X_CFLAGS) |
||||
|
|
||||
|
xgraph_LDADD = $(ADDITIONAL_LIBS) $(X_LIBS) $(X_PRE_LIBS) $(X_EXTRA_LIBS) -lX11 -lm |
||||
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 |
||||
|
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs |
||||
|
CONFIG_HEADER = autoconf.h |
||||
|
CONFIG_CLEAN_FILES = |
||||
|
PROGRAMS = $(bin_PROGRAMS) |
||||
|
|
||||
|
|
||||
|
DEFS = @DEFS@ -I. -I$(srcdir) -I. |
||||
|
CPPFLAGS = @CPPFLAGS@ |
||||
|
LDFLAGS = @LDFLAGS@ |
||||
|
LIBS = @LIBS@ |
||||
|
X_CFLAGS = @X_CFLAGS@ |
||||
|
X_LIBS = @X_LIBS@ |
||||
|
X_EXTRA_LIBS = @X_EXTRA_LIBS@ |
||||
|
X_PRE_LIBS = @X_PRE_LIBS@ |
||||
|
xgraph_OBJECTS = xgraph.o xgX.o hard_devices.o dialog.o hpgl.o ps.o \
|
||||
|
idraw.o xtb.o st.o params.o alloc.o draw.o init.o read.o tgif.o \ |
||||
|
derivative.o |
||||
|
xgraph_DEPENDENCIES = |
||||
|
xgraph_LDFLAGS = |
||||
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) |
||||
|
CCLD = $(CC) |
||||
|
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ |
||||
|
manmdir = $(mandir)/manm |
||||
|
MANS = $(man_MANS) |
||||
|
|
||||
|
NROFF = nroff |
||||
|
DIST_COMMON = README ./stamp-h.in INSTALL Makefile.am Makefile.in \
|
||||
|
aclocal.m4 autoconf.h.in configure configure.in install-sh missing \ |
||||
|
mkinstalldirs |
||||
|
|
||||
|
|
||||
|
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) |
||||
|
|
||||
|
TAR = gtar |
||||
|
GZIP_ENV = --best |
||||
|
SOURCES = $(xgraph_SOURCES) |
||||
|
OBJECTS = $(xgraph_OBJECTS) |
||||
|
|
||||
|
all: all-redirect |
||||
|
.SUFFIXES: |
||||
|
.SUFFIXES: .S .c .o .s |
||||
|
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) |
||||
|
cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Makefile |
||||
|
|
||||
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status |
||||
|
cd $(top_builddir) \
|
||||
|
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status |
||||
|
|
||||
|
$(ACLOCAL_M4): configure.in |
||||
|
cd $(srcdir) && $(ACLOCAL) |
||||
|
|
||||
|
config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) |
||||
|
$(SHELL) ./config.status --recheck |
||||
|
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) |
||||
|
cd $(srcdir) && $(AUTOCONF) |
||||
|
|
||||
|
autoconf.h: stamp-h |
||||
|
@if test ! -f $@; then \
|
||||
|
rm -f stamp-h; \
|
||||
|
$(MAKE) stamp-h; \
|
||||
|
else :; fi |
||||
|
stamp-h: $(srcdir)/autoconf.h.in $(top_builddir)/config.status |
||||
|
cd $(top_builddir) \
|
||||
|
&& CONFIG_FILES= CONFIG_HEADERS=autoconf.h \
|
||||
|
$(SHELL) ./config.status |
||||
|
@echo timestamp > stamp-h 2> /dev/null |
||||
|
$(srcdir)/autoconf.h.in: $(srcdir)/stamp-h.in |
||||
|
@if test ! -f $@; then \
|
||||
|
rm -f $(srcdir)/stamp-h.in; \
|
||||
|
$(MAKE) $(srcdir)/stamp-h.in; \
|
||||
|
else :; fi |
||||
|
$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) |
||||
|
cd $(top_srcdir) && $(AUTOHEADER) |
||||
|
@echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null |
||||
|
|
||||
|
mostlyclean-hdr: |
||||
|
|
||||
|
clean-hdr: |
||||
|
|
||||
|
distclean-hdr: |
||||
|
-rm -f autoconf.h |
||||
|
|
||||
|
maintainer-clean-hdr: |
||||
|
|
||||
|
mostlyclean-binPROGRAMS: |
||||
|
|
||||
|
clean-binPROGRAMS: |
||||
|
-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) |
||||
|
|
||||
|
distclean-binPROGRAMS: |
||||
|
|
||||
|
maintainer-clean-binPROGRAMS: |
||||
|
|
||||
|
install-binPROGRAMS: $(bin_PROGRAMS) |
||||
|
@$(NORMAL_INSTALL) |
||||
|
$(mkinstalldirs) $(DESTDIR)$(bindir) |
||||
|
@list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||
|
if test -f $$p; then \
|
||||
|
echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
|
||||
|
$(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
|
||||
|
else :; fi; \
|
||||
|
done |
||||
|
|
||||
|
uninstall-binPROGRAMS: |
||||
|
@$(NORMAL_UNINSTALL) |
||||
|
list='$(bin_PROGRAMS)'; for p in $$list; do \
|
||||
|
rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
|
||||
|
done |
||||
|
|
||||
|
.c.o: |
||||
|
$(COMPILE) -c $< |
||||
|
|
||||
|
.s.o: |
||||
|
$(COMPILE) -c $< |
||||
|
|
||||
|
.S.o: |
||||
|
$(COMPILE) -c $< |
||||
|
|
||||
|
mostlyclean-compile: |
||||
|
-rm -f *.o core *.core |
||||
|
|
||||
|
clean-compile: |
||||
|
|
||||
|
distclean-compile: |
||||
|
-rm -f *.tab.c |
||||
|
|
||||
|
maintainer-clean-compile: |
||||
|
|
||||
|
xgraph: $(xgraph_OBJECTS) $(xgraph_DEPENDENCIES) |
||||
|
@rm -f xgraph |
||||
|
$(LINK) $(xgraph_LDFLAGS) $(xgraph_OBJECTS) $(xgraph_LDADD) $(LIBS) |
||||
|
|
||||
|
install-manm: |
||||
|
$(mkinstalldirs) $(DESTDIR)$(manmdir) |
||||
|
@list='$(manm_MANS)'; \
|
||||
|
l2='$(man_MANS)'; for i in $$l2; do \
|
||||
|
case "$$i" in \
|
||||
|
*.m*) list="$$list $$i" ;; \
|
||||
|
esac; \
|
||||
|
done; \
|
||||
|
for i in $$list; do \
|
||||
|
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
||||
|
else file=$$i; fi; \
|
||||
|
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
|
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
|
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
|
echo " $(INSTALL_DATA) $$file $(DESTDIR)$(manmdir)/$$inst"; \
|
||||
|
$(INSTALL_DATA) $$file $(DESTDIR)$(manmdir)/$$inst; \
|
||||
|
done |
||||
|
|
||||
|
uninstall-manm: |
||||
|
@list='$(manm_MANS)'; \
|
||||
|
l2='$(man_MANS)'; for i in $$l2; do \
|
||||
|
case "$$i" in \
|
||||
|
*.m*) list="$$list $$i" ;; \
|
||||
|
esac; \
|
||||
|
done; \
|
||||
|
for i in $$list; do \
|
||||
|
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
|
||||
|
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
|
||||
|
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
|
||||
|
echo " rm -f $(DESTDIR)$(manmdir)/$$inst"; \
|
||||
|
rm -f $(DESTDIR)$(manmdir)/$$inst; \
|
||||
|
done |
||||
|
install-man: $(MANS) |
||||
|
@$(NORMAL_INSTALL) |
||||
|
$(MAKE) $(AM_MAKEFLAGS) install-manm |
||||
|
uninstall-man: |
||||
|
@$(NORMAL_UNINSTALL) |
||||
|
$(MAKE) $(AM_MAKEFLAGS) uninstall-manm |
||||
|
|
||||
|
tags: TAGS |
||||
|
|
||||
|
ID: $(HEADERS) $(SOURCES) $(LISP) |
||||
|
list='$(SOURCES) $(HEADERS)'; \
|
||||
|
unique=`for i in $$list; do echo $$i; done | \
|
||||
|
awk ' { files[$$0] = 1; } \
|
||||
|
END { for (i in files) print i; }'`; \
|
||||
|
here=`pwd` && cd $(srcdir) \
|
||||
|
&& mkid -f$$here/ID $$unique $(LISP) |
||||
|
|
||||
|
TAGS: $(HEADERS) $(SOURCES) autoconf.h.in $(TAGS_DEPENDENCIES) $(LISP) |
||||
|
tags=; \
|
||||
|
here=`pwd`; \
|
||||
|
list='$(SOURCES) $(HEADERS)'; \
|
||||
|
unique=`for i in $$list; do echo $$i; done | \
|
||||
|
awk ' { files[$$0] = 1; } \
|
||||
|
END { for (i in files) print i; }'`; \
|
||||
|
test -z "$(ETAGS_ARGS)autoconf.h.in$$unique$(LISP)$$tags" \
|
||||
|
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags autoconf.h.in $$unique $(LISP) -o $$here/TAGS) |
||||
|
|
||||
|
mostlyclean-tags: |
||||
|
|
||||
|
clean-tags: |
||||
|
|
||||
|
distclean-tags: |
||||
|
-rm -f TAGS ID |
||||
|
|
||||
|
maintainer-clean-tags: |
||||
|
|
||||
|
distdir = $(PACKAGE)-$(VERSION) |
||||
|
top_distdir = $(distdir) |
||||
|
|
||||
|
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
|
# it guarantees that the distribution is self-contained by making another
|
||||
|
# tarfile.
|
||||
|
distcheck: dist |
||||
|
-rm -rf $(distdir) |
||||
|
GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz |
||||
|
mkdir $(distdir)/=build |
||||
|
mkdir $(distdir)/=inst |
||||
|
dc_install_base=`cd $(distdir)/=inst && pwd`; \
|
||||
|
cd $(distdir)/=build \
|
||||
|
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
|
&& $(MAKE) $(AM_MAKEFLAGS) dist |
||||
|
-rm -rf $(distdir) |
||||
|
@banner="$(distdir).tar.gz is ready for distribution"; \
|
||||
|
dashes=`echo "$$banner" | sed s/./=/g`; \
|
||||
|
echo "$$dashes"; \
|
||||
|
echo "$$banner"; \
|
||||
|
echo "$$dashes" |
||||
|
dist: distdir |
||||
|
-chmod -R a+r $(distdir) |
||||
|
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) |
||||
|
-rm -rf $(distdir) |
||||
|
dist-all: distdir |
||||
|
-chmod -R a+r $(distdir) |
||||
|
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) |
||||
|
-rm -rf $(distdir) |
||||
|
distdir: $(DISTFILES) |
||||
|
-rm -rf $(distdir) |
||||
|
mkdir $(distdir) |
||||
|
-chmod 777 $(distdir) |
||||
|
$(mkinstalldirs) $(distdir)/bitmaps $(distdir)/examples |
||||
|
@for file in $(DISTFILES); do \
|
||||
|
d=$(srcdir); \
|
||||
|
if test -d $$d/$$file; then \
|
||||
|
cp -pr $$/$$file $(distdir)/$$file; \
|
||||
|
else \
|
||||
|
test -f $(distdir)/$$file \
|
||||
|
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|
|| cp -p $$d/$$file $(distdir)/$$file || :; \
|
||||
|
fi; \
|
||||
|
done |
||||
|
alloc.o: alloc.c |
||||
|
derivative.o: derivative.c xgraph.h autoconf.h xgout.h |
||||
|
dialog.o: dialog.c copyright.h xgout.h xgraph.h autoconf.h \ |
||||
|
hard_devices.h xtb.h params.h |
||||
|
draw.o: draw.c copyright.h xgraph.h autoconf.h xgout.h xtb.h \ |
||||
|
hard_devices.h params.h |
||||
|
hard_devices.o: hard_devices.c copyright.h xgout.h hard_devices.h \ |
||||
|
params.h xgraph.h autoconf.h |
||||
|
hpgl.o: hpgl.c copyright.h xgraph.h autoconf.h xgout.h plotter.h |
||||
|
idraw.o: idraw.c hard_devices.h xgout.h |
||||
|
init.o: init.c copyright.h xgraph.h autoconf.h xgout.h xtb.h \ |
||||
|
hard_devices.h params.h |
||||
|
params.o: params.c st.h params.h xgraph.h autoconf.h xgout.h \ |
||||
|
hard_devices.h |
||||
|
ps.o: ps.c copyright.h xgraph.h autoconf.h xgout.h |
||||
|
read.o: read.c copyright.h xgraph.h autoconf.h xgout.h xtb.h \ |
||||
|
hard_devices.h params.h |
||||
|
st.o: st.c copyright.h st.h xgraph.h autoconf.h xgout.h |
||||
|
tgif.o: tgif.c hard_devices.h xgout.h |
||||
|
xgX.o: xgX.c copyright.h xgout.h params.h xgraph.h autoconf.h \ |
||||
|
bitmaps/dot.11 bitmaps/mark1.11 bitmaps/mark2.11 \
|
||||
|
bitmaps/mark3.11 bitmaps/mark4.11 bitmaps/mark5.11 \
|
||||
|
bitmaps/mark6.11 bitmaps/mark7.11 bitmaps/mark8.11 |
||||
|
xgraph.o: xgraph.c copyright.h xgraph.h autoconf.h xgout.h xtb.h \ |
||||
|
hard_devices.h params.h |
||||
|
xtb.o: xtb.c xtb.h copyright.h |
||||
|
|
||||
|
info-am: |
||||
|
info: info-am |
||||
|
dvi-am: |
||||
|
dvi: dvi-am |
||||
|
check-am: all-am |
||||
|
check: check-am |
||||
|
installcheck-am: |
||||
|
installcheck: installcheck-am |
||||
|
all-recursive-am: autoconf.h |
||||
|
$(MAKE) $(AM_MAKEFLAGS) all-recursive |
||||
|
|
||||
|
install-exec-am: install-binPROGRAMS |
||||
|
install-exec: install-exec-am |
||||
|
|
||||
|
install-data-am: install-man |
||||
|
install-data: install-data-am |
||||
|
|
||||
|
install-am: all-am |
||||
|
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am |
||||
|
install: install-am |
||||
|
uninstall-am: uninstall-binPROGRAMS uninstall-man |
||||
|
uninstall: uninstall-am |
||||
|
all-am: Makefile $(PROGRAMS) $(MANS) autoconf.h |
||||
|
all-redirect: all-am |
||||
|
install-strip: |
||||
|
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install |
||||
|
installdirs: |
||||
|
$(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/manm |
||||
|
|
||||
|
|
||||
|
mostlyclean-generic: |
||||
|
|
||||
|
clean-generic: |
||||
|
|
||||
|
distclean-generic: |
||||
|
-rm -f Makefile $(CONFIG_CLEAN_FILES) |
||||
|
-rm -f config.cache config.log stamp-h stamp-h[0-9]* |
||||
|
|
||||
|
maintainer-clean-generic: |
||||
|
mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ |
||||
|
mostlyclean-compile mostlyclean-tags \
|
||||
|
mostlyclean-generic |
||||
|
|
||||
|
mostlyclean: mostlyclean-am |
||||
|
|
||||
|
clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ |
||||
|
clean-generic mostlyclean-am |
||||
|
|
||||
|
clean: clean-am |
||||
|
|
||||
|
distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ |
||||
|
distclean-tags distclean-generic clean-am |
||||
|
|
||||
|
distclean: distclean-am |
||||
|
-rm -f config.status |
||||
|
|
||||
|
maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ |
||||
|
maintainer-clean-compile maintainer-clean-tags \
|
||||
|
maintainer-clean-generic distclean-am |
||||
|
@echo "This command is intended for maintainers to use;" |
||||
|
@echo "it deletes files that may require special tools to rebuild." |
||||
|
|
||||
|
maintainer-clean: maintainer-clean-am |
||||
|
-rm -f config.status |
||||
|
|
||||
|
.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ |
||||
|
mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ |
||||
|
maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ |
||||
|
mostlyclean-compile distclean-compile clean-compile \ |
||||
|
maintainer-clean-compile install-manm uninstall-manm install-man \ |
||||
|
uninstall-man tags mostlyclean-tags distclean-tags clean-tags \ |
||||
|
maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ |
||||
|
installcheck-am installcheck all-recursive-am install-exec-am \ |
||||
|
install-exec install-data-am install-data install-am install \ |
||||
|
uninstall-am uninstall all-redirect all-am all installdirs \ |
||||
|
mostlyclean-generic distclean-generic clean-generic \ |
||||
|
maintainer-clean-generic clean mostlyclean distclean maintainer-clean |
||||
|
|
||||
|
|
||||
|
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
|
.NOEXPORT: |
||||
@ -0,0 +1,26 @@ |
|||||
|
|
||||
|
xgraph 12.1 |
||||
|
<http://www-mash.cs.berkeley.edu/vint/xgraph> |
||||
|
|
||||
|
distributed by the VINT project |
||||
|
<http://netweb.usc.edu/vint/> |
||||
|
|
||||
|
|
||||
|
Welcome to the VINT release of xgraph. |
||||
|
Xgraph is an X-Windows application that includes: |
||||
|
|
||||
|
- interactive plotting and graphing, by David Harrison of UC Berkeley |
||||
|
- animation and deritives, added by Paul Walker of NCSA |
||||
|
- portability and bug fixes, by the VINT project |
||||
|
|
||||
|
|
||||
|
See the file "INSTALL" for installation instructions. |
||||
|
|
||||
|
If you have installation problems or questions, check: |
||||
|
|
||||
|
<http://www-mash.cs.berkeley.edu/ns/ns-problems.html#xgraph> |
||||
|
|
||||
|
BEFORE posting to the mailing list. Mailing list info can be found at |
||||
|
the xgraph web page. |
||||
|
|
||||
|
|
||||
@ -0,0 +1,84 @@ |
|||||
|
|
||||
|
A new version of xgraph is now available. Xgraph is a popular |
||||
|
two-dimensional plotting program that accepts data in a form similar |
||||
|
to the unix program graph and displays line graphs, scatter plots, or |
||||
|
bar charts on an X11 display. These graphs are fully annotated with a |
||||
|
title, axis numbering and labels, and a legend. Zooming in on regions |
||||
|
of a graph is supported. The program can automatically generate |
||||
|
hardcopy output to Postscript printers and HPGL plotters. A new |
||||
|
option allows xgraph output to be directly pasted into idraw for |
||||
|
further annotation. |
||||
|
|
||||
|
This program is NOT a widget. It is a stand-alone program written at |
||||
|
the Xlib level and should run on any machine with a reasonable |
||||
|
implementation of X11 release 3 or later. The source for the program |
||||
|
is available through anonymous ftp to shambhala.Berkeley.EDU |
||||
|
(128.32.132.54): |
||||
|
|
||||
|
% ftp shambhala.Berkeley.EDU |
||||
|
Name: anonymous |
||||
|
Password: <anything non-null> |
||||
|
ftp> cd pub |
||||
|
ftp> binary |
||||
|
ftp> get xgraph-11.tar.Z |
||||
|
ftp> quit |
||||
|
% uncompress xgraph-11.tar.Z |
||||
|
% tar xf xgraph-11.tar |
||||
|
|
||||
|
This will create a directory called xgraph-11. In that directory |
||||
|
you will find a file called README.INSTALL that contains directions |
||||
|
for building the program. I plan to submit the sources to the |
||||
|
moderator of comp.sources.x after I have tested the program under X11 |
||||
|
release 4 (meaning a few weeks after the X Consortium releases the |
||||
|
distribution). |
||||
|
|
||||
|
Those who do not have ftp access can obtain the source for xgraph |
||||
|
using a mail archive system I have installed on dent.Berkeley.EDU |
||||
|
(courtesy of Brian Reid at Digital). An example is given below: |
||||
|
|
||||
|
To: ucbvax!dent!archive-server |
||||
|
Subject: send programs xgraph.shar.01 xgraph.shar.02 |
||||
|
|
||||
|
send programs xgraph.shar.03 xgraph.shar.04 xgraph.shar.05 |
||||
|
send programs xgraph.shar.06 xgraph.shar.07 xgraph.shar.08 |
||||
|
|
||||
|
The archive server will send you these files as time and load permits. |
||||
|
They are standard shell archives and can be unpacked by running them |
||||
|
through /bin/sh (in order). If you would like to know more about the |
||||
|
mail server, send a message with a subject of "help". I am afraid I |
||||
|
am no mail wizard so I cannot help you determine a path to dent. |
||||
|
|
||||
|
For those familar with xgraph, the most important changes are |
||||
|
summarized below: |
||||
|
|
||||
|
- A new data reader has been written that allows discontinuous data in |
||||
|
each data set. Also, nearly all of the display options for xgraph |
||||
|
can be set in the data file. The reader is also more forgiving |
||||
|
about blank lines and excess white space. |
||||
|
|
||||
|
- A new option has been added to the Postscript hardcopy facility to |
||||
|
allow xgraph output to be included in other documents using psfig. |
||||
|
As mentioned above, xgraph output can be imported into idraw for |
||||
|
further annotation if necessary. |
||||
|
|
||||
|
- I received lots of complaints about the way xgraph obtains fonts and |
||||
|
visuals. The new xgraph uses a much simpler scheme to obtain these |
||||
|
resources and has fall back code to insure it will run in almost any |
||||
|
situation. |
||||
|
|
||||
|
- Options handling has been cleaned up substantially. Xgraph options |
||||
|
can now be specified as X resources (~/.Xdefaults), in the data |
||||
|
file, or on the command line. |
||||
|
|
||||
|
- Drawing is somewhat faster on some servers due to a better choice of |
||||
|
initial defaults. |
||||
|
|
||||
|
Please send all bug reports, questions, comments or suggestions to |
||||
|
the electronic address below. |
||||
|
|
||||
|
David Harrison |
||||
|
UC Berkeley Electronics Research Lab |
||||
|
(davidh@ic.Berkeley.EDU, ...!ucbvax!ucbcad!davidh) |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,74 @@ |
|||||
|
|
||||
|
This directory contains source for the X11 version of xgraph, a |
||||
|
two-dimensional data plotting program. Those familar with the X10 |
||||
|
version of this program will find that is completely compatible. |
||||
|
However, there are a few important notes and changes you should |
||||
|
be aware of: |
||||
|
|
||||
|
1. The program was developed and tested on X11 release 3 on a |
||||
|
color VAXstation GPX and on a color DECstation 3100. It should |
||||
|
work on most other servers without change but has not been tested |
||||
|
on these other configurations. If you have problems, please send |
||||
|
a note to: |
||||
|
|
||||
|
davidh@ic.Berkeley.EDU |
||||
|
or |
||||
|
...!ucbvax!ucbcad!davidh |
||||
|
|
||||
|
2. This version includes an improved hardcopy facility. |
||||
|
An additional option, "Include in Document", has been added since |
||||
|
the first X11 release. A new output type, Idraw, has also been |
||||
|
added. See the manual page for details about the hardcopy dialog. |
||||
|
|
||||
|
3. There are several changes to the input format for xgraph. However, |
||||
|
the new format is compatible with the old and there should be no |
||||
|
problem running xgraph with old data sets. The new form allows |
||||
|
discontinuous data in data sets (using the "move" operator), |
||||
|
parameter specification using a format similar to that found in the |
||||
|
~/.Xdefaults file, and comments. See the manual page for details. |
||||
|
|
||||
|
4. In some cases, xgraph uses dashed lines to distinguish different |
||||
|
data sets. Some servers are notoriously slow at rendering dashed |
||||
|
lines. Be prepared for a significantly reduced performance on |
||||
|
those servers. |
||||
|
|
||||
|
5. Xgraph now uses software clipping to clip data to its display |
||||
|
windows. This means you should be able to zoom in much farther |
||||
|
on large data sets than was possible under the X10 version. |
||||
|
|
||||
|
6. Xgraph used to use some rather sophisticated heuristics to handle |
||||
|
visuals and colormaps. Due to complaints, I have removed these |
||||
|
heuristics. Xgraph will display on whatever screen is specified in |
||||
|
the DISPLAY environment variable or on the command line. |
||||
|
|
||||
|
7. I plan to add full ICCCM support when X11 release 4 becomes |
||||
|
available. In the meantime, the program should work under most |
||||
|
window mangers (it is somewhat conformant already). |
||||
|
|
||||
|
8. As a follow-on to (7), note that the operation of the program |
||||
|
is heavily influenced by your choice of window managers. Focus |
||||
|
based window managers (like dxwm from Digital) will require you |
||||
|
to set focus in the text input slots of the hardcopy dialog box. |
||||
|
|
||||
|
9. Many people have sent me notes about the state of code of xgraph. |
||||
|
Xgraph was constructed initially as a challenge from another |
||||
|
programmer here at Berkeley. The first version of the program was |
||||
|
written in an afternoon. Since then, the program has "evolved" |
||||
|
quite dramatically. Since this is not my primary work, I generally |
||||
|
tacked on features quickly as the need became apparent. Some day, |
||||
|
I would truely like to rewrite it. Until then, please bear with |
||||
|
me. |
||||
|
|
||||
|
10. Since xgraph has become quite popular, those in positions of power |
||||
|
have recommended I add the standard UC Berkeley copyright notice |
||||
|
to this software. See copyright.h for details. |
||||
|
|
||||
|
11. Many people have sent me suggestions and comments. Some have |
||||
|
written new code or sent patches to fix problems. I greately |
||||
|
appreciate these contributions. Special thanks go to Beorn Johnson |
||||
|
and Alan Kramer for the idraw output code. |
||||
|
|
||||
|
David Harrison |
||||
|
UC Berkeley Electronics Research Lab |
||||
|
(davidh@ic.Berkeley.EDU, ...!ucbvax!ucbcad!davidh) |
||||
|
|
||||
@ -0,0 +1,288 @@ |
|||||
|
/* |
||||
|
* Hardcopy Interface for Xgraph |
||||
|
* |
||||
|
* Major differences from first version: |
||||
|
* A flags argument has been added to xg_init(). This new argument |
||||
|
* is used to specify a new binary option: D_DOCU. See below |
||||
|
* for details. |
||||
|
* |
||||
|
* Four new parameters are passed to the device initialization routine: |
||||
|
* title_family, title_size, axis_family, and axis_size. See the |
||||
|
* description of xg_init() for details. |
||||
|
* |
||||
|
* Clipping is done automatically by xgraph. The xg_clip() routine |
||||
|
* is obsolete. |
||||
|
* |
||||
|
* The xg_line() routine has become the xg_seg() routine. It now |
||||
|
* draws segments rather than a series of lines. |
||||
|
* |
||||
|
* A new field (max_segs) in the device structure now specifies |
||||
|
* the maximum number of segments the device can handle in a group. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 1 |
||||
|
* Write versions of the following routines for your device: |
||||
|
* xg_init(), xg_text(), xg_seg(), xg_dot(), and xg_end(). |
||||
|
* The interface and function of these routines are described |
||||
|
* in detail below. These routines should be named according |
||||
|
* to your device. For example, the initialization routine |
||||
|
* for the Postscript output device is psInit(). Also, name |
||||
|
* your source file after your device (e.g. the postscript |
||||
|
* routines are in the file ps.c). Instructions continue |
||||
|
* after the description of the interface routines. |
||||
|
* |
||||
|
* The definitions below are quoted here as a convenience. In |
||||
|
* your output module, you can include "xgout.h" to obtain these |
||||
|
* definitions. |
||||
|
*/ |
||||
|
|
||||
|
#define D_COLOR 0x01 |
||||
|
#define ERRBUFSIZE 2048 |
||||
|
|
||||
|
#define D_DOCU 0x01 |
||||
|
|
||||
|
typedef struct xg_out { |
||||
|
int dev_flags; /* Device characteristic flags */ |
||||
|
int area_w, area_h; /* Width and height in pixels */ |
||||
|
int bdr_pad; /* Padding from border */ |
||||
|
int axis_pad; /* Extra space around axis labels */ |
||||
|
int tick_len; /* Length of a tick mark */ |
||||
|
int legend_pad; /* Top of legend text to legend line */ |
||||
|
int axis_width; /* Width of big character of axis font */ |
||||
|
int axis_height; /* Height of big character of axis font */ |
||||
|
int title_width; /* Width of big character of title font */ |
||||
|
int title_height; /* Height of big character of title font */ |
||||
|
int max_segs; /* Maximum number of segments in group */ |
||||
|
|
||||
|
void (*xg_text)(); /* Draws text at a location */ |
||||
|
void (*xg_seg)(); /* Draws a series of segments */ |
||||
|
void (*xg_dot)(); /* Draws a dot or marker at a location */ |
||||
|
void (*xg_end)(); /* Stops the drawing sequence */ |
||||
|
|
||||
|
char *user_state; /* User supplied state information */ |
||||
|
} xgOut; |
||||
|
|
||||
|
|
||||
|
int xg_init(strm, width, height, title_family, title_size, |
||||
|
axis_family, axis_size, out_info, errmsg) |
||||
|
FILE *strm; /* Output stream */ |
||||
|
int width, height; /* Size of space (microns) */ |
||||
|
char *title_family; /* Name of title font family */ |
||||
|
double title_size; /* Title font height (points) */ |
||||
|
char *axis_family; /* Name of axis font family */ |
||||
|
double axis_size; /* Axis font height (points) */ |
||||
|
int flags; /* Flags (see below) */ |
||||
|
xgOut *out_info; /* Device info (RETURN) */ |
||||
|
char errmsg[ERRBUFSIZE]; /* Error message area */ |
||||
|
/* |
||||
|
* This routine is called by xgraph just before drawing is to |
||||
|
* begin. The desired size of the plot is given by `width' |
||||
|
* and `height'. The parameters `title_family', `title_size', |
||||
|
* `axis_family', and `axis_size' specify the names of the |
||||
|
* title and axis fonts and their vertical sizes (in points). |
||||
|
* These parameters can be ignored if your device does not |
||||
|
* support multiple fonts. The `flags' argument specifies |
||||
|
* certain binary flags to the output routines. These |
||||
|
* flags are: |
||||
|
* D_DOCU: |
||||
|
* If this flag is set, it indicates the user has specified that |
||||
|
* the output will be included in some larger document. Devices |
||||
|
* may choose to use this information to produce output that |
||||
|
* can be integrated into documents with less effort. For example, |
||||
|
* the Postscript output routines produce bounding box information |
||||
|
* when this flag is set. |
||||
|
* The routine should fill in all of the fields of `out_info' with |
||||
|
* appropriate values. The values are described below: |
||||
|
* area_w, area_h: |
||||
|
* Size of the drawing space in device coordinates. |
||||
|
* This should take in account the requested area |
||||
|
* given by `width', and `height'. |
||||
|
* bdr_pad: |
||||
|
* Xgraph will leave this number of device coordinates around |
||||
|
* all of the outer edges of the graph. |
||||
|
* axis_pad: |
||||
|
* Additional space around axis labels (in devcoords) |
||||
|
* so that the labels do not appear crowded. |
||||
|
* legend_pad: |
||||
|
* Space (in devcoords) from the top of legend text to |
||||
|
* the representative line drawn above the legend text. |
||||
|
* tick_len: |
||||
|
* Size of a tick mark placed on axis (in devcoords) |
||||
|
* axis_width: |
||||
|
* An estimate of the width of a large character in |
||||
|
* the axis font (in devcoords). This can be an overestimate. An |
||||
|
* underestimate may produce bad results. |
||||
|
* axis_height: |
||||
|
* An estimate of the height of a large character in |
||||
|
* the axis labeling font (in devcoords). |
||||
|
* title_width, title_height: |
||||
|
* Same as above except for the title font. |
||||
|
* max_segs: |
||||
|
* Due to buffering constraints, some devices may not be able to |
||||
|
* handle massive segment lists. This parameter tells xgraph not |
||||
|
* to send more than `max_segs' segments in one request. |
||||
|
* Output to the device should be written to the stream `strm'. |
||||
|
* The functions are described individually below. After filling |
||||
|
* in the parameters and setting the function pointers, the routine |
||||
|
* should initialize its drawing state and store any extra needed |
||||
|
* information in `user_state'. This value will be passed to all |
||||
|
* other routines during the drawing sequence. If the device |
||||
|
* cannot initialize, it should return a zero status and fill |
||||
|
* `errmsg' with an informative error message. |
||||
|
*/ |
||||
|
|
||||
|
/* Text justifications */ |
||||
|
#define T_CENTER 0 |
||||
|
#define T_LEFT 1 |
||||
|
#define T_UPPERLEFT 2 |
||||
|
#define T_TOP 3 |
||||
|
#define T_UPPERRIGHT 4 |
||||
|
#define T_RIGHT 5 |
||||
|
#define T_LOWERRIGHT 6 |
||||
|
#define T_BOTTOM 7 |
||||
|
#define T_LOWERLEFT 8 |
||||
|
|
||||
|
/* Text styles */ |
||||
|
#define T_AXIS 0 |
||||
|
#define T_TITLE 1 |
||||
|
|
||||
|
void xg_text(user_state, x, y, text, just, style) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, y; /* Text position (pixels) */ |
||||
|
char *text; /* Null terminated text */ |
||||
|
int just; /* Justification (above) */ |
||||
|
int style; /* Text style (above) */ |
||||
|
/* |
||||
|
* This routine should draw text at the indicated position using |
||||
|
* the indicated justification and style. The justification refers |
||||
|
* to the location of the point in reference to the text. For example, |
||||
|
* if just is T_LOWERLEFT, (x,y) should be located at the lower left |
||||
|
* edge of the text string. |
||||
|
*/ |
||||
|
|
||||
|
/* Line Styles */ |
||||
|
#define L_AXIS 0 |
||||
|
#define L_ZERO 1 |
||||
|
#define L_VAR 2 |
||||
|
|
||||
|
void xg_seg(user_state, ns, seglist, width, style, lappr, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int ns; /* Number of segments */ |
||||
|
XSegment *seglist; /* X array of segments */ |
||||
|
int width; /* Width of lines */ |
||||
|
int style; /* See above */ |
||||
|
int lappr; /* Line appearence */ |
||||
|
int color; /* Line color (if any) */ |
||||
|
/* |
||||
|
* This routine draws a number of line segments at the points |
||||
|
* given in `seglist'. Note that contiguous segments need not share |
||||
|
* endpoints but often do. All segments should be `width' devcoords wide |
||||
|
* and drawn in style `style'. The `width' may be zero meaning that |
||||
|
* the line should be drawn as thin as the device allows. If `style' is |
||||
|
* L_VAR, the parameters `color' and `lappr' should be used to draw the |
||||
|
* line. Both parameters vary from 0 to 7. If the device is capable of |
||||
|
* color, `color' varies faster than `style'. If the device |
||||
|
* has no color, `style' will vary faster than `color' and |
||||
|
* `color' can be safely ignored. However, if the |
||||
|
* the device has more than 8 line appearences, the two can |
||||
|
* be combined to specify 64 line style variations. |
||||
|
* Xgraph promises not to send more than the `max_segs' in the |
||||
|
* xgOut structure passed back from xg_init(). |
||||
|
*/ |
||||
|
|
||||
|
/* Marker styles */ |
||||
|
#define P_PIXEL 0 |
||||
|
#define P_DOT 1 |
||||
|
#define P_MARK 2 |
||||
|
|
||||
|
void xg_dot(user_state, x, y, style, type, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, y; /* Location in pixel units */ |
||||
|
int style; /* Dot style */ |
||||
|
int type; /* Type of marker */ |
||||
|
int color; /* Marker color (if any) */ |
||||
|
/* |
||||
|
* This routine should draw a marker at location `x,y'. If the |
||||
|
* style is P_PIXEL, the dot should be a single pixel. If |
||||
|
* the style is P_DOT, the dot should be a reasonably large |
||||
|
* dot. If the style is P_MARK, it should be a distinguished |
||||
|
* mark which is specified by `type' (0-7). If the output |
||||
|
* device is capable of color, the marker should be drawn in |
||||
|
* `color' (0-7) which corresponds with the color for xg_line. |
||||
|
*/ |
||||
|
|
||||
|
void xg_end(user_state) |
||||
|
char *user_state; |
||||
|
/* |
||||
|
* This routine is called after a drawing sequence is complete. |
||||
|
* It can be used to clean up the user state and set the device |
||||
|
* state appropriately. This routine is optional in the structure. |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 2 |
||||
|
* Edit the file hard_devices.c. Declare your initialization |
||||
|
* function and add your device to the list of devices, |
||||
|
* hard_devices[]. The structure hard_dev is described below |
||||
|
* and is defined in hard_devices.h: |
||||
|
*/ |
||||
|
|
||||
|
#define MFNAME 25 |
||||
|
|
||||
|
typedef enum hard_dev_docu_defn { NONE, NO, YES } hard_dev_docu; |
||||
|
|
||||
|
typedef struct hard_dev { |
||||
|
char *dev_name; /* Device name */ |
||||
|
int (*dev_init)(); /* Initialization function */ |
||||
|
char *dev_spec; /* Default pipe program */ |
||||
|
char dev_file[MFNAME]; /* Default file name */ |
||||
|
char dev_printer[MFNAME]; /* Default printer name */ |
||||
|
double dev_max_dim; /* Default maximum dimension (cm) */ |
||||
|
char dev_title_font[MFNAME];/* Default name of title font */ |
||||
|
double dev_title_size; /* Default size of title font (pnts) */ |
||||
|
char dev_axis_font[MFNAME]; /* Default name of axis font */ |
||||
|
double dev_axis_size; /* Default size of axis font (pnts) */ |
||||
|
hard_dev_docu dev_docu; /* Document predicate */ |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
* dev_spec: |
||||
|
* The dev_spec field should be a command that directly outputs to |
||||
|
* your device. The command should contain one %s directive that |
||||
|
* will be filled in with the name of the device from the hardcopy |
||||
|
* dialog. |
||||
|
* dev_file: |
||||
|
* The default file to write output to if the user selects `To File'. |
||||
|
* dev_printer: |
||||
|
* The default printer to write output to if the user selects |
||||
|
* `To Device'. |
||||
|
* dev_max_dim: |
||||
|
* The default maximum dimension for the device in centimeters. |
||||
|
* dev_title_font, dev_title_size: |
||||
|
* The default title font and size. Sizes are specified in |
||||
|
* points (1/72 inch). |
||||
|
* dev_axis_font, dev_axis_size: |
||||
|
* The default axis font and size. |
||||
|
* dev_docu |
||||
|
* Some devices may require extra preparation when including xgraph |
||||
|
* output in a document. This parameter indicates the default |
||||
|
* value of the Document predicate in the hardcopy dialog. If |
||||
|
* the value is NONE, the device doesn't need any special preparation |
||||
|
* for producing output for inclusion in documents. |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 3 |
||||
|
* Edit the file Makefile. Add your source file to the SRC variable |
||||
|
* and the corresponding object file to the OBJ variable. Finally, |
||||
|
* remake xgraph. Your device should now be available in the |
||||
|
* hardcopy dialog. |
||||
|
*/ |
||||
@ -0,0 +1,79 @@ |
|||||
|
|
||||
|
This file contains instructions for building the X11 version of xgraph. |
||||
|
When unpacked, the source is distributed in three directories: |
||||
|
|
||||
|
xgraph-11 Source for the program |
||||
|
xgraph-11/bitmaps Bitmaps used for cursors and markers |
||||
|
xgraph-11/examples Sample data for trying out the program |
||||
|
|
||||
|
First, you should examine the file hard_devices.c. This file lists |
||||
|
the default hardcopy parameters for each hardcopy output device. Some |
||||
|
of these defaults are site-specific and should be taylored to your |
||||
|
site. For example, at our site, the default HPGL plotter is called |
||||
|
"paper" and the default Postscript printer is called "lps40". You can |
||||
|
change these names in this file. See hard_devices.h for a description |
||||
|
of the initialization fields. |
||||
|
|
||||
|
If you do not like the default values for xgraph options, you can |
||||
|
change these by editing the default values as listed on the third page |
||||
|
in xgraph.c. Remember that changing these values changes the default |
||||
|
behaviour for everyone running the program. Personal preference |
||||
|
should be left for specification in the user's Xresources or Xdefaults |
||||
|
file. |
||||
|
|
||||
|
An Imakefile is provided for compiling the program in an X11 release 3 |
||||
|
source tree. If you have such a source tree, type the following in |
||||
|
the xgraph-11 directory: |
||||
|
|
||||
|
% make TOP=<source-tree-top> |
||||
|
|
||||
|
where <source-tree-top> is the top level directory of the X11 release |
||||
|
3 source tree. If you don't have an X11 source tree but you have all |
||||
|
of the X libraries and include files installed in "standard |
||||
|
locations", type the following the in the xgraph-11 directory: |
||||
|
|
||||
|
% make -f Makefile.std |
||||
|
|
||||
|
Either of these commands will produce an executable xgraph in the |
||||
|
xgraph-11 directory. If you are installing the program in an X11 |
||||
|
source tree, you can use the following to install the program and |
||||
|
manual page in the proper locations: |
||||
|
|
||||
|
% make TOP=<source-tree-top> install |
||||
|
% make TOP=<source-tree-top> install.man |
||||
|
|
||||
|
You might want to try these commands with the "-n" option once to make |
||||
|
sure the program and manual page are installed in the proper |
||||
|
directories. If they aren't, you may want to change the DESTDIR |
||||
|
variable and try again. If you really need to change the Makefile |
||||
|
options, you can generate a new Makefile from the Imakefile using |
||||
|
imake as provided on the X11 release tape. |
||||
|
|
||||
|
Several example data sets are provided in the xgraph-11/examples |
||||
|
directory. Try the following to check out xgraph: |
||||
|
|
||||
|
% xgraph examples/xgtest.xg |
||||
|
|
||||
|
This should produce a graph with a series of parabolic curves. |
||||
|
|
||||
|
Other documentation files are included. A summary of these |
||||
|
files is given below: |
||||
|
|
||||
|
README.ANNOUNCE Message submitted to comp.windows.x announcing |
||||
|
the program and how to obtain it. |
||||
|
|
||||
|
README.GENERAL Important notes about differences and quirks |
||||
|
of the program. |
||||
|
|
||||
|
README.HARDCOPY Documenation for writing your own hardcopy |
||||
|
driver library. |
||||
|
|
||||
|
README.INSTALL This file. |
||||
|
|
||||
|
xgraph.man Xgraph manual page. |
||||
|
|
||||
|
David Harrison |
||||
|
UC Berkeley Electronics Research Lab |
||||
|
(davidh@ic.Berkeley.EDU, ...!ucbvax!ucbcad!davidh) |
||||
|
|
||||
|
|
||||
@ -0,0 +1,43 @@ |
|||||
|
This code is essentially XGraph release 11.4, with some modifications |
||||
|
which were made for use by the NCSA Relativity group. |
||||
|
These modifications were made by Paul Walker, and he should be |
||||
|
contacted at the below address if you have any problems/questions |
||||
|
regarding these features. |
||||
|
|
||||
|
1. Animation. XGraph will now do a *very* crude animation of |
||||
|
your data sets. It occasionally has problems with refreshes |
||||
|
and will consequently run your animation three of four times. |
||||
|
Consider this an undocumented feature! You can adjust the |
||||
|
speed of the animation with the -dl option. I find "2" works |
||||
|
well on a sparc displaying on MacX, "5" on a sparc on its |
||||
|
own display, and "10" on an SGI or RS6K on its own display. |
||||
|
Remeber, this animation is not being advertised as anything |
||||
|
other than very crude, so if you are looking for production |
||||
|
quality video, turn elsewhere. We find it useful as it will |
||||
|
quickly generate animation which shows time evolution. |
||||
|
|
||||
|
2. Differentation. You can press the "Derivative" button to |
||||
|
see the first and second derivatives of your data set. The |
||||
|
method is a standard centered difference. You cannot display |
||||
|
higher than second derivatives. Animation, zooming, etc... |
||||
|
work in each of the derivative windows. Endpoints are found |
||||
|
linearly interpolating inner values to ends, so pay them |
||||
|
little heed! |
||||
|
|
||||
|
3. New Color Map. We couldn't differentiate the colors once we |
||||
|
got past yellow, so we created a new color map. If you don't |
||||
|
like it, look in init.c for the variable "defColors" and |
||||
|
comment out the new one, replacing it with the commented |
||||
|
old one. Of course, you are free to insert your own choices |
||||
|
here also ... Just use standard X color names. |
||||
|
|
||||
|
|
||||
|
These modifications were made by Paul Walker, and distributed with the |
||||
|
Original author's consent. See Copyright.h for information about |
||||
|
distribution and ownership of these changes. Contact Paul Walker at |
||||
|
|
||||
|
Paul Walker |
||||
|
NCSA |
||||
|
605 E. Springfield Ave |
||||
|
Champaign IL 61820 |
||||
|
pwalker@ncsa.uiuc.edu |
||||
@ -0,0 +1,146 @@ |
|||||
|
dnl aclocal.m4 generated automatically by aclocal 1.4 |
||||
|
|
||||
|
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. |
||||
|
dnl This file is free software; the Free Software Foundation |
||||
|
dnl gives unlimited permission to copy and/or distribute it, |
||||
|
dnl with or without modifications, as long as this notice is preserved. |
||||
|
|
||||
|
dnl This program is distributed in the hope that it will be useful, |
||||
|
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without |
||||
|
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
||||
|
dnl PARTICULAR PURPOSE. |
||||
|
|
||||
|
# Do all the work for Automake. This macro actually does too much -- |
||||
|
# some checks are only needed if your package does certain things. |
||||
|
# But this isn't really a big deal. |
||||
|
|
||||
|
# serial 1 |
||||
|
|
||||
|
dnl Usage: |
||||
|
dnl AM_INIT_AUTOMAKE(package,version, [no-define]) |
||||
|
|
||||
|
AC_DEFUN(AM_INIT_AUTOMAKE, |
||||
|
[AC_REQUIRE([AC_PROG_INSTALL]) |
||||
|
PACKAGE=[$1] |
||||
|
AC_SUBST(PACKAGE) |
||||
|
VERSION=[$2] |
||||
|
AC_SUBST(VERSION) |
||||
|
dnl test to see if srcdir already configured |
||||
|
if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then |
||||
|
AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) |
||||
|
fi |
||||
|
ifelse([$3],, |
||||
|
AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) |
||||
|
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) |
||||
|
AC_REQUIRE([AM_SANITY_CHECK]) |
||||
|
AC_REQUIRE([AC_ARG_PROGRAM]) |
||||
|
dnl FIXME This is truly gross. |
||||
|
missing_dir=`cd $ac_aux_dir && pwd` |
||||
|
AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) |
||||
|
AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) |
||||
|
AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) |
||||
|
AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) |
||||
|
AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) |
||||
|
AC_REQUIRE([AC_PROG_MAKE_SET])]) |
||||
|
|
||||
|
# |
||||
|
# Check to make sure that the build environment is sane. |
||||
|
# |
||||
|
|
||||
|
AC_DEFUN(AM_SANITY_CHECK, |
||||
|
[AC_MSG_CHECKING([whether build environment is sane]) |
||||
|
# Just in case |
||||
|
sleep 1 |
||||
|
echo timestamp > conftestfile |
||||
|
# Do `set' in a subshell so we don't clobber the current shell's |
||||
|
# arguments. Must try -L first in case configure is actually a |
||||
|
# symlink; some systems play weird games with the mod time of symlinks |
||||
|
# (eg FreeBSD returns the mod time of the symlink's containing |
||||
|
# directory). |
||||
|
if ( |
||||
|
set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` |
||||
|
if test "[$]*" = "X"; then |
||||
|
# -L didn't work. |
||||
|
set X `ls -t $srcdir/configure conftestfile` |
||||
|
fi |
||||
|
if test "[$]*" != "X $srcdir/configure conftestfile" \ |
||||
|
&& test "[$]*" != "X conftestfile $srcdir/configure"; then |
||||
|
|
||||
|
# If neither matched, then we have a broken ls. This can happen |
||||
|
# if, for instance, CONFIG_SHELL is bash and it inherits a |
||||
|
# broken ls alias from the environment. This has actually |
||||
|
# happened. Such a system could not be considered "sane". |
||||
|
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken |
||||
|
alias in your environment]) |
||||
|
fi |
||||
|
|
||||
|
test "[$]2" = conftestfile |
||||
|
) |
||||
|
then |
||||
|
# Ok. |
||||
|
: |
||||
|
else |
||||
|
AC_MSG_ERROR([newly created file is older than distributed files! |
||||
|
Check your system clock]) |
||||
|
fi |
||||
|
rm -f conftest* |
||||
|
AC_MSG_RESULT(yes)]) |
||||
|
|
||||
|
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) |
||||
|
dnl The program must properly implement --version. |
||||
|
AC_DEFUN(AM_MISSING_PROG, |
||||
|
[AC_MSG_CHECKING(for working $2) |
||||
|
# Run test in a subshell; some versions of sh will print an error if |
||||
|
# an executable is not found, even if stderr is redirected. |
||||
|
# Redirect stdin to placate older versions of autoconf. Sigh. |
||||
|
if ($2 --version) < /dev/null > /dev/null 2>&1; then |
||||
|
$1=$2 |
||||
|
AC_MSG_RESULT(found) |
||||
|
else |
||||
|
$1="$3/missing $2" |
||||
|
AC_MSG_RESULT(missing) |
||||
|
fi |
||||
|
AC_SUBST($1)]) |
||||
|
|
||||
|
# Like AC_CONFIG_HEADER, but automatically create stamp file. |
||||
|
|
||||
|
AC_DEFUN(AM_CONFIG_HEADER, |
||||
|
[AC_PREREQ([2.12]) |
||||
|
AC_CONFIG_HEADER([$1]) |
||||
|
dnl When config.status generates a header, we must update the stamp-h file. |
||||
|
dnl This file resides in the same directory as the config header |
||||
|
dnl that is generated. We must strip everything past the first ":", |
||||
|
dnl and everything past the last "/". |
||||
|
AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl |
||||
|
ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, |
||||
|
<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, |
||||
|
<<am_indx=1 |
||||
|
for am_file in <<$1>>; do |
||||
|
case " <<$>>CONFIG_HEADERS " in |
||||
|
*" <<$>>am_file "*<<)>> |
||||
|
echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx |
||||
|
;; |
||||
|
esac |
||||
|
am_indx=`expr "<<$>>am_indx" + 1` |
||||
|
done<<>>dnl>>) |
||||
|
changequote([,]))]) |
||||
|
|
||||
|
|
||||
|
# serial 1 |
||||
|
|
||||
|
AC_DEFUN(AM_WITH_DMALLOC, |
||||
|
[AC_MSG_CHECKING(if malloc debugging is wanted) |
||||
|
AC_ARG_WITH(dmalloc, |
||||
|
[ --with-dmalloc use dmalloc, as in |
||||
|
ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz], |
||||
|
[if test "$withval" = yes; then |
||||
|
AC_MSG_RESULT(yes) |
||||
|
AC_DEFINE(WITH_DMALLOC,1, |
||||
|
[Define if using the dmalloc debugging malloc package]) |
||||
|
LIBS="$LIBS -ldmalloc" |
||||
|
LDFLAGS="$LDFLAGS -g" |
||||
|
else |
||||
|
AC_MSG_RESULT(no) |
||||
|
fi], [AC_MSG_RESULT(no)]) |
||||
|
]) |
||||
|
|
||||
@ -0,0 +1,284 @@ |
|||||
|
/* $Header$ */ |
||||
|
/* |
||||
|
* |
||||
|
* alloc.c : Memory checked Malloc. This malloc keeps track of memory usage. |
||||
|
* |
||||
|
* Routines: |
||||
|
* char * Malloc(); |
||||
|
* char * Calloc(); |
||||
|
* char * Realloc(); |
||||
|
* void Free(); |
||||
|
* unsigned MemStat(); |
||||
|
* unsigned MemPtr(); |
||||
|
* void MemChain(); |
||||
|
* |
||||
|
* $Log$ |
||||
|
* Revision 1.1 2004-01-25 09:00:49 pnenzi |
||||
|
* |
||||
|
* Added xgraph plotting program. |
||||
|
* |
||||
|
* Revision 1.1.1.1 1999/12/03 23:15:53 heideman |
||||
|
* xgraph-12.0 |
||||
|
* |
||||
|
* Revision 1.10 1991/02/01 08:12:55 christos |
||||
|
* Overhaul... Simplified and added calloc. |
||||
|
* |
||||
|
* Revision 1.9 1990/10/02 18:11:24 christos |
||||
|
* Another Realloc() bug! |
||||
|
* |
||||
|
* Revision 1.8 90/10/02 17:32:45 christos |
||||
|
* Fixed Realloc() bug. |
||||
|
* |
||||
|
* Revision 1.7 90/08/24 02:28:15 christos |
||||
|
* Changed bigstruct_t to align_t |
||||
|
* for lint. |
||||
|
* |
||||
|
* Revision 1.6 90/07/15 17:31:33 christos |
||||
|
* Fixed MemPtr Bug |
||||
|
* |
||||
|
* Revision 1.5 90/07/11 16:19:31 christos |
||||
|
* Added Realloc() |
||||
|
* |
||||
|
* Revision 1.4 90/03/21 12:58:44 christos |
||||
|
* Fixed void buggy computations. |
||||
|
* |
||||
|
* Revision 1.3 90/02/26 02:15:11 christos |
||||
|
* ANSI conformance. |
||||
|
* |
||||
|
* Revision 1.2 89/08/29 14:08:25 christos |
||||
|
* Fixed. |
||||
|
* |
||||
|
* Revision 1.1 89/03/27 14:23:40 christos |
||||
|
* Initial revision |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef lint |
||||
|
static char rcsid[] = "$Id$"; |
||||
|
|
||||
|
#endif /* lint */ |
||||
|
#include <stdio.h> |
||||
|
#ifdef __STDC__ |
||||
|
#include <stdlib.h> |
||||
|
#include <memory.h> |
||||
|
#else |
||||
|
extern char *malloc(); |
||||
|
extern char *calloc(); |
||||
|
extern char *realloc(); |
||||
|
extern void free(); |
||||
|
extern void abort(); |
||||
|
extern char *memset(); |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#ifndef NIL |
||||
|
#define NIL(a) ((a *) 0) |
||||
|
#endif /* NIL */ |
||||
|
|
||||
|
#ifndef MIN |
||||
|
#define MIN(a, b) ((a) > (b) ? (b) : (a)) |
||||
|
#endif /* MIN */ |
||||
|
|
||||
|
#ifndef MAX |
||||
|
#define MAX(a, b) ((a) < (b) ? (b) : (a)) |
||||
|
#endif /* MAX */ |
||||
|
|
||||
|
#ifndef private |
||||
|
#define private static |
||||
|
#endif /* private */ |
||||
|
|
||||
|
#ifndef public |
||||
|
#define public |
||||
|
#endif /* public */ |
||||
|
|
||||
|
|
||||
|
#define SIG_GOOD 0x01020304 |
||||
|
#define SIG_FREE 0x04030201 |
||||
|
#define OVERHEAD (sizeof(long) + sizeof(unsigned)) |
||||
|
|
||||
|
private unsigned memused = 0; |
||||
|
private unsigned memalloc = 0; |
||||
|
|
||||
|
#ifdef __STDC__ |
||||
|
typedef void *Ptr; |
||||
|
|
||||
|
#else |
||||
|
typedef char *Ptr; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
/* _chaina(): |
||||
|
* Check things for validity and allocate space |
||||
|
*/ |
||||
|
private Ptr |
||||
|
_chaina(n, routine, action, tptr) |
||||
|
unsigned n; |
||||
|
|
||||
|
Ptr(*routine) (); |
||||
|
char *action; |
||||
|
Ptr tptr; |
||||
|
{ |
||||
|
char *ptr; |
||||
|
|
||||
|
if (n == 0) { |
||||
|
(void) fprintf(stderr, "*** %s zero length block.\n", |
||||
|
action); |
||||
|
if (tptr != (Ptr) 0) { |
||||
|
ptr = tptr; |
||||
|
*((long *) ptr) = SIG_GOOD; |
||||
|
memused += *((unsigned *) &ptr[sizeof(long)]); |
||||
|
memalloc++; |
||||
|
} |
||||
|
abort(); |
||||
|
} |
||||
|
|
||||
|
ptr = (tptr == (Ptr) 0) ? (char *) (*routine) (n + OVERHEAD) : |
||||
|
(char *) (*routine) (tptr, n + OVERHEAD); |
||||
|
|
||||
|
if (ptr == NIL(char)) { |
||||
|
if (tptr != (Ptr) 0) |
||||
|
*((long *) tptr) = SIG_GOOD; |
||||
|
(void) fprintf(stderr, |
||||
|
"*** Out of memory in %s (current allocation %d).\n", |
||||
|
action, memused, n); |
||||
|
|
||||
|
abort(); |
||||
|
} |
||||
|
*((long *) ptr) = SIG_GOOD; |
||||
|
memused += (*((unsigned *) &ptr[sizeof(long)]) = n); |
||||
|
memalloc++; |
||||
|
ptr += OVERHEAD; |
||||
|
return ((Ptr) ptr); |
||||
|
} /* end _chaina */ |
||||
|
|
||||
|
|
||||
|
/* _chainc(): |
||||
|
* Check the pointer given |
||||
|
*/ |
||||
|
private unsigned |
||||
|
_chainc(ptr, action) |
||||
|
char **ptr; |
||||
|
char *action; |
||||
|
{ |
||||
|
static char *msg = "*** %s %s pointer.\n"; |
||||
|
|
||||
|
if (*ptr == NIL(char)) { |
||||
|
(void) fprintf(stderr, msg, action, "nil"); |
||||
|
abort(); |
||||
|
} |
||||
|
*ptr -= OVERHEAD; |
||||
|
switch (*((long *) *ptr)) { |
||||
|
case SIG_GOOD: |
||||
|
return (*((unsigned *) &((*ptr)[sizeof(long)]))); |
||||
|
case SIG_FREE: |
||||
|
(void) fprintf(stderr, msg, action, "free"); |
||||
|
abort(); |
||||
|
default: |
||||
|
(void) fprintf(stderr, msg, action, "invalid"); |
||||
|
abort(); |
||||
|
} |
||||
|
return (0); |
||||
|
} /* end _chainc */ |
||||
|
|
||||
|
|
||||
|
/* Malloc(): |
||||
|
* real alloc |
||||
|
*/ |
||||
|
public Ptr |
||||
|
Malloc(n) |
||||
|
unsigned n; |
||||
|
{ |
||||
|
static char *routine = "malloc"; |
||||
|
|
||||
|
return (_chaina(n, malloc, routine, (Ptr) 0)); |
||||
|
} /* end Malloc */ |
||||
|
|
||||
|
|
||||
|
/* Calloc(): |
||||
|
* real alloc |
||||
|
*/ |
||||
|
public Ptr |
||||
|
Calloc(n, sz) |
||||
|
unsigned n, |
||||
|
sz; |
||||
|
{ |
||||
|
Ptr ptr; |
||||
|
static char *routine = "calloc"; |
||||
|
|
||||
|
n *= sz; |
||||
|
ptr = _chaina(n, malloc, routine, (Ptr) 0); |
||||
|
memset((char *) ptr, 0, n); |
||||
|
return (ptr); |
||||
|
} /* end Calloc */ |
||||
|
|
||||
|
|
||||
|
/* Realloc(): |
||||
|
* real alloc |
||||
|
*/ |
||||
|
public Ptr |
||||
|
Realloc(ptr, n) |
||||
|
Ptr ptr; |
||||
|
unsigned n; |
||||
|
{ |
||||
|
static char *routine = "realloc"; |
||||
|
|
||||
|
memused -= _chainc((char **) &ptr, routine); |
||||
|
memalloc--; |
||||
|
*((long *) ptr) = SIG_FREE; |
||||
|
return (_chaina(n, realloc, routine, ptr)); |
||||
|
} /* end Realloc */ |
||||
|
|
||||
|
|
||||
|
/* Free(): |
||||
|
* free memory counting the number of bytes freed |
||||
|
*/ |
||||
|
public void |
||||
|
Free(ptr) |
||||
|
Ptr ptr; |
||||
|
{ |
||||
|
static char *routine = "free"; |
||||
|
|
||||
|
memused -= _chainc((char **) &ptr, routine); |
||||
|
memalloc--; |
||||
|
*((long *) ptr) = SIG_FREE; |
||||
|
free(ptr); |
||||
|
} /* end Free */ |
||||
|
|
||||
|
|
||||
|
/* MemChain(): |
||||
|
* Dump the chain |
||||
|
*/ |
||||
|
public void |
||||
|
MemChain() |
||||
|
{ |
||||
|
if (memused == 0 && memalloc == 0) |
||||
|
(void) fprintf(stdout, "\tNo memory allocated.\n"); |
||||
|
else { |
||||
|
(void) fprintf(stdout, "\t%u Bytes allocated in %u chunks.\n", memused, |
||||
|
memalloc); |
||||
|
(void) fprintf(stdout, "\tAverage chunk length %u bytes.\n", |
||||
|
memused / memalloc); |
||||
|
} |
||||
|
} /* end MemChain */ |
||||
|
|
||||
|
|
||||
|
/* MemStat(): |
||||
|
* return the amount of memory in use |
||||
|
*/ |
||||
|
public unsigned |
||||
|
MemStat() |
||||
|
{ |
||||
|
return (memused); |
||||
|
} /* end MemStat */ |
||||
|
|
||||
|
|
||||
|
/* MemPtr(): |
||||
|
* return the amount of memory used by the pointer |
||||
|
*/ |
||||
|
public unsigned |
||||
|
MemPtr(ptr) |
||||
|
Ptr ptr; |
||||
|
{ |
||||
|
static char *routine = "get size"; |
||||
|
|
||||
|
return (_chainc((char **) &ptr, routine)); |
||||
|
} /* end MemPtr */ |
||||
@ -0,0 +1,35 @@ |
|||||
|
/* autoconf.h.in. Generated automatically from configure.in by autoheader. */ |
||||
|
|
||||
|
/* Define if the X Window System is missing or not being used. */ |
||||
|
#undef X_DISPLAY_MISSING |
||||
|
|
||||
|
/* Define if you have the strcasecmp function. */ |
||||
|
#undef HAVE_STRCASECMP |
||||
|
|
||||
|
/* Define if you have the <float.h> header file. */ |
||||
|
#undef HAVE_FLOAT_H |
||||
|
|
||||
|
/* Define if you have the <limits.h> header file. */ |
||||
|
#undef HAVE_LIMITS_H |
||||
|
|
||||
|
/* Define if you have the <stdlib.h> header file. */ |
||||
|
#undef HAVE_STDLIB_H |
||||
|
|
||||
|
/* Define if you have the <string.h> header file. */ |
||||
|
#undef HAVE_STRING_H |
||||
|
|
||||
|
/* Define if you have the <strings.h> header file. */ |
||||
|
#undef HAVE_STRINGS_H |
||||
|
|
||||
|
/* Define if you have the <unistd.h> header file. */ |
||||
|
#undef HAVE_UNISTD_H |
||||
|
|
||||
|
/* Name of package */ |
||||
|
#undef PACKAGE |
||||
|
|
||||
|
/* Version number of package */ |
||||
|
#undef VERSION |
||||
|
|
||||
|
/* Define if using the dmalloc debugging malloc package */ |
||||
|
#undef WITH_DMALLOC |
||||
|
|
||||
@ -0,0 +1,4 @@ |
|||||
|
#define dot_width 8 |
||||
|
#define dot_height 8 |
||||
|
static char dot_bits[] = { |
||||
|
0x00, 0x3c, 0x7e, 0x7e, 0x7e, 0x7e, 0x3c, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define gray_width 16 |
||||
|
#define gray_height 16 |
||||
|
static char gray_bits[] = { |
||||
|
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, |
||||
|
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, |
||||
|
0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark1_width 8 |
||||
|
#define mark1_height 8 |
||||
|
#define mark1_x_hot 3 |
||||
|
#define mark1_y_hot 3 |
||||
|
static char mark1_bits[] = { |
||||
|
0x00, 0x00, 0x1c, 0x1c, 0x1c, 0x00, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark2_width 8 |
||||
|
#define mark2_height 8 |
||||
|
#define mark2_x_hot 3 |
||||
|
#define mark2_y_hot 3 |
||||
|
static char mark2_bits[] = { |
||||
|
0x00, 0x3e, 0x22, 0x22, 0x22, 0x3e, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark3_width 8 |
||||
|
#define mark3_height 8 |
||||
|
#define mark3_x_hot 3 |
||||
|
#define mark3_y_hot 3 |
||||
|
static char mark3_bits[] = { |
||||
|
0x00, 0x1c, 0x36, 0x22, 0x36, 0x1c, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark4_width 8 |
||||
|
#define mark4_height 8 |
||||
|
#define mark4_x_hot 3 |
||||
|
#define mark4_y_hot 3 |
||||
|
static char mark4_bits[] = { |
||||
|
0x00, 0x22, 0x14, 0x08, 0x14, 0x22, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark5_width 8 |
||||
|
#define mark5_height 8 |
||||
|
#define mark5_x_hot 3 |
||||
|
#define mark5_y_hot 3 |
||||
|
static char mark5_bits[] = { |
||||
|
0x00, 0x08, 0x14, 0x22, 0x14, 0x08, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark6_width 8 |
||||
|
#define mark6_height 8 |
||||
|
#define mark6_x_hot 3 |
||||
|
#define mark6_y_hot 3 |
||||
|
static char mark6_bits[] = { |
||||
|
0x00, 0x1c, 0x14, 0x1c, 0x14, 0x1c, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark7_width 8 |
||||
|
#define mark7_height 8 |
||||
|
#define mark7_x_hot 3 |
||||
|
#define mark7_y_hot 3 |
||||
|
static char mark7_bits[] = { |
||||
|
0x00, 0x1c, 0x2a, 0x36, 0x2a, 0x1c, 0x00, 0x00}; |
||||
@ -0,0 +1,6 @@ |
|||||
|
#define mark8_width 8 |
||||
|
#define mark8_height 8 |
||||
|
#define mark8_x_hot 3 |
||||
|
#define mark8_y_hot 3 |
||||
|
static char mark8_bits[] = { |
||||
|
0x00, 0x3e, 0x1c, 0x08, 0x1c, 0x3e, 0x00, 0x00}; |
||||
2442
xgraph/configure
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,34 @@ |
|||||
|
dnl Process this file with autoconf to produce a configure script. |
||||
|
AC_INIT(xgraph.c) |
||||
|
AM_INIT_AUTOMAKE(xgraph,12.1) |
||||
|
|
||||
|
AM_CONFIG_HEADER(autoconf.h) |
||||
|
|
||||
|
AM_WITH_DMALLOC |
||||
|
|
||||
|
dnl Checks for programs. |
||||
|
AC_PROG_CC |
||||
|
|
||||
|
dnl Checks for libraries. |
||||
|
AC_PATH_XTRA |
||||
|
|
||||
|
dnl check header files. |
||||
|
AC_CHECK_HEADERS(float.h limits.h stdlib.h string.h strings.h unistd.h) |
||||
|
|
||||
|
dnl checks for typedefs |
||||
|
dnl checks for structures |
||||
|
dnl checks for compiler characteristics |
||||
|
|
||||
|
dnl checks for library functions |
||||
|
AC_CHECK_FUNCS(strcasecmp) |
||||
|
|
||||
|
dnl checks for system services |
||||
|
|
||||
|
AC_ARG_WITH(additional-includes, --with-additional-includes=path, ADDITIONAL_INCLUDES=$withval,ADDITIONAL_INCLUDES="") |
||||
|
AC_ARG_WITH(additional-libs, --with-additional-libs=path, ADDITIONAL_LIBS=$withval,ADDITIONAL_LIBS="") |
||||
|
AC_SUBST(ADDITIONAL_INCLUDES) |
||||
|
AC_SUBST(ADDITIONAL_LIBS) |
||||
|
|
||||
|
|
||||
|
AC_OUTPUT([Makefile]) |
||||
|
|
||||
@ -0,0 +1,65 @@ |
|||||
|
/* |
||||
|
* xgraph - program to graphically display numerical data |
||||
|
* |
||||
|
* David Harrison |
||||
|
* University of California, Berkeley |
||||
|
* 1989 |
||||
|
* |
||||
|
* Animation, Differentiation by Paul Walker |
||||
|
* NCSA and University of Illinois at Urbana Champaign Dept. of Physics |
||||
|
* |
||||
|
* Copyright (c) 1988, 1989, Regents of the University of California. |
||||
|
* All rights reserved. |
||||
|
* |
||||
|
* Use and copying of this software and preparation of derivative works |
||||
|
* based upon this software are permitted. However, any distribution of |
||||
|
* this software or derivative works must include the above copyright |
||||
|
* notice. |
||||
|
* |
||||
|
* This software is made available AS IS, and neither the Electronics |
||||
|
* Research Laboratory or the University of California make any |
||||
|
* warranty about the software, its performance or its conformity to |
||||
|
* any specification. |
||||
|
* |
||||
|
|
||||
|
Animation and differentiation routines were added by Paul Walker, |
||||
|
NCSA and UIUC Dept of Physics. The following copyright and disclaimer |
||||
|
applies to these parts of the code only. |
||||
|
|
||||
|
UNIVERSITY OF ILLINOIS (UI), NATIONAL CENTER FOR SUPERCOMPUTING |
||||
|
APPLICATIONS (NCSA), Software Distribution Policy for Copyrighted Software |
||||
|
|
||||
|
The above mentioned modifications to XGraph made with the authors consent are |
||||
|
copyrighted, but available without fee for education, academic research |
||||
|
and non-commercial purposes. The modifications are copyrighted in the name of |
||||
|
the UI, and ownership of the modifications remains with the UI. Users may |
||||
|
distribute the binary and source code to third parties provided that the |
||||
|
copyright notice and this statement appears on all copies and that no |
||||
|
charge is made for such copies. Any entity wishing to integrate all or |
||||
|
part of the source code into a product for commercial use or resale, |
||||
|
should contact the University of Illinois, c/o NCSA, to negotiate an |
||||
|
appropriate license for such commercial use. |
||||
|
|
||||
|
UI MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR ANY |
||||
|
PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY. THE |
||||
|
UI SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY THE USER OF THIS |
||||
|
SOFTWARE. The software may have been developed under agreements between |
||||
|
the UI and the Federal Government which entitle the Government to certain |
||||
|
rights. |
||||
|
|
||||
|
By copying this program, you, the user, agree to abide by the copyright |
||||
|
conditions and understandings with respect to any software which is marked |
||||
|
with a copyright notice. |
||||
|
|
||||
|
Send all comments about the modifications to Paul Walker, |
||||
|
pwalker@ncsa.uiuc.edu |
||||
|
|
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
#ifndef _RIGHTS_ |
||||
|
#define _RIGHTS_ |
||||
|
|
||||
|
static char copyright[] = "Copyright (c) 1989, Regents of the University of California. All rights reserved."; |
||||
|
|
||||
|
#endif /* _RIGHTS_ */ |
||||
@ -0,0 +1,130 @@ |
|||||
|
/* This entire routine written by PW. */ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <string.h> |
||||
|
#include "xgraph.h" |
||||
|
|
||||
|
void |
||||
|
Der1() |
||||
|
{ |
||||
|
PointList *theList, *D1List, *D2List; |
||||
|
double m,b; |
||||
|
int i; |
||||
|
|
||||
|
|
||||
|
for (i=0;i<MAXSETS;i++) { |
||||
|
theList = PlotData[i].list; |
||||
|
if (theList) { |
||||
|
DataD1[i].list = (PointList *)malloc(sizeof(PointList)); |
||||
|
DataD2[i].list = (PointList *)malloc(sizeof(PointList)); |
||||
|
D1List = DataD1[i].list; |
||||
|
D2List = DataD2[i].list; |
||||
|
} else |
||||
|
DataD1[i].list = DataD2[i].list = NULL; |
||||
|
DataD1[i].setName = |
||||
|
(char *)malloc(sizeof(char)*strlen(PlotData[i].setName)); |
||||
|
DataD2[i].setName = |
||||
|
(char *)malloc(sizeof(char)*strlen(PlotData[i].setName)); |
||||
|
strcpy(DataD1[i].setName,PlotData[i].setName); |
||||
|
strcpy(DataD2[i].setName,PlotData[i].setName); |
||||
|
while (theList) { |
||||
|
int j; |
||||
|
|
||||
|
D1List->numPoints = D2List->numPoints = theList->numPoints; |
||||
|
D1List->xvec = (double *)malloc(sizeof(double)*theList->numPoints); |
||||
|
D1List->yvec = (double *)malloc(sizeof(double)*theList->numPoints); |
||||
|
D1List->next = NULL; |
||||
|
D2List->xvec = (double *)malloc(sizeof(double)*theList->numPoints); |
||||
|
D2List->yvec = (double *)malloc(sizeof(double)*theList->numPoints); |
||||
|
D2List->next = NULL; |
||||
|
|
||||
|
for (j=1;j<theList->numPoints-1;j++) { |
||||
|
D1List->xvec[j] = D2List->xvec[j] = theList->xvec[j]; |
||||
|
D1List->yvec[j] = (theList->yvec[j+1] - theList->yvec[j-1]) / |
||||
|
(theList->xvec[j+1] - theList->xvec[j-1]); |
||||
|
D2List->yvec[j] = (theList->yvec[j+1] + theList->yvec[j-1] - |
||||
|
2.0*theList->yvec[j]) / |
||||
|
((theList->xvec[j+1] - theList->xvec[j]) * |
||||
|
(theList->xvec[j]-theList->xvec[j-1])); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/* Extrapolate to get the endpoints ... */ |
||||
|
/* end near 0 */ |
||||
|
D1List->xvec[0] = theList->xvec[0]; |
||||
|
D1List->xvec[theList->numPoints-1] = |
||||
|
theList->xvec[theList->numPoints-1]; |
||||
|
m = (D1List->yvec[2]-D1List->yvec[1]) / |
||||
|
(theList->xvec[2]-theList->xvec[1]); |
||||
|
b = D1List->yvec[1] - m*theList->xvec[1]; |
||||
|
D1List->yvec[0] = m*theList->xvec[0] + b; |
||||
|
/* end near numPoints-1 */ |
||||
|
m = (D1List->yvec[theList->numPoints-2]- |
||||
|
D1List->yvec[theList->numPoints-3]) / |
||||
|
(theList->xvec[theList->numPoints-2]- |
||||
|
theList->xvec[theList->numPoints-3]); |
||||
|
b = D1List->yvec [theList->numPoints-2] - |
||||
|
m*theList->xvec[theList->numPoints-2]; |
||||
|
D1List->yvec[theList->numPoints-1] = |
||||
|
m*theList->xvec[theList->numPoints-1] + b; |
||||
|
|
||||
|
/* Extrapolate to get the endpoints ... */ |
||||
|
/* end near 0 */ |
||||
|
D2List->xvec[0] = theList->xvec[0]; |
||||
|
D2List->xvec[theList->numPoints-1] = |
||||
|
theList->xvec[theList->numPoints-1]; |
||||
|
m = (D2List->yvec[2]-D2List->yvec[1]) / |
||||
|
(theList->xvec[2]-theList->xvec[1]); |
||||
|
b = D2List->yvec[1] - m*theList->xvec[1]; |
||||
|
D2List->yvec[0] = m*theList->xvec[0] + b; |
||||
|
/* end near numPoints-1 */ |
||||
|
m = (D2List->yvec[theList->numPoints-2]- |
||||
|
D2List->yvec[theList->numPoints-3]) / |
||||
|
(theList->xvec[theList->numPoints-2]- |
||||
|
theList->xvec[theList->numPoints-3]); |
||||
|
b = D2List->yvec[theList->numPoints-2] - |
||||
|
m*theList->xvec[theList->numPoints-2]; |
||||
|
D2List->yvec[theList->numPoints-1] = |
||||
|
m*theList->xvec[theList->numPoints-1] + b; |
||||
|
|
||||
|
theList = theList->next; |
||||
|
if (theList) { |
||||
|
D1List->next = (PointList *)malloc(sizeof(PointList)); |
||||
|
D2List->next = (PointList *)malloc(sizeof(PointList)); |
||||
|
D1List = D1List->next; |
||||
|
D2List = D2List->next; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
Bounds(loX, loY, hiX, hiY, Ord) |
||||
|
double *loX, *loY, *hiX, *hiY; |
||||
|
int Ord; |
||||
|
{ |
||||
|
int i; |
||||
|
PointList *theList; |
||||
|
if ((Ord<1) || (Ord>2)) { |
||||
|
printf ("Internal Error - Cannot eval deriv > 2 in Bounds.\n"); |
||||
|
exit(1); |
||||
|
} |
||||
|
*loX = *loY = *hiX = *hiY = 0.0; |
||||
|
for (i=0;i<MAXSETS;i++) { |
||||
|
if (Ord == 1) |
||||
|
theList = DataD1[i].list; |
||||
|
else |
||||
|
theList = DataD2[i].list; |
||||
|
while (theList) { |
||||
|
int j; |
||||
|
|
||||
|
for (j=0;j<theList->numPoints;j++) { |
||||
|
*loX = (theList->xvec[j]<*loX?theList->xvec[j]:*loX); |
||||
|
*loY = (theList->yvec[j]<*loY?theList->yvec[j]:*loY); |
||||
|
*hiX = (theList->xvec[j]>*hiX?theList->xvec[j]:*hiX); |
||||
|
*hiY = (theList->yvec[j]>*hiY?theList->yvec[j]:*hiY); |
||||
|
} |
||||
|
theList = theList->next; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,942 @@ |
|||||
|
/* |
||||
|
* Xgraph Dialog Boxes |
||||
|
* |
||||
|
* This file constructs the hardcopy and error dialog |
||||
|
* boxes used by xgraph. It uses the mini-toolbox given |
||||
|
* in toolbox.c. |
||||
|
*/ |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include "xgout.h" |
||||
|
#include "xgraph.h" |
||||
|
#include "hard_devices.h" |
||||
|
#include "xtb.h" |
||||
|
#include "params.h" |
||||
|
#include <stdio.h> |
||||
|
#include <X11/Xutil.h> |
||||
|
|
||||
|
void do_error(); |
||||
|
|
||||
|
#define MAXCHBUF 1024 |
||||
|
|
||||
|
#ifdef SHADOW |
||||
|
#define gray_width 16 |
||||
|
#define gray_height 16 |
||||
|
static short gray_bits[] = |
||||
|
{ |
||||
|
0x5555, 0xaaaa, 0x5555, 0xaaaa, |
||||
|
0x5555, 0xaaaa, 0x5555, 0xaaaa, |
||||
|
0x5555, 0xaaaa, 0x5555, 0xaaaa, |
||||
|
0x5555, 0xaaaa, 0x5555, 0xaaaa}; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
static void make_msg_box(); |
||||
|
static void del_msg_box(); |
||||
|
|
||||
|
|
||||
|
#define D_VPAD 2 |
||||
|
#define D_HPAD 2 |
||||
|
#define D_INT 4 |
||||
|
#define D_BRDR 2 |
||||
|
#define D_INP 35 |
||||
|
#define D_DSP 10 |
||||
|
#define D_FS 10 |
||||
|
|
||||
|
struct d_info { |
||||
|
char *prog; /* Program name */ |
||||
|
xtb_data cookie; /* Info used by do_harcopy */ |
||||
|
Window choices; /* Output device choices */ |
||||
|
Window fod; /* File or device flag */ |
||||
|
Window fodspec; /* File or device spec */ |
||||
|
Window docu_p; /* Document predicate */ |
||||
|
Window dimspec; /* Maximum dimension spec */ |
||||
|
Window tf_family; /* Title font family spec */ |
||||
|
Window tf_size; /* Title font size spec */ |
||||
|
Window af_family; /* Axis font family spec */ |
||||
|
Window af_size; /* Axis font size spec */ |
||||
|
}; |
||||
|
|
||||
|
#define BACKSPACE 0010 |
||||
|
#define DELETE 0177 |
||||
|
#define CONTROL_U 0025 |
||||
|
#define CONTROL_X 0030 |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
df_fun(win, ch, text, val) |
||||
|
Window win; /* Widget window */ |
||||
|
int ch; /* Typed character */ |
||||
|
char *text; /* Copy of text */ |
||||
|
xtb_data val; /* User info */ |
||||
|
|
||||
|
/* |
||||
|
* This is the handler function for the text widget for |
||||
|
* specifing the file or device name. It supports simple |
||||
|
* line editing operations. |
||||
|
*/ |
||||
|
{ |
||||
|
if ((ch == BACKSPACE) || (ch == DELETE)) { |
||||
|
if (!xtb_ti_dch(win)) |
||||
|
XBell(disp, 0); |
||||
|
} |
||||
|
else if ((ch == CONTROL_U) || (ch == CONTROL_X)) { |
||||
|
(void) xtb_ti_set(win, "", (xtb_data) 0); |
||||
|
} |
||||
|
else { |
||||
|
/* Insert if printable - ascii dependent */ |
||||
|
if ((ch < ' ') || (ch >= DELETE) || !xtb_ti_ins(win, ch)) { |
||||
|
XBell(disp, 0); |
||||
|
} |
||||
|
} |
||||
|
return XTB_HANDLED; |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
ok_fun(win, bval, info) |
||||
|
Window win; /* Button window */ |
||||
|
int bval; /* Button value */ |
||||
|
xtb_data info; /* Local button info */ |
||||
|
|
||||
|
/* |
||||
|
* This is the handler function for when the `Ok' button |
||||
|
* is hit. It sets the button, does the hardcopy output, |
||||
|
* and turns the button off. It returns a status which |
||||
|
* deactivates the dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
struct d_info *real_info = (struct d_info *) info; |
||||
|
int val, |
||||
|
dev_p, |
||||
|
doc_p; |
||||
|
char file_or_dev[MAXCHBUF], |
||||
|
dim_spec[MAXCHBUF], |
||||
|
*dev_spec; |
||||
|
char tfam[MAXCHBUF], |
||||
|
afam[MAXCHBUF]; |
||||
|
char tsizstr[MAXCHBUF], |
||||
|
asizstr[MAXCHBUF]; |
||||
|
double centimeters, |
||||
|
tsize, |
||||
|
asize; |
||||
|
xtb_hret rtn; |
||||
|
|
||||
|
(void) xtb_bt_set(win, 1, (xtb_data) 0, 0); |
||||
|
val = xtb_br_get(real_info->choices); |
||||
|
if ((val >= 0) && (val < hard_count)) { |
||||
|
dev_p = xtb_br_get(real_info->fod); |
||||
|
if ((dev_p == 0) || (dev_p == 1)) { |
||||
|
xtb_ti_get(real_info->fodspec, file_or_dev, (xtb_data *) 0); |
||||
|
doc_p = xtb_bt_get(real_info->docu_p, (xtb_data *) 0, (int *) 0); |
||||
|
xtb_ti_get(real_info->dimspec, dim_spec, (xtb_data *) 0); |
||||
|
if (sscanf(dim_spec, "%lf", ¢imeters) == 1) { |
||||
|
xtb_ti_get(real_info->tf_family, tfam, (xtb_data *) 0); |
||||
|
xtb_ti_get(real_info->af_family, afam, (xtb_data *) 0); |
||||
|
xtb_ti_get(real_info->tf_size, tsizstr, (xtb_data *) 0); |
||||
|
if (sscanf(tsizstr, "%lf", &tsize) == 1) { |
||||
|
xtb_ti_get(real_info->af_size, asizstr, (xtb_data *) 0); |
||||
|
if (sscanf(asizstr, "%lf", &asize) == 1) { |
||||
|
/* Got all the info */ |
||||
|
if (dev_p) { |
||||
|
dev_spec = (char *) 0; |
||||
|
} |
||||
|
else { |
||||
|
dev_spec = hard_devices[val].dev_spec; |
||||
|
} |
||||
|
do_hardcopy(real_info->prog, real_info->cookie, |
||||
|
hard_devices[val].dev_init, dev_spec, |
||||
|
file_or_dev, centimeters, |
||||
|
tfam, tsize, afam, asize, doc_p); |
||||
|
rtn = XTB_STOP; |
||||
|
} |
||||
|
else { |
||||
|
/* Bad axis size */ |
||||
|
do_error("Bad axis font size\n"); |
||||
|
rtn = XTB_HANDLED; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Bad title size */ |
||||
|
do_error("Bad title font size\n"); |
||||
|
rtn = XTB_HANDLED; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Bad max dimension */ |
||||
|
do_error("Bad maximum dimension\n"); |
||||
|
rtn = XTB_HANDLED; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Bad device spec */ |
||||
|
do_error("Must specify `To File' or `To Device'\n"); |
||||
|
rtn = XTB_HANDLED; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Bad value spec */ |
||||
|
do_error("Must specify an output device\n"); |
||||
|
rtn = XTB_HANDLED; |
||||
|
} |
||||
|
(void) xtb_bt_set(win, 0, (xtb_data) 0, 0); |
||||
|
return rtn; |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
can_fun(win, val, info) |
||||
|
Window win; /* Button window */ |
||||
|
int val; /* Button value */ |
||||
|
xtb_data info; /* Local button info */ |
||||
|
|
||||
|
/* |
||||
|
* This is the handler function for the cancel button. It |
||||
|
* turns itself on and off and then exits with a status |
||||
|
* which kills the dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
(void) xtb_bt_set(win, 1, (xtb_data) 0, 0); |
||||
|
(void) xtb_bt_set(win, 0, (xtb_data) 0, 0); |
||||
|
return XTB_STOP; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
docu_fun(win, val, info) |
||||
|
Window win; /* Button window */ |
||||
|
int val; /* Button value */ |
||||
|
xtb_data info; /* Local button info */ |
||||
|
|
||||
|
/* |
||||
|
* This is the handler function for the document button. It |
||||
|
* toggles it's state. |
||||
|
*/ |
||||
|
{ |
||||
|
int state; |
||||
|
|
||||
|
state = xtb_bt_get(win, (xtb_data *) 0, (int *) 0); |
||||
|
xtb_bt_set(win, (state == 0), (xtb_data) 0, 0); |
||||
|
return XTB_HANDLED; |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
dev_fun(win, old, new, info) |
||||
|
Window win; /* Button row window */ |
||||
|
int old; /* Previous button */ |
||||
|
int new; /* Current button */ |
||||
|
xtb_data info; /* User data */ |
||||
|
|
||||
|
/* |
||||
|
* This routine swaps the device specific information |
||||
|
* in the dialog based on what device is selected. The |
||||
|
* information passed is the information for the whole |
||||
|
* dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
struct d_info *data = (struct d_info *) info; |
||||
|
char text[MAXCHBUF]; |
||||
|
int fod_spot, |
||||
|
inactive; |
||||
|
|
||||
|
fod_spot = xtb_br_get(data->fod); |
||||
|
if ((old >= 0) && (old < hard_count)) { |
||||
|
/* Save old info */ |
||||
|
xtb_ti_get(data->fodspec, text, (xtb_data *) 0); |
||||
|
if (fod_spot == 1) { |
||||
|
strncpy(hard_devices[old].dev_file, text, MFNAME - 1); |
||||
|
} |
||||
|
else if (fod_spot == 0) { |
||||
|
strncpy(hard_devices[old].dev_printer, text, MFNAME - 1); |
||||
|
} |
||||
|
if (xtb_bt_get(data->docu_p, (xtb_data *) 0, &inactive)) { |
||||
|
if (inactive) |
||||
|
hard_devices[old].dev_docu = NONE; |
||||
|
else |
||||
|
hard_devices[old].dev_docu = YES; |
||||
|
} |
||||
|
else if (inactive) |
||||
|
hard_devices[old].dev_docu = NONE; |
||||
|
else |
||||
|
hard_devices[old].dev_docu = NO; |
||||
|
xtb_ti_get(data->dimspec, text, (xtb_data *) 0); |
||||
|
if (sscanf(text, "%lf", &hard_devices[old].dev_max_dim) != 1) { |
||||
|
do_error("Warning: can't read maximum dimension"); |
||||
|
} |
||||
|
xtb_ti_get(data->tf_family, text, (xtb_data *) 0); |
||||
|
strncpy(hard_devices[old].dev_title_font, text, MFNAME - 1); |
||||
|
xtb_ti_get(data->tf_size, text, (xtb_data *) 0); |
||||
|
if (sscanf(text, "%lf", &hard_devices[old].dev_title_size) != 1) { |
||||
|
do_error("Warning: can't read title font size"); |
||||
|
} |
||||
|
xtb_ti_get(data->af_family, text, (xtb_data *) 0); |
||||
|
strncpy(hard_devices[old].dev_axis_font, text, MFNAME - 1); |
||||
|
xtb_ti_get(data->af_size, text, (xtb_data *) 0); |
||||
|
if (sscanf(text, "%lf", &hard_devices[old].dev_axis_size) != 1) { |
||||
|
do_error("Warning: can't read axis font size"); |
||||
|
} |
||||
|
} |
||||
|
/* Insert new info */ |
||||
|
if ((new >= 0) && (new < hard_count)) { |
||||
|
if (fod_spot == 1) { |
||||
|
xtb_ti_set(data->fodspec, hard_devices[new].dev_file, (xtb_data) 0); |
||||
|
} |
||||
|
else if (fod_spot == 0) { |
||||
|
xtb_ti_set(data->fodspec, hard_devices[new].dev_printer, |
||||
|
(xtb_data) 0); |
||||
|
} |
||||
|
else { |
||||
|
xtb_ti_set(data->fodspec, "", (xtb_data) 0); |
||||
|
} |
||||
|
switch (hard_devices[new].dev_docu) { |
||||
|
case NONE: |
||||
|
(void) xtb_bt_set(data->docu_p, 0, (xtb_data) 0, 1); |
||||
|
break; |
||||
|
case NO: |
||||
|
(void) xtb_bt_set(data->docu_p, 0, (xtb_data) 0, 0); |
||||
|
break; |
||||
|
case YES: |
||||
|
(void) xtb_bt_set(data->docu_p, 1, (xtb_data) 0, 0); |
||||
|
break; |
||||
|
} |
||||
|
(void) sprintf(text, "%lg", hard_devices[new].dev_max_dim); |
||||
|
xtb_ti_set(data->dimspec, text, (xtb_data) 0); |
||||
|
xtb_ti_set(data->tf_family, hard_devices[new].dev_title_font, |
||||
|
(xtb_data) 0); |
||||
|
(void) sprintf(text, "%lg", hard_devices[new].dev_title_size); |
||||
|
xtb_ti_set(data->tf_size, text, (xtb_data) 0); |
||||
|
xtb_ti_set(data->af_family, hard_devices[new].dev_axis_font, |
||||
|
(xtb_data) 0); |
||||
|
(void) sprintf(text, "%lg", hard_devices[new].dev_axis_size); |
||||
|
xtb_ti_set(data->af_size, text, (xtb_data) 0); |
||||
|
} |
||||
|
return XTB_HANDLED; |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
fd_fun(win, old, new, info) |
||||
|
Window win; /* Button row window */ |
||||
|
int old; /* Previous button */ |
||||
|
int new; /* Current button */ |
||||
|
xtb_data info; /* User data */ |
||||
|
|
||||
|
/* |
||||
|
* This routine swaps the default file or device names |
||||
|
* based on the state of the file or device buttons. |
||||
|
* The information passed is the information for the whole |
||||
|
* dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
struct d_info *data = (struct d_info *) info; |
||||
|
char text[MAXCHBUF]; |
||||
|
int which_one; |
||||
|
|
||||
|
which_one = xtb_br_get(data->choices); |
||||
|
if ((which_one >= 0) && (which_one < hard_count)) { |
||||
|
if (old == 0) { |
||||
|
/* Save into device space */ |
||||
|
xtb_ti_get(data->fodspec, text, (xtb_data *) 0); |
||||
|
strncpy(hard_devices[which_one].dev_printer, text, MFNAME - 1); |
||||
|
} |
||||
|
else if (old == 1) { |
||||
|
/* Save into file space */ |
||||
|
xtb_ti_get(data->fodspec, text, (xtb_data *) 0); |
||||
|
which_one = xtb_br_get(data->choices); |
||||
|
strncpy(hard_devices[which_one].dev_file, text, MFNAME - 1); |
||||
|
} |
||||
|
if (new == 0) { |
||||
|
/* Restore into device */ |
||||
|
xtb_ti_set(data->fodspec, hard_devices[which_one].dev_printer, |
||||
|
(xtb_data *) 0); |
||||
|
} |
||||
|
else if (new == 1) { |
||||
|
xtb_ti_set(data->fodspec, hard_devices[which_one].dev_file, |
||||
|
(xtb_data *) 0); |
||||
|
} |
||||
|
} |
||||
|
return XTB_HANDLED; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Indices for frames made in make_dialog */ |
||||
|
enum d_frames_defn { |
||||
|
TITLE_F, ODEVLBL_F, ODEVROW_F, DISPLBL_F, DISPROW_F, FDLBL_F, |
||||
|
FDINP_F, OPTLBL_F, DOCU_F, MDIMLBL_F, MDIMI_F, TFLBL_F, TFFAMLBL_F, TFFAM_F, |
||||
|
TFSIZLBL_F, TFSIZ_F, AFLBL_F, AFFAMLBL_F, AFFAM_F, AFSIZLBL_F, AFSIZ_F, |
||||
|
OK_F, CAN_F, BAR_F, LAST_F |
||||
|
} d_frames; |
||||
|
|
||||
|
#define AF(ix) af[(int) (ix)] |
||||
|
|
||||
|
#define BAR_SLACK 10 |
||||
|
|
||||
|
static void |
||||
|
make_dialog(win, spawned, prog, cookie, okbtn, frame) |
||||
|
Window win; /* Parent window */ |
||||
|
Window spawned; /* Spawned from window */ |
||||
|
char *prog; /* Program name */ |
||||
|
xtb_data cookie; /* Info for do_hardcopy */ |
||||
|
xtb_frame *okbtn; /* Frame for OK button */ |
||||
|
xtb_frame *frame; /* Returned window/size */ |
||||
|
|
||||
|
/* |
||||
|
* This routine constructs a new dialog for asking the user about |
||||
|
* hardcopy devices. The dialog and its size is returned in |
||||
|
* `frame'. The window of the `ok' button is returned in `btnwin'. |
||||
|
* This can be used to reset some of the button state to reuse the dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
Window overall; |
||||
|
xtb_frame AF(LAST_F); |
||||
|
xtb_fmt *def, |
||||
|
*cntrl, |
||||
|
*mindim, |
||||
|
*tfarea, |
||||
|
*afarea; |
||||
|
Cursor diag_cursor; |
||||
|
XColor fg_color, |
||||
|
bg_color; |
||||
|
XSizeHints hints; |
||||
|
unsigned long wamask; |
||||
|
XSetWindowAttributes wattr; |
||||
|
struct d_info *info; |
||||
|
int i, |
||||
|
found, |
||||
|
max_width, |
||||
|
which_one, |
||||
|
fodi; |
||||
|
char **names; |
||||
|
static char *fodstrs[] = |
||||
|
{"To Device", "To File"}; |
||||
|
XFontStruct *bigFont = PM_FONT("TitleFont"); |
||||
|
XFontStruct *medFont = PM_FONT("LabelFont"); |
||||
|
char *Odevice = PM_STR("Device"); |
||||
|
char *Odisp = PM_STR("Disposition"); |
||||
|
char *OfileDev = PM_STR("FileOrDev"); |
||||
|
|
||||
|
wamask = CWBackPixel | CWBorderPixel | CWOverrideRedirect | |
||||
|
CWSaveUnder | CWColormap; |
||||
|
wattr.background_pixel = PM_PIXEL("Background"); |
||||
|
wattr.border_pixel = PM_PIXEL("Border"); |
||||
|
wattr.override_redirect = True; |
||||
|
wattr.save_under = True; |
||||
|
wattr.colormap = cmap; |
||||
|
overall = XCreateWindow(disp, win, 0, 0, 1, 1, D_BRDR, |
||||
|
depth, InputOutput, vis, |
||||
|
wamask, &wattr); |
||||
|
frame->win = overall; |
||||
|
frame->width = frame->height = frame->x_loc = frame->y_loc = 0; |
||||
|
XStoreName(disp, overall, "Hardcopy Dialog"); |
||||
|
XSetTransientForHint(disp, spawned, overall); |
||||
|
info = (struct d_info *) Malloc(sizeof(struct d_info)); |
||||
|
info->prog = prog; |
||||
|
info->cookie = cookie; |
||||
|
|
||||
|
/* Make all frames */ |
||||
|
xtb_to_new(overall, "Hardcopy Options", bigFont, &AF(TITLE_F)); |
||||
|
xtb_to_new(overall, "Output device:", medFont, &AF(ODEVLBL_F)); |
||||
|
found = -1; |
||||
|
names = (char **) Malloc((unsigned) (sizeof(char *) * hard_count)); |
||||
|
for (i = 0; i < hard_count; i++) { |
||||
|
names[i] = hard_devices[i].dev_name; |
||||
|
if (strcmp(Odevice, names[i]) == 0) { |
||||
|
found = i; |
||||
|
} |
||||
|
} |
||||
|
xtb_br_new(overall, hard_count, names, found, |
||||
|
dev_fun, (xtb_data) info, &AF(ODEVROW_F)); |
||||
|
info->choices = AF(ODEVROW_F).win; |
||||
|
xtb_to_new(overall, "Disposition:", medFont, &AF(DISPLBL_F)); |
||||
|
found = -1; |
||||
|
for (i = 0; i < 2; i++) { |
||||
|
if (strcmp(Odisp, fodstrs[i]) == 0) { |
||||
|
found = i; |
||||
|
} |
||||
|
} |
||||
|
xtb_br_new(overall, 2, fodstrs, found, |
||||
|
fd_fun, (xtb_data) info, &AF(DISPROW_F)); |
||||
|
info->fod = AF(DISPROW_F).win; |
||||
|
xtb_to_new(overall, "File or Device Name:", medFont, &AF(FDLBL_F)); |
||||
|
xtb_ti_new(overall, "", D_INP, df_fun, (xtb_data) 0, &AF(FDINP_F)); |
||||
|
if (OfileDev && strlen(OfileDev)) { |
||||
|
which_one = xtb_br_get(info->choices); |
||||
|
if ((which_one >= 0) && (which_one < hard_count)) { |
||||
|
fodi = xtb_br_get(info->fod); |
||||
|
if (fodi == 0) { |
||||
|
strncpy(hard_devices[which_one].dev_printer, OfileDev, MFNAME - 1); |
||||
|
} |
||||
|
else if (fodi == 1) { |
||||
|
strncpy(hard_devices[which_one].dev_file, OfileDev, MFNAME - 1); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
info->fodspec = AF(FDINP_F).win; |
||||
|
xtb_to_new(overall, "Optional Parameters", bigFont, &AF(OPTLBL_F)); |
||||
|
xtb_bt_new(overall, "Include in Document", docu_fun, (xtb_data) 0, &AF(DOCU_F)); |
||||
|
info->docu_p = AF(DOCU_F).win; |
||||
|
xtb_to_new(overall, "Maximum Dimension (cm):", medFont, &AF(MDIMLBL_F)); |
||||
|
xtb_ti_new(overall, "", D_DSP, df_fun, (xtb_data) 0, &AF(MDIMI_F)); |
||||
|
info->dimspec = AF(MDIMI_F).win; |
||||
|
xtb_to_new(overall, "Title Font", medFont, &AF(TFLBL_F)); |
||||
|
xtb_to_new(overall, "Family:", medFont, &AF(TFFAMLBL_F)); |
||||
|
xtb_ti_new(overall, "", MFNAME, df_fun, (xtb_data) 0, &AF(TFFAM_F)); |
||||
|
info->tf_family = AF(TFFAM_F).win; |
||||
|
xtb_to_new(overall, "Size (pnts):", medFont, &AF(TFSIZLBL_F)); |
||||
|
xtb_ti_new(overall, "", D_FS, df_fun, (xtb_data) 0, &AF(TFSIZ_F)); |
||||
|
info->tf_size = AF(TFSIZ_F).win; |
||||
|
xtb_to_new(overall, "Axis Font", medFont, &AF(AFLBL_F)); |
||||
|
xtb_to_new(overall, "Family:", medFont, &AF(AFFAMLBL_F)); |
||||
|
xtb_ti_new(overall, "", MFNAME, df_fun, (xtb_data) 0, &AF(AFFAM_F)); |
||||
|
info->af_family = AF(AFFAM_F).win; |
||||
|
xtb_to_new(overall, "Size (pnts):", medFont, &AF(AFSIZLBL_F)); |
||||
|
xtb_ti_new(overall, "", D_FS, df_fun, (xtb_data) 0, &AF(AFSIZ_F)); |
||||
|
info->af_size = AF(AFSIZ_F).win; |
||||
|
xtb_bt_new(overall, " Ok ", ok_fun, (xtb_data) info, &AF(OK_F)); |
||||
|
xtb_bt_new(overall, "Cancel", can_fun, (xtb_data) 0, &AF(CAN_F)); |
||||
|
/* Dividing bar */ |
||||
|
max_width = 0; |
||||
|
for (i = 0; i < ((int) BAR_F); i++) { |
||||
|
if (AF(i).width > max_width) |
||||
|
max_width = AF(i).width; |
||||
|
} |
||||
|
xtb_bk_new(overall, max_width - BAR_SLACK, 1, &AF(BAR_F)); |
||||
|
|
||||
|
/* Set device specific info */ |
||||
|
(void) dev_fun(info->choices, -1, xtb_br_get(info->choices), (xtb_data) info); |
||||
|
(void) fd_fun(info->fod, -1, xtb_br_get(info->fod), (xtb_data) info); |
||||
|
|
||||
|
/* |
||||
|
* Now place elements - could make this one expression but pcc is too |
||||
|
* wimpy. |
||||
|
*/ |
||||
|
cntrl = xtb_vert(XTB_LEFT, D_VPAD, D_INT, |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(ODEVLBL_F)), |
||||
|
xtb_w(&AF(ODEVROW_F)), NE), |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(DISPLBL_F)), |
||||
|
xtb_w(&AF(DISPROW_F)), NE), |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(FDLBL_F)), |
||||
|
xtb_w(&AF(FDINP_F)), NE), |
||||
|
NE); |
||||
|
|
||||
|
mindim = xtb_vert(XTB_LEFT, D_VPAD, D_INT, |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(MDIMLBL_F)), |
||||
|
xtb_w(&AF(MDIMI_F)), |
||||
|
NE), |
||||
|
NE); |
||||
|
|
||||
|
tfarea = xtb_vert(XTB_LEFT, D_VPAD, D_INT, |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(TFFAMLBL_F)), |
||||
|
xtb_w(&AF(TFFAM_F)), |
||||
|
xtb_w(&AF(TFSIZLBL_F)), |
||||
|
xtb_w(&AF(TFSIZ_F)), NE), |
||||
|
NE); |
||||
|
|
||||
|
afarea = xtb_vert(XTB_LEFT, D_VPAD, D_INT, |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(AFFAMLBL_F)), |
||||
|
xtb_w(&AF(AFFAM_F)), |
||||
|
xtb_w(&AF(AFSIZLBL_F)), |
||||
|
xtb_w(&AF(AFSIZ_F)), NE), |
||||
|
NE); |
||||
|
|
||||
|
def = xtb_fmt_do |
||||
|
(xtb_vert(XTB_CENTER, D_VPAD, D_INT, |
||||
|
xtb_w(&AF(TITLE_F)), |
||||
|
cntrl, |
||||
|
xtb_w(&AF(BAR_F)), |
||||
|
xtb_w(&AF(OPTLBL_F)), |
||||
|
mindim, |
||||
|
xtb_w(&AF(DOCU_F)), |
||||
|
xtb_w(&AF(TFLBL_F)), |
||||
|
tfarea, |
||||
|
xtb_w(&AF(AFLBL_F)), |
||||
|
afarea, |
||||
|
xtb_hort(XTB_CENTER, D_HPAD, D_INT, |
||||
|
xtb_w(&AF(OK_F)), xtb_w(&AF(CAN_F)), NE), |
||||
|
NE), |
||||
|
&frame->width, &frame->height); |
||||
|
xtb_mv_frames(LAST_F, af); |
||||
|
xtb_fmt_free(def); |
||||
|
|
||||
|
/* Make window large enough to contain the info */ |
||||
|
XResizeWindow(disp, overall, frame->width, frame->height); |
||||
|
hints.flags = PSize; |
||||
|
hints.width = frame->width; |
||||
|
hints.height = frame->height; |
||||
|
XSetNormalHints(disp, overall, &hints); |
||||
|
diag_cursor = XCreateFontCursor(disp, XC_dotbox); |
||||
|
fg_color.pixel = PM_PIXEL("Foreground"); |
||||
|
XQueryColor(disp, cmap, &fg_color); |
||||
|
bg_color.pixel = PM_PIXEL("Background"); |
||||
|
XQueryColor(disp, cmap, &bg_color); |
||||
|
XRecolorCursor(disp, diag_cursor, &fg_color, &bg_color); |
||||
|
XDefineCursor(disp, overall, diag_cursor); |
||||
|
frame->width += (2 * D_BRDR); |
||||
|
frame->height += (2 * D_BRDR); |
||||
|
*okbtn = AF(OK_F); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifdef SHADOW |
||||
|
Window |
||||
|
make_shadow(w, h) |
||||
|
int w, |
||||
|
h; |
||||
|
|
||||
|
/* |
||||
|
* Makes a shadow window for a pop-up window of the specified size. |
||||
|
* Needs hint work as well. Try no background window. |
||||
|
*/ |
||||
|
{ |
||||
|
Window shadow; |
||||
|
Bitmap gray_bm; |
||||
|
Pixmap gray_pm; |
||||
|
|
||||
|
gray_bm = XStoreBitmap(gray_width, gray_height, gray_bits); |
||||
|
gray_pm = XMakePixmap(gray_bm, PM_PIXEL("Foreground"), PM_PIXEL("Background")); |
||||
|
shadow = XCreateWindow(RootWindow, 0, 0, w, h, 0, BlackPixmap, gray_pm); |
||||
|
XFreePixmap(gray_pm); |
||||
|
XFreeBitmap(gray_bm); |
||||
|
return shadow; |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
|
||||
|
#define SH_W 5 |
||||
|
#define SH_H 5 |
||||
|
|
||||
|
void |
||||
|
ho_dialog(parent, prog, cookie) |
||||
|
Window parent; /* Parent window */ |
||||
|
char *prog; /* Program name */ |
||||
|
xtb_data cookie; /* Info passed to do_hardcopy */ |
||||
|
|
||||
|
/* |
||||
|
* Asks the user about hardcopy devices. A table of hardcopy |
||||
|
* device names and function pointers to their initialization |
||||
|
* functions is assumed to be in the global `hard_devices' and |
||||
|
* `hard_count'. Returns a non-zero status if the dialog was |
||||
|
* sucessfully posted. Calls do_hardcopy in xgraph to actually |
||||
|
* output information. |
||||
|
*/ |
||||
|
{ |
||||
|
#ifdef SHADOW |
||||
|
static Window shadow; |
||||
|
|
||||
|
#endif |
||||
|
static Window dummy; |
||||
|
static xtb_frame overall = |
||||
|
{(Window) 0, 0, 0, 0, 0}; |
||||
|
static xtb_frame okbtn; |
||||
|
XEvent evt; |
||||
|
XWindowAttributes winInfo; |
||||
|
XSizeHints hints; |
||||
|
struct d_info *info; |
||||
|
|
||||
|
if (!overall.win) { |
||||
|
make_dialog(RootWindow(disp, screen), parent, prog, cookie, |
||||
|
&okbtn, &overall); |
||||
|
#ifdef SHADOW |
||||
|
shadow = make_shadow(d_w, d_h); |
||||
|
#endif |
||||
|
} |
||||
|
else { |
||||
|
/* Change the button information */ |
||||
|
(void) xtb_bt_get(okbtn.win, (xtb_data *) & info, (int *) 0); |
||||
|
info->prog = prog; |
||||
|
info->cookie = cookie; |
||||
|
} |
||||
|
XGetWindowAttributes(disp, parent, &winInfo); |
||||
|
XTranslateCoordinates(disp, parent, RootWindow(disp, screen), |
||||
|
0, 0, &winInfo.x, &winInfo.y, &dummy); |
||||
|
XMoveWindow(disp, overall.win, |
||||
|
(int) (winInfo.x + winInfo.width / 2 - overall.width / 2), |
||||
|
(int) (winInfo.y + winInfo.height / 2 - overall.height / 2)); |
||||
|
hints.flags = PPosition; |
||||
|
hints.x = winInfo.x + winInfo.width / 2 - overall.width / 2; |
||||
|
hints.y = winInfo.y + winInfo.height / 2 - overall.height / 2; |
||||
|
XSetNormalHints(disp, overall.win, &hints); |
||||
|
#ifdef SHADOW |
||||
|
XMoveWindow(disp, shadow, winInfo.x + winInfo.width / 2 - d_w / 2 + SH_W, |
||||
|
winInfo.y + winInfo.height / 2 - d_h / 2 + SH_H); |
||||
|
hints.flags = PPosition; |
||||
|
hints.x = winInfo.x + winInfo.width / 2 - d_w / 2 + SH_W; |
||||
|
hints.y = winInfo.y + winInfo.height / 2 - d_h / 2 + SH_H; |
||||
|
XSetNormalHints(disp, shadow, &hints); |
||||
|
XRaiseWindow(disp, shadow); |
||||
|
XMapWindow(disp, shadow); |
||||
|
#endif |
||||
|
XRaiseWindow(disp, overall.win); |
||||
|
XMapWindow(disp, overall.win); |
||||
|
do { |
||||
|
XNextEvent(disp, &evt); |
||||
|
} while (xtb_dispatch(&evt) != XTB_STOP); |
||||
|
XUnmapWindow(disp, overall.win); |
||||
|
#ifdef SHADOW |
||||
|
XUnmapWindow(disp, shadow); |
||||
|
#endif |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static xtb_hret |
||||
|
err_func(win, bval, info) |
||||
|
Window win; /* Button window */ |
||||
|
int bval; /* Button value */ |
||||
|
xtb_data info; /* Local button info */ |
||||
|
|
||||
|
/* |
||||
|
* Handler function for button in error box. Simply stops dialog. |
||||
|
*/ |
||||
|
{ |
||||
|
(void) xtb_bt_set(win, 1, (xtb_data) 0, 0); |
||||
|
(void) xtb_bt_set(win, 0, (xtb_data) 0, 0); |
||||
|
return XTB_STOP; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
struct err_info { |
||||
|
Window title; |
||||
|
Window contbtn; |
||||
|
int num_lines; |
||||
|
int alloc_lines; |
||||
|
Window *lines; |
||||
|
}; |
||||
|
|
||||
|
#define E_LINES 2 |
||||
|
#define E_VPAD 3 |
||||
|
#define E_HPAD 3 |
||||
|
#define E_INTER 1 |
||||
|
#define ML 256 |
||||
|
|
||||
|
static void |
||||
|
make_msg_box(text, title, frame) |
||||
|
char *text; /* Error text */ |
||||
|
char *title; /* Title text */ |
||||
|
xtb_frame *frame; /* Returned frame */ |
||||
|
|
||||
|
/* |
||||
|
* Makes an error box with a title. |
||||
|
*/ |
||||
|
{ |
||||
|
XSizeHints hints; |
||||
|
struct err_info *new_info; |
||||
|
xtb_frame tf, |
||||
|
cf, |
||||
|
lf; |
||||
|
char *lineptr, |
||||
|
line[ML]; |
||||
|
int y, |
||||
|
i; |
||||
|
unsigned long wamask; |
||||
|
XSetWindowAttributes wattr; |
||||
|
XFontStruct *bigFont = PM_FONT("TitleFont"); |
||||
|
XFontStruct *medFont = PM_FONT("LabelFont"); |
||||
|
|
||||
|
wamask = CWBackPixel | CWBorderPixel | CWOverrideRedirect | |
||||
|
CWSaveUnder | CWColormap; |
||||
|
wattr.background_pixel = PM_PIXEL("Background"); |
||||
|
wattr.border_pixel = PM_PIXEL("Border"); |
||||
|
wattr.override_redirect = True; |
||||
|
wattr.save_under = True; |
||||
|
wattr.colormap = cmap; |
||||
|
frame->win = XCreateWindow(disp, RootWindow(disp, screen), |
||||
|
0, 0, 1, 1, D_BRDR, |
||||
|
depth, InputOutput, vis, |
||||
|
wamask, &wattr); |
||||
|
frame->x_loc = frame->y_loc = frame->width = frame->height = 0; |
||||
|
XStoreName(disp, frame->win, "Error Dialog"); |
||||
|
XSetTransientForHint(disp, RootWindow(disp, screen), frame->win); |
||||
|
new_info = (struct err_info *) Malloc((unsigned) sizeof(struct err_info)); |
||||
|
xtb_to_new(frame->win, title, bigFont, &tf); |
||||
|
new_info->title = tf.win; |
||||
|
if (tf.width > frame->width) |
||||
|
frame->width = tf.width; |
||||
|
|
||||
|
xtb_bt_new(frame->win, "Dismiss", err_func, (xtb_data) 0, &cf); |
||||
|
new_info->contbtn = cf.win; |
||||
|
if (cf.width > frame->width) |
||||
|
frame->width = cf.width; |
||||
|
|
||||
|
new_info->alloc_lines = E_LINES; |
||||
|
new_info->num_lines = 0; |
||||
|
new_info->lines = (Window *) Malloc((unsigned) (sizeof(Window) * E_LINES)); |
||||
|
/* zero the memory out of paranoia */ |
||||
|
memset(new_info->lines, 0, sizeof(Window) * E_LINES); |
||||
|
|
||||
|
lineptr = text; |
||||
|
while (getline(&lineptr, line)) { |
||||
|
if (new_info->num_lines >= new_info->alloc_lines) { |
||||
|
int old_alloc_lines_size = new_info->alloc_lines * sizeof(Window); |
||||
|
new_info->alloc_lines *= 2; |
||||
|
new_info->lines = (Window *) Realloc((char *) new_info->lines, |
||||
|
(unsigned) |
||||
|
(new_info->alloc_lines * |
||||
|
sizeof(Window))); |
||||
|
memset(((char*)new_info->lines) + old_alloc_lines_size, |
||||
|
0, old_alloc_lines_size); |
||||
|
} |
||||
|
xtb_to_new(frame->win, line, medFont, &lf); |
||||
|
new_info->lines[new_info->num_lines] = lf.win; |
||||
|
new_info->num_lines += 1; |
||||
|
if (lf.width > frame->width) |
||||
|
frame->width = lf.width; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Placement */ |
||||
|
frame->width += (2 * E_HPAD); |
||||
|
y = E_VPAD; |
||||
|
/* Title */ |
||||
|
XMoveWindow(disp, new_info->title, (int) (frame->width / 2 - tf.width / 2), y); |
||||
|
y += (tf.height + E_INTER); |
||||
|
/* All lines */ |
||||
|
for (i = 0; i < new_info->num_lines; i++) { |
||||
|
XMoveWindow(disp, new_info->lines[i], E_HPAD, y); |
||||
|
y += (lf.height + E_INTER); |
||||
|
} |
||||
|
/* Button */ |
||||
|
XMoveWindow(disp, new_info->contbtn, (int) (frame->width / 2 - cf.width / 2), y); |
||||
|
y += (cf.height + E_INTER); |
||||
|
|
||||
|
/* Make dialog the right size */ |
||||
|
y += (E_VPAD - E_INTER); |
||||
|
XResizeWindow(disp, frame->win, frame->width, (unsigned int) y); |
||||
|
hints.flags = PSize; |
||||
|
hints.width = frame->width; |
||||
|
hints.height = (unsigned int) y; |
||||
|
XSetNormalHints(disp, frame->win, &hints); |
||||
|
frame->width += (2 * D_BRDR); |
||||
|
frame->height = y + (2 * D_BRDR); |
||||
|
xtb_register(frame->win, (xtb_hret(*) ()) 0, (xtb_data) new_info); |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
msg_box(title, text) |
||||
|
char *title, |
||||
|
*text; |
||||
|
|
||||
|
/* |
||||
|
* This posts a dialog that contains lines of text and a continue |
||||
|
* button. The text may be multiple lines. The dialog is remade |
||||
|
* each time. |
||||
|
*/ |
||||
|
{ |
||||
|
#ifdef SHADOW |
||||
|
Window shadow; |
||||
|
|
||||
|
#endif |
||||
|
XWindowAttributes info; |
||||
|
XEvent evt; |
||||
|
XSizeHints hints; |
||||
|
xtb_frame text_frame; |
||||
|
|
||||
|
make_msg_box(text, title, &text_frame); |
||||
|
#ifdef SHADOW |
||||
|
shadow = make_shadow(w, h); |
||||
|
#endif |
||||
|
XGetWindowAttributes(disp, RootWindow(disp, screen), &info); |
||||
|
XMoveWindow(disp, text_frame.win, (int) (info.width / 2 - text_frame.width / 2), |
||||
|
(int) (info.height / 2 - text_frame.height / 2)); |
||||
|
hints.flags = PPosition; |
||||
|
hints.x = info.width / 2 - text_frame.width / 2; |
||||
|
hints.y = info.height / 2 - text_frame.height / 2; |
||||
|
XSetNormalHints(disp, text_frame.win, &hints); |
||||
|
#ifdef SHADOW |
||||
|
XMoveWindow(disp, shadow, info.width / 2 - w / 2 + SH_W, |
||||
|
info.height / 2 - h / 2 + SH_H); |
||||
|
hints.flags = PPosition; |
||||
|
hints.x = info.width / 2 - w / 2 + SH_W; |
||||
|
hints.y = info.height / 2 - h / 2 + SH_H; |
||||
|
XSetNormalHints(disp, text_frame.win, &hints); |
||||
|
XRaiseWindow(disp, shadow); |
||||
|
XMapWindow(disp, shadow); |
||||
|
#endif |
||||
|
XRaiseWindow(disp, text_frame.win); |
||||
|
XMapWindow(disp, text_frame.win); |
||||
|
do { |
||||
|
XNextEvent(disp, &evt); |
||||
|
} while (xtb_dispatch(&evt) != XTB_STOP); |
||||
|
#ifdef SHADOW |
||||
|
XDestroyWindow(disp, shadow); |
||||
|
#endif |
||||
|
del_msg_box(text_frame.win); |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
do_error(err_text) |
||||
|
char *err_text; |
||||
|
{ |
||||
|
if (PM_INT("Output Device") == D_XWINDOWS) |
||||
|
msg_box("Xgraph Error", err_text); |
||||
|
else |
||||
|
fputs(err_text, stderr); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
getline(tptr, lptr) |
||||
|
char **tptr; |
||||
|
char *lptr; |
||||
|
|
||||
|
/* |
||||
|
* Returns next line from tptr. Assumes `lptr' is large enough to |
||||
|
* accept the line. |
||||
|
*/ |
||||
|
{ |
||||
|
char *start; |
||||
|
|
||||
|
start = *tptr; |
||||
|
while (*tptr && **tptr && (**tptr != '\n')) { |
||||
|
(*tptr)++; |
||||
|
} |
||||
|
if (*tptr > start) { |
||||
|
(void) strncpy(lptr, start, (*tptr - start)); |
||||
|
lptr[*tptr - start] = '\0'; |
||||
|
if (**tptr == '\n') |
||||
|
(*tptr)++; |
||||
|
return 1; |
||||
|
} |
||||
|
else { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
del_msg_box(msg) |
||||
|
Window msg; |
||||
|
|
||||
|
/* |
||||
|
* Deletes all components of an msg box |
||||
|
*/ |
||||
|
{ |
||||
|
struct err_info *info; |
||||
|
char *dummy; |
||||
|
int i; |
||||
|
|
||||
|
if (xtb_unregister(msg, (xtb_data *) & info)) { |
||||
|
xtb_to_del(info->title); |
||||
|
xtb_bt_del(info->contbtn, (xtb_data *) & dummy); |
||||
|
for (i = 0; i < info->num_lines; i++) { |
||||
|
xtb_to_del(info->lines[i]); |
||||
|
} |
||||
|
Free((char *) info->lines); |
||||
|
Free((char *) info); |
||||
|
XDestroyWindow(disp, msg); |
||||
|
} |
||||
|
} |
||||
1263
xgraph/draw.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2047
xgraph/examples/Animation.xg
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,21 @@ |
|||||
|
TitleText: Sample Bar Graph |
||||
|
BarGraph: true |
||||
|
BarBase: 0.0 |
||||
|
BarWidth: 0.25 |
||||
|
NoLines: true |
||||
|
YUnitText: Widgets/Year |
||||
|
XUnitText: Year |
||||
|
"Frobs" |
||||
|
79.75 5.6 |
||||
|
80.75 8.3 |
||||
|
81.75 2.2 |
||||
|
|
||||
|
"Blobs" |
||||
|
80 8.0 |
||||
|
81 6.4 |
||||
|
82 1.2 |
||||
|
|
||||
|
"Zygotes" |
||||
|
80.25 9.1 |
||||
|
81.25 10.8 |
||||
|
82.25 8.3 |
||||
1805
xgraph/examples/surface.xg
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,631 @@ |
|||||
|
TitleText: Another Surface Plot |
||||
|
ticks: on |
||||
|
boundbox: on |
||||
|
move 367.000000 10.000000 |
||||
|
draw 390.000000 22.000000 |
||||
|
move 367.000000 10.000000 |
||||
|
draw 390.000000 22.000000 |
||||
|
move 320.000000 188.000000 |
||||
|
draw 367.000000 10.000000 |
||||
|
move 320.000000 188.000000 |
||||
|
draw 367.000000 10.000000 |
||||
|
move 390.000000 22.000000 |
||||
|
draw 412.000000 33.000000 |
||||
|
move 390.000000 22.000000 |
||||
|
draw 412.000000 33.000000 |
||||
|
move 343.000000 200.000000 |
||||
|
draw 390.000000 22.000000 |
||||
|
move 390.000000 22.000000 |
||||
|
draw 390.000000 22.000000 |
||||
|
move 412.000000 33.000000 |
||||
|
draw 457.000000 56.000000 |
||||
|
move 412.000000 33.000000 |
||||
|
draw 457.000000 56.000000 |
||||
|
move 365.000000 211.000000 |
||||
|
draw 412.000000 33.000000 |
||||
|
move 412.000000 33.000000 |
||||
|
draw 412.000000 33.000000 |
||||
|
move 457.000000 56.000000 |
||||
|
draw 523.000000 91.000000 |
||||
|
move 457.000000 56.000000 |
||||
|
draw 523.000000 91.000000 |
||||
|
move 410.000000 234.000000 |
||||
|
draw 457.000000 56.000000 |
||||
|
move 457.000000 56.000000 |
||||
|
draw 457.000000 56.000000 |
||||
|
move 523.000000 91.000000 |
||||
|
draw 545.000000 102.000000 |
||||
|
move 523.000000 91.000000 |
||||
|
draw 545.000000 102.000000 |
||||
|
move 477.000000 267.000000 |
||||
|
draw 523.000000 91.000000 |
||||
|
move 523.000000 91.000000 |
||||
|
draw 523.000000 91.000000 |
||||
|
move 545.000000 102.000000 |
||||
|
draw 589.000000 125.000000 |
||||
|
move 545.000000 102.000000 |
||||
|
draw 589.000000 125.000000 |
||||
|
move 500.000000 258.000000 |
||||
|
draw 545.000000 102.000000 |
||||
|
move 545.000000 102.000000 |
||||
|
draw 545.000000 102.000000 |
||||
|
move 589.000000 125.000000 |
||||
|
draw 632.000000 147.000000 |
||||
|
move 589.000000 125.000000 |
||||
|
draw 632.000000 147.000000 |
||||
|
move 544.000000 246.000000 |
||||
|
draw 589.000000 125.000000 |
||||
|
move 589.000000 125.000000 |
||||
|
draw 589.000000 125.000000 |
||||
|
move 632.000000 147.000000 |
||||
|
draw 675.000000 170.000000 |
||||
|
move 632.000000 147.000000 |
||||
|
draw 675.000000 170.000000 |
||||
|
move 588.000000 242.000000 |
||||
|
draw 632.000000 147.000000 |
||||
|
move 632.000000 147.000000 |
||||
|
draw 632.000000 147.000000 |
||||
|
move 675.000000 170.000000 |
||||
|
draw 718.000000 192.000000 |
||||
|
move 675.000000 170.000000 |
||||
|
draw 718.000000 192.000000 |
||||
|
move 631.000000 290.000000 |
||||
|
draw 675.000000 170.000000 |
||||
|
move 675.000000 170.000000 |
||||
|
draw 675.000000 170.000000 |
||||
|
move 718.000000 192.000000 |
||||
|
draw 739.000000 203.000000 |
||||
|
move 718.000000 192.000000 |
||||
|
draw 739.000000 203.000000 |
||||
|
move 674.000000 345.000000 |
||||
|
draw 718.000000 192.000000 |
||||
|
move 718.000000 192.000000 |
||||
|
draw 718.000000 192.000000 |
||||
|
move 739.000000 203.000000 |
||||
|
draw 803.000000 235.000000 |
||||
|
move 739.000000 203.000000 |
||||
|
draw 803.000000 235.000000 |
||||
|
move 695.000000 376.000000 |
||||
|
draw 739.000000 203.000000 |
||||
|
move 739.000000 203.000000 |
||||
|
draw 739.000000 203.000000 |
||||
|
move 803.000000 235.000000 |
||||
|
draw 845.000000 257.000000 |
||||
|
move 803.000000 235.000000 |
||||
|
draw 845.000000 257.000000 |
||||
|
move 759.000000 409.000000 |
||||
|
draw 803.000000 235.000000 |
||||
|
move 803.000000 235.000000 |
||||
|
draw 803.000000 235.000000 |
||||
|
move 845.000000 257.000000 |
||||
|
draw 865.000000 268.000000 |
||||
|
move 845.000000 257.000000 |
||||
|
draw 865.000000 268.000000 |
||||
|
move 801.000000 430.000000 |
||||
|
draw 845.000000 257.000000 |
||||
|
move 845.000000 257.000000 |
||||
|
draw 845.000000 257.000000 |
||||
|
move 865.000000 268.000000 |
||||
|
draw 886.000000 279.000000 |
||||
|
move 865.000000 268.000000 |
||||
|
draw 886.000000 279.000000 |
||||
|
move 822.000000 440.000000 |
||||
|
draw 865.000000 268.000000 |
||||
|
move 865.000000 268.000000 |
||||
|
draw 865.000000 268.000000 |
||||
|
move 843.000000 451.000000 |
||||
|
draw 886.000000 279.000000 |
||||
|
move 886.000000 279.000000 |
||||
|
draw 886.000000 279.000000 |
||||
|
move 320.000000 188.000000 |
||||
|
draw 343.000000 200.000000 |
||||
|
move 320.000000 188.000000 |
||||
|
draw 321.000000 189.000000 |
||||
|
move 287.000000 245.000000 |
||||
|
draw 320.000000 188.000000 |
||||
|
move 287.000000 245.000000 |
||||
|
draw 320.000000 188.000000 |
||||
|
move 343.000000 200.000000 |
||||
|
draw 365.000000 211.000000 |
||||
|
move 310.000000 257.000000 |
||||
|
draw 343.000000 200.000000 |
||||
|
move 365.000000 211.000000 |
||||
|
draw 410.000000 234.000000 |
||||
|
move 332.000000 268.000000 |
||||
|
draw 365.000000 211.000000 |
||||
|
move 410.000000 234.000000 |
||||
|
draw 477.000000 267.000000 |
||||
|
move 378.000000 290.000000 |
||||
|
draw 410.000000 234.000000 |
||||
|
move 477.000000 267.000000 |
||||
|
draw 500.000000 258.000000 |
||||
|
move 445.000000 323.000000 |
||||
|
draw 477.000000 267.000000 |
||||
|
move 500.000000 258.000000 |
||||
|
draw 544.000000 246.000000 |
||||
|
move 467.000000 311.000000 |
||||
|
draw 500.000000 258.000000 |
||||
|
move 544.000000 246.000000 |
||||
|
draw 588.000000 242.000000 |
||||
|
move 511.000000 297.000000 |
||||
|
draw 544.000000 246.000000 |
||||
|
move 588.000000 242.000000 |
||||
|
draw 631.000000 290.000000 |
||||
|
move 555.000000 287.000000 |
||||
|
draw 588.000000 242.000000 |
||||
|
move 631.000000 290.000000 |
||||
|
draw 674.000000 345.000000 |
||||
|
move 599.000000 340.000000 |
||||
|
draw 631.000000 290.000000 |
||||
|
move 674.000000 345.000000 |
||||
|
draw 695.000000 376.000000 |
||||
|
move 642.000000 398.000000 |
||||
|
draw 674.000000 345.000000 |
||||
|
move 695.000000 376.000000 |
||||
|
draw 759.000000 409.000000 |
||||
|
move 663.000000 431.000000 |
||||
|
draw 695.000000 376.000000 |
||||
|
move 759.000000 409.000000 |
||||
|
draw 801.000000 430.000000 |
||||
|
move 727.000000 463.000000 |
||||
|
draw 759.000000 409.000000 |
||||
|
move 801.000000 430.000000 |
||||
|
draw 822.000000 440.000000 |
||||
|
move 769.000000 484.000000 |
||||
|
draw 801.000000 430.000000 |
||||
|
move 822.000000 440.000000 |
||||
|
draw 843.000000 451.000000 |
||||
|
move 790.000000 495.000000 |
||||
|
draw 822.000000 440.000000 |
||||
|
move 811.000000 505.000000 |
||||
|
draw 843.000000 451.000000 |
||||
|
move 287.000000 245.000000 |
||||
|
draw 310.000000 257.000000 |
||||
|
move 287.000000 245.000000 |
||||
|
draw 288.000000 246.000000 |
||||
|
move 222.000000 329.000000 |
||||
|
draw 287.000000 245.000000 |
||||
|
move 222.000000 329.000000 |
||||
|
draw 287.000000 245.000000 |
||||
|
move 310.000000 257.000000 |
||||
|
draw 332.000000 268.000000 |
||||
|
move 245.000000 340.000000 |
||||
|
draw 310.000000 257.000000 |
||||
|
move 332.000000 268.000000 |
||||
|
draw 378.000000 290.000000 |
||||
|
move 267.000000 351.000000 |
||||
|
draw 332.000000 268.000000 |
||||
|
move 378.000000 290.000000 |
||||
|
draw 445.000000 323.000000 |
||||
|
move 313.000000 373.000000 |
||||
|
draw 378.000000 290.000000 |
||||
|
move 445.000000 323.000000 |
||||
|
draw 467.000000 311.000000 |
||||
|
move 380.000000 405.000000 |
||||
|
draw 445.000000 323.000000 |
||||
|
move 467.000000 311.000000 |
||||
|
draw 511.000000 297.000000 |
||||
|
move 403.000000 389.000000 |
||||
|
draw 467.000000 311.000000 |
||||
|
move 511.000000 297.000000 |
||||
|
draw 555.000000 287.000000 |
||||
|
move 447.000000 371.000000 |
||||
|
draw 511.000000 297.000000 |
||||
|
move 555.000000 287.000000 |
||||
|
draw 599.000000 340.000000 |
||||
|
move 491.000000 359.000000 |
||||
|
draw 555.000000 287.000000 |
||||
|
move 599.000000 340.000000 |
||||
|
draw 642.000000 398.000000 |
||||
|
move 535.000000 414.000000 |
||||
|
draw 599.000000 340.000000 |
||||
|
move 642.000000 398.000000 |
||||
|
draw 663.000000 431.000000 |
||||
|
move 578.000000 475.000000 |
||||
|
draw 642.000000 398.000000 |
||||
|
move 663.000000 431.000000 |
||||
|
draw 727.000000 463.000000 |
||||
|
move 599.000000 512.000000 |
||||
|
draw 663.000000 431.000000 |
||||
|
move 727.000000 463.000000 |
||||
|
draw 769.000000 484.000000 |
||||
|
move 663.000000 543.000000 |
||||
|
draw 727.000000 463.000000 |
||||
|
move 769.000000 484.000000 |
||||
|
draw 790.000000 495.000000 |
||||
|
move 705.000000 564.000000 |
||||
|
draw 769.000000 484.000000 |
||||
|
move 790.000000 495.000000 |
||||
|
draw 811.000000 505.000000 |
||||
|
move 727.000000 574.000000 |
||||
|
draw 790.000000 495.000000 |
||||
|
move 748.000000 584.000000 |
||||
|
draw 811.000000 505.000000 |
||||
|
move 222.000000 329.000000 |
||||
|
draw 245.000000 340.000000 |
||||
|
move 222.000000 329.000000 |
||||
|
draw 223.000000 329.000000 |
||||
|
move 190.000000 748.000000 |
||||
|
draw 222.000000 329.000000 |
||||
|
move 190.000000 748.000000 |
||||
|
draw 222.000000 329.000000 |
||||
|
move 245.000000 340.000000 |
||||
|
draw 267.000000 351.000000 |
||||
|
move 213.000000 759.000000 |
||||
|
draw 245.000000 340.000000 |
||||
|
move 267.000000 351.000000 |
||||
|
draw 313.000000 373.000000 |
||||
|
move 237.000000 769.000000 |
||||
|
draw 267.000000 351.000000 |
||||
|
move 313.000000 373.000000 |
||||
|
draw 380.000000 405.000000 |
||||
|
move 283.000000 790.000000 |
||||
|
draw 313.000000 373.000000 |
||||
|
move 380.000000 405.000000 |
||||
|
draw 403.000000 389.000000 |
||||
|
move 352.000000 821.000000 |
||||
|
draw 380.000000 405.000000 |
||||
|
move 403.000000 389.000000 |
||||
|
draw 447.000000 371.000000 |
||||
|
move 381.000000 430.000000 |
||||
|
draw 403.000000 389.000000 |
||||
|
move 447.000000 371.000000 |
||||
|
draw 491.000000 359.000000 |
||||
|
move 426.000000 407.000000 |
||||
|
draw 447.000000 371.000000 |
||||
|
move 491.000000 359.000000 |
||||
|
draw 535.000000 414.000000 |
||||
|
move 470.000000 392.000000 |
||||
|
draw 491.000000 359.000000 |
||||
|
move 535.000000 414.000000 |
||||
|
draw 578.000000 475.000000 |
||||
|
move 513.000000 450.000000 |
||||
|
draw 535.000000 414.000000 |
||||
|
move 578.000000 475.000000 |
||||
|
draw 599.000000 512.000000 |
||||
|
move 556.000000 514.000000 |
||||
|
draw 578.000000 475.000000 |
||||
|
move 599.000000 512.000000 |
||||
|
draw 663.000000 543.000000 |
||||
|
move 576.000000 922.000000 |
||||
|
draw 599.000000 512.000000 |
||||
|
move 663.000000 543.000000 |
||||
|
draw 705.000000 564.000000 |
||||
|
move 641.000000 952.000000 |
||||
|
draw 663.000000 543.000000 |
||||
|
move 705.000000 564.000000 |
||||
|
draw 727.000000 574.000000 |
||||
|
move 684.000000 971.000000 |
||||
|
draw 705.000000 564.000000 |
||||
|
move 727.000000 574.000000 |
||||
|
draw 748.000000 584.000000 |
||||
|
move 706.000000 981.000000 |
||||
|
draw 727.000000 574.000000 |
||||
|
move 727.000000 991.000000 |
||||
|
draw 748.000000 584.000000 |
||||
|
move 190.000000 748.000000 |
||||
|
draw 213.000000 759.000000 |
||||
|
move 190.000000 748.000000 |
||||
|
draw 191.000000 748.000000 |
||||
|
move 168.000000 759.000000 |
||||
|
draw 190.000000 748.000000 |
||||
|
move 168.000000 759.000000 |
||||
|
draw 190.000000 748.000000 |
||||
|
move 213.000000 759.000000 |
||||
|
draw 237.000000 769.000000 |
||||
|
move 192.000000 769.000000 |
||||
|
draw 213.000000 759.000000 |
||||
|
move 237.000000 769.000000 |
||||
|
draw 283.000000 790.000000 |
||||
|
move 215.000000 780.000000 |
||||
|
draw 237.000000 769.000000 |
||||
|
move 283.000000 790.000000 |
||||
|
draw 352.000000 821.000000 |
||||
|
move 261.000000 800.000000 |
||||
|
draw 283.000000 790.000000 |
||||
|
move 352.000000 821.000000 |
||||
|
draw 381.000000 430.000000 |
||||
|
move 330.000000 831.000000 |
||||
|
draw 352.000000 821.000000 |
||||
|
move 381.000000 430.000000 |
||||
|
draw 426.000000 407.000000 |
||||
|
move 381.000000 430.000000 |
||||
|
draw 381.000000 430.000000 |
||||
|
move 426.000000 407.000000 |
||||
|
draw 470.000000 392.000000 |
||||
|
move 405.000000 419.000000 |
||||
|
draw 426.000000 407.000000 |
||||
|
move 470.000000 392.000000 |
||||
|
draw 513.000000 450.000000 |
||||
|
move 449.000000 404.000000 |
||||
|
draw 470.000000 392.000000 |
||||
|
move 513.000000 450.000000 |
||||
|
draw 556.000000 514.000000 |
||||
|
move 492.000000 461.000000 |
||||
|
draw 513.000000 450.000000 |
||||
|
move 556.000000 514.000000 |
||||
|
draw 576.000000 922.000000 |
||||
|
move 535.000000 525.000000 |
||||
|
draw 556.000000 514.000000 |
||||
|
move 576.000000 922.000000 |
||||
|
draw 641.000000 952.000000 |
||||
|
move 554.000000 932.000000 |
||||
|
draw 576.000000 922.000000 |
||||
|
move 641.000000 952.000000 |
||||
|
draw 684.000000 971.000000 |
||||
|
move 620.000000 962.000000 |
||||
|
draw 641.000000 952.000000 |
||||
|
move 684.000000 971.000000 |
||||
|
draw 706.000000 981.000000 |
||||
|
move 663.000000 981.000000 |
||||
|
draw 684.000000 971.000000 |
||||
|
move 706.000000 981.000000 |
||||
|
draw 727.000000 991.000000 |
||||
|
move 684.000000 991.000000 |
||||
|
draw 706.000000 981.000000 |
||||
|
move 706.000000 1000.000000 |
||||
|
draw 727.000000 991.000000 |
||||
|
move 168.000000 759.000000 |
||||
|
draw 192.000000 769.000000 |
||||
|
move 168.000000 759.000000 |
||||
|
draw 170.000000 760.000000 |
||||
|
move 145.000000 770.000000 |
||||
|
draw 168.000000 759.000000 |
||||
|
move 145.000000 770.000000 |
||||
|
draw 168.000000 759.000000 |
||||
|
move 192.000000 769.000000 |
||||
|
draw 215.000000 780.000000 |
||||
|
move 168.000000 781.000000 |
||||
|
draw 192.000000 769.000000 |
||||
|
move 215.000000 780.000000 |
||||
|
draw 261.000000 800.000000 |
||||
|
move 191.000000 791.000000 |
||||
|
draw 215.000000 780.000000 |
||||
|
move 261.000000 800.000000 |
||||
|
draw 330.000000 831.000000 |
||||
|
move 238.000000 812.000000 |
||||
|
draw 261.000000 800.000000 |
||||
|
move 330.000000 831.000000 |
||||
|
draw 331.000000 831.000000 |
||||
|
move 306.000000 843.000000 |
||||
|
draw 330.000000 831.000000 |
||||
|
move 381.000000 431.000000 |
||||
|
draw 405.000000 419.000000 |
||||
|
move 405.000000 419.000000 |
||||
|
draw 449.000000 404.000000 |
||||
|
move 381.000000 488.000000 |
||||
|
draw 405.000000 419.000000 |
||||
|
move 449.000000 404.000000 |
||||
|
draw 492.000000 461.000000 |
||||
|
move 425.000000 509.000000 |
||||
|
draw 449.000000 404.000000 |
||||
|
move 492.000000 461.000000 |
||||
|
draw 535.000000 525.000000 |
||||
|
move 468.000000 530.000000 |
||||
|
draw 492.000000 461.000000 |
||||
|
move 535.000000 525.000000 |
||||
|
draw 554.000000 932.000000 |
||||
|
move 512.000000 553.000000 |
||||
|
draw 535.000000 525.000000 |
||||
|
move 554.000000 932.000000 |
||||
|
draw 620.000000 962.000000 |
||||
|
move 530.000000 943.000000 |
||||
|
draw 554.000000 932.000000 |
||||
|
move 620.000000 962.000000 |
||||
|
draw 663.000000 981.000000 |
||||
|
move 596.000000 972.000000 |
||||
|
draw 620.000000 962.000000 |
||||
|
move 663.000000 981.000000 |
||||
|
draw 684.000000 991.000000 |
||||
|
move 639.000000 992.000000 |
||||
|
draw 663.000000 981.000000 |
||||
|
move 684.000000 991.000000 |
||||
|
draw 706.000000 1000.000000 |
||||
|
move 661.000000 1001.000000 |
||||
|
draw 684.000000 991.000000 |
||||
|
move 682.000000 1011.000000 |
||||
|
draw 706.000000 1000.000000 |
||||
|
move 145.000000 770.000000 |
||||
|
draw 168.000000 781.000000 |
||||
|
move 145.000000 770.000000 |
||||
|
draw 147.000000 771.000000 |
||||
|
move 141.000000 772.000000 |
||||
|
draw 145.000000 770.000000 |
||||
|
move 141.000000 772.000000 |
||||
|
draw 145.000000 770.000000 |
||||
|
move 168.000000 781.000000 |
||||
|
draw 191.000000 791.000000 |
||||
|
move 165.000000 782.000000 |
||||
|
draw 168.000000 781.000000 |
||||
|
move 191.000000 791.000000 |
||||
|
draw 238.000000 812.000000 |
||||
|
move 188.000000 793.000000 |
||||
|
draw 191.000000 791.000000 |
||||
|
move 238.000000 812.000000 |
||||
|
draw 306.000000 843.000000 |
||||
|
move 234.000000 813.000000 |
||||
|
draw 238.000000 812.000000 |
||||
|
move 306.000000 843.000000 |
||||
|
draw 307.000000 843.000000 |
||||
|
move 303.000000 844.000000 |
||||
|
draw 306.000000 843.000000 |
||||
|
move 377.000000 486.000000 |
||||
|
draw 381.000000 488.000000 |
||||
|
move 381.000000 488.000000 |
||||
|
draw 425.000000 509.000000 |
||||
|
move 377.000000 492.000000 |
||||
|
draw 381.000000 488.000000 |
||||
|
move 425.000000 509.000000 |
||||
|
draw 468.000000 530.000000 |
||||
|
move 421.000000 513.000000 |
||||
|
draw 425.000000 509.000000 |
||||
|
move 468.000000 530.000000 |
||||
|
draw 512.000000 553.000000 |
||||
|
move 465.000000 534.000000 |
||||
|
draw 468.000000 530.000000 |
||||
|
move 512.000000 553.000000 |
||||
|
draw 530.000000 943.000000 |
||||
|
move 508.000000 556.000000 |
||||
|
draw 512.000000 553.000000 |
||||
|
move 530.000000 943.000000 |
||||
|
draw 596.000000 972.000000 |
||||
|
move 527.000000 944.000000 |
||||
|
draw 530.000000 943.000000 |
||||
|
move 596.000000 972.000000 |
||||
|
draw 639.000000 992.000000 |
||||
|
move 592.000000 974.000000 |
||||
|
draw 596.000000 972.000000 |
||||
|
move 639.000000 992.000000 |
||||
|
draw 661.000000 1001.000000 |
||||
|
move 636.000000 993.000000 |
||||
|
draw 639.000000 992.000000 |
||||
|
move 661.000000 1001.000000 |
||||
|
draw 682.000000 1011.000000 |
||||
|
move 657.000000 1003.000000 |
||||
|
draw 661.000000 1001.000000 |
||||
|
move 679.000000 1012.000000 |
||||
|
draw 682.000000 1011.000000 |
||||
|
move 141.000000 772.000000 |
||||
|
draw 165.000000 782.000000 |
||||
|
move 141.000000 772.000000 |
||||
|
draw 143.000000 773.000000 |
||||
|
move 139.000000 773.000000 |
||||
|
draw 141.000000 772.000000 |
||||
|
move 139.000000 773.000000 |
||||
|
draw 141.000000 772.000000 |
||||
|
move 165.000000 782.000000 |
||||
|
draw 188.000000 793.000000 |
||||
|
move 162.000000 783.000000 |
||||
|
draw 165.000000 782.000000 |
||||
|
move 188.000000 793.000000 |
||||
|
draw 234.000000 813.000000 |
||||
|
move 186.000000 794.000000 |
||||
|
draw 188.000000 793.000000 |
||||
|
move 234.000000 813.000000 |
||||
|
draw 303.000000 844.000000 |
||||
|
move 232.000000 815.000000 |
||||
|
draw 234.000000 813.000000 |
||||
|
move 303.000000 844.000000 |
||||
|
draw 304.000000 844.000000 |
||||
|
move 301.000000 845.000000 |
||||
|
draw 303.000000 844.000000 |
||||
|
move 377.000000 492.000000 |
||||
|
draw 377.000000 492.000000 |
||||
|
move 377.000000 492.000000 |
||||
|
draw 421.000000 513.000000 |
||||
|
move 377.000000 492.000000 |
||||
|
draw 377.000000 492.000000 |
||||
|
move 421.000000 513.000000 |
||||
|
draw 465.000000 534.000000 |
||||
|
move 419.000000 517.000000 |
||||
|
draw 421.000000 513.000000 |
||||
|
move 465.000000 534.000000 |
||||
|
draw 508.000000 556.000000 |
||||
|
move 463.000000 538.000000 |
||||
|
draw 465.000000 534.000000 |
||||
|
move 508.000000 556.000000 |
||||
|
draw 527.000000 944.000000 |
||||
|
move 506.000000 559.000000 |
||||
|
draw 508.000000 556.000000 |
||||
|
move 527.000000 944.000000 |
||||
|
draw 592.000000 974.000000 |
||||
|
move 525.000000 946.000000 |
||||
|
draw 527.000000 944.000000 |
||||
|
move 592.000000 974.000000 |
||||
|
draw 636.000000 993.000000 |
||||
|
move 590.000000 975.000000 |
||||
|
draw 592.000000 974.000000 |
||||
|
move 636.000000 993.000000 |
||||
|
draw 657.000000 1003.000000 |
||||
|
move 634.000000 994.000000 |
||||
|
draw 636.000000 993.000000 |
||||
|
move 657.000000 1003.000000 |
||||
|
draw 679.000000 1012.000000 |
||||
|
move 655.000000 1004.000000 |
||||
|
draw 657.000000 1003.000000 |
||||
|
move 677.000000 1013.000000 |
||||
|
draw 679.000000 1012.000000 |
||||
|
move 139.000000 773.000000 |
||||
|
draw 162.000000 783.000000 |
||||
|
move 139.000000 773.000000 |
||||
|
draw 141.000000 774.000000 |
||||
|
move 138.000000 774.000000 |
||||
|
draw 139.000000 773.000000 |
||||
|
move 138.000000 774.000000 |
||||
|
draw 139.000000 773.000000 |
||||
|
move 162.000000 783.000000 |
||||
|
draw 186.000000 794.000000 |
||||
|
move 161.000000 784.000000 |
||||
|
draw 162.000000 783.000000 |
||||
|
move 186.000000 794.000000 |
||||
|
draw 232.000000 815.000000 |
||||
|
move 185.000000 794.000000 |
||||
|
draw 186.000000 794.000000 |
||||
|
move 232.000000 815.000000 |
||||
|
draw 301.000000 845.000000 |
||||
|
move 231.000000 815.000000 |
||||
|
draw 232.000000 815.000000 |
||||
|
move 301.000000 845.000000 |
||||
|
draw 302.000000 845.000000 |
||||
|
move 300.000000 846.000000 |
||||
|
draw 301.000000 845.000000 |
||||
|
move 377.000000 497.000000 |
||||
|
draw 419.000000 517.000000 |
||||
|
move 419.000000 517.000000 |
||||
|
draw 463.000000 538.000000 |
||||
|
move 418.000000 519.000000 |
||||
|
draw 419.000000 517.000000 |
||||
|
move 463.000000 538.000000 |
||||
|
draw 506.000000 559.000000 |
||||
|
move 462.000000 540.000000 |
||||
|
draw 463.000000 538.000000 |
||||
|
move 506.000000 559.000000 |
||||
|
draw 525.000000 946.000000 |
||||
|
move 505.000000 562.000000 |
||||
|
draw 506.000000 559.000000 |
||||
|
move 525.000000 946.000000 |
||||
|
draw 590.000000 975.000000 |
||||
|
move 523.000000 946.000000 |
||||
|
draw 525.000000 946.000000 |
||||
|
move 590.000000 975.000000 |
||||
|
draw 634.000000 994.000000 |
||||
|
move 589.000000 975.000000 |
||||
|
draw 590.000000 975.000000 |
||||
|
move 634.000000 994.000000 |
||||
|
draw 655.000000 1004.000000 |
||||
|
move 632.000000 995.000000 |
||||
|
draw 634.000000 994.000000 |
||||
|
move 655.000000 1004.000000 |
||||
|
draw 677.000000 1013.000000 |
||||
|
move 654.000000 1004.000000 |
||||
|
draw 655.000000 1004.000000 |
||||
|
move 675.000000 1014.000000 |
||||
|
draw 677.000000 1013.000000 |
||||
|
move 138.000000 774.000000 |
||||
|
draw 161.000000 784.000000 |
||||
|
move 138.000000 774.000000 |
||||
|
draw 139.000000 774.000000 |
||||
|
move 161.000000 784.000000 |
||||
|
draw 185.000000 794.000000 |
||||
|
move 185.000000 794.000000 |
||||
|
draw 231.000000 815.000000 |
||||
|
move 231.000000 815.000000 |
||||
|
draw 300.000000 846.000000 |
||||
|
move 300.000000 846.000000 |
||||
|
draw 301.000000 845.000000 |
||||
|
move 376.000000 499.000000 |
||||
|
draw 418.000000 519.000000 |
||||
|
move 418.000000 519.000000 |
||||
|
draw 462.000000 540.000000 |
||||
|
move 462.000000 540.000000 |
||||
|
draw 505.000000 562.000000 |
||||
|
move 505.000000 562.000000 |
||||
|
draw 523.000000 946.000000 |
||||
|
move 523.000000 946.000000 |
||||
|
draw 589.000000 975.000000 |
||||
|
move 589.000000 975.000000 |
||||
|
draw 632.000000 995.000000 |
||||
|
move 632.000000 995.000000 |
||||
|
draw 654.000000 1004.000000 |
||||
|
move 654.000000 1004.000000 |
||||
|
draw 675.000000 1014.000000 |
||||
@ -0,0 +1,667 @@ |
|||||
|
TitleText: Last Surface Plot |
||||
|
ticks: on |
||||
|
Boundbox: on |
||||
|
move 641.000000 167.000000 |
||||
|
draw 664.000000 156.000000 |
||||
|
move 641.000000 167.000000 |
||||
|
draw 664.000000 156.000000 |
||||
|
move 664.000000 156.000000 |
||||
|
draw 664.000000 156.000000 |
||||
|
move 661.000000 10.000000 |
||||
|
draw 664.000000 156.000000 |
||||
|
move 614.000000 32.000000 |
||||
|
draw 641.000000 167.000000 |
||||
|
move 614.000000 32.000000 |
||||
|
draw 641.000000 167.000000 |
||||
|
move 641.000000 167.000000 |
||||
|
draw 641.000000 167.000000 |
||||
|
move 638.000000 21.000000 |
||||
|
draw 641.000000 167.000000 |
||||
|
move 568.000000 55.000000 |
||||
|
draw 614.000000 32.000000 |
||||
|
move 568.000000 55.000000 |
||||
|
draw 614.000000 32.000000 |
||||
|
move 614.000000 32.000000 |
||||
|
draw 615.000000 33.000000 |
||||
|
move 614.000000 32.000000 |
||||
|
draw 615.000000 33.000000 |
||||
|
move 501.000000 89.000000 |
||||
|
draw 568.000000 55.000000 |
||||
|
move 501.000000 89.000000 |
||||
|
draw 568.000000 55.000000 |
||||
|
move 568.000000 55.000000 |
||||
|
draw 570.000000 56.000000 |
||||
|
move 568.000000 55.000000 |
||||
|
draw 569.000000 56.000000 |
||||
|
move 478.000000 100.000000 |
||||
|
draw 501.000000 89.000000 |
||||
|
move 478.000000 100.000000 |
||||
|
draw 501.000000 89.000000 |
||||
|
move 501.000000 89.000000 |
||||
|
draw 502.000000 90.000000 |
||||
|
move 501.000000 89.000000 |
||||
|
draw 502.000000 90.000000 |
||||
|
move 434.000000 122.000000 |
||||
|
draw 478.000000 100.000000 |
||||
|
move 434.000000 122.000000 |
||||
|
draw 478.000000 100.000000 |
||||
|
move 478.000000 100.000000 |
||||
|
draw 479.000000 101.000000 |
||||
|
move 478.000000 100.000000 |
||||
|
draw 479.000000 101.000000 |
||||
|
move 389.000000 145.000000 |
||||
|
draw 434.000000 122.000000 |
||||
|
move 389.000000 145.000000 |
||||
|
draw 434.000000 122.000000 |
||||
|
move 434.000000 122.000000 |
||||
|
draw 435.000000 123.000000 |
||||
|
move 434.000000 122.000000 |
||||
|
draw 435.000000 123.000000 |
||||
|
move 345.000000 167.000000 |
||||
|
draw 389.000000 145.000000 |
||||
|
move 345.000000 167.000000 |
||||
|
draw 389.000000 145.000000 |
||||
|
move 389.000000 145.000000 |
||||
|
draw 391.000000 145.000000 |
||||
|
move 389.000000 145.000000 |
||||
|
draw 391.000000 145.000000 |
||||
|
move 302.000000 188.000000 |
||||
|
draw 345.000000 167.000000 |
||||
|
move 302.000000 188.000000 |
||||
|
draw 345.000000 167.000000 |
||||
|
move 345.000000 167.000000 |
||||
|
draw 347.000000 167.000000 |
||||
|
move 345.000000 167.000000 |
||||
|
draw 347.000000 167.000000 |
||||
|
move 280.000000 199.000000 |
||||
|
draw 302.000000 188.000000 |
||||
|
move 280.000000 199.000000 |
||||
|
draw 302.000000 188.000000 |
||||
|
move 302.000000 188.000000 |
||||
|
draw 303.000000 189.000000 |
||||
|
move 302.000000 188.000000 |
||||
|
draw 303.000000 189.000000 |
||||
|
move 215.000000 232.000000 |
||||
|
draw 280.000000 199.000000 |
||||
|
move 215.000000 232.000000 |
||||
|
draw 280.000000 199.000000 |
||||
|
move 280.000000 199.000000 |
||||
|
draw 281.000000 200.000000 |
||||
|
move 280.000000 199.000000 |
||||
|
draw 281.000000 200.000000 |
||||
|
move 173.000000 253.000000 |
||||
|
draw 215.000000 232.000000 |
||||
|
move 173.000000 253.000000 |
||||
|
draw 215.000000 232.000000 |
||||
|
move 215.000000 232.000000 |
||||
|
draw 217.000000 232.000000 |
||||
|
move 215.000000 232.000000 |
||||
|
draw 217.000000 232.000000 |
||||
|
move 152.000000 406.000000 |
||||
|
draw 173.000000 253.000000 |
||||
|
move 152.000000 406.000000 |
||||
|
draw 173.000000 253.000000 |
||||
|
move 173.000000 253.000000 |
||||
|
draw 174.000000 254.000000 |
||||
|
move 173.000000 253.000000 |
||||
|
draw 174.000000 254.000000 |
||||
|
move 130.000000 417.000000 |
||||
|
draw 152.000000 406.000000 |
||||
|
move 130.000000 417.000000 |
||||
|
draw 152.000000 406.000000 |
||||
|
move 152.000000 406.000000 |
||||
|
draw 153.000000 399.000000 |
||||
|
move 152.000000 406.000000 |
||||
|
draw 153.000000 264.000000 |
||||
|
move 130.000000 417.000000 |
||||
|
draw 131.000000 417.000000 |
||||
|
move 130.000000 417.000000 |
||||
|
draw 131.000000 275.000000 |
||||
|
move 638.000000 21.000000 |
||||
|
draw 661.000000 10.000000 |
||||
|
move 661.000000 10.000000 |
||||
|
draw 663.000000 11.000000 |
||||
|
move 615.000000 33.000000 |
||||
|
draw 616.000000 32.000000 |
||||
|
move 615.000000 33.000000 |
||||
|
draw 638.000000 21.000000 |
||||
|
move 638.000000 21.000000 |
||||
|
draw 639.000000 22.000000 |
||||
|
move 570.000000 56.000000 |
||||
|
draw 615.000000 33.000000 |
||||
|
move 615.000000 33.000000 |
||||
|
draw 615.000000 33.000000 |
||||
|
move 615.000000 33.000000 |
||||
|
draw 617.000000 34.000000 |
||||
|
move 615.000000 33.000000 |
||||
|
draw 616.000000 34.000000 |
||||
|
move 502.000000 90.000000 |
||||
|
draw 570.000000 56.000000 |
||||
|
move 502.000000 90.000000 |
||||
|
draw 503.000000 90.000000 |
||||
|
move 570.000000 56.000000 |
||||
|
draw 572.000000 57.000000 |
||||
|
move 479.000000 101.000000 |
||||
|
draw 502.000000 90.000000 |
||||
|
move 479.000000 101.000000 |
||||
|
draw 502.000000 90.000000 |
||||
|
move 502.000000 90.000000 |
||||
|
draw 504.000000 91.000000 |
||||
|
move 502.000000 90.000000 |
||||
|
draw 503.000000 91.000000 |
||||
|
move 435.000000 123.000000 |
||||
|
draw 479.000000 101.000000 |
||||
|
move 435.000000 123.000000 |
||||
|
draw 479.000000 101.000000 |
||||
|
move 479.000000 101.000000 |
||||
|
draw 482.000000 102.000000 |
||||
|
move 479.000000 101.000000 |
||||
|
draw 481.000000 102.000000 |
||||
|
move 391.000000 145.000000 |
||||
|
draw 435.000000 123.000000 |
||||
|
move 391.000000 145.000000 |
||||
|
draw 435.000000 123.000000 |
||||
|
move 435.000000 123.000000 |
||||
|
draw 437.000000 124.000000 |
||||
|
move 435.000000 123.000000 |
||||
|
draw 436.000000 124.000000 |
||||
|
move 347.000000 167.000000 |
||||
|
draw 391.000000 145.000000 |
||||
|
move 347.000000 167.000000 |
||||
|
draw 391.000000 145.000000 |
||||
|
move 391.000000 145.000000 |
||||
|
draw 393.000000 146.000000 |
||||
|
move 391.000000 145.000000 |
||||
|
draw 392.000000 146.000000 |
||||
|
move 303.000000 189.000000 |
||||
|
draw 347.000000 167.000000 |
||||
|
move 303.000000 189.000000 |
||||
|
draw 347.000000 167.000000 |
||||
|
move 347.000000 167.000000 |
||||
|
draw 349.000000 168.000000 |
||||
|
move 347.000000 167.000000 |
||||
|
draw 348.000000 168.000000 |
||||
|
move 281.000000 200.000000 |
||||
|
draw 303.000000 189.000000 |
||||
|
move 281.000000 200.000000 |
||||
|
draw 303.000000 189.000000 |
||||
|
move 303.000000 189.000000 |
||||
|
draw 305.000000 190.000000 |
||||
|
move 303.000000 189.000000 |
||||
|
draw 304.000000 190.000000 |
||||
|
move 217.000000 232.000000 |
||||
|
draw 281.000000 200.000000 |
||||
|
move 217.000000 232.000000 |
||||
|
draw 281.000000 200.000000 |
||||
|
move 281.000000 200.000000 |
||||
|
draw 283.000000 201.000000 |
||||
|
move 281.000000 200.000000 |
||||
|
draw 282.000000 201.000000 |
||||
|
move 174.000000 254.000000 |
||||
|
draw 217.000000 232.000000 |
||||
|
move 174.000000 254.000000 |
||||
|
draw 217.000000 232.000000 |
||||
|
move 217.000000 232.000000 |
||||
|
draw 219.000000 233.000000 |
||||
|
move 217.000000 232.000000 |
||||
|
draw 218.000000 233.000000 |
||||
|
move 173.000000 254.000000 |
||||
|
draw 174.000000 254.000000 |
||||
|
move 153.000000 264.000000 |
||||
|
draw 174.000000 254.000000 |
||||
|
move 174.000000 254.000000 |
||||
|
draw 176.000000 255.000000 |
||||
|
move 174.000000 254.000000 |
||||
|
draw 175.000000 255.000000 |
||||
|
move 131.000000 275.000000 |
||||
|
draw 153.000000 264.000000 |
||||
|
move 153.000000 264.000000 |
||||
|
draw 154.000000 265.000000 |
||||
|
move 131.000000 275.000000 |
||||
|
draw 133.000000 276.000000 |
||||
|
move 663.000000 11.000000 |
||||
|
draw 663.000000 11.000000 |
||||
|
move 665.000000 12.000000 |
||||
|
draw 667.000000 13.000000 |
||||
|
move 663.000000 11.000000 |
||||
|
draw 667.000000 13.000000 |
||||
|
move 617.000000 34.000000 |
||||
|
draw 618.000000 34.000000 |
||||
|
move 572.000000 57.000000 |
||||
|
draw 617.000000 34.000000 |
||||
|
move 617.000000 34.000000 |
||||
|
draw 619.000000 35.000000 |
||||
|
move 504.000000 91.000000 |
||||
|
draw 572.000000 57.000000 |
||||
|
move 572.000000 57.000000 |
||||
|
draw 575.000000 59.000000 |
||||
|
move 482.000000 102.000000 |
||||
|
draw 504.000000 91.000000 |
||||
|
move 504.000000 91.000000 |
||||
|
draw 507.000000 93.000000 |
||||
|
move 437.000000 124.000000 |
||||
|
draw 482.000000 102.000000 |
||||
|
move 482.000000 102.000000 |
||||
|
draw 485.000000 104.000000 |
||||
|
move 393.000000 146.000000 |
||||
|
draw 437.000000 124.000000 |
||||
|
move 437.000000 124.000000 |
||||
|
draw 440.000000 126.000000 |
||||
|
move 349.000000 168.000000 |
||||
|
draw 393.000000 146.000000 |
||||
|
move 393.000000 146.000000 |
||||
|
draw 396.000000 148.000000 |
||||
|
move 305.000000 190.000000 |
||||
|
draw 349.000000 168.000000 |
||||
|
move 349.000000 168.000000 |
||||
|
draw 352.000000 170.000000 |
||||
|
move 283.000000 201.000000 |
||||
|
draw 305.000000 190.000000 |
||||
|
move 305.000000 190.000000 |
||||
|
draw 308.000000 192.000000 |
||||
|
move 219.000000 233.000000 |
||||
|
draw 283.000000 201.000000 |
||||
|
move 283.000000 201.000000 |
||||
|
draw 287.000000 203.000000 |
||||
|
move 176.000000 255.000000 |
||||
|
draw 219.000000 233.000000 |
||||
|
move 219.000000 233.000000 |
||||
|
draw 222.000000 235.000000 |
||||
|
move 173.000000 256.000000 |
||||
|
draw 176.000000 255.000000 |
||||
|
move 176.000000 255.000000 |
||||
|
draw 179.000000 256.000000 |
||||
|
move 665.000000 14.000000 |
||||
|
draw 667.000000 13.000000 |
||||
|
move 667.000000 13.000000 |
||||
|
draw 667.000000 13.000000 |
||||
|
move 667.000000 13.000000 |
||||
|
draw 690.000000 26.000000 |
||||
|
move 667.000000 13.000000 |
||||
|
draw 690.000000 26.000000 |
||||
|
move 665.000000 36.000000 |
||||
|
draw 667.000000 37.000000 |
||||
|
move 575.000000 59.000000 |
||||
|
draw 620.000000 37.000000 |
||||
|
move 507.000000 93.000000 |
||||
|
draw 575.000000 59.000000 |
||||
|
move 575.000000 59.000000 |
||||
|
draw 598.000000 71.000000 |
||||
|
move 485.000000 104.000000 |
||||
|
draw 507.000000 93.000000 |
||||
|
move 507.000000 93.000000 |
||||
|
draw 531.000000 105.000000 |
||||
|
move 440.000000 126.000000 |
||||
|
draw 485.000000 104.000000 |
||||
|
move 485.000000 104.000000 |
||||
|
draw 508.000000 116.000000 |
||||
|
move 396.000000 148.000000 |
||||
|
draw 440.000000 126.000000 |
||||
|
move 440.000000 126.000000 |
||||
|
draw 476.000000 790.000000 |
||||
|
move 352.000000 170.000000 |
||||
|
draw 396.000000 148.000000 |
||||
|
move 396.000000 148.000000 |
||||
|
draw 430.000000 812.000000 |
||||
|
move 308.000000 192.000000 |
||||
|
draw 352.000000 170.000000 |
||||
|
move 352.000000 170.000000 |
||||
|
draw 384.000000 831.000000 |
||||
|
move 287.000000 203.000000 |
||||
|
draw 308.000000 192.000000 |
||||
|
move 308.000000 192.000000 |
||||
|
draw 332.000000 204.000000 |
||||
|
move 222.000000 235.000000 |
||||
|
draw 287.000000 203.000000 |
||||
|
move 287.000000 203.000000 |
||||
|
draw 310.000000 215.000000 |
||||
|
move 179.000000 256.000000 |
||||
|
draw 222.000000 235.000000 |
||||
|
move 222.000000 235.000000 |
||||
|
draw 245.000000 247.000000 |
||||
|
move 173.000000 259.000000 |
||||
|
draw 179.000000 256.000000 |
||||
|
move 179.000000 256.000000 |
||||
|
draw 203.000000 268.000000 |
||||
|
move 171.000000 274.000000 |
||||
|
draw 181.000000 279.000000 |
||||
|
move 667.000000 37.000000 |
||||
|
draw 690.000000 26.000000 |
||||
|
move 690.000000 26.000000 |
||||
|
draw 690.000000 26.000000 |
||||
|
move 690.000000 26.000000 |
||||
|
draw 711.000000 37.000000 |
||||
|
move 690.000000 26.000000 |
||||
|
draw 711.000000 37.000000 |
||||
|
move 665.000000 38.000000 |
||||
|
draw 667.000000 37.000000 |
||||
|
move 667.000000 37.000000 |
||||
|
draw 688.000000 49.000000 |
||||
|
move 598.000000 71.000000 |
||||
|
draw 621.000000 60.000000 |
||||
|
move 665.000000 60.000000 |
||||
|
draw 665.000000 60.000000 |
||||
|
move 531.000000 105.000000 |
||||
|
draw 598.000000 71.000000 |
||||
|
move 598.000000 71.000000 |
||||
|
draw 619.000000 82.000000 |
||||
|
move 508.000000 116.000000 |
||||
|
draw 531.000000 105.000000 |
||||
|
move 531.000000 105.000000 |
||||
|
draw 552.000000 116.000000 |
||||
|
move 476.000000 790.000000 |
||||
|
draw 508.000000 116.000000 |
||||
|
move 508.000000 116.000000 |
||||
|
draw 529.000000 127.000000 |
||||
|
move 430.000000 812.000000 |
||||
|
draw 476.000000 790.000000 |
||||
|
move 476.000000 790.000000 |
||||
|
draw 497.000000 801.000000 |
||||
|
move 384.000000 831.000000 |
||||
|
draw 430.000000 812.000000 |
||||
|
move 430.000000 812.000000 |
||||
|
draw 451.000000 822.000000 |
||||
|
move 332.000000 204.000000 |
||||
|
draw 384.000000 831.000000 |
||||
|
move 384.000000 831.000000 |
||||
|
draw 406.000000 841.000000 |
||||
|
move 310.000000 215.000000 |
||||
|
draw 332.000000 204.000000 |
||||
|
move 332.000000 204.000000 |
||||
|
draw 333.000000 205.000000 |
||||
|
move 245.000000 247.000000 |
||||
|
draw 310.000000 215.000000 |
||||
|
move 310.000000 215.000000 |
||||
|
draw 331.000000 225.000000 |
||||
|
move 203.000000 268.000000 |
||||
|
draw 245.000000 247.000000 |
||||
|
move 245.000000 247.000000 |
||||
|
draw 266.000000 257.000000 |
||||
|
move 181.000000 279.000000 |
||||
|
draw 203.000000 268.000000 |
||||
|
move 203.000000 268.000000 |
||||
|
draw 224.000000 279.000000 |
||||
|
move 169.000000 285.000000 |
||||
|
draw 181.000000 279.000000 |
||||
|
move 181.000000 279.000000 |
||||
|
draw 202.000000 289.000000 |
||||
|
move 168.000000 293.000000 |
||||
|
draw 181.000000 300.000000 |
||||
|
move 688.000000 49.000000 |
||||
|
draw 711.000000 37.000000 |
||||
|
move 711.000000 37.000000 |
||||
|
draw 711.000000 37.000000 |
||||
|
move 711.000000 37.000000 |
||||
|
draw 732.000000 49.000000 |
||||
|
move 711.000000 37.000000 |
||||
|
draw 732.000000 49.000000 |
||||
|
move 665.000000 60.000000 |
||||
|
draw 688.000000 49.000000 |
||||
|
move 688.000000 49.000000 |
||||
|
draw 709.000000 60.000000 |
||||
|
move 619.000000 82.000000 |
||||
|
draw 665.000000 60.000000 |
||||
|
move 665.000000 60.000000 |
||||
|
draw 686.000000 71.000000 |
||||
|
move 552.000000 116.000000 |
||||
|
draw 619.000000 82.000000 |
||||
|
move 619.000000 82.000000 |
||||
|
draw 640.000000 94.000000 |
||||
|
move 529.000000 127.000000 |
||||
|
draw 552.000000 116.000000 |
||||
|
move 552.000000 116.000000 |
||||
|
draw 587.000000 732.000000 |
||||
|
move 497.000000 801.000000 |
||||
|
draw 529.000000 127.000000 |
||||
|
move 529.000000 127.000000 |
||||
|
draw 565.000000 787.000000 |
||||
|
move 451.000000 822.000000 |
||||
|
draw 497.000000 801.000000 |
||||
|
move 497.000000 801.000000 |
||||
|
draw 519.000000 812.000000 |
||||
|
move 406.000000 841.000000 |
||||
|
draw 451.000000 822.000000 |
||||
|
move 451.000000 822.000000 |
||||
|
draw 473.000000 832.000000 |
||||
|
move 406.000000 841.000000 |
||||
|
draw 406.000000 841.000000 |
||||
|
move 406.000000 841.000000 |
||||
|
draw 428.000000 852.000000 |
||||
|
move 331.000000 225.000000 |
||||
|
draw 334.000000 224.000000 |
||||
|
move 377.000000 747.000000 |
||||
|
draw 382.000000 868.000000 |
||||
|
move 266.000000 257.000000 |
||||
|
draw 331.000000 225.000000 |
||||
|
move 331.000000 225.000000 |
||||
|
draw 359.000000 833.000000 |
||||
|
move 224.000000 279.000000 |
||||
|
draw 266.000000 257.000000 |
||||
|
move 266.000000 257.000000 |
||||
|
draw 287.000000 268.000000 |
||||
|
move 202.000000 289.000000 |
||||
|
draw 224.000000 279.000000 |
||||
|
move 224.000000 279.000000 |
||||
|
draw 245.000000 289.000000 |
||||
|
move 181.000000 300.000000 |
||||
|
draw 202.000000 289.000000 |
||||
|
move 202.000000 289.000000 |
||||
|
draw 223.000000 300.000000 |
||||
|
move 181.000000 300.000000 |
||||
|
draw 202.000000 310.000000 |
||||
|
move 709.000000 60.000000 |
||||
|
draw 732.000000 49.000000 |
||||
|
move 732.000000 49.000000 |
||||
|
draw 732.000000 49.000000 |
||||
|
move 732.000000 49.000000 |
||||
|
draw 818.000000 739.000000 |
||||
|
move 732.000000 49.000000 |
||||
|
draw 818.000000 739.000000 |
||||
|
move 686.000000 71.000000 |
||||
|
draw 709.000000 60.000000 |
||||
|
move 709.000000 60.000000 |
||||
|
draw 794.000000 750.000000 |
||||
|
move 640.000000 94.000000 |
||||
|
draw 686.000000 71.000000 |
||||
|
move 686.000000 71.000000 |
||||
|
draw 770.000000 760.000000 |
||||
|
move 587.000000 732.000000 |
||||
|
draw 640.000000 94.000000 |
||||
|
move 640.000000 94.000000 |
||||
|
draw 723.000000 781.000000 |
||||
|
move 565.000000 787.000000 |
||||
|
draw 587.000000 732.000000 |
||||
|
move 587.000000 732.000000 |
||||
|
draw 653.000000 812.000000 |
||||
|
move 519.000000 812.000000 |
||||
|
draw 565.000000 787.000000 |
||||
|
move 565.000000 787.000000 |
||||
|
draw 630.000000 822.000000 |
||||
|
move 473.000000 832.000000 |
||||
|
draw 519.000000 812.000000 |
||||
|
move 519.000000 812.000000 |
||||
|
draw 583.000000 843.000000 |
||||
|
move 428.000000 852.000000 |
||||
|
draw 473.000000 832.000000 |
||||
|
move 473.000000 832.000000 |
||||
|
draw 538.000000 863.000000 |
||||
|
move 382.000000 868.000000 |
||||
|
draw 428.000000 852.000000 |
||||
|
move 428.000000 852.000000 |
||||
|
draw 492.000000 882.000000 |
||||
|
move 359.000000 833.000000 |
||||
|
draw 382.000000 868.000000 |
||||
|
move 382.000000 868.000000 |
||||
|
draw 447.000000 902.000000 |
||||
|
move 287.000000 268.000000 |
||||
|
draw 359.000000 833.000000 |
||||
|
move 359.000000 833.000000 |
||||
|
draw 424.000000 912.000000 |
||||
|
move 245.000000 289.000000 |
||||
|
draw 287.000000 268.000000 |
||||
|
move 287.000000 268.000000 |
||||
|
draw 357.000000 941.000000 |
||||
|
move 223.000000 300.000000 |
||||
|
draw 245.000000 289.000000 |
||||
|
move 245.000000 289.000000 |
||||
|
draw 313.000000 960.000000 |
||||
|
move 202.000000 310.000000 |
||||
|
draw 223.000000 300.000000 |
||||
|
move 223.000000 300.000000 |
||||
|
draw 291.000000 970.000000 |
||||
|
move 202.000000 310.000000 |
||||
|
draw 269.000000 979.000000 |
||||
|
move 794.000000 750.000000 |
||||
|
draw 818.000000 739.000000 |
||||
|
move 818.000000 739.000000 |
||||
|
draw 818.000000 739.000000 |
||||
|
move 818.000000 739.000000 |
||||
|
draw 850.000000 756.000000 |
||||
|
move 818.000000 739.000000 |
||||
|
draw 850.000000 756.000000 |
||||
|
move 770.000000 760.000000 |
||||
|
draw 794.000000 750.000000 |
||||
|
move 794.000000 750.000000 |
||||
|
draw 826.000000 766.000000 |
||||
|
move 723.000000 781.000000 |
||||
|
draw 770.000000 760.000000 |
||||
|
move 770.000000 760.000000 |
||||
|
draw 802.000000 776.000000 |
||||
|
move 653.000000 812.000000 |
||||
|
draw 723.000000 781.000000 |
||||
|
move 723.000000 781.000000 |
||||
|
draw 755.000000 797.000000 |
||||
|
move 630.000000 822.000000 |
||||
|
draw 653.000000 812.000000 |
||||
|
move 653.000000 812.000000 |
||||
|
draw 685.000000 827.000000 |
||||
|
move 583.000000 843.000000 |
||||
|
draw 630.000000 822.000000 |
||||
|
move 630.000000 822.000000 |
||||
|
draw 662.000000 837.000000 |
||||
|
move 538.000000 863.000000 |
||||
|
draw 583.000000 843.000000 |
||||
|
move 583.000000 843.000000 |
||||
|
draw 615.000000 858.000000 |
||||
|
move 492.000000 882.000000 |
||||
|
draw 538.000000 863.000000 |
||||
|
move 538.000000 863.000000 |
||||
|
draw 570.000000 878.000000 |
||||
|
move 447.000000 902.000000 |
||||
|
draw 492.000000 882.000000 |
||||
|
move 492.000000 882.000000 |
||||
|
draw 524.000000 897.000000 |
||||
|
move 424.000000 912.000000 |
||||
|
draw 447.000000 902.000000 |
||||
|
move 447.000000 902.000000 |
||||
|
draw 479.000000 917.000000 |
||||
|
move 357.000000 941.000000 |
||||
|
draw 424.000000 912.000000 |
||||
|
move 424.000000 912.000000 |
||||
|
draw 456.000000 927.000000 |
||||
|
move 313.000000 960.000000 |
||||
|
draw 357.000000 941.000000 |
||||
|
move 357.000000 941.000000 |
||||
|
draw 389.000000 956.000000 |
||||
|
move 291.000000 970.000000 |
||||
|
draw 313.000000 960.000000 |
||||
|
move 313.000000 960.000000 |
||||
|
draw 345.000000 975.000000 |
||||
|
move 269.000000 979.000000 |
||||
|
draw 291.000000 970.000000 |
||||
|
move 291.000000 970.000000 |
||||
|
draw 323.000000 985.000000 |
||||
|
move 269.000000 979.000000 |
||||
|
draw 301.000000 994.000000 |
||||
|
move 826.000000 766.000000 |
||||
|
draw 850.000000 756.000000 |
||||
|
move 850.000000 756.000000 |
||||
|
draw 850.000000 756.000000 |
||||
|
move 850.000000 756.000000 |
||||
|
draw 894.000000 777.000000 |
||||
|
move 850.000000 756.000000 |
||||
|
draw 894.000000 777.000000 |
||||
|
move 802.000000 776.000000 |
||||
|
draw 826.000000 766.000000 |
||||
|
move 826.000000 766.000000 |
||||
|
draw 870.000000 787.000000 |
||||
|
move 755.000000 797.000000 |
||||
|
draw 802.000000 776.000000 |
||||
|
move 802.000000 776.000000 |
||||
|
draw 846.000000 798.000000 |
||||
|
move 685.000000 827.000000 |
||||
|
draw 755.000000 797.000000 |
||||
|
move 755.000000 797.000000 |
||||
|
draw 799.000000 818.000000 |
||||
|
move 662.000000 837.000000 |
||||
|
draw 685.000000 827.000000 |
||||
|
move 685.000000 827.000000 |
||||
|
draw 729.000000 848.000000 |
||||
|
move 615.000000 858.000000 |
||||
|
draw 662.000000 837.000000 |
||||
|
move 662.000000 837.000000 |
||||
|
draw 706.000000 858.000000 |
||||
|
move 570.000000 878.000000 |
||||
|
draw 615.000000 858.000000 |
||||
|
move 615.000000 858.000000 |
||||
|
draw 659.000000 878.000000 |
||||
|
move 524.000000 897.000000 |
||||
|
draw 570.000000 878.000000 |
||||
|
move 570.000000 878.000000 |
||||
|
draw 614.000000 898.000000 |
||||
|
move 479.000000 917.000000 |
||||
|
draw 524.000000 897.000000 |
||||
|
move 524.000000 897.000000 |
||||
|
draw 568.000000 918.000000 |
||||
|
move 456.000000 927.000000 |
||||
|
draw 479.000000 917.000000 |
||||
|
move 479.000000 917.000000 |
||||
|
draw 523.000000 937.000000 |
||||
|
move 389.000000 956.000000 |
||||
|
draw 456.000000 927.000000 |
||||
|
move 456.000000 927.000000 |
||||
|
draw 500.000000 947.000000 |
||||
|
move 345.000000 975.000000 |
||||
|
draw 389.000000 956.000000 |
||||
|
move 389.000000 956.000000 |
||||
|
draw 433.000000 976.000000 |
||||
|
move 323.000000 985.000000 |
||||
|
draw 345.000000 975.000000 |
||||
|
move 345.000000 975.000000 |
||||
|
draw 389.000000 995.000000 |
||||
|
move 301.000000 994.000000 |
||||
|
draw 323.000000 985.000000 |
||||
|
move 323.000000 985.000000 |
||||
|
draw 367.000000 1005.000000 |
||||
|
move 301.000000 994.000000 |
||||
|
draw 345.000000 1014.000000 |
||||
|
move 870.000000 787.000000 |
||||
|
draw 894.000000 777.000000 |
||||
|
move 894.000000 777.000000 |
||||
|
draw 894.000000 777.000000 |
||||
|
move 846.000000 798.000000 |
||||
|
draw 870.000000 787.000000 |
||||
|
move 799.000000 818.000000 |
||||
|
draw 846.000000 798.000000 |
||||
|
move 729.000000 848.000000 |
||||
|
draw 799.000000 818.000000 |
||||
|
move 706.000000 858.000000 |
||||
|
draw 729.000000 848.000000 |
||||
|
move 659.000000 878.000000 |
||||
|
draw 706.000000 858.000000 |
||||
|
move 614.000000 898.000000 |
||||
|
draw 659.000000 878.000000 |
||||
|
move 568.000000 918.000000 |
||||
|
draw 614.000000 898.000000 |
||||
|
move 523.000000 937.000000 |
||||
|
draw 568.000000 918.000000 |
||||
|
move 500.000000 947.000000 |
||||
|
draw 523.000000 937.000000 |
||||
|
move 433.000000 976.000000 |
||||
|
draw 500.000000 947.000000 |
||||
|
move 389.000000 995.000000 |
||||
|
draw 433.000000 976.000000 |
||||
|
move 367.000000 1005.000000 |
||||
|
draw 389.000000 995.000000 |
||||
|
move 345.000000 1014.000000 |
||||
|
draw 367.000000 1005.000000 |
||||
@ -0,0 +1,725 @@ |
|||||
|
Device: Postscript |
||||
|
Disposition: To File |
||||
|
FileOrDev: /usr/tmp/hpgl.out |
||||
|
TitleText: Sample Xgraph Data |
||||
|
"Alpha |
||||
|
-5 29 |
||||
|
-4.9 27.91 |
||||
|
-4.8 26.84 |
||||
|
-4.7 25.79 |
||||
|
-4.6 24.76 |
||||
|
-4.5 23.75 |
||||
|
-4.4 22.76 |
||||
|
-4.3 21.79 |
||||
|
-4.2 20.84 |
||||
|
-4.1 19.91 |
||||
|
-4 19 |
||||
|
-3.9 18.11 |
||||
|
-3.8 17.24 |
||||
|
-3.7 16.39 |
||||
|
-3.6 15.56 |
||||
|
-3.5 14.75 |
||||
|
-3.4 13.96 |
||||
|
-3.3 13.19 |
||||
|
-3.2 12.44 |
||||
|
-3.1 11.71 |
||||
|
-3 11 |
||||
|
-2.9 10.31 |
||||
|
-2.8 9.64 |
||||
|
-2.7 8.99 |
||||
|
-2.6 8.36 |
||||
|
-2.5 7.75 |
||||
|
-2.4 7.16 |
||||
|
-2.3 6.59 |
||||
|
-2.2 6.04 |
||||
|
-2.1 5.51 |
||||
|
-2 5 |
||||
|
-1.9 4.51 |
||||
|
-1.8 4.04 |
||||
|
-1.7 3.59 |
||||
|
-1.6 3.16 |
||||
|
-1.5 2.75 |
||||
|
-1.4 2.36 |
||||
|
-1.3 1.99 |
||||
|
-1.2 1.64 |
||||
|
-1.1 1.31 |
||||
|
-1 1 |
||||
|
-0.9 0.71 |
||||
|
-0.8 0.44 |
||||
|
-0.7 0.19 |
||||
|
-0.6 -0.04 |
||||
|
-0.5 -0.25 |
||||
|
-0.4 -0.44 |
||||
|
-0.3 -0.61 |
||||
|
-0.2 -0.76 |
||||
|
-0.1 -0.89 |
||||
|
-1.02696E-15 -1 |
||||
|
0.1 -1.09 |
||||
|
0.2 -1.16 |
||||
|
0.3 -1.21 |
||||
|
0.4 -1.24 |
||||
|
0.5 -1.25 |
||||
|
0.6 -1.24 |
||||
|
0.7 -1.21 |
||||
|
0.8 -1.16 |
||||
|
0.9 -1.09 |
||||
|
1 -1 |
||||
|
1.1 -0.89 |
||||
|
1.2 -0.76 |
||||
|
1.3 -0.61 |
||||
|
1.4 -0.44 |
||||
|
1.5 -0.25 |
||||
|
1.6 -0.04 |
||||
|
1.7 0.19 |
||||
|
1.8 0.44 |
||||
|
1.9 0.71 |
||||
|
2 1 |
||||
|
2.1 1.31 |
||||
|
2.2 1.64 |
||||
|
2.3 1.99 |
||||
|
2.4 2.36 |
||||
|
2.5 2.75 |
||||
|
2.6 3.16 |
||||
|
2.7 3.59 |
||||
|
2.8 4.04 |
||||
|
2.9 4.51 |
||||
|
3 5 |
||||
|
3.1 5.51 |
||||
|
3.2 6.04 |
||||
|
3.3 6.59 |
||||
|
3.4 7.16 |
||||
|
3.5 7.75 |
||||
|
3.6 8.36 |
||||
|
3.7 8.99 |
||||
|
3.8 9.64 |
||||
|
3.9 10.31 |
||||
|
4 11 |
||||
|
4.1 11.71 |
||||
|
4.2 12.44 |
||||
|
4.3 13.19 |
||||
|
4.4 13.96 |
||||
|
4.5 14.75 |
||||
|
4.6 15.56 |
||||
|
4.7 16.39 |
||||
|
4.8 17.24 |
||||
|
4.9 18.11 |
||||
|
5 19 |
||||
|
|
||||
|
"Beta |
||||
|
-5 33 |
||||
|
-4.9 31.81 |
||||
|
-4.8 30.64 |
||||
|
-4.7 29.49 |
||||
|
-4.6 28.36 |
||||
|
-4.5 27.25 |
||||
|
-4.4 26.16 |
||||
|
-4.3 25.09 |
||||
|
-4.2 24.04 |
||||
|
-4.1 23.01 |
||||
|
-4 22 |
||||
|
-3.9 21.01 |
||||
|
-3.8 20.04 |
||||
|
-3.7 19.09 |
||||
|
-3.6 18.16 |
||||
|
-3.5 17.25 |
||||
|
-3.4 16.36 |
||||
|
-3.3 15.49 |
||||
|
-3.2 14.64 |
||||
|
-3.1 13.81 |
||||
|
-3 13 |
||||
|
-2.9 12.21 |
||||
|
-2.8 11.44 |
||||
|
-2.7 10.69 |
||||
|
-2.6 9.96 |
||||
|
-2.5 9.25 |
||||
|
-2.4 8.56 |
||||
|
-2.3 7.89 |
||||
|
-2.2 7.24 |
||||
|
-2.1 6.61 |
||||
|
-2 6 |
||||
|
-1.9 5.41 |
||||
|
-1.8 4.84 |
||||
|
-1.7 4.29 |
||||
|
-1.6 3.76 |
||||
|
-1.5 3.25 |
||||
|
-1.4 2.76 |
||||
|
-1.3 2.29 |
||||
|
-1.2 1.84 |
||||
|
-1.1 1.41 |
||||
|
-1 1 |
||||
|
-0.9 0.61 |
||||
|
-0.8 0.24 |
||||
|
-0.7 -0.11 |
||||
|
-0.6 -0.44 |
||||
|
-0.5 -0.75 |
||||
|
-0.4 -1.04 |
||||
|
-0.3 -1.31 |
||||
|
-0.2 -1.56 |
||||
|
-0.1 -1.79 |
||||
|
-1.02696E-15 -2 |
||||
|
0.1 -2.19 |
||||
|
0.2 -2.36 |
||||
|
0.3 -2.51 |
||||
|
0.4 -2.64 |
||||
|
0.5 -2.75 |
||||
|
0.6 -2.84 |
||||
|
0.7 -2.91 |
||||
|
0.8 -2.96 |
||||
|
0.9 -2.99 |
||||
|
1 -3 |
||||
|
1.1 -2.99 |
||||
|
1.2 -2.96 |
||||
|
1.3 -2.91 |
||||
|
1.4 -2.84 |
||||
|
1.5 -2.75 |
||||
|
1.6 -2.64 |
||||
|
1.7 -2.51 |
||||
|
1.8 -2.36 |
||||
|
1.9 -2.19 |
||||
|
2 -2 |
||||
|
2.1 -1.79 |
||||
|
2.2 -1.56 |
||||
|
2.3 -1.31 |
||||
|
2.4 -1.04 |
||||
|
2.5 -0.75 |
||||
|
2.6 -0.44 |
||||
|
2.7 -0.11 |
||||
|
2.8 0.24 |
||||
|
2.9 0.61 |
||||
|
3 1 |
||||
|
3.1 1.41 |
||||
|
3.2 1.84 |
||||
|
3.3 2.29 |
||||
|
3.4 2.76 |
||||
|
3.5 3.25 |
||||
|
3.6 3.76 |
||||
|
3.7 4.29 |
||||
|
3.8 4.84 |
||||
|
3.9 5.41 |
||||
|
4 6 |
||||
|
4.1 6.61 |
||||
|
4.2 7.24 |
||||
|
4.3 7.89 |
||||
|
4.4 8.56 |
||||
|
4.5 9.25 |
||||
|
4.6 9.96 |
||||
|
4.7 10.69 |
||||
|
4.8 11.44 |
||||
|
4.9 12.21 |
||||
|
5 13 |
||||
|
|
||||
|
"Gamma |
||||
|
-5 37 |
||||
|
-4.9 35.71 |
||||
|
-4.8 34.44 |
||||
|
-4.7 33.19 |
||||
|
-4.6 31.96 |
||||
|
-4.5 30.75 |
||||
|
-4.4 29.56 |
||||
|
-4.3 28.39 |
||||
|
-4.2 27.24 |
||||
|
-4.1 26.11 |
||||
|
-4 25 |
||||
|
-3.9 23.91 |
||||
|
-3.8 22.84 |
||||
|
-3.7 21.79 |
||||
|
-3.6 20.76 |
||||
|
-3.5 19.75 |
||||
|
-3.4 18.76 |
||||
|
-3.3 17.79 |
||||
|
-3.2 16.84 |
||||
|
-3.1 15.91 |
||||
|
-3 15 |
||||
|
-2.9 14.11 |
||||
|
-2.8 13.24 |
||||
|
-2.7 12.39 |
||||
|
-2.6 11.56 |
||||
|
-2.5 10.75 |
||||
|
-2.4 9.96 |
||||
|
-2.3 9.19 |
||||
|
-2.2 8.44 |
||||
|
-2.1 7.71 |
||||
|
-2 7 |
||||
|
-1.9 6.31 |
||||
|
-1.8 5.64 |
||||
|
-1.7 4.99 |
||||
|
-1.6 4.36 |
||||
|
-1.5 3.75 |
||||
|
-1.4 3.16 |
||||
|
-1.3 2.59 |
||||
|
-1.2 2.04 |
||||
|
-1.1 1.51 |
||||
|
-1 1 |
||||
|
-0.9 0.51 |
||||
|
-0.8 0.04 |
||||
|
-0.7 -0.41 |
||||
|
-0.6 -0.84 |
||||
|
-0.5 -1.25 |
||||
|
-0.4 -1.64 |
||||
|
-0.3 -2.01 |
||||
|
-0.2 -2.36 |
||||
|
-0.1 -2.69 |
||||
|
-1.02696E-15 -3 |
||||
|
0.1 -3.29 |
||||
|
0.2 -3.56 |
||||
|
0.3 -3.81 |
||||
|
0.4 -4.04 |
||||
|
0.5 -4.25 |
||||
|
0.6 -4.44 |
||||
|
0.7 -4.61 |
||||
|
0.8 -4.76 |
||||
|
0.9 -4.89 |
||||
|
1 -5 |
||||
|
1.1 -5.09 |
||||
|
1.2 -5.16 |
||||
|
1.3 -5.21 |
||||
|
1.4 -5.24 |
||||
|
1.5 -5.25 |
||||
|
1.6 -5.24 |
||||
|
1.7 -5.21 |
||||
|
1.8 -5.16 |
||||
|
1.9 -5.09 |
||||
|
2 -5 |
||||
|
2.1 -4.89 |
||||
|
2.2 -4.76 |
||||
|
2.3 -4.61 |
||||
|
2.4 -4.44 |
||||
|
2.5 -4.25 |
||||
|
2.6 -4.04 |
||||
|
2.7 -3.81 |
||||
|
2.8 -3.56 |
||||
|
2.9 -3.29 |
||||
|
3 -3 |
||||
|
3.1 -2.69 |
||||
|
3.2 -2.36 |
||||
|
3.3 -2.01 |
||||
|
3.4 -1.64 |
||||
|
3.5 -1.25 |
||||
|
3.6 -0.84 |
||||
|
3.7 -0.41 |
||||
|
3.8 0.04 |
||||
|
3.9 0.51 |
||||
|
4 1 |
||||
|
4.1 1.51 |
||||
|
4.2 2.04 |
||||
|
4.3 2.59 |
||||
|
4.4 3.16 |
||||
|
4.5 3.75 |
||||
|
4.6 4.36 |
||||
|
4.7 4.99 |
||||
|
4.8 5.64 |
||||
|
4.9 6.31 |
||||
|
5 7 |
||||
|
|
||||
|
"Delta |
||||
|
-5 41 |
||||
|
-4.9 39.61 |
||||
|
-4.8 38.24 |
||||
|
-4.7 36.89 |
||||
|
-4.6 35.56 |
||||
|
-4.5 34.25 |
||||
|
-4.4 32.96 |
||||
|
-4.3 31.69 |
||||
|
-4.2 30.44 |
||||
|
-4.1 29.21 |
||||
|
-4 28 |
||||
|
-3.9 26.81 |
||||
|
-3.8 25.64 |
||||
|
-3.7 24.49 |
||||
|
-3.6 23.36 |
||||
|
-3.5 22.25 |
||||
|
-3.4 21.16 |
||||
|
-3.3 20.09 |
||||
|
-3.2 19.04 |
||||
|
-3.1 18.01 |
||||
|
-3 17 |
||||
|
-2.9 16.01 |
||||
|
-2.8 15.04 |
||||
|
-2.7 14.09 |
||||
|
-2.6 13.16 |
||||
|
-2.5 12.25 |
||||
|
-2.4 11.36 |
||||
|
-2.3 10.49 |
||||
|
-2.2 9.64 |
||||
|
-2.1 8.81 |
||||
|
-2 8 |
||||
|
-1.9 7.21 |
||||
|
-1.8 6.44 |
||||
|
-1.7 5.69 |
||||
|
-1.6 4.96 |
||||
|
-1.5 4.25 |
||||
|
-1.4 3.56 |
||||
|
-1.3 2.89 |
||||
|
-1.2 2.24 |
||||
|
-1.1 1.61 |
||||
|
-1 1 |
||||
|
-0.9 0.41 |
||||
|
-0.8 -0.16 |
||||
|
-0.7 -0.71 |
||||
|
-0.6 -1.24 |
||||
|
-0.5 -1.75 |
||||
|
-0.4 -2.24 |
||||
|
-0.3 -2.71 |
||||
|
-0.2 -3.16 |
||||
|
-0.1 -3.59 |
||||
|
-1.02696E-15 -4 |
||||
|
0.1 -4.39 |
||||
|
0.2 -4.76 |
||||
|
0.3 -5.11 |
||||
|
0.4 -5.44 |
||||
|
0.5 -5.75 |
||||
|
0.6 -6.04 |
||||
|
0.7 -6.31 |
||||
|
0.8 -6.56 |
||||
|
0.9 -6.79 |
||||
|
1 -7 |
||||
|
1.1 -7.19 |
||||
|
1.2 -7.36 |
||||
|
1.3 -7.51 |
||||
|
1.4 -7.64 |
||||
|
1.5 -7.75 |
||||
|
1.6 -7.84 |
||||
|
1.7 -7.91 |
||||
|
1.8 -7.96 |
||||
|
1.9 -7.99 |
||||
|
2 -8 |
||||
|
2.1 -7.99 |
||||
|
2.2 -7.96 |
||||
|
2.3 -7.91 |
||||
|
2.4 -7.84 |
||||
|
2.5 -7.75 |
||||
|
2.6 -7.64 |
||||
|
2.7 -7.51 |
||||
|
2.8 -7.36 |
||||
|
2.9 -7.19 |
||||
|
3 -7 |
||||
|
3.1 -6.79 |
||||
|
3.2 -6.56 |
||||
|
3.3 -6.31 |
||||
|
3.4 -6.04 |
||||
|
3.5 -5.75 |
||||
|
3.6 -5.44 |
||||
|
3.7 -5.11 |
||||
|
3.8 -4.76 |
||||
|
3.9 -4.39 |
||||
|
4 -4 |
||||
|
4.1 -3.59 |
||||
|
4.2 -3.16 |
||||
|
4.3 -2.71 |
||||
|
4.4 -2.24 |
||||
|
4.5 -1.75 |
||||
|
4.6 -1.24 |
||||
|
4.7 -0.71 |
||||
|
4.8 -0.16 |
||||
|
4.9 0.41 |
||||
|
5 1 |
||||
|
|
||||
|
"Epsilon |
||||
|
-5 45 |
||||
|
-4.9 43.51 |
||||
|
-4.8 42.04 |
||||
|
-4.7 40.59 |
||||
|
-4.6 39.16 |
||||
|
-4.5 37.75 |
||||
|
-4.4 36.36 |
||||
|
-4.3 34.99 |
||||
|
-4.2 33.64 |
||||
|
-4.1 32.31 |
||||
|
-4 31 |
||||
|
-3.9 29.71 |
||||
|
-3.8 28.44 |
||||
|
-3.7 27.19 |
||||
|
-3.6 25.96 |
||||
|
-3.5 24.75 |
||||
|
-3.4 23.56 |
||||
|
-3.3 22.39 |
||||
|
-3.2 21.24 |
||||
|
-3.1 20.11 |
||||
|
-3 19 |
||||
|
-2.9 17.91 |
||||
|
-2.8 16.84 |
||||
|
-2.7 15.79 |
||||
|
-2.6 14.76 |
||||
|
-2.5 13.75 |
||||
|
-2.4 12.76 |
||||
|
-2.3 11.79 |
||||
|
-2.2 10.84 |
||||
|
-2.1 9.91 |
||||
|
-2 9 |
||||
|
-1.9 8.11 |
||||
|
-1.8 7.24 |
||||
|
-1.7 6.39 |
||||
|
-1.6 5.56 |
||||
|
-1.5 4.75 |
||||
|
-1.4 3.96 |
||||
|
-1.3 3.19 |
||||
|
-1.2 2.44 |
||||
|
-1.1 1.71 |
||||
|
-1 1 |
||||
|
-0.9 0.31 |
||||
|
-0.8 -0.36 |
||||
|
-0.7 -1.01 |
||||
|
-0.6 -1.64 |
||||
|
-0.5 -2.25 |
||||
|
-0.4 -2.84 |
||||
|
-0.3 -3.41 |
||||
|
-0.2 -3.96 |
||||
|
-0.1 -4.49 |
||||
|
-1.02696E-15 -5 |
||||
|
0.1 -5.49 |
||||
|
0.2 -5.96 |
||||
|
0.3 -6.41 |
||||
|
0.4 -6.84 |
||||
|
0.5 -7.25 |
||||
|
0.6 -7.64 |
||||
|
0.7 -8.01 |
||||
|
0.8 -8.36 |
||||
|
0.9 -8.69 |
||||
|
1 -9 |
||||
|
1.1 -9.29 |
||||
|
1.2 -9.56 |
||||
|
1.3 -9.81 |
||||
|
1.4 -10.04 |
||||
|
1.5 -10.25 |
||||
|
1.6 -10.44 |
||||
|
1.7 -10.61 |
||||
|
1.8 -10.76 |
||||
|
1.9 -10.89 |
||||
|
2 -11 |
||||
|
2.1 -11.09 |
||||
|
2.2 -11.16 |
||||
|
2.3 -11.21 |
||||
|
2.4 -11.24 |
||||
|
2.5 -11.25 |
||||
|
2.6 -11.24 |
||||
|
2.7 -11.21 |
||||
|
2.8 -11.16 |
||||
|
2.9 -11.09 |
||||
|
3 -11 |
||||
|
3.1 -10.89 |
||||
|
3.2 -10.76 |
||||
|
3.3 -10.61 |
||||
|
3.4 -10.44 |
||||
|
3.5 -10.25 |
||||
|
3.6 -10.04 |
||||
|
3.7 -9.81 |
||||
|
3.8 -9.56 |
||||
|
3.9 -9.29 |
||||
|
4 -9 |
||||
|
4.1 -8.69 |
||||
|
4.2 -8.36 |
||||
|
4.3 -8.01 |
||||
|
4.4 -7.64 |
||||
|
4.5 -7.25 |
||||
|
4.6 -6.84 |
||||
|
4.7 -6.41 |
||||
|
4.8 -5.96 |
||||
|
4.9 -5.49 |
||||
|
5 -5 |
||||
|
|
||||
|
"Zeta |
||||
|
-5 49 |
||||
|
-4.9 47.41 |
||||
|
-4.8 45.84 |
||||
|
-4.7 44.29 |
||||
|
-4.6 42.76 |
||||
|
-4.5 41.25 |
||||
|
-4.4 39.76 |
||||
|
-4.3 38.29 |
||||
|
-4.2 36.84 |
||||
|
-4.1 35.41 |
||||
|
-4 34 |
||||
|
-3.9 32.61 |
||||
|
-3.8 31.24 |
||||
|
-3.7 29.89 |
||||
|
-3.6 28.56 |
||||
|
-3.5 27.25 |
||||
|
-3.4 25.96 |
||||
|
-3.3 24.69 |
||||
|
-3.2 23.44 |
||||
|
-3.1 22.21 |
||||
|
-3 21 |
||||
|
-2.9 19.81 |
||||
|
-2.8 18.64 |
||||
|
-2.7 17.49 |
||||
|
-2.6 16.36 |
||||
|
-2.5 15.25 |
||||
|
-2.4 14.16 |
||||
|
-2.3 13.09 |
||||
|
-2.2 12.04 |
||||
|
-2.1 11.01 |
||||
|
-2 10 |
||||
|
-1.9 9.01 |
||||
|
-1.8 8.04 |
||||
|
-1.7 7.09 |
||||
|
-1.6 6.16 |
||||
|
-1.5 5.25 |
||||
|
-1.4 4.36 |
||||
|
-1.3 3.49 |
||||
|
-1.2 2.64 |
||||
|
-1.1 1.81 |
||||
|
-1 1 |
||||
|
-0.9 0.21 |
||||
|
-0.8 -0.56 |
||||
|
-0.7 -1.31 |
||||
|
-0.6 -2.04 |
||||
|
-0.5 -2.75 |
||||
|
-0.4 -3.44 |
||||
|
-0.3 -4.11 |
||||
|
-0.2 -4.76 |
||||
|
-0.1 -5.39 |
||||
|
-1.02696E-15 -6 |
||||
|
0.1 -6.59 |
||||
|
0.2 -7.16 |
||||
|
0.3 -7.71 |
||||
|
0.4 -8.24 |
||||
|
0.5 -8.75 |
||||
|
0.6 -9.24 |
||||
|
0.7 -9.71 |
||||
|
0.8 -10.16 |
||||
|
0.9 -10.59 |
||||
|
1 -11 |
||||
|
1.1 -11.39 |
||||
|
1.2 -11.76 |
||||
|
1.3 -12.11 |
||||
|
1.4 -12.44 |
||||
|
1.5 -12.75 |
||||
|
1.6 -13.04 |
||||
|
1.7 -13.31 |
||||
|
1.8 -13.56 |
||||
|
1.9 -13.79 |
||||
|
2 -14 |
||||
|
2.1 -14.19 |
||||
|
2.2 -14.36 |
||||
|
2.3 -14.51 |
||||
|
2.4 -14.64 |
||||
|
2.5 -14.75 |
||||
|
2.6 -14.84 |
||||
|
2.7 -14.91 |
||||
|
2.8 -14.96 |
||||
|
2.9 -14.99 |
||||
|
3 -15 |
||||
|
3.1 -14.99 |
||||
|
3.2 -14.96 |
||||
|
3.3 -14.91 |
||||
|
3.4 -14.84 |
||||
|
3.5 -14.75 |
||||
|
3.6 -14.64 |
||||
|
3.7 -14.51 |
||||
|
3.8 -14.36 |
||||
|
3.9 -14.19 |
||||
|
4 -14 |
||||
|
4.1 -13.79 |
||||
|
4.2 -13.56 |
||||
|
4.3 -13.31 |
||||
|
4.4 -13.04 |
||||
|
4.5 -12.75 |
||||
|
4.6 -12.44 |
||||
|
4.7 -12.11 |
||||
|
4.8 -11.76 |
||||
|
4.9 -11.39 |
||||
|
5 -11 |
||||
|
|
||||
|
"Eta |
||||
|
-5 53 |
||||
|
-4.9 51.31 |
||||
|
-4.8 49.64 |
||||
|
-4.7 47.99 |
||||
|
-4.6 46.36 |
||||
|
-4.5 44.75 |
||||
|
-4.4 43.16 |
||||
|
-4.3 41.59 |
||||
|
-4.2 40.04 |
||||
|
-4.1 38.51 |
||||
|
-4 37 |
||||
|
-3.9 35.51 |
||||
|
-3.8 34.04 |
||||
|
-3.7 32.59 |
||||
|
-3.6 31.16 |
||||
|
-3.5 29.75 |
||||
|
-3.4 28.36 |
||||
|
-3.3 26.99 |
||||
|
-3.2 25.64 |
||||
|
-3.1 24.31 |
||||
|
-3 23 |
||||
|
-2.9 21.71 |
||||
|
-2.8 20.44 |
||||
|
-2.7 19.19 |
||||
|
-2.6 17.96 |
||||
|
-2.5 16.75 |
||||
|
-2.4 15.56 |
||||
|
-2.3 14.39 |
||||
|
-2.2 13.24 |
||||
|
-2.1 12.11 |
||||
|
-2 11 |
||||
|
-1.9 9.91 |
||||
|
-1.8 8.84 |
||||
|
-1.7 7.79 |
||||
|
-1.6 6.76 |
||||
|
-1.5 5.75 |
||||
|
-1.4 4.76 |
||||
|
-1.3 3.79 |
||||
|
-1.2 2.84 |
||||
|
-1.1 1.91 |
||||
|
-1 1 |
||||
|
-0.9 0.11 |
||||
|
-0.8 -0.76 |
||||
|
-0.7 -1.61 |
||||
|
-0.6 -2.44 |
||||
|
-0.5 -3.25 |
||||
|
-0.4 -4.04 |
||||
|
-0.3 -4.81 |
||||
|
-0.2 -5.56 |
||||
|
-0.1 -6.29 |
||||
|
-1.02696E-15 -7 |
||||
|
0.1 -7.69 |
||||
|
0.2 -8.36 |
||||
|
0.3 -9.01 |
||||
|
0.4 -9.64 |
||||
|
0.5 -10.25 |
||||
|
0.6 -10.84 |
||||
|
0.7 -11.41 |
||||
|
0.8 -11.96 |
||||
|
0.9 -12.49 |
||||
|
1 -13 |
||||
|
1.1 -13.49 |
||||
|
1.2 -13.96 |
||||
|
1.3 -14.41 |
||||
|
1.4 -14.84 |
||||
|
1.5 -15.25 |
||||
|
1.6 -15.64 |
||||
|
1.7 -16.01 |
||||
|
1.8 -16.36 |
||||
|
1.9 -16.69 |
||||
|
2 -17 |
||||
|
2.1 -17.29 |
||||
|
2.2 -17.56 |
||||
|
2.3 -17.81 |
||||
|
2.4 -18.04 |
||||
|
2.5 -18.25 |
||||
|
2.6 -18.44 |
||||
|
2.7 -18.61 |
||||
|
2.8 -18.76 |
||||
|
2.9 -18.89 |
||||
|
3 -19 |
||||
|
3.1 -19.09 |
||||
|
3.2 -19.16 |
||||
|
3.3 -19.21 |
||||
|
3.4 -19.24 |
||||
|
3.5 -19.25 |
||||
|
3.6 -19.24 |
||||
|
3.7 -19.21 |
||||
|
3.8 -19.16 |
||||
|
3.9 -19.09 |
||||
|
4 -19 |
||||
|
4.1 -18.89 |
||||
|
4.2 -18.76 |
||||
|
4.3 -18.61 |
||||
|
4.4 -18.44 |
||||
|
4.5 -18.25 |
||||
|
4.6 -18.04 |
||||
|
4.7 -17.81 |
||||
|
4.8 -17.56 |
||||
|
4.9 -17.29 |
||||
|
5 -17 |
||||
|
|
||||
@ -0,0 +1,97 @@ |
|||||
|
/* $Header$ */ |
||||
|
/* |
||||
|
* Hardcopy Devices |
||||
|
* |
||||
|
* This file contains the basic output device table. The hardcopy |
||||
|
* dialog is automatically constructed from this table. |
||||
|
* |
||||
|
* $Log$ |
||||
|
* Revision 1.1 2004-01-25 09:00:49 pnenzi |
||||
|
* |
||||
|
* Added xgraph plotting program. |
||||
|
* |
||||
|
* Revision 1.1.1.1 1999/12/03 23:15:52 heideman |
||||
|
* xgraph-12.0 |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef lint |
||||
|
static char rcsid[] = "$Id$"; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include "copyright.h" |
||||
|
#include "xgout.h" |
||||
|
#include "hard_devices.h" |
||||
|
#include "params.h" |
||||
|
|
||||
|
extern int hpglInit(); |
||||
|
extern int psInit(); |
||||
|
extern int idrawInit(); |
||||
|
extern int tgifInit(); |
||||
|
|
||||
|
struct hard_dev hard_devices[] = |
||||
|
{ |
||||
|
{"HPGL", hpglInit, "lpr -P%s", "xgraph.hpgl", "paper", |
||||
|
27.5, "1", 14.0, "1", 12.0, NONE}, |
||||
|
{"Postscript", psInit, "lpr -P%s", "xgraph.ps", "$PRINTER", |
||||
|
19.0, "Times-Bold", 18.0, "Times-Roman", 12.0, NO}, |
||||
|
{"Idraw", idrawInit, |
||||
|
"cat > /usr/tmp/idraw.tmp.ps; %s /usr/tmp/idraw.tmp.ps&", |
||||
|
"~/.clipboard", "/usr/bin/X11/idraw", 19.0, "Times-Bold", 18.0, |
||||
|
"Times-Roman", 12.0, NONE}, |
||||
|
{"Tgif", tgifInit, |
||||
|
"cat > /usr/tmp/xgraph.obj; %s /usr/tmp/xgraph &", |
||||
|
"xgraph.obj", "/usr/bin/X11/tgif", 19.0, "Times-Bold", 18.0, |
||||
|
"Times-Roman", 12.0, NONE} |
||||
|
}; |
||||
|
|
||||
|
int hard_count = sizeof(hard_devices) / sizeof(struct hard_dev); |
||||
|
|
||||
|
#define CHANGE_D(name, field) \ |
||||
|
if (param_get(name, &val)) { \ |
||||
|
if (val.type == DBL) { \ |
||||
|
hard_devices[idx].field = val.dblv.value; \ |
||||
|
} \ |
||||
|
} |
||||
|
|
||||
|
#define CHANGE_S(name, field) \ |
||||
|
if (param_get(name, &val)) { \ |
||||
|
if (val.type == STR) { \ |
||||
|
(void) strcpy(hard_devices[idx].field, val.strv.value); \ |
||||
|
} \ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void |
||||
|
hard_init() |
||||
|
/* |
||||
|
* Changes values in hard_devices structures in accordance with |
||||
|
* parameters set using the parameters module. |
||||
|
*/ |
||||
|
{ |
||||
|
char nn[BUFSIZ]; |
||||
|
int idx; |
||||
|
params val; |
||||
|
|
||||
|
for (idx = 0; idx < hard_count; idx++) { |
||||
|
(void) sprintf(nn, "%s.Dimension", hard_devices[idx].dev_name); |
||||
|
CHANGE_D(nn, dev_max_dim); |
||||
|
(void) sprintf(nn, "%s.OutputTitleFont", hard_devices[idx].dev_name); |
||||
|
CHANGE_S(nn, dev_title_font); |
||||
|
(void) sprintf(nn, "%s.OutputTitleSize", hard_devices[idx].dev_name); |
||||
|
CHANGE_D(nn, dev_title_size); |
||||
|
(void) sprintf(nn, "%s.OutputAxisFont", hard_devices[idx].dev_name); |
||||
|
CHANGE_S(nn, dev_axis_font); |
||||
|
(void) sprintf(nn, "%s.OutputAxisSize", hard_devices[idx].dev_name); |
||||
|
CHANGE_D(nn, dev_axis_size); |
||||
|
if (hard_devices[idx].dev_printer[0] == '$') { |
||||
|
extern char *getenv(); |
||||
|
char *ptr; |
||||
|
if ((ptr = getenv(&hard_devices[idx].dev_printer[1]))) { |
||||
|
(void) strncpy(hard_devices[idx].dev_printer, ptr, MFNAME - 1); |
||||
|
hard_devices[idx].dev_printer[MFNAME - 1] = '\0'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
/* |
||||
|
* Hardcopy Device Header |
||||
|
* |
||||
|
* This file declares the types required for the hardcopy table |
||||
|
* found in hard_devices.c. |
||||
|
*/ |
||||
|
|
||||
|
#ifndef _h_hard_devices |
||||
|
#define _h_hard_devices |
||||
|
|
||||
|
#define MFNAME 25 |
||||
|
|
||||
|
typedef enum hard_dev_docu_defn { |
||||
|
NONE, NO, YES |
||||
|
} hard_dev_docu; |
||||
|
|
||||
|
struct hard_dev { |
||||
|
char *dev_name; /* Device name */ |
||||
|
int (*dev_init) (); /* Initialization function */ |
||||
|
char *dev_spec; /* Default pipe program */ |
||||
|
char dev_file[MFNAME]; /* Default file name */ |
||||
|
char dev_printer[MFNAME];/* Default printer name */ |
||||
|
double dev_max_dim; /* Default maximum dimension (cm) */ |
||||
|
char dev_title_font[MFNAME]; /* Default name of title font */ |
||||
|
double dev_title_size; /* Default size of title font (pnts) */ |
||||
|
char dev_axis_font[MFNAME]; /* Default name of axis font */ |
||||
|
double dev_axis_size; /* Default size of axis font (pnts) */ |
||||
|
hard_dev_docu dev_docu; /* Document predicate */ |
||||
|
}; |
||||
|
|
||||
|
extern int hard_count; |
||||
|
extern struct hard_dev hard_devices[]; |
||||
|
|
||||
|
#define D_HPGL 0 |
||||
|
#define D_POSTSCRIPT 1 |
||||
|
#define D_IDRAW 2 |
||||
|
#define D_TGIF 3 |
||||
|
#define D_XWINDOWS 4 |
||||
|
|
||||
|
extern void hard_init(); |
||||
|
#endif /* _h_hard_devices */ |
||||
@ -0,0 +1,337 @@ |
|||||
|
/* |
||||
|
* HPGL Output |
||||
|
* |
||||
|
* Tom Quarles |
||||
|
*/ |
||||
|
|
||||
|
#define MAPX(state,x) ( (x) + P1X + state->clipminX ) |
||||
|
#define MAPY(state,y) ( MAXY - (y) + P1Y - state->clipminY) |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include "xgraph.h" |
||||
|
#include "plotter.h" |
||||
|
#include <stdio.h> |
||||
|
#include <math.h> |
||||
|
|
||||
|
static void hpglText(); |
||||
|
static void hpglSeg(); |
||||
|
static void hpglDot(); |
||||
|
static void hpglEnd(); |
||||
|
|
||||
|
static xgOut hpglInfo = |
||||
|
{ |
||||
|
D_COLOR, /* device characteristics */ |
||||
|
MAXX, /* width */ |
||||
|
MAXY, /* height */ |
||||
|
200, /* border padding */ |
||||
|
0, /* extra space around axis labels */ |
||||
|
250, /* tick length - approx 1/4 inch */ |
||||
|
50, /* spacing above legend lables */ |
||||
|
0, /* axis font width */ |
||||
|
0, /* axis font height */ |
||||
|
0, /* title font width */ |
||||
|
0, /* title font height */ |
||||
|
1000000, /* maximum number of segments */ |
||||
|
|
||||
|
hpglText, /* text output function */ |
||||
|
hpglSeg, /* segment drawing function */ |
||||
|
hpglDot, /* dot/marker drawing function */ |
||||
|
hpglEnd, /* end of plot function */ |
||||
|
|
||||
|
NULL, /* userInfo */ |
||||
|
}; |
||||
|
|
||||
|
typedef struct { |
||||
|
double axis_w; |
||||
|
double axis_h; |
||||
|
double title_w; |
||||
|
double title_h; |
||||
|
FILE *plotterFile; |
||||
|
int clipminX; |
||||
|
int clipminY; |
||||
|
int clipmaxX; |
||||
|
int clipmaxY; |
||||
|
} mydata; |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
int |
||||
|
hpglInit(stream, width, height, title_family, title_size, |
||||
|
axis_family, axis_size, flags, outInfo, errmsg) |
||||
|
FILE *stream; /* output stream */ |
||||
|
int width; /* desired width of space in microns */ |
||||
|
int height; /* desired height in microns */ |
||||
|
char *title_family; /* name of font for titles */ |
||||
|
double title_size; /* size of font for titles */ |
||||
|
char *axis_family; /* name of font for axes */ |
||||
|
double axis_size; /* size of font for axes */ |
||||
|
int flags; /* predicate values (ignored) */ |
||||
|
xgOut *outInfo; /* my structure */ |
||||
|
char errmsg[ERRBUFSIZE]; /* a place to complain to */ |
||||
|
{ |
||||
|
mydata *myInfo; |
||||
|
|
||||
|
myInfo = (mydata *) Malloc(sizeof(mydata)); |
||||
|
if (myInfo == NULL) |
||||
|
return 0; |
||||
|
*outInfo = hpglInfo; |
||||
|
outInfo->area_w = MIN(MAXX, width / 25); |
||||
|
outInfo->area_h = MIN(MAXY, height / 25); |
||||
|
/* magic formulas: input sizes are in points = 1/72 inch */ |
||||
|
/* my sizes are in cm */ |
||||
|
/* plotter units are in units of .025mm ~= 1/1016 inch */ |
||||
|
/* |
||||
|
* have to warn of height 1.5 times larger or get bitten by plotter's |
||||
|
* internal padding |
||||
|
*/ |
||||
|
/* widths are (arbitrarily) selected to be 2/3 of the height */ |
||||
|
/* (cancels with width factor) */ |
||||
|
myInfo->axis_w = axis_size * .666 * 2.54 / 72.; |
||||
|
myInfo->axis_h = axis_size * 2.54 / 72.; |
||||
|
myInfo->title_w = title_size * .666 * 2.54 / 72.; |
||||
|
myInfo->title_h = title_size * 2.54 / 72.; |
||||
|
|
||||
|
outInfo->axis_pad = axis_size * 1016. * 1.5 / 72.; |
||||
|
outInfo->axis_width = axis_size * 1016. * 1.5 / 72.; |
||||
|
outInfo->axis_height = axis_size * 1016. * .666 / 72.; |
||||
|
outInfo->title_width = title_size * 1016. * 1.5 / 72.; |
||||
|
outInfo->title_height = title_size * 1016. * .666 / 72.; |
||||
|
outInfo->user_state = (char *) myInfo; |
||||
|
myInfo->plotterFile = stream; |
||||
|
myInfo->clipminX = 0; |
||||
|
myInfo->clipminY = 0; |
||||
|
myInfo->clipmaxX = MAXX; |
||||
|
myInfo->clipmaxY = MAXY; |
||||
|
fprintf(myInfo->plotterFile, "PG;IN;\n"); |
||||
|
fprintf(myInfo->plotterFile, "DI1,0;\n"); |
||||
|
fprintf(myInfo->plotterFile, "IW%d,%d,%d,%d;\n", MAPX(myInfo, 0), |
||||
|
MAPY(myInfo, myInfo->clipmaxY - myInfo->clipminY), |
||||
|
MAPX(myInfo, myInfo->clipmaxX - myInfo->clipminX), |
||||
|
MAPY(myInfo, 0)); |
||||
|
return (1); |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
hpglText(userState, x, y, text, just, style) |
||||
|
mydata *userState; /* my state information */ |
||||
|
int x, |
||||
|
y; /* coords of text origin */ |
||||
|
char *text; /* what to put there */ |
||||
|
int just; /* how to justify */ |
||||
|
|
||||
|
/* |
||||
|
* where the origin is relative to where the text should go as a function of |
||||
|
* the various values of just |
||||
|
* |
||||
|
* T_UPPERLEFT T_TOP T_UPPERRIGHT T_LEFT T_CENTER T_RIGHT |
||||
|
* T_LOWERLEFT T_BOTTOM T_LOWERRIGHT |
||||
|
* |
||||
|
*/ |
||||
|
int style; /* T_AXIS = axis font, T_TITLE = title font */ |
||||
|
|
||||
|
{ |
||||
|
fprintf(userState->plotterFile, "PU;SP%d;", TEXTCOLOR); |
||||
|
fprintf(userState->plotterFile, "PA%d,%d;", MAPX(userState, x), MAPY(userState, y)); |
||||
|
switch (style) { |
||||
|
case T_AXIS: |
||||
|
fprintf(userState->plotterFile, "SI%f,%f;", userState->axis_w, userState->axis_h); |
||||
|
break; |
||||
|
case T_TITLE: |
||||
|
fprintf(userState->plotterFile, "SI%f,%f;", userState->title_w, userState->title_h); |
||||
|
break; |
||||
|
default: |
||||
|
printf("bad text style %d in hpglText\n", style); |
||||
|
exit(1); |
||||
|
break; |
||||
|
} |
||||
|
switch (just) { |
||||
|
case T_UPPERLEFT: |
||||
|
fprintf(userState->plotterFile, "LO3;\n"); |
||||
|
break; |
||||
|
case T_TOP: |
||||
|
fprintf(userState->plotterFile, "LO6;\n"); |
||||
|
break; |
||||
|
case T_UPPERRIGHT: |
||||
|
fprintf(userState->plotterFile, "LO9;\n"); |
||||
|
break; |
||||
|
case T_LEFT: |
||||
|
fprintf(userState->plotterFile, "LO2;\n"); |
||||
|
break; |
||||
|
case T_CENTER: |
||||
|
fprintf(userState->plotterFile, "LO5;\n"); |
||||
|
break; |
||||
|
case T_RIGHT: |
||||
|
fprintf(userState->plotterFile, "LO8;\n"); |
||||
|
break; |
||||
|
case T_LOWERLEFT: |
||||
|
fprintf(userState->plotterFile, "LO1;\n"); |
||||
|
break; |
||||
|
case T_BOTTOM: |
||||
|
fprintf(userState->plotterFile, "LO4;\n"); |
||||
|
break; |
||||
|
case T_LOWERRIGHT: |
||||
|
fprintf(userState->plotterFile, "LO7;\n"); |
||||
|
break; |
||||
|
default: |
||||
|
printf("bad justification type %d in hpglText\n", just); |
||||
|
exit(1); |
||||
|
break; |
||||
|
} |
||||
|
fprintf(userState->plotterFile, "LB%s\03;", text); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static int penselect[8] = |
||||
|
{PEN1, PEN2, PEN3, PEN4, PEN5, PEN6, PEN7, PEN8}; |
||||
|
static int lineselect[8] = |
||||
|
{LINE1, LINE2, LINE3, LINE4, LINE5, LINE6, |
||||
|
LINE7, LINE8}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
hpglSeg(userState, ns, segs, width, style, lappr, color) |
||||
|
mydata *userState; /* my state information (not used) */ |
||||
|
int ns; /* number of segments */ |
||||
|
XSegment *segs; /* X array of segments */ |
||||
|
int width; /* width of lines in pixels */ |
||||
|
int style; /* L_VAR = dotted, L_AXIS = grid, L_ZERO = axis */ |
||||
|
int lappr; /* line style */ |
||||
|
int color; /* line color */ |
||||
|
{ |
||||
|
int i; |
||||
|
|
||||
|
if (style == L_ZERO) { |
||||
|
fprintf(userState->plotterFile, "SP%d;", PENAXIS); /* select correct pen */ |
||||
|
fprintf(userState->plotterFile, "LT;"); /* solid line style */ |
||||
|
} |
||||
|
else if (style == L_AXIS) { |
||||
|
fprintf(userState->plotterFile, "SP%d;", PENGRID); /* select correct pen */ |
||||
|
fprintf(userState->plotterFile, "LT;"); /* solid line style */ |
||||
|
} |
||||
|
else if (style == L_VAR) { |
||||
|
if ((color < 0) || (color > 7)) { |
||||
|
printf("out of range line color %d in hpglLine\n", color); |
||||
|
exit(1); |
||||
|
} |
||||
|
fprintf(userState->plotterFile, "SP%d;", penselect[color]); /* select correct pen */ |
||||
|
if ((lappr < 0) || (lappr > 7)) { |
||||
|
printf("out of range line style %d in hpglLine\n", lappr); |
||||
|
exit(1); |
||||
|
} |
||||
|
if (lappr == 0) { |
||||
|
fprintf(userState->plotterFile, "LT;"); /* select solid line |
||||
|
* type */ |
||||
|
} |
||||
|
else { |
||||
|
fprintf(userState->plotterFile, "LT%d;", lineselect[lappr]); /* select line type */ |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
printf("unknown style %d in hpglLine\n", style); |
||||
|
exit(1); |
||||
|
} |
||||
|
for (i = 0; i < ns; i++) { |
||||
|
if (!i || ((segs[i].x1 != segs[i - 1].x2) || (segs[i].y1 != segs[i - 1].y2))) { |
||||
|
/* MOVE */ |
||||
|
fprintf(userState->plotterFile, "PU;PA%d,%d;\n", MAPX(userState, segs[i].x1), |
||||
|
MAPY(userState, segs[i].y1)); |
||||
|
} |
||||
|
/* DRAW */ |
||||
|
if (width <= 1) { |
||||
|
fprintf(userState->plotterFile, "PD;PA%d,%d;\n", MAPX(userState, segs[i].x2), |
||||
|
MAPY(userState, segs[i].y2)); |
||||
|
} |
||||
|
else { /* ugly - wide lines -> rectangles */ |
||||
|
double frac; |
||||
|
int lx, |
||||
|
ly; |
||||
|
int urx, |
||||
|
ury, |
||||
|
ulx, |
||||
|
uly, |
||||
|
llx, |
||||
|
lly, |
||||
|
lrx, |
||||
|
lry; |
||||
|
|
||||
|
frac = (width / 2) / sqrt((double) |
||||
|
((segs[i].x1 - segs[i].x2) * |
||||
|
(segs[i].x1 - segs[i].x2)) + |
||||
|
((segs[i].y1 - segs[i].y2) * |
||||
|
(segs[i].y1 - segs[i].y2))); |
||||
|
lx = frac * (segs[i].y2 - segs[i].y1); |
||||
|
ly = -frac * (segs[i].x2 - segs[i].x1); |
||||
|
urx = segs[i].x2 + lx; |
||||
|
ury = segs[i].y2 + ly; |
||||
|
ulx = segs[i].x2 - lx; |
||||
|
uly = segs[i].y2 - ly; |
||||
|
llx = segs[i].x1 - lx; |
||||
|
lly = segs[i].y1 - ly; |
||||
|
lrx = segs[i].x1 + lx; |
||||
|
lry = segs[i].y1 + ly; |
||||
|
fprintf(userState->plotterFile, "PU;PA%d,%d;", MAPX(userState, llx), |
||||
|
MAPY(userState, lly)); |
||||
|
fprintf(userState->plotterFile, "PM0;"); |
||||
|
fprintf(userState->plotterFile, "PD,PA%d,%D;PA%d,%D;PA%d,%d;\n", |
||||
|
MAPX(userState, lrx), MAPY(userState, lry), |
||||
|
MAPX(userState, urx), MAPY(userState, ury), |
||||
|
MAPX(userState, ulx), MAPY(userState, uly)); |
||||
|
fprintf(userState->plotterFile, "PM2;FP;EP;"); |
||||
|
} |
||||
|
} |
||||
|
fprintf(userState->plotterFile, "PU;"); |
||||
|
} |
||||
|
|
||||
|
static char *markselect[8] = |
||||
|
{MARK1, MARK2, MARK3, MARK4, MARK5, MARK6, |
||||
|
MARK7, MARK8}; |
||||
|
|
||||
|
static void |
||||
|
hpglDot(userState, x, y, style, type, color) |
||||
|
mydata *userState; /* my state information (not used) */ |
||||
|
int x, |
||||
|
y; /* coord of dot */ |
||||
|
int style; /* type of dot */ |
||||
|
int type; /* dot style variation */ |
||||
|
int color; /* color of dot */ |
||||
|
{ |
||||
|
/* move to given coord */ |
||||
|
fprintf(userState->plotterFile, "PU;PA%d,%d;\n", MAPX(userState, x), MAPY(userState, y)); |
||||
|
if ((color < 0) || (color > 7)) { |
||||
|
printf("unknown color %d in hpglDot\n", color); |
||||
|
exit(1); |
||||
|
} |
||||
|
fprintf(userState->plotterFile, "SP%d;", penselect[color]); |
||||
|
if (style == P_PIXEL) { |
||||
|
fprintf(userState->plotterFile, "PD;PU;\n"); |
||||
|
} |
||||
|
else if (style == P_DOT) { |
||||
|
fprintf(userState->plotterFile, "LT;PM0;CI40;PM2;FT;EP;\n"); |
||||
|
} |
||||
|
else if (style == P_MARK) { |
||||
|
if ((type < 0) || (type > 7)) { |
||||
|
printf("unknown marker type %d in hpglDot\n", type); |
||||
|
exit(1); |
||||
|
} |
||||
|
/* |
||||
|
* fprintf(userState->plotterFile,"LT;CA5;LO4;SI0.1;LB%s\03;\n",marksele |
||||
|
* ct[type]); |
||||
|
*/ |
||||
|
fprintf(userState->plotterFile, "LT;CS5;LO4;SI0.15;SM%s;PR0,0;SM;CS;\n", markselect[type]); |
||||
|
} |
||||
|
else { |
||||
|
printf("unknown marker style %d in hpglDot\n", style); |
||||
|
exit(1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
hpglEnd(userState) |
||||
|
mydata *userState; /* my state information (not used) */ |
||||
|
|
||||
|
{ |
||||
|
fprintf(userState->plotterFile, "SP;PG;IN;\n"); |
||||
|
fflush(userState->plotterFile); |
||||
|
return; |
||||
|
} |
||||
@ -0,0 +1,498 @@ |
|||||
|
/* |
||||
|
* Idraw Output |
||||
|
* |
||||
|
* Beorn Johnson |
||||
|
* Alan Kramer |
||||
|
* David Harrison |
||||
|
*/ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <X11/Xlib.h> |
||||
|
#include "hard_devices.h" |
||||
|
#include "xgout.h" |
||||
|
|
||||
|
#define HEIGHT 792 |
||||
|
#define FIX(X) X = HEIGHT - X; |
||||
|
|
||||
|
typedef struct { |
||||
|
char *title_font; |
||||
|
char *axis_font; |
||||
|
int title_size; |
||||
|
int axis_size; |
||||
|
FILE *strm; |
||||
|
} Info; |
||||
|
|
||||
|
char *idraw_prologue[] = |
||||
|
{ |
||||
|
"%I Idraw 4", |
||||
|
"Begin", |
||||
|
"%I b u", |
||||
|
"%I cfg u", |
||||
|
"%I cbg u", |
||||
|
"%I f u", |
||||
|
"%I p u", |
||||
|
"%I t", |
||||
|
"[ 1 0 0 1 0 0 ] concat", |
||||
|
"/originalCTM matrix currentmatrix def", |
||||
|
0 |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
* Hardcopy Interface for Xgraph |
||||
|
* |
||||
|
* Major differences from first version: |
||||
|
* Four new parameters are passed to the device initialization routine: |
||||
|
* title_family, title_size, axis_family, and axis_size. See the |
||||
|
* description of xg_init() for details. |
||||
|
* |
||||
|
* Clipping is done automatically by xgraph. The xg_clip() routine |
||||
|
* is obsolete. |
||||
|
* |
||||
|
* The xg_line() routine has become the xg_seg() routine. It now |
||||
|
* draws segments rather than a series of lines. |
||||
|
* |
||||
|
* A new field (max_segs) in the device structure now specifies |
||||
|
* the maximum number of segments the device can handle in a group. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 1 |
||||
|
* Write versions of the following routines for your device: |
||||
|
* xg_init(), xg_text(), xg_seg(), xg_dot(), and xg_end(). |
||||
|
* The interface and function of these routines are described |
||||
|
* in detail below. These routines should be named according |
||||
|
* to your device. For example, the initialization routine |
||||
|
* for the Postscript output device is psInit(). Also, name |
||||
|
* your source file after your device (e.g. the postscript |
||||
|
* routines are in the file ps.c). Instructions continue |
||||
|
* after the description of the interface routines. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
void idrawText(); |
||||
|
void idrawDot(); |
||||
|
void idrawSeg(); |
||||
|
void idrawEnd(); |
||||
|
|
||||
|
int |
||||
|
idrawInit(strm, width, height, title_family, title_size, |
||||
|
axis_family, axis_size, flags, out_info, errmsg) |
||||
|
FILE *strm; /* Output stream */ |
||||
|
int width, |
||||
|
height; /* Size of space (microns) */ |
||||
|
char *title_family; /* Name of title font family */ |
||||
|
double title_size; /* Title font height (points) */ |
||||
|
char *axis_family; /* Name of axis font family */ |
||||
|
double axis_size; /* Axis font height (points) */ |
||||
|
int flags; /* Flags */ |
||||
|
xgOut *out_info; /* Device info (RETURN) */ |
||||
|
char errmsg[ERRBUFSIZE]; /* Error message area */ |
||||
|
|
||||
|
/* |
||||
|
* This routine is called by xgraph just before drawing is to |
||||
|
* begin. The desired size of the plot is given by `width' |
||||
|
* and `height'. The parameters `title_family', `title_size', |
||||
|
* `axis_family', and `axis_size' specify the names of the |
||||
|
* title and axis fonts and their vertical sizes (in points). |
||||
|
* These parameters can be ignored if your device does not |
||||
|
* support multiple fonts. Binary flags are specified in |
||||
|
* the `flags' field. These include: |
||||
|
* D_DOCU: |
||||
|
* If this flag is set, it indicates the user has specified that |
||||
|
* the output will be included in some larger document. Devices |
||||
|
* may choose to use this information to produce output that |
||||
|
* can be integrated into documents with less effort. For example, |
||||
|
* the Postscript output routines produce bounding box information |
||||
|
* when this flag is set. |
||||
|
* The routine should fill in all of the fields of `out_info' with |
||||
|
* appropriate values. The values are described below: |
||||
|
* area_w, area_h: |
||||
|
* Size of the drawing space in device coordinates. |
||||
|
* This should take in account the requested area |
||||
|
* given by `width', and `height'. |
||||
|
* bdr_pad: |
||||
|
* Xgraph will leave this number of device coordinates around |
||||
|
* all of the outer edges of the graph. |
||||
|
* axis_pad: |
||||
|
* Additional space around axis labels (in devcoords) |
||||
|
* so that the labels do not appear crowded. |
||||
|
* legend_pad: |
||||
|
* Space (in devcoords) from the top of legend text to |
||||
|
* the representative line drawn above the legend text. |
||||
|
* tick_len: |
||||
|
* Size of a tick mark placed on axis (in devcoords) |
||||
|
* axis_width: |
||||
|
* An estimate of the width of a large character in |
||||
|
* the axis font (in devcoords). This can be an overestimate. An |
||||
|
* underestimate may produce bad results. |
||||
|
* axis_height: |
||||
|
* An estimate of the height of a large character in |
||||
|
* the axis labeling font (in devcoords). |
||||
|
* title_width, title_height: |
||||
|
* Same as above except for the title font. |
||||
|
* max_segs: |
||||
|
* Due to buffering constraints, some devices may not be able to |
||||
|
* handle massive segment lists. This parameter tells xgraph not |
||||
|
* to send more than `max_segs' segments in one request. |
||||
|
* Output to the device should be written to the stream `strm'. |
||||
|
* The functions are described individually below. After filling |
||||
|
* in the parameters and setting the function pointers, the routine |
||||
|
* should initialize its drawing state and store any extra needed |
||||
|
* information in `user_state'. This value will be passed to all |
||||
|
* other routines during the drawing sequence. If the device |
||||
|
* cannot initialize, it should return a zero status and fill |
||||
|
* `errmsg' with an informative error message. |
||||
|
*/ |
||||
|
{ |
||||
|
Info *idraw_info; |
||||
|
char **l; |
||||
|
double scx, |
||||
|
scy; |
||||
|
|
||||
|
idraw_info = (Info *) Malloc(sizeof(*idraw_info)); |
||||
|
|
||||
|
for (l = idraw_prologue; *l; l++) |
||||
|
fprintf(strm, "%s\n", *l); |
||||
|
|
||||
|
out_info->dev_flags = 0; |
||||
|
scx = width / 612; |
||||
|
scy = height / 792.0; |
||||
|
if (scx > scy) { |
||||
|
scy /= scx; |
||||
|
scx = 1; |
||||
|
} |
||||
|
else { |
||||
|
scx /= scy; |
||||
|
scy = 1; |
||||
|
} |
||||
|
out_info->bdr_pad = title_size / 4; |
||||
|
out_info->axis_pad = 2.0 * axis_size; |
||||
|
out_info->legend_pad = 0; |
||||
|
|
||||
|
out_info->area_w = width * 0.00283; /* pts per micron */ |
||||
|
out_info->area_h = height * 0.00283; |
||||
|
|
||||
|
out_info->tick_len = axis_size; |
||||
|
out_info->axis_height = axis_size; |
||||
|
out_info->title_height = title_size; |
||||
|
out_info->axis_width = (axis_size * 5.0) / 12.0; |
||||
|
out_info->title_width = (title_size * 5.0) / 12.0; |
||||
|
out_info->max_segs = 100; |
||||
|
out_info->xg_text = idrawText; |
||||
|
out_info->xg_seg = idrawSeg; |
||||
|
out_info->xg_dot = idrawDot; |
||||
|
out_info->xg_end = idrawEnd; |
||||
|
out_info->user_state = (char *) idraw_info; |
||||
|
|
||||
|
idraw_info->title_font = title_family; |
||||
|
idraw_info->axis_font = axis_family; |
||||
|
idraw_info->title_size = title_size; |
||||
|
idraw_info->axis_size = axis_size; |
||||
|
idraw_info->strm = strm; |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
/* Text justifications */ |
||||
|
#define T_CENTER 0 |
||||
|
#define T_LEFT 1 |
||||
|
#define T_UPPERLEFT 2 |
||||
|
#define T_TOP 3 |
||||
|
#define T_UPPERRIGHT 4 |
||||
|
#define T_RIGHT 5 |
||||
|
#define T_LOWERRIGHT 6 |
||||
|
#define T_BOTTOM 7 |
||||
|
#define T_LOWERLEFT 8 |
||||
|
|
||||
|
/* Text styles */ |
||||
|
#define T_AXIS 0 |
||||
|
#define T_TITLE 1 |
||||
|
|
||||
|
static void |
||||
|
idraw_just(x, y, just, size, len) |
||||
|
int *x, |
||||
|
*y; /* Given location (lower left) */ |
||||
|
int just; /* Justification */ |
||||
|
int size; /* Size in points */ |
||||
|
int len; /* Number of chars */ |
||||
|
|
||||
|
/* |
||||
|
* Unfortunately, idraw really can't display text with a justification. |
||||
|
* This is a horrible hack to try to get around the problem. It tries |
||||
|
* to compute a rough bounding box for the text based on the text height |
||||
|
* and the string length and offset `x,y' appropriately for the justification. |
||||
|
* This is only a hack... |
||||
|
*/ |
||||
|
{ |
||||
|
int t_width, |
||||
|
t_height; |
||||
|
|
||||
|
t_height = size; |
||||
|
t_width = (size * len * 5) / 12; /* Horrible estimate */ |
||||
|
|
||||
|
switch (just) { |
||||
|
case T_CENTER: |
||||
|
*x -= t_width / 2; |
||||
|
*y += t_height / 2; |
||||
|
break; |
||||
|
case T_LEFT: |
||||
|
*y += t_height / 2; |
||||
|
break; |
||||
|
case T_UPPERLEFT: |
||||
|
/* nothing */ |
||||
|
break; |
||||
|
case T_TOP: |
||||
|
*x -= t_width / 2; |
||||
|
break; |
||||
|
case T_UPPERRIGHT: |
||||
|
*x -= t_width; |
||||
|
break; |
||||
|
case T_RIGHT: |
||||
|
*x -= t_width; |
||||
|
*y += t_height / 2; |
||||
|
break; |
||||
|
case T_LOWERRIGHT: |
||||
|
*x -= t_width; |
||||
|
*y += t_height; |
||||
|
break; |
||||
|
case T_BOTTOM: |
||||
|
*x -= t_width / 2; |
||||
|
*y += t_height; |
||||
|
break; |
||||
|
case T_LOWERLEFT: |
||||
|
*y += t_height; |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Also, idraw seems to put a space above all text it draws. The |
||||
|
* computation below compensates for this. |
||||
|
*/ |
||||
|
*y += (size / 3); |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
idrawText(user_state, x, y, text, just, style) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Text position (pixels) */ |
||||
|
char *text; /* Null terminated text */ |
||||
|
int just; /* Justification (above) */ |
||||
|
int style; /* Text style (above) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw text at the indicated position using |
||||
|
* the indicated justification and style. The justification refers |
||||
|
* to the location of the point in reference to the text. For example, |
||||
|
* if just is T_LOWERLEFT, (x,y) should be located at the lower left |
||||
|
* edge of the text string. |
||||
|
*/ |
||||
|
{ |
||||
|
char *font; |
||||
|
int size; |
||||
|
Info *idraw = (Info *) user_state; |
||||
|
|
||||
|
FIX(y); |
||||
|
font = style == T_AXIS ? idraw->axis_font : |
||||
|
idraw->title_font; |
||||
|
size = style == T_AXIS ? idraw->axis_size : |
||||
|
idraw->title_size; |
||||
|
|
||||
|
idraw_just(&x, &y, just, size, strlen(text)); |
||||
|
|
||||
|
fprintf(idraw->strm, "Begin %%I Text\n"); |
||||
|
fprintf(idraw->strm, "%%I cfg Black\n"); |
||||
|
fprintf(idraw->strm, "0 0 0 SetCFg\n"); |
||||
|
fprintf(idraw->strm, "%%I f *%s*-%d-*\n", font, size); |
||||
|
fprintf(idraw->strm, "/%s %d SetF\n", font, size); |
||||
|
fprintf(idraw->strm, "%%I t\n"); |
||||
|
fprintf(idraw->strm, "[ 1 0 0 1 %d %d ] concat\n", x, y); |
||||
|
fprintf(idraw->strm, "%%I\n"); |
||||
|
fprintf(idraw->strm, "[\n"); |
||||
|
fprintf(idraw->strm, "(%s)\n", text); |
||||
|
fprintf(idraw->strm, "] Text\n"); |
||||
|
fprintf(idraw->strm, "End\n"); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/* Line Styles */ |
||||
|
#define L_AXIS 0 |
||||
|
#define L_ZERO 1 |
||||
|
#define L_VAR 2 |
||||
|
|
||||
|
void |
||||
|
idrawSeg(user_state, ns, seglist, width, style, lappr, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int ns; /* Number of segments */ |
||||
|
XSegment *seglist; /* X array of segments */ |
||||
|
int width; /* Width of lines */ |
||||
|
int style; /* See above */ |
||||
|
int lappr; /* Line appearence */ |
||||
|
int color; /* Line color (if any) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine draws a number of line segments at the points |
||||
|
* given in `seglist'. Note that contiguous segments need not share |
||||
|
* endpoints but often do. All segments should be `width' devcoords wide |
||||
|
* and drawn in style `style'. If `style' is L_VAR, the parameters |
||||
|
* `color' and `lappr' should be used to draw the line. Both |
||||
|
* parameters vary from 0 to 7. If the device is capable of |
||||
|
* color, `color' varies faster than `style'. If the device |
||||
|
* has no color, `style' will vary faster than `color' and |
||||
|
* `color' can be safely ignored. However, if the |
||||
|
* the device has more than 8 line appearences, the two can |
||||
|
* be combined to specify 64 line style variations. |
||||
|
* Xgraph promises not to send more than the `max_segs' in the |
||||
|
* xgOut structure passed back from xg_init(). |
||||
|
*/ |
||||
|
{ |
||||
|
Info *idraw = (Info *) user_state; |
||||
|
short to_style; |
||||
|
int i, |
||||
|
j, |
||||
|
k; |
||||
|
|
||||
|
static unsigned short style_list[] = |
||||
|
{ |
||||
|
0xffff, 0xf0f0, 0xcccc, 0xaaaa, |
||||
|
0xf060, 0xf198, 0x7f55, 0x0000, |
||||
|
}; |
||||
|
|
||||
|
to_style = style == L_AXIS ? 65535 |
||||
|
: style == L_ZERO ? 65535 |
||||
|
: style_list[lappr]; |
||||
|
|
||||
|
for (i = 0; i < ns; i++) { |
||||
|
FIX(seglist[i].y1); |
||||
|
FIX(seglist[i].y2); |
||||
|
} |
||||
|
|
||||
|
for (i = 0; i < ns; i = j) { |
||||
|
|
||||
|
for (j = i + 1; j < ns |
||||
|
&& seglist[j - 1].x2 == seglist[j].x1 |
||||
|
&& seglist[j - 1].y2 == seglist[j].y1; |
||||
|
j++); |
||||
|
|
||||
|
fprintf(idraw->strm, "Begin %%I MLine\n"); |
||||
|
fprintf(idraw->strm, "%%I b %d\n", to_style); |
||||
|
fprintf(idraw->strm, "%d 0 0 [", width); |
||||
|
/* fprintf(idraw -> strm, "%d"); */ |
||||
|
fprintf(idraw->strm, "] 0 SetB\n"); |
||||
|
fprintf(idraw->strm, "%%I cfg Black\n"); |
||||
|
fprintf(idraw->strm, "0 0 0 SetCFg\n"); |
||||
|
fprintf(idraw->strm, "%%I cbg White\n"); |
||||
|
fprintf(idraw->strm, "1 1 1 SetCBg\n"); |
||||
|
fprintf(idraw->strm, "none SetP %%I p n\n"); |
||||
|
fprintf(idraw->strm, "%%I t u\n"); |
||||
|
|
||||
|
fprintf(idraw->strm, "%%I %d\n", j - i + 1); |
||||
|
|
||||
|
for (k = i; k < j; k++) |
||||
|
fprintf(idraw->strm, "%d %d\n", |
||||
|
seglist[k].x1, seglist[k].y1); |
||||
|
|
||||
|
fprintf(idraw->strm, "%d %d\n", |
||||
|
seglist[k - 1].x2, seglist[k - 1].y2); |
||||
|
|
||||
|
fprintf(idraw->strm, "%d MLine\n", j - i + 1); |
||||
|
fprintf(idraw->strm, "End\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
/* Marker styles */ |
||||
|
#define P_PIXEL 0 |
||||
|
#define P_DOT 1 |
||||
|
#define P_MARK 2 |
||||
|
|
||||
|
void |
||||
|
idrawDot(user_state, x, y, style, type, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Location in pixel units */ |
||||
|
int style; /* Dot style */ |
||||
|
int type; /* Type of marker */ |
||||
|
int color; /* Marker color (if any) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw a marker at location `x,y'. If the |
||||
|
* style is P_PIXEL, the dot should be a single pixel. If |
||||
|
* the style is P_DOT, the dot should be a reasonably large |
||||
|
* dot. If the style is P_MARK, it should be a distinguished |
||||
|
* mark which is specified by `type' (0-7). If the output |
||||
|
* device is capable of color, the marker should be drawn in |
||||
|
* `color' (0-7) which corresponds with the color for xg_line. |
||||
|
*/ |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
idrawEnd(user_state) |
||||
|
char *user_state; |
||||
|
|
||||
|
/* |
||||
|
* This routine is called after a drawing sequence is complete. |
||||
|
* It can be used to clean up the user state and set the device |
||||
|
* state appropriately. This routine is optional in the structure. |
||||
|
*/ |
||||
|
{ |
||||
|
Info *idraw = (Info *) user_state; |
||||
|
|
||||
|
fprintf(idraw->strm, "End %%I eop\n"); |
||||
|
fclose(idraw->strm); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 2 |
||||
|
* Edit the file hard_devices.c. Declare your initialization |
||||
|
* function and add your device to the list of devices, |
||||
|
* hard_devices[]. The structure hard_dev is described below: |
||||
|
*/ |
||||
|
|
||||
|
#ifdef notdef |
||||
|
extern int idrawInit(); |
||||
|
|
||||
|
struct hard_dev idraw = |
||||
|
{ |
||||
|
"idraw format", idrawInit, |
||||
|
0, ".clipboard", 0, |
||||
|
25, "Times-Bold", 18, "Times", 12 |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
/* |
||||
|
* dev_spec: |
||||
|
* The dev_spec field should be a command that directly outputs to |
||||
|
* your device. The command should contain one %s directive that |
||||
|
* will be filled in with the name of the device from the hardcopy |
||||
|
* dialog. |
||||
|
* dev_file: |
||||
|
* The default file to write output to if the user selects `To File'. |
||||
|
* dev_printer: |
||||
|
* The default printer to write output to if the user selects |
||||
|
* `To Device'. |
||||
|
* dev_max_dim: |
||||
|
* The default maximum dimension for the device in centimeters. |
||||
|
* dev_title_font, dev_title_size: |
||||
|
* The default title font and size. Sizes are specified in |
||||
|
* points (1/72 inch). |
||||
|
* dev_axis_font, dev_axis_size: |
||||
|
* The default axis font and size. |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
* Adding an output device to xgraph |
||||
|
* |
||||
|
* Step 3 |
||||
|
* Edit the file Makefile. Add your source file to the SRC variable |
||||
|
* and the corresponding object file to the OBJ variable. Finally, |
||||
|
* remake xgraph. Your device should now be available in the |
||||
|
* hardcopy dialog. |
||||
|
*/ |
||||
@ -0,0 +1,622 @@ |
|||||
|
/* $Header$ */ |
||||
|
/* |
||||
|
* init.c: xgraph initialization code |
||||
|
* |
||||
|
* Routines: |
||||
|
* InitSets(); |
||||
|
* ParseArgs(); |
||||
|
* ReadDefaults(); |
||||
|
* |
||||
|
* $Log$ |
||||
|
* Revision 1.1 2004-01-25 09:00:49 pnenzi |
||||
|
* |
||||
|
* Added xgraph plotting program. |
||||
|
* |
||||
|
* Revision 1.2 1999/12/19 00:52:06 heideman |
||||
|
* warning suppresion, slightly different flot ahndling |
||||
|
* |
||||
|
* Revision 1.1.1.1 1999/12/03 23:15:53 heideman |
||||
|
* xgraph-12.0 |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef lint |
||||
|
static char rcsid[] = "$Id$"; |
||||
|
#endif |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include <stdio.h> |
||||
|
#include <math.h> |
||||
|
#include <pwd.h> |
||||
|
#include <ctype.h> |
||||
|
#include "xgraph.h" |
||||
|
#include "xtb.h" |
||||
|
#include "hard_devices.h" |
||||
|
#include "params.h" |
||||
|
|
||||
|
/* |
||||
|
* Default settings for xgraph parameters |
||||
|
*/ |
||||
|
|
||||
|
/* PW */ |
||||
|
#define DEF_ANIMATE "off" |
||||
|
#define DEF_DELAY_VALUE "2" |
||||
|
#define DEF_BORDER_WIDTH "2" |
||||
|
#define DEF_BORDER_COLOR "Black" |
||||
|
#define DEF_TITLE_TEXT "X Graph" |
||||
|
#define DEF_XUNIT_TEXT "X" |
||||
|
#define DEF_YUNIT_TEXT "Y" |
||||
|
#define DEF_TICK_FLAG "off" |
||||
|
#define DEF_TICKAXIS_FLAG "off" |
||||
|
#define DEF_MARK_FLAG "off" |
||||
|
#define DEF_PIXMARK_FLAG "off" |
||||
|
#define DEF_LARGEPIX_FLAG "off" |
||||
|
#define DEF_DIFFMARK_FLAG "off" |
||||
|
#define DEF_BB_FLAG "off" |
||||
|
#define DEF_NOLINE_FLAG "off" |
||||
|
#define DEF_NOLEGEND_FLAG "off" |
||||
|
#define DEF_NOBUTTON_FLAG "off" |
||||
|
#define DEF_LOGX_FLAG "off" |
||||
|
#define DEF_LOGY_FLAG "off" |
||||
|
#define DEF_BAR_FLAG "off" |
||||
|
#define DEF_STK_FLAG "off" |
||||
|
#define DEF_FITX_FLAG "off" |
||||
|
#define DEF_FITY_FLAG "off" |
||||
|
#define DEF_BAR_BASE "0.0" |
||||
|
#define DEF_BAR_OFFS "0.0" |
||||
|
#define DEF_BAR_WIDTH "-1.0" |
||||
|
#define DEF_LINE_WIDTH "0" |
||||
|
#define DEF_GRID_SIZE "0" |
||||
|
#define DEF_GRID_STYLE "10" |
||||
|
#define DEF_LABEL_FONT "helvetica-10" |
||||
|
#define DEF_TITLE_FONT "helvetica-18" |
||||
|
#define DEF_GEOMETRY "" |
||||
|
#define DEF_REVERSE "off" |
||||
|
/* PW Changes these to please JM */ |
||||
|
#define DEF_FMT_X "%.4f" |
||||
|
#define DEF_FMT_Y "%.4f" |
||||
|
#define DEF_DEVICE "" |
||||
|
#define DEF_OUTPUT_DEVICE D_XWINDOWS |
||||
|
#define DEF_DISPOSITION "To Device" |
||||
|
#define DEF_FILEORDEV "" |
||||
|
#define DEF_DOCUMENT "off" |
||||
|
#define DEF_SCALE "1.0" |
||||
|
|
||||
|
#define DEF_MARKER_FLAG "off" |
||||
|
#define DEF_DIFFMARK_FLAG "off" |
||||
|
#define DEF_PIXMARK_FLAG "off" |
||||
|
#define DEF_LARGEPIX_FLAG "off" |
||||
|
|
||||
|
/* Low > High means set it based on the data */ |
||||
|
#define DEF_LOW_LIMIT "1.0" |
||||
|
#define DEF_HIGH_LIMIT "0.0" |
||||
|
|
||||
|
/* Black and white defaults */ |
||||
|
#define DEF_BW_BACKGROUND "white" |
||||
|
#define DEF_BW_BORDER "black" |
||||
|
#define DEF_BW_ZEROCOLOR "black" |
||||
|
#define DEF_BW_ZEROWIDTH "3" |
||||
|
#define DEF_BW_ZEROSTYLE "1" |
||||
|
#define DEF_BW_FOREGROUND "black" |
||||
|
|
||||
|
/* Color defaults */ |
||||
|
#define DEF_COL_BACKGROUND "#ccc" |
||||
|
#define DEF_COL_BORDER "black" |
||||
|
#define DEF_COL_ZEROCOLOR "white" |
||||
|
#define DEF_COL_ZEROWIDTH "0" |
||||
|
#define DEF_COL_ZEROSTYLE "1" |
||||
|
#define DEF_COL_FOREGROUND "black" |
||||
|
#define DEF_COL_FIRSTSTYLE "1" |
||||
|
|
||||
|
/* Default line styles */ |
||||
|
static char *defStyle[MAXATTR] = |
||||
|
{ |
||||
|
"1", "10", "11110000", "010111", "1110", |
||||
|
"1111111100000000", "11001111", "0011000111" |
||||
|
}; |
||||
|
|
||||
|
/* Default color names */ |
||||
|
/*static char *defColors[MAXATTR] = |
||||
|
{ |
||||
|
"red", "SpringGreen", "blue", "yellow", |
||||
|
"cyan", "sienna", "orange", "coral" |
||||
|
};*/ |
||||
|
static char *defColors[MAXATTR] = |
||||
|
{ |
||||
|
"red", "SpringGreen", "blue", "yellow", |
||||
|
"purple", "orange", "hotpink", "cyan" |
||||
|
}; |
||||
|
|
||||
|
void |
||||
|
InitSets(o) |
||||
|
int o; |
||||
|
|
||||
|
/* |
||||
|
* Initializes the data sets with default information. Sets up |
||||
|
* original values for parameters in parameters package. |
||||
|
*/ |
||||
|
{ |
||||
|
int idx; |
||||
|
char buf[1024]; |
||||
|
|
||||
|
if (o == D_XWINDOWS) { |
||||
|
/* |
||||
|
* Used to do all kinds of searching through visuals, etc. Got |
||||
|
* complaints -- so back to the simple version. |
||||
|
*/ |
||||
|
vis = DefaultVisual(disp, DefaultScreen(disp)); |
||||
|
cmap = DefaultColormap(disp, DefaultScreen(disp)); |
||||
|
screen = DefaultScreen(disp); |
||||
|
depth = DefaultDepth(disp, DefaultScreen(disp)); |
||||
|
param_init(disp, cmap); |
||||
|
} |
||||
|
else |
||||
|
param_init(NULL, 0); |
||||
|
|
||||
|
|
||||
|
param_set("Debug", BOOL, "false"); |
||||
|
param_set("Geometry", STR, DEF_GEOMETRY); |
||||
|
param_set("ReverseVideo", BOOL, DEF_REVERSE); |
||||
|
|
||||
|
param_set("BorderSize", INT, DEF_BORDER_WIDTH); |
||||
|
param_set("TitleText", STR, DEF_TITLE_TEXT); |
||||
|
param_set("XUnitText", STR, DEF_XUNIT_TEXT); |
||||
|
param_set("YUnitText", STR, DEF_YUNIT_TEXT); /* YUnits */ |
||||
|
param_set("Ticks", BOOL, DEF_TICK_FLAG); |
||||
|
param_set("TickAxis", BOOL, DEF_TICKAXIS_FLAG); |
||||
|
|
||||
|
param_set("Markers", BOOL, DEF_MARKER_FLAG); /* markFlag (-m) */ |
||||
|
param_set("StyleMarkers", BOOL, DEF_DIFFMARK_FLAG); /* colorMark (-M) */ |
||||
|
param_set("PixelMarkers", BOOL, DEF_PIXMARK_FLAG); /* pixelMarks (-p) */ |
||||
|
param_set("LargePixels", BOOL, DEF_LARGEPIX_FLAG); /* bigPixel (-P) */ |
||||
|
|
||||
|
param_set("BoundBox", BOOL, DEF_BB_FLAG); |
||||
|
param_set("NoLines", BOOL, DEF_NOLINE_FLAG); |
||||
|
param_set("NoLegend", BOOL, DEF_NOLEGEND_FLAG); |
||||
|
param_set("NoButton", BOOL, DEF_NOBUTTON_FLAG); |
||||
|
param_set("LogX", BOOL, DEF_LOGX_FLAG); |
||||
|
param_set("LogY", BOOL, DEF_LOGY_FLAG); /* logYFlag */ |
||||
|
param_set("BarGraph", BOOL, DEF_BAR_FLAG); |
||||
|
param_set("StackGraph", BOOL, DEF_STK_FLAG); |
||||
|
param_set("FitX", BOOL, DEF_FITX_FLAG); |
||||
|
param_set("FitY", BOOL, DEF_FITY_FLAG); |
||||
|
param_set("BarBase", DBL, DEF_BAR_BASE); |
||||
|
param_set("BarWidth", DBL, DEF_BAR_WIDTH); |
||||
|
param_set("BarOffset", DBL, DEF_BAR_OFFS); |
||||
|
param_set("LineWidth", INT, DEF_LINE_WIDTH); |
||||
|
param_set("GridSize", INT, DEF_GRID_SIZE); |
||||
|
param_set("GridStyle", STYLE, DEF_GRID_STYLE); |
||||
|
param_set("Format X", STR, DEF_FMT_X); |
||||
|
param_set("Format Y", STR, DEF_FMT_Y); |
||||
|
|
||||
|
param_set("Device", STR, DEF_DEVICE); |
||||
|
param_set("Disposition", STR, DEF_DISPOSITION); |
||||
|
param_set("FileOrDev", STR, DEF_FILEORDEV); |
||||
|
sprintf(buf, "%d", o); |
||||
|
param_set("Output Device", INT, buf); |
||||
|
param_set("Document", BOOL, DEF_DOCUMENT); |
||||
|
param_set("Scale", DBL, DEF_SCALE); |
||||
|
|
||||
|
/* Set the user bounding box */ |
||||
|
param_set("XLowLimit", DBL, DEF_LOW_LIMIT); |
||||
|
param_set("YLowLimit", DBL, DEF_LOW_LIMIT); |
||||
|
param_set("XHighLimit", DBL, DEF_HIGH_LIMIT); |
||||
|
param_set("YHighLimit", DBL, DEF_HIGH_LIMIT); |
||||
|
|
||||
|
/* Depends critically on whether the display has color */ |
||||
|
if (depth < 4) { |
||||
|
/* Its black and white */ |
||||
|
param_set("Background", PIXEL, DEF_BW_BACKGROUND); |
||||
|
param_set("Border", PIXEL, DEF_BW_BORDER); |
||||
|
param_set("ZeroColor", PIXEL, DEF_BW_ZEROCOLOR); |
||||
|
param_set("ZeroWidth", INT, DEF_BW_ZEROWIDTH); |
||||
|
param_set("ZeroStyle", STYLE, DEF_BW_ZEROSTYLE); |
||||
|
param_set("Foreground", PIXEL, DEF_BW_FOREGROUND); |
||||
|
/* Initialize set defaults */ |
||||
|
for (idx = 0; idx < MAXATTR; idx++) { |
||||
|
(void) sprintf(buf, "%d.Style", idx); |
||||
|
param_set(buf, STYLE, defStyle[idx]); |
||||
|
(void) sprintf(buf, "%d.Color", idx); |
||||
|
param_set(buf, PIXEL, DEF_BW_FOREGROUND); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Its color */ |
||||
|
param_set("Background", PIXEL, DEF_COL_BACKGROUND); |
||||
|
param_set("Border", PIXEL, DEF_COL_BORDER); |
||||
|
param_set("ZeroColor", PIXEL, DEF_COL_ZEROCOLOR); |
||||
|
param_set("ZeroWidth", INT, DEF_COL_ZEROWIDTH); |
||||
|
param_set("ZeroStyle", STYLE, DEF_COL_ZEROSTYLE); |
||||
|
param_set("Foreground", PIXEL, DEF_COL_FOREGROUND); |
||||
|
/* Initalize attribute colors defaults */ |
||||
|
for (idx = 0; idx < MAXATTR; idx++) { |
||||
|
(void) sprintf(buf, "%d.Style", idx); |
||||
|
param_set(buf, STYLE, defStyle[idx]); |
||||
|
(void) sprintf(buf, "%d.Color", idx); |
||||
|
param_set(buf, PIXEL, defColors[idx]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
param_set("LabelFont", FONT, DEF_LABEL_FONT); |
||||
|
param_set("TitleFont", FONT, DEF_TITLE_FONT); |
||||
|
/* PW */ |
||||
|
param_set("Animate", BOOL, DEF_ANIMATE); |
||||
|
param_set("DelayValue", INT, DEF_DELAY_VALUE); |
||||
|
|
||||
|
/* Initialize the data sets */ |
||||
|
for (idx = 0; idx < MAXSETS; idx++) { |
||||
|
(void) sprintf(buf, "Set %d", idx); |
||||
|
PlotData[idx].setName = STRDUP(buf); |
||||
|
PlotData[idx].list = (PointList *) 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static char *def_str; |
||||
|
|
||||
|
#define DEF(name, type) \ |
||||
|
if (def_str = XGetDefault(disp, Prog_Name, name)) { \ |
||||
|
param_set(name, type, def_str); \ |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
ReadDefaults() |
||||
|
/* |
||||
|
* Reads X default values which override the hard-coded defaults |
||||
|
* set up by InitSets. |
||||
|
*/ |
||||
|
{ |
||||
|
char newname[100]; |
||||
|
int idx; |
||||
|
|
||||
|
DEF("Debug", BOOL); |
||||
|
DEF("Geometry", STR); |
||||
|
DEF("Background", PIXEL); |
||||
|
DEF("BorderSize", INT); |
||||
|
DEF("Border", PIXEL); |
||||
|
DEF("GridSize", INT); |
||||
|
DEF("GridStyle", STYLE); |
||||
|
DEF("Foreground", PIXEL); |
||||
|
DEF("ZeroColor", PIXEL); |
||||
|
DEF("ZeroStyle", STYLE); |
||||
|
DEF("ZeroWidth", INT); |
||||
|
DEF("LabelFont", FONT); |
||||
|
DEF("TitleFont", FONT); |
||||
|
DEF("Ticks", BOOL); |
||||
|
DEF("TickAxis", BOOL); |
||||
|
DEF("Device", STR); |
||||
|
DEF("Disposition", STR); |
||||
|
DEF("FileOrDev", STR); |
||||
|
DEF("PixelMarkers", BOOL); |
||||
|
DEF("LargePixels", BOOL); |
||||
|
DEF("Markers", BOOL); |
||||
|
DEF("StyleMarkers", BOOL); |
||||
|
DEF("BoundBox", BOOL); |
||||
|
DEF("NoLines", BOOL); |
||||
|
DEF("LineWidth", INT); |
||||
|
/* PW */ |
||||
|
DEF("Animate",BOOL); |
||||
|
DEF("DelayValue",INT); |
||||
|
/* End PW */ |
||||
|
|
||||
|
/* Read device specific parameters */ |
||||
|
for (idx = 0; idx < hard_count; idx++) { |
||||
|
sprintf(newname, "%s.Dimension", hard_devices[idx].dev_name); |
||||
|
DEF(newname, DBL); /* hard_devices[idx].dev_max_dim */ |
||||
|
sprintf(newname, "%s.OutputTitleFont", hard_devices[idx].dev_name); |
||||
|
DEF(newname, STR); /* hard_devices[idx].dev_title_font */ |
||||
|
sprintf(newname, "%s.OutputTitleSize", hard_devices[idx].dev_name); |
||||
|
DEF(newname, DBL); /* hard_devices[idx].dev_title_size */ |
||||
|
sprintf(newname, "%s.OutputAxisFont", hard_devices[idx].dev_name); |
||||
|
DEF(newname, STR); /* hard_devices[idx].dev_axis_font */ |
||||
|
sprintf(newname, "%s.OutputAxisSize", hard_devices[idx].dev_name); |
||||
|
DEF(newname, DBL); /* hard_devices[idx].dev_axis_size */ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Read the default line and color attributes */ |
||||
|
for (idx = 0; idx < MAXATTR; idx++) { |
||||
|
(void) sprintf(newname, "%d.Style", idx); |
||||
|
DEF(newname, STYLE); /* AllAttrs[idx].lineStyleLen */ |
||||
|
(void) sprintf(newname, "%d.Color", idx); |
||||
|
DEF(newname, PIXEL); /* AllAttrs[idx].pixelValue */ |
||||
|
} |
||||
|
|
||||
|
DEF("ReverseVideo", BOOL); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#define FS(str) (void) fprintf(stderr, str) |
||||
|
|
||||
|
static void |
||||
|
argerror(err, val) |
||||
|
char *err, |
||||
|
*val; |
||||
|
{ |
||||
|
(void) fprintf(stderr, "Error: %s: %s\n\n", val, err); |
||||
|
|
||||
|
FS("Usage: xgraph [-device <ps|X|hpgl|idraw|tgif>]\n"); |
||||
|
FS("\t[-bd border_color] [-bg background_color] [-fg foreground_color]\n"); |
||||
|
FS("\t[-bar] [-brb bar_base] [-brw bar_width] [-bof bar_offset] [-stk]\n"); |
||||
|
FS("\t[-bw bdr_width] [-db] [-gw grid_size] [-fitx] [-fity]\n"); |
||||
|
FS("\t[-gs grid_style] [-lf label_font] [-lnx] [-lny] [-lw line_width]\n"); |
||||
|
FS("\t[-lx x1,x2] [-ly y1,y2] [-m] [-M] [-nl] [-ng] [-nb] [-p] [-P]\n"); |
||||
|
FS("\t[-rv] [-t title] [-tf title_font] [-tk] [-scale factor]\n"); |
||||
|
FS("\t[-x x_unit_name] [-y y_unit_name] [-fmtx format] [-fmty format]\n"); |
||||
|
FS("\t[[-geometry |=]W=H+X+Y] [[-display] <host>:<disp>.<screen>]\n"); |
||||
|
FS("\t[-Pprinter|-o output_file|-O output_file] [[-<digit> set_name]\n"); |
||||
|
FS("\t[-zg zero_color] [-zw zero_size] [-a] [-dl <delay>] input_files...\n\n"); |
||||
|
FS("-bar Draw bar graph with base -brb, width -brw, and offset -bof\n"); |
||||
|
FS("-stk Draw bar graph stacking data sets.\n"); |
||||
|
FS("-fitx Scale all sets to fit the x-axis [0,1].\n"); |
||||
|
FS("-fity Scale all sets to fit the y-axis [0,1].\n"); |
||||
|
FS("-fmtx Printf format for the x-axis\n"); |
||||
|
FS("-fmty Printf format for the y-axis\n"); |
||||
|
FS("-scale Scale the output file with factor\n"); |
||||
|
FS("-O fn Printer ready output file\n"); |
||||
|
FS("-o fn Encapsulated (document) output file\n"); |
||||
|
FS("-bb Draw bounding box around data\n"); |
||||
|
FS("-db Turn on debugging\n"); |
||||
|
FS("-lnx Logarithmic scale for X axis\n"); |
||||
|
FS("-lny Logarithmic scale for Y axis\n"); |
||||
|
FS("-m -M Mark points distinctively (M varies with color)\n"); |
||||
|
FS("-nl Don't draw lines (scatter plot)\n"); |
||||
|
FS("-ng Don't draw legend\n"); |
||||
|
FS("-nb Don't draw buttons\n"); |
||||
|
FS("-p -P Mark points with dot (P means big dot)\n"); |
||||
|
FS("-rv Reverse video on black and white displays\n"); |
||||
|
FS("-tk Draw tick marks instead of full grid\n"); |
||||
|
FS("-a Start in animation mode\n"); |
||||
|
FS("-dl Animation delay. Default is 2\n"); |
||||
|
|
||||
|
exit(1); |
||||
|
} |
||||
|
|
||||
|
#define ARG(opt, name) \ |
||||
|
if (strcmp(argv[idx], opt) == 0) { \ |
||||
|
if (do_it) param_set(name, BOOL, "on"); \ |
||||
|
idx++; continue; \ |
||||
|
} |
||||
|
|
||||
|
#define ARG2(opt, name, type, missing) \ |
||||
|
if (strcmp(argv[idx], opt) == 0) { \ |
||||
|
if (idx+1 >= argc) argerror(missing, argv[idx]); \ |
||||
|
if (do_it) param_set(name, type, argv[idx+1]); \ |
||||
|
idx += 2; continue;\ |
||||
|
} |
||||
|
|
||||
|
#define MAXLO 30 |
||||
|
|
||||
|
int |
||||
|
ParseArgs(argc, argv, do_it) |
||||
|
int argc; |
||||
|
char *argv[]; |
||||
|
int do_it; |
||||
|
|
||||
|
/* |
||||
|
* This routine parses the argument list for xgraph. There are too |
||||
|
* many to mention here so I won't. If `do_it' is non-zero, options |
||||
|
* are actually changed. If `do_it' is zero, the argument list |
||||
|
* is parsed but the options aren't set. The routine is called |
||||
|
* once to obtain the input files then again after the data is |
||||
|
* read to set the options. |
||||
|
*/ |
||||
|
{ |
||||
|
int idx, |
||||
|
set, |
||||
|
dflag; |
||||
|
char *hi; |
||||
|
|
||||
|
dflag = DEF_OUTPUT_DEVICE; |
||||
|
|
||||
|
idx = 1; |
||||
|
while (idx < argc) { |
||||
|
if (argv[idx][0] == '-') { |
||||
|
/* Check to see if its a data set name */ |
||||
|
if (sscanf(argv[idx], "-%d", &set) == 1) { |
||||
|
/* The next string is a set name */ |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing set name", argv[idx]); |
||||
|
if (do_it) { |
||||
|
PlotData[set].setName = argv[idx + 1]; |
||||
|
} |
||||
|
idx += 2; |
||||
|
} |
||||
|
else { |
||||
|
/* Some non-dataset option */ |
||||
|
ARG2("-x", "XUnitText", STR, "missing axis name"); |
||||
|
ARG2("-y", "YUnitText", STR, "missing axis name"); |
||||
|
ARG2("-t", "TitleText", STR, "missing plot title"); |
||||
|
ARG2("-fg", "Foreground", PIXEL, "missing color name"); |
||||
|
ARG2("-bg", "Background", PIXEL, "missing color name"); |
||||
|
ARG2("-bd", "Border", PIXEL, "missing color name"); |
||||
|
ARG2("-bw", "BorderSize", INT, "missing border size"); |
||||
|
ARG2("-zg", "ZeroColor", PIXEL, "missing color name"); |
||||
|
ARG2("-zw", "ZeroWidth", INT, "missing width"); |
||||
|
ARG2("-tf", "TitleFont", FONT, "missing font name"); |
||||
|
ARG2("-lf", "LabelFont", FONT, "missing font name"); |
||||
|
/* PW */ |
||||
|
ARG2("-dl", "DelayValue", INT, "missing delay value"); |
||||
|
/* Doesn't make much sense to PW why this must be |
||||
|
switched, but it must. */ |
||||
|
ARG2("-digy", "Format X", STR, "Missing C-String"); |
||||
|
ARG2("-digx", "Format Y", STR, "Missing C-String"); |
||||
|
ARG("-a", "Animate"); |
||||
|
/* End PW */ |
||||
|
ARG("-rv", "ReverseVideo"); |
||||
|
ARG("-tk", "Ticks"); |
||||
|
ARG("-tkax", "TickAxis"); |
||||
|
ARG("-bb", "BoundBox"); |
||||
|
if (strcmp(argv[idx], "-lx") == 0) { |
||||
|
/* Limit the X coordinates */ |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing coordinate(s)", |
||||
|
argv[idx]); |
||||
|
if (hi = index(argv[idx + 1], ',')) { |
||||
|
char low[MAXLO]; |
||||
|
|
||||
|
(void) strncpy(low, argv[idx + 1], hi - argv[idx + 1]); |
||||
|
low[hi - argv[idx + 1]] = '\0'; |
||||
|
hi++; |
||||
|
if (do_it) { |
||||
|
param_set("XLowLimit", DBL, argv[idx + 1]); |
||||
|
param_set("XHighLimit", DBL, hi); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
argerror("limit coordinates not specified right", |
||||
|
argv[idx]); |
||||
|
} |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-ly") == 0) { |
||||
|
/* Limit the Y coordinates */ |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing coordinate(s)", |
||||
|
argv[idx]); |
||||
|
if (hi = index(argv[idx + 1], ',')) { |
||||
|
char low[MAXLO]; |
||||
|
|
||||
|
(void) strncpy(low, argv[idx + 1], hi - argv[idx + 1]); |
||||
|
low[hi - argv[idx + 1]] = '\0'; |
||||
|
hi++; |
||||
|
if (do_it) { |
||||
|
param_set("YLowLimit", DBL, argv[idx + 1]); |
||||
|
param_set("YHighLimit", DBL, hi); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
argerror("limit coordinates not specified right", |
||||
|
argv[idx]); |
||||
|
} |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
ARG2("-lw", "LineWidth", INT, "missing line width"); |
||||
|
ARG("-nl", "NoLines"); |
||||
|
ARG("-ng", "NoLegend"); |
||||
|
ARG("-nb", "NoButton"); |
||||
|
ARG("-m", "Markers"); |
||||
|
ARG("-M", "StyleMarkers"); |
||||
|
ARG("-p", "PixelMarkers"); |
||||
|
ARG("-P", "LargePixels"); |
||||
|
ARG("-lnx", "LogX"); |
||||
|
ARG("-lny", "LogY"); |
||||
|
ARG("-bar", "BarGraph"); |
||||
|
ARG("-stk", "StackGraph"); |
||||
|
ARG("-fitx", "FitX"); |
||||
|
ARG("-fity", "FitY"); |
||||
|
ARG2("-brw", "BarWidth", DBL, "missing width"); |
||||
|
ARG2("-bof", "BarOffset", DBL, "missing offset"); |
||||
|
ARG2("-brb", "BarBase", DBL, "missing base"); |
||||
|
ARG("-db", "Debug"); |
||||
|
ARG2("-gw", "GridSize", INT, "missing grid size"); |
||||
|
ARG2("-gs", "GridStyle", STYLE, "missing grid style"); |
||||
|
if (strcmp(argv[idx], "-display") == 0) { |
||||
|
/* Harmless display specification */ |
||||
|
dflag = D_XWINDOWS; |
||||
|
disp_name = argv[idx+1]; |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-geometry") == 0) { |
||||
|
if (do_it) |
||||
|
param_set("Geometry", STR, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-device") == 0) { |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing device", argv[idx]); |
||||
|
if (strcmp(argv[++idx], "hpgl") == 0) |
||||
|
dflag = D_HPGL; |
||||
|
else if (strcmp(argv[idx], "idraw") == 0) |
||||
|
dflag = D_IDRAW; |
||||
|
else if (strcmp(argv[idx], "x") == 0) |
||||
|
dflag = D_XWINDOWS; |
||||
|
else if (strcmp(argv[idx], "ps") == 0) |
||||
|
dflag = D_POSTSCRIPT; |
||||
|
else if (strcmp(argv[idx], "tgif") == 0) |
||||
|
dflag = D_TGIF; |
||||
|
else |
||||
|
argerror("bad device specification", argv[idx]); |
||||
|
idx++; |
||||
|
continue; |
||||
|
} |
||||
|
if (strncmp(argv[idx], "-P", 2) == 0) { |
||||
|
/* Printer spec */ |
||||
|
if (do_it) |
||||
|
param_set("Disposition", STR, "To Device"); |
||||
|
if (do_it) |
||||
|
param_set("FileOrDev", STR, &(argv[idx][2])); |
||||
|
idx++; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-o") == 0) { |
||||
|
if (do_it) |
||||
|
param_set("Disposition", STR, "To File"); |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing file", argv[idx]); |
||||
|
if (do_it) |
||||
|
param_set("FileOrDev", STR, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-O") == 0) { |
||||
|
if (do_it) |
||||
|
param_set("Disposition", STR, "To File"); |
||||
|
if (do_it) |
||||
|
param_set("Document", BOOL, "on"); |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing file", argv[idx]); |
||||
|
if (do_it) |
||||
|
param_set("FileOrDev", STR, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-fmtx") == 0) { |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing x format", argv[idx]); |
||||
|
if (do_it) |
||||
|
param_set("Format Y", STR, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-fmty") == 0) { |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("missing y format", argv[idx]); |
||||
|
if (do_it) |
||||
|
param_set("Format X", STR, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
if (strcmp(argv[idx], "-scale") == 0) { |
||||
|
if (idx + 1 >= argc) |
||||
|
argerror("scale factor", argv[idx]); |
||||
|
if (do_it) |
||||
|
param_set("Scale", DBL, argv[idx + 1]); |
||||
|
idx += 2; |
||||
|
continue; |
||||
|
} |
||||
|
argerror("unknown option", argv[idx]); |
||||
|
} |
||||
|
} |
||||
|
else if (argv[idx][0] == '=') { |
||||
|
/* Its a geometry specification */ |
||||
|
if (do_it) |
||||
|
param_set("Geometry", STR, argv[idx] + 1); |
||||
|
idx++; |
||||
|
} |
||||
|
else { |
||||
|
/* It might be the host:display string */ |
||||
|
if (rindex(argv[idx], ':') == (char *) 0) { |
||||
|
/* Should be an input file */ |
||||
|
inFileNames[numFiles] = argv[idx]; |
||||
|
numFiles++; |
||||
|
} |
||||
|
idx++; |
||||
|
} |
||||
|
} |
||||
|
return (dflag); |
||||
|
} |
||||
@ -0,0 +1,251 @@ |
|||||
|
#!/bin/sh |
||||
|
# |
||||
|
# install - install a program, script, or datafile |
||||
|
# This comes from X11R5 (mit/util/scripts/install.sh). |
||||
|
# |
||||
|
# Copyright 1991 by the Massachusetts Institute of Technology |
||||
|
# |
||||
|
# Permission to use, copy, modify, distribute, and sell this software and its |
||||
|
# documentation for any purpose is hereby granted without fee, provided that |
||||
|
# the above copyright notice appear in all copies and that both that |
||||
|
# copyright notice and this permission notice appear in supporting |
||||
|
# documentation, and that the name of M.I.T. not be used in advertising or |
||||
|
# publicity pertaining to distribution of the software without specific, |
||||
|
# written prior permission. M.I.T. makes no representations about the |
||||
|
# suitability of this software for any purpose. It is provided "as is" |
||||
|
# without express or implied warranty. |
||||
|
# |
||||
|
# Calling this script install-sh is preferred over install.sh, to prevent |
||||
|
# `make' implicit rules from creating a file called install from it |
||||
|
# when there is no Makefile. |
||||
|
# |
||||
|
# This script is compatible with the BSD install script, but was written |
||||
|
# from scratch. It can only install one file at a time, a restriction |
||||
|
# shared with many OS's install programs. |
||||
|
|
||||
|
|
||||
|
# set DOITPROG to echo to test this script |
||||
|
|
||||
|
# Don't use :- since 4.3BSD and earlier shells don't like it. |
||||
|
doit="${DOITPROG-}" |
||||
|
|
||||
|
|
||||
|
# put in absolute paths if you don't have them in your path; or use env. vars. |
||||
|
|
||||
|
mvprog="${MVPROG-mv}" |
||||
|
cpprog="${CPPROG-cp}" |
||||
|
chmodprog="${CHMODPROG-chmod}" |
||||
|
chownprog="${CHOWNPROG-chown}" |
||||
|
chgrpprog="${CHGRPPROG-chgrp}" |
||||
|
stripprog="${STRIPPROG-strip}" |
||||
|
rmprog="${RMPROG-rm}" |
||||
|
mkdirprog="${MKDIRPROG-mkdir}" |
||||
|
|
||||
|
transformbasename="" |
||||
|
transform_arg="" |
||||
|
instcmd="$mvprog" |
||||
|
chmodcmd="$chmodprog 0755" |
||||
|
chowncmd="" |
||||
|
chgrpcmd="" |
||||
|
stripcmd="" |
||||
|
rmcmd="$rmprog -f" |
||||
|
mvcmd="$mvprog" |
||||
|
src="" |
||||
|
dst="" |
||||
|
dir_arg="" |
||||
|
|
||||
|
while [ x"$1" != x ]; do |
||||
|
case $1 in |
||||
|
-c) instcmd="$cpprog" |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-d) dir_arg=true |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-m) chmodcmd="$chmodprog $2" |
||||
|
shift |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-o) chowncmd="$chownprog $2" |
||||
|
shift |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-g) chgrpcmd="$chgrpprog $2" |
||||
|
shift |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-s) stripcmd="$stripprog" |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-t=*) transformarg=`echo $1 | sed 's/-t=//'` |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
-b=*) transformbasename=`echo $1 | sed 's/-b=//'` |
||||
|
shift |
||||
|
continue;; |
||||
|
|
||||
|
*) if [ x"$src" = x ] |
||||
|
then |
||||
|
src=$1 |
||||
|
else |
||||
|
# this colon is to work around a 386BSD /bin/sh bug |
||||
|
: |
||||
|
dst=$1 |
||||
|
fi |
||||
|
shift |
||||
|
continue;; |
||||
|
esac |
||||
|
done |
||||
|
|
||||
|
if [ x"$src" = x ] |
||||
|
then |
||||
|
echo "install: no input file specified" |
||||
|
exit 1 |
||||
|
else |
||||
|
true |
||||
|
fi |
||||
|
|
||||
|
if [ x"$dir_arg" != x ]; then |
||||
|
dst=$src |
||||
|
src="" |
||||
|
|
||||
|
if [ -d $dst ]; then |
||||
|
instcmd=: |
||||
|
chmodcmd="" |
||||
|
else |
||||
|
instcmd=mkdir |
||||
|
fi |
||||
|
else |
||||
|
|
||||
|
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command |
||||
|
# might cause directories to be created, which would be especially bad |
||||
|
# if $src (and thus $dsttmp) contains '*'. |
||||
|
|
||||
|
if [ -f $src -o -d $src ] |
||||
|
then |
||||
|
true |
||||
|
else |
||||
|
echo "install: $src does not exist" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
if [ x"$dst" = x ] |
||||
|
then |
||||
|
echo "install: no destination specified" |
||||
|
exit 1 |
||||
|
else |
||||
|
true |
||||
|
fi |
||||
|
|
||||
|
# If destination is a directory, append the input filename; if your system |
||||
|
# does not like double slashes in filenames, you may need to add some logic |
||||
|
|
||||
|
if [ -d $dst ] |
||||
|
then |
||||
|
dst="$dst"/`basename $src` |
||||
|
else |
||||
|
true |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
## this sed command emulates the dirname command |
||||
|
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` |
||||
|
|
||||
|
# Make sure that the destination directory exists. |
||||
|
# this part is taken from Noah Friedman's mkinstalldirs script |
||||
|
|
||||
|
# Skip lots of stat calls in the usual case. |
||||
|
if [ ! -d "$dstdir" ]; then |
||||
|
defaultIFS=' |
||||
|
' |
||||
|
IFS="${IFS-${defaultIFS}}" |
||||
|
|
||||
|
oIFS="${IFS}" |
||||
|
# Some sh's can't handle IFS=/ for some reason. |
||||
|
IFS='%' |
||||
|
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` |
||||
|
IFS="${oIFS}" |
||||
|
|
||||
|
pathcomp='' |
||||
|
|
||||
|
while [ $# -ne 0 ] ; do |
||||
|
pathcomp="${pathcomp}${1}" |
||||
|
shift |
||||
|
|
||||
|
if [ ! -d "${pathcomp}" ] ; |
||||
|
then |
||||
|
$mkdirprog "${pathcomp}" |
||||
|
else |
||||
|
true |
||||
|
fi |
||||
|
|
||||
|
pathcomp="${pathcomp}/" |
||||
|
done |
||||
|
fi |
||||
|
|
||||
|
if [ x"$dir_arg" != x ] |
||||
|
then |
||||
|
$doit $instcmd $dst && |
||||
|
|
||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && |
||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && |
||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && |
||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi |
||||
|
else |
||||
|
|
||||
|
# If we're going to rename the final executable, determine the name now. |
||||
|
|
||||
|
if [ x"$transformarg" = x ] |
||||
|
then |
||||
|
dstfile=`basename $dst` |
||||
|
else |
||||
|
dstfile=`basename $dst $transformbasename | |
||||
|
sed $transformarg`$transformbasename |
||||
|
fi |
||||
|
|
||||
|
# don't allow the sed command to completely eliminate the filename |
||||
|
|
||||
|
if [ x"$dstfile" = x ] |
||||
|
then |
||||
|
dstfile=`basename $dst` |
||||
|
else |
||||
|
true |
||||
|
fi |
||||
|
|
||||
|
# Make a temp file name in the proper directory. |
||||
|
|
||||
|
dsttmp=$dstdir/#inst.$$# |
||||
|
|
||||
|
# Move or copy the file name to the temp name |
||||
|
|
||||
|
$doit $instcmd $src $dsttmp && |
||||
|
|
||||
|
trap "rm -f ${dsttmp}" 0 && |
||||
|
|
||||
|
# and set any options; do chmod last to preserve setuid bits |
||||
|
|
||||
|
# If any of these fail, we abort the whole thing. If we want to |
||||
|
# ignore errors from any of these, just make sure not to ignore |
||||
|
# errors from the above "$doit $instcmd $src $dsttmp" command. |
||||
|
|
||||
|
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && |
||||
|
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && |
||||
|
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && |
||||
|
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && |
||||
|
|
||||
|
# Now rename the file to the real destination. |
||||
|
|
||||
|
$doit $rmcmd -f $dstdir/$dstfile && |
||||
|
$doit $mvcmd $dsttmp $dstdir/$dstfile |
||||
|
|
||||
|
fi && |
||||
|
|
||||
|
|
||||
|
exit 0 |
||||
@ -0,0 +1,190 @@ |
|||||
|
#! /bin/sh |
||||
|
# Common stub for a few missing GNU programs while installing. |
||||
|
# Copyright (C) 1996, 1997 Free Software Foundation, Inc. |
||||
|
# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996. |
||||
|
|
||||
|
# This program is free software; you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU General Public License as published by |
||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||
|
# any later version. |
||||
|
|
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
|
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, write to the Free Software |
||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
||||
|
# 02111-1307, USA. |
||||
|
|
||||
|
if test $# -eq 0; then |
||||
|
echo 1>&2 "Try \`$0 --help' for more information" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
case "$1" in |
||||
|
|
||||
|
-h|--h|--he|--hel|--help) |
||||
|
echo "\ |
||||
|
$0 [OPTION]... PROGRAM [ARGUMENT]... |
||||
|
|
||||
|
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an |
||||
|
error status if there is no known handling for PROGRAM. |
||||
|
|
||||
|
Options: |
||||
|
-h, --help display this help and exit |
||||
|
-v, --version output version information and exit |
||||
|
|
||||
|
Supported PROGRAM values: |
||||
|
aclocal touch file \`aclocal.m4' |
||||
|
autoconf touch file \`configure' |
||||
|
autoheader touch file \`config.h.in' |
||||
|
automake touch all \`Makefile.in' files |
||||
|
bison create \`y.tab.[ch]', if possible, from existing .[ch] |
||||
|
flex create \`lex.yy.c', if possible, from existing .c |
||||
|
lex create \`lex.yy.c', if possible, from existing .c |
||||
|
makeinfo touch the output file |
||||
|
yacc create \`y.tab.[ch]', if possible, from existing .[ch]" |
||||
|
;; |
||||
|
|
||||
|
-v|--v|--ve|--ver|--vers|--versi|--versio|--version) |
||||
|
echo "missing - GNU libit 0.0" |
||||
|
;; |
||||
|
|
||||
|
-*) |
||||
|
echo 1>&2 "$0: Unknown \`$1' option" |
||||
|
echo 1>&2 "Try \`$0 --help' for more information" |
||||
|
exit 1 |
||||
|
;; |
||||
|
|
||||
|
aclocal) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified \`acinclude.m4' or \`configure.in'. You might want |
||||
|
to install the \`Automake' and \`Perl' packages. Grab them from |
||||
|
any GNU archive site." |
||||
|
touch aclocal.m4 |
||||
|
;; |
||||
|
|
||||
|
autoconf) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified \`configure.in'. You might want to install the |
||||
|
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU |
||||
|
archive site." |
||||
|
touch configure |
||||
|
;; |
||||
|
|
||||
|
autoheader) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified \`acconfig.h' or \`configure.in'. You might want |
||||
|
to install the \`Autoconf' and \`GNU m4' packages. Grab them |
||||
|
from any GNU archive site." |
||||
|
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` |
||||
|
test -z "$files" && files="config.h" |
||||
|
touch_files= |
||||
|
for f in $files; do |
||||
|
case "$f" in |
||||
|
*:*) touch_files="$touch_files "`echo "$f" | |
||||
|
sed -e 's/^[^:]*://' -e 's/:.*//'`;; |
||||
|
*) touch_files="$touch_files $f.in";; |
||||
|
esac |
||||
|
done |
||||
|
touch $touch_files |
||||
|
;; |
||||
|
|
||||
|
automake) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. |
||||
|
You might want to install the \`Automake' and \`Perl' packages. |
||||
|
Grab them from any GNU archive site." |
||||
|
find . -type f -name Makefile.am -print | |
||||
|
sed 's/\.am$/.in/' | |
||||
|
while read f; do touch "$f"; done |
||||
|
;; |
||||
|
|
||||
|
bison|yacc) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified a \`.y' file. You may need the \`Bison' package |
||||
|
in order for those modifications to take effect. You can get |
||||
|
\`Bison' from any GNU archive site." |
||||
|
rm -f y.tab.c y.tab.h |
||||
|
if [ $# -ne 1 ]; then |
||||
|
eval LASTARG="\${$#}" |
||||
|
case "$LASTARG" in |
||||
|
*.y) |
||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` |
||||
|
if [ -f "$SRCFILE" ]; then |
||||
|
cp "$SRCFILE" y.tab.c |
||||
|
fi |
||||
|
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` |
||||
|
if [ -f "$SRCFILE" ]; then |
||||
|
cp "$SRCFILE" y.tab.h |
||||
|
fi |
||||
|
;; |
||||
|
esac |
||||
|
fi |
||||
|
if [ ! -f y.tab.h ]; then |
||||
|
echo >y.tab.h |
||||
|
fi |
||||
|
if [ ! -f y.tab.c ]; then |
||||
|
echo 'main() { return 0; }' >y.tab.c |
||||
|
fi |
||||
|
;; |
||||
|
|
||||
|
lex|flex) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified a \`.l' file. You may need the \`Flex' package |
||||
|
in order for those modifications to take effect. You can get |
||||
|
\`Flex' from any GNU archive site." |
||||
|
rm -f lex.yy.c |
||||
|
if [ $# -ne 1 ]; then |
||||
|
eval LASTARG="\${$#}" |
||||
|
case "$LASTARG" in |
||||
|
*.l) |
||||
|
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` |
||||
|
if [ -f "$SRCFILE" ]; then |
||||
|
cp "$SRCFILE" lex.yy.c |
||||
|
fi |
||||
|
;; |
||||
|
esac |
||||
|
fi |
||||
|
if [ ! -f lex.yy.c ]; then |
||||
|
echo 'main() { return 0; }' >lex.yy.c |
||||
|
fi |
||||
|
;; |
||||
|
|
||||
|
makeinfo) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is missing on your system. You should only need it if |
||||
|
you modified a \`.texi' or \`.texinfo' file, or any other file |
||||
|
indirectly affecting the aspect of the manual. The spurious |
||||
|
call might also be the consequence of using a buggy \`make' (AIX, |
||||
|
DU, IRIX). You might want to install the \`Texinfo' package or |
||||
|
the \`GNU make' package. Grab either from any GNU archive site." |
||||
|
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` |
||||
|
if test -z "$file"; then |
||||
|
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` |
||||
|
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` |
||||
|
fi |
||||
|
touch $file |
||||
|
;; |
||||
|
|
||||
|
*) |
||||
|
echo 1>&2 "\ |
||||
|
WARNING: \`$1' is needed, and you do not seem to have it handy on your |
||||
|
system. You might have modified some files without having the |
||||
|
proper tools for further handling them. Check the \`README' file, |
||||
|
it often tells you about the needed prerequirements for installing |
||||
|
this package. You may also peek at any GNU archive site, in case |
||||
|
some other package would contain this missing \`$1' program." |
||||
|
exit 1 |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
exit 0 |
||||
@ -0,0 +1,40 @@ |
|||||
|
#! /bin/sh |
||||
|
# mkinstalldirs --- make directory hierarchy |
||||
|
# Author: Noah Friedman <friedman@prep.ai.mit.edu> |
||||
|
# Created: 1993-05-16 |
||||
|
# Public domain |
||||
|
|
||||
|
# $Id$ |
||||
|
|
||||
|
errstatus=0 |
||||
|
|
||||
|
for file |
||||
|
do |
||||
|
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` |
||||
|
shift |
||||
|
|
||||
|
pathcomp= |
||||
|
for d |
||||
|
do |
||||
|
pathcomp="$pathcomp$d" |
||||
|
case "$pathcomp" in |
||||
|
-* ) pathcomp=./$pathcomp ;; |
||||
|
esac |
||||
|
|
||||
|
if test ! -d "$pathcomp"; then |
||||
|
echo "mkdir $pathcomp" |
||||
|
|
||||
|
mkdir "$pathcomp" || lasterr=$? |
||||
|
|
||||
|
if test ! -d "$pathcomp"; then |
||||
|
errstatus=$lasterr |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
pathcomp="$pathcomp/" |
||||
|
done |
||||
|
done |
||||
|
|
||||
|
exit $errstatus |
||||
|
|
||||
|
# mkinstalldirs ends here |
||||
@ -0,0 +1,567 @@ |
|||||
|
/* $Header$ */ |
||||
|
/* |
||||
|
* Xgraph Parameters |
||||
|
* |
||||
|
* This file contains routines for setting and retrieving |
||||
|
* various X style display parameters for xgraph. |
||||
|
* |
||||
|
* $Log$ |
||||
|
* Revision 1.1 2004-01-25 09:00:49 pnenzi |
||||
|
* |
||||
|
* Added xgraph plotting program. |
||||
|
* |
||||
|
* Revision 1.2 1999/12/08 19:32:41 heideman |
||||
|
* strcasecmp portability fix |
||||
|
* |
||||
|
* Revision 1.1.1.1 1999/12/03 23:15:52 heideman |
||||
|
* xgraph-12.0 |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef lint |
||||
|
static char rcsid[] = "$Id$"; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
#include <ctype.h> |
||||
|
#include <stdio.h> |
||||
|
#include "st.h" |
||||
|
#include "params.h" |
||||
|
#include "hard_devices.h" |
||||
|
#include "xgraph.h" /* for string.h */ |
||||
|
|
||||
|
/* For use by convenience macros */ |
||||
|
params param_temp, |
||||
|
*param_temp_ptr; |
||||
|
XColor param_null_color = |
||||
|
{0, 0, 0, 0, 0, 0}; |
||||
|
param_style param_null_style = |
||||
|
{STYLE, 0, (char *) 0}; |
||||
|
|
||||
|
static st_table *param_table = (st_table *) 0; |
||||
|
|
||||
|
typedef struct param_full_defn { |
||||
|
param_types type; |
||||
|
char *text_form; |
||||
|
params *real_form; |
||||
|
} param_full; |
||||
|
|
||||
|
|
||||
|
#define ISO_FONT "*-*-%s-medium-r-normal-*-*-%d-*-*-*-*-iso8859-*" |
||||
|
static Display *param_disp; |
||||
|
static Colormap param_cmap; |
||||
|
static int param_scrn; |
||||
|
|
||||
|
static void free_resource(); |
||||
|
static params *resolve_entry(); |
||||
|
static int strihash(); |
||||
|
static int do_color(); |
||||
|
static int do_font(); |
||||
|
static int do_style(); |
||||
|
static int do_bool(); |
||||
|
|
||||
|
#define DEF_INT "0" |
||||
|
#define DEF_STR "" |
||||
|
#define DEF_FONT "fixed" |
||||
|
#define DEF_PIXEL "black" |
||||
|
#define DEF_STYLE "1" |
||||
|
#define DEF_BOOL "false" |
||||
|
#define DEF_DBL "0.0" |
||||
|
|
||||
|
#define DEF_MAX_FONT 1024 |
||||
|
#define DEF_MAX_NAMES 10 |
||||
|
|
||||
|
#define DUP(str) \ |
||||
|
strcpy((char *) Malloc((unsigned) (strlen(str)+1)), (str)) |
||||
|
|
||||
|
|
||||
|
void |
||||
|
param_init(disp, cmap) |
||||
|
Display *disp; /* X Connection */ |
||||
|
Colormap cmap; /* Colormap for colors */ |
||||
|
|
||||
|
/* |
||||
|
* Initializes parameter package. The display and colormap arguments |
||||
|
* are used to resolve font and pixel values. |
||||
|
*/ |
||||
|
{ |
||||
|
param_table = st_init_table(stricmp, strihash); |
||||
|
if (disp != NULL) { |
||||
|
param_disp = disp; |
||||
|
param_cmap = cmap; |
||||
|
/* This could also be a parameter for greater generality */ |
||||
|
param_scrn = DefaultScreen(disp); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
param_set(name, type, val) |
||||
|
char *name; /* Name of parameter */ |
||||
|
param_types type; /* Type */ |
||||
|
char *val; /* Text form for value */ |
||||
|
|
||||
|
/* |
||||
|
* Sets the parameter with the given name to have the type |
||||
|
* `type' and the text value `value'. This will be evaluated |
||||
|
* to its full form the first time it is referenced using |
||||
|
* param_get(). If it is already filled, the old value |
||||
|
* will be reclaimed. |
||||
|
*/ |
||||
|
{ |
||||
|
param_full *entry; |
||||
|
|
||||
|
if (!param_table) { |
||||
|
(void) fprintf(stderr, "Parameter table not initialized\n"); |
||||
|
return; |
||||
|
} |
||||
|
if (st_lookup(param_table, name, (char **) &entry)) { |
||||
|
if (entry->real_form) |
||||
|
free_resource(entry->real_form); |
||||
|
entry->real_form = (params *) 0; |
||||
|
} |
||||
|
else { |
||||
|
entry = (param_full *) Malloc(sizeof(param_full)); |
||||
|
entry->text_form = (char *) 0; |
||||
|
entry->real_form = (params *) 0; |
||||
|
(void) st_insert(param_table, DUP(name), (char *) entry); |
||||
|
} |
||||
|
entry->type = type; |
||||
|
if (entry->text_form) |
||||
|
(void) Free((char *) (entry->text_form)); |
||||
|
entry->text_form = DUP(val); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void |
||||
|
param_reset(name, val) |
||||
|
char *name; /* Name of parameter */ |
||||
|
char *val; /* Text form for value */ |
||||
|
|
||||
|
/* |
||||
|
* This routine sets the value of an existing parameter to a new |
||||
|
* value. The type of the parameter remains the same. Changes |
||||
|
* in type should be done by using param_set() directly. |
||||
|
*/ |
||||
|
{ |
||||
|
param_full *entry; |
||||
|
|
||||
|
if (!param_table) { |
||||
|
(void) fprintf(stderr, "Parameter table not initialized\n"); |
||||
|
return; |
||||
|
} |
||||
|
if (st_lookup(param_table, name, (char **) &entry)) |
||||
|
param_set(name, entry->type, val); |
||||
|
else |
||||
|
(void) fprintf(stderr, "Cannot reset unknown parameter `%s'\n", name); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
params * |
||||
|
param_get(name, val) |
||||
|
char *name; /* Name of parameter */ |
||||
|
params *val; /* Result value */ |
||||
|
|
||||
|
/* |
||||
|
* Retrieves a value from the parameter table. The value |
||||
|
* is placed in `val'. If successful, the routine will |
||||
|
* return `val'. Otherwise, it will return zero. |
||||
|
*/ |
||||
|
{ |
||||
|
param_full *entry; |
||||
|
|
||||
|
if (!param_table) { |
||||
|
(void) fprintf(stderr, "Parameter table not initialized\n"); |
||||
|
return (params *) 0; |
||||
|
} |
||||
|
if (st_lookup(param_table, name, (char **) &entry)) { |
||||
|
if (!entry->real_form) |
||||
|
entry->real_form = resolve_entry(name, entry->type, |
||||
|
entry->text_form); |
||||
|
*val = *(entry->real_form); |
||||
|
return val; |
||||
|
} |
||||
|
else { |
||||
|
return (params *) 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void |
||||
|
free_resource(val) |
||||
|
params *val; /* Value to free */ |
||||
|
|
||||
|
/* |
||||
|
* Reclaims a resource based on its type. |
||||
|
*/ |
||||
|
{ |
||||
|
switch (val->type) { |
||||
|
case INT: |
||||
|
case STR: |
||||
|
case BOOL: |
||||
|
case DBL: |
||||
|
/* No reclaimation necessary */ |
||||
|
break; |
||||
|
case PIXEL: |
||||
|
if ((val->pixv.value.pixel != WhitePixel(param_disp, param_scrn)) && |
||||
|
(val->pixv.value.pixel != BlackPixel(param_disp, param_scrn))) |
||||
|
XFreeColors(param_disp, param_cmap, &(val->pixv.value.pixel), 1, 0); |
||||
|
break; |
||||
|
case FONT: |
||||
|
XFreeFont(param_disp, val->fontv.value); |
||||
|
break; |
||||
|
case STYLE: |
||||
|
(void) Free(val->stylev.dash_list); |
||||
|
break; |
||||
|
} |
||||
|
(void) Free((char *) val); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static params * |
||||
|
resolve_entry(name, type, form) |
||||
|
char *name; /* Name of item for errors */ |
||||
|
param_types type; /* What type of thing */ |
||||
|
char *form; /* Textual form */ |
||||
|
|
||||
|
/* |
||||
|
* Allocates and returns an appropriate parameter structure |
||||
|
* by translating `form' into its native type as given by `type'. |
||||
|
* If it can't translate the given form, it will fall back onto |
||||
|
* the default. |
||||
|
*/ |
||||
|
{ |
||||
|
static char paramstr[] = |
||||
|
"Parameter %s: can't translate `%s' into a %s (defaulting to `%s')\n"; |
||||
|
params *result = (params *) Malloc(sizeof(params)); |
||||
|
|
||||
|
result->type = type; |
||||
|
switch (type) { |
||||
|
case INT: |
||||
|
if (sscanf(form, "%d", &result->intv.value) != 1) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "integer", DEF_INT); |
||||
|
result->intv.value = atoi(DEF_INT); |
||||
|
} |
||||
|
break; |
||||
|
case STR: |
||||
|
result->strv.value = form; |
||||
|
break; |
||||
|
case PIXEL: |
||||
|
if (!do_color(form, &result->pixv.value)) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "color", DEF_PIXEL); |
||||
|
(void) do_color(DEF_PIXEL, &result->pixv.value); |
||||
|
} |
||||
|
break; |
||||
|
case FONT: |
||||
|
if (!do_font(form, &result->fontv.value)) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "font", DEF_FONT); |
||||
|
(void) do_font(DEF_FONT, &result->fontv.value); |
||||
|
} |
||||
|
break; |
||||
|
case STYLE: |
||||
|
if (!do_style(form, &result->stylev)) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "line style", |
||||
|
DEF_STYLE); |
||||
|
(void) do_style(DEF_STYLE, &result->stylev); |
||||
|
} |
||||
|
break; |
||||
|
case BOOL: |
||||
|
if (!do_bool(form, &result->boolv.value)) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "boolean flag", |
||||
|
DEF_BOOL); |
||||
|
(void) do_bool(DEF_BOOL, &result->boolv.value); |
||||
|
} |
||||
|
break; |
||||
|
case DBL: |
||||
|
if (sscanf(form, "%lf", &result->dblv.value) != 1) { |
||||
|
(void) fprintf(stderr, paramstr, name, form, "double", DEF_DBL); |
||||
|
result->dblv.value = atof(DEF_DBL); |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static int |
||||
|
do_color(name, color) |
||||
|
char *name; /* Name for color */ |
||||
|
XColor *color; /* Returned color */ |
||||
|
|
||||
|
/* |
||||
|
* Translates `name' into a color and attempts to get the pixel |
||||
|
* for the color using XAllocColor(). |
||||
|
*/ |
||||
|
{ |
||||
|
int result = 1; |
||||
|
|
||||
|
if (PM_INT("Output Device") == D_XWINDOWS) { |
||||
|
if (XParseColor(param_disp, param_cmap, name, color)) { |
||||
|
if (stricmp(name, "black") == 0) { |
||||
|
color->pixel = BlackPixel(param_disp, param_scrn); |
||||
|
XQueryColor(param_disp, param_cmap, color); |
||||
|
} |
||||
|
else if (stricmp(name, "white") == 0) { |
||||
|
color->pixel = WhitePixel(param_disp, param_scrn); |
||||
|
XQueryColor(param_disp, param_cmap, color); |
||||
|
} |
||||
|
else |
||||
|
result = XAllocColor(param_disp, param_cmap, color); |
||||
|
} |
||||
|
else |
||||
|
result = 0; |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static int |
||||
|
do_font(name, font_info) |
||||
|
char *name; /* Name of desired font */ |
||||
|
XFontStruct **font_info; /* Returned font information */ |
||||
|
|
||||
|
/* |
||||
|
* This routine translates a font name into a font structure. The |
||||
|
* font name can be in two forms. The first form is <family>-<size>. |
||||
|
* The family is a family name (like helvetica) and the size is |
||||
|
* in points (like 12). If the font is not in this form, it |
||||
|
* is assumed to be a regular X font name specification and |
||||
|
* is looked up using the standard means. |
||||
|
*/ |
||||
|
{ |
||||
|
char name_copy[DEF_MAX_FONT], |
||||
|
query_spec[DEF_MAX_FONT]; |
||||
|
char *font_family, |
||||
|
*font_size, |
||||
|
**font_list; |
||||
|
int font_size_value, |
||||
|
font_count, |
||||
|
i; |
||||
|
|
||||
|
/* First attempt to interpret as font family/size */ |
||||
|
if (PM_INT("Output Device") == D_XWINDOWS) { |
||||
|
(void) strcpy(name_copy, name); |
||||
|
if (font_size = index(name_copy, '-')) { |
||||
|
*font_size = '\0'; |
||||
|
font_family = name_copy; |
||||
|
font_size++; |
||||
|
font_size_value = atoi(font_size); |
||||
|
if (font_size_value > 0) { |
||||
|
/* |
||||
|
* Still a little iffy -- what about weight and roman vs. other |
||||
|
*/ |
||||
|
(void) sprintf(query_spec, ISO_FONT, |
||||
|
font_family, font_size_value * 10); |
||||
|
font_list = XListFonts(param_disp, query_spec, |
||||
|
DEF_MAX_NAMES, &font_count); |
||||
|
|
||||
|
/* Load first one that you can */ |
||||
|
for (i = 0; i < font_count; i++) |
||||
|
if (*font_info = XLoadQueryFont(param_disp, font_list[i])) |
||||
|
break; |
||||
|
if (*font_info) |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
/* Assume normal font name */ |
||||
|
return (int) (*font_info = XLoadQueryFont(param_disp, name)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static int |
||||
|
do_style(list, val) |
||||
|
char *list; /* List of ones and zeros */ |
||||
|
param_style *val; /* Line style returned */ |
||||
|
|
||||
|
/* |
||||
|
* Translates a string representation of a dash specification into |
||||
|
* a form suitable for use in XSetDashes(). Assumes `list' |
||||
|
* is a null terminated string of ones and zeros. |
||||
|
*/ |
||||
|
{ |
||||
|
char *i, |
||||
|
*spot, |
||||
|
last_char; |
||||
|
int count; |
||||
|
|
||||
|
for (i = list; *i; i++) |
||||
|
if ((*i != '0') && (*i != '1')) |
||||
|
break; |
||||
|
|
||||
|
if (!*i) { |
||||
|
val->len = 0; |
||||
|
last_char = '\0'; |
||||
|
for (i = list; *i; i++) { |
||||
|
if (*i != last_char) { |
||||
|
val->len += 1; |
||||
|
last_char = *i; |
||||
|
} |
||||
|
} |
||||
|
val->dash_list = (char *) Malloc((unsigned) |
||||
|
(sizeof(char) * val->len + 1)); |
||||
|
last_char = *list; |
||||
|
spot = val->dash_list; |
||||
|
count = 0; |
||||
|
for (i = list; *i; i++) { |
||||
|
if (*i != last_char) { |
||||
|
*spot++ = (char) count; |
||||
|
last_char = *i; |
||||
|
count = 1; |
||||
|
} |
||||
|
else |
||||
|
count++; |
||||
|
} |
||||
|
*spot = (char) count; |
||||
|
return 1; |
||||
|
} |
||||
|
else { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static char *positive[] = |
||||
|
{"on", "yes", "true", "1", "affirmative", (char *) 0}; |
||||
|
static char *negative[] = |
||||
|
{"off", "no", "false", "0", "negative", (char *) 0}; |
||||
|
|
||||
|
static int |
||||
|
do_bool(name, val) |
||||
|
char *name; /* String representation */ |
||||
|
int *val; /* Returned value */ |
||||
|
|
||||
|
/* |
||||
|
* Translates a string representation into a suitable binary value. |
||||
|
* Can parse all kinds of interesting boolean type words. |
||||
|
*/ |
||||
|
{ |
||||
|
char **term; |
||||
|
|
||||
|
for (term = positive; *term; term++) { |
||||
|
if (stricmp(name, *term) == 0) |
||||
|
break; |
||||
|
} |
||||
|
if (*term) { |
||||
|
*val = 1; |
||||
|
return 1; |
||||
|
} |
||||
|
for (term = negative; *term; term++) |
||||
|
if (stricmp(name, *term) == 0) |
||||
|
break; |
||||
|
|
||||
|
if (*term) { |
||||
|
*val = 0; |
||||
|
return 1; |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static enum st_retval |
||||
|
dump_it(key, value, arg) |
||||
|
char *key, |
||||
|
*value, |
||||
|
*arg; |
||||
|
{ |
||||
|
param_full *val = (param_full *) value; |
||||
|
|
||||
|
(void) fprintf(stdout, "%s (", key); |
||||
|
switch (val->type) { |
||||
|
case INT: |
||||
|
(void) fprintf(stdout, "INT"); |
||||
|
break; |
||||
|
case STR: |
||||
|
(void) fprintf(stdout, "STR"); |
||||
|
break; |
||||
|
case PIXEL: |
||||
|
(void) fprintf(stdout, "PIXEL"); |
||||
|
break; |
||||
|
case FONT: |
||||
|
(void) fprintf(stdout, "FONT"); |
||||
|
break; |
||||
|
case STYLE: |
||||
|
(void) fprintf(stdout, "STYLE"); |
||||
|
break; |
||||
|
case BOOL: |
||||
|
(void) fprintf(stdout, "BOOL"); |
||||
|
break; |
||||
|
case DBL: |
||||
|
(void) fprintf(stdout, "DBL"); |
||||
|
break; |
||||
|
} |
||||
|
(void) fprintf(stdout, ") = %s\n", val->text_form); |
||||
|
return ST_CONTINUE; |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
param_dump() |
||||
|
/* |
||||
|
* Dumps all of the parameter values to standard output. |
||||
|
*/ |
||||
|
{ |
||||
|
st_foreach(param_table, dump_it, (char *) 0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
#ifdef HAVE_STRCASECMP |
||||
|
int |
||||
|
stricmp(a, b) |
||||
|
char *a, *b; |
||||
|
{ |
||||
|
return strcasecmp(a, b); |
||||
|
} |
||||
|
#else |
||||
|
int |
||||
|
stricmp(a, b) |
||||
|
register char *a, |
||||
|
*b; |
||||
|
|
||||
|
/* |
||||
|
* This routine compares two strings disregarding case. |
||||
|
*/ |
||||
|
{ |
||||
|
register int value; |
||||
|
|
||||
|
if ((a == (char *) 0) || (b == (char *) 0)) { |
||||
|
return a - b; |
||||
|
} |
||||
|
|
||||
|
for ( /* nothing */ ; |
||||
|
((*a | *b) && |
||||
|
!(value = ((isupper(*a) ? *a - 'A' + 'a' : *a) - |
||||
|
(isupper(*b) ? *b - 'A' + 'a' : *b)))); |
||||
|
a++, b++) |
||||
|
/* Empty Body */ ; |
||||
|
|
||||
|
return value; |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
static int |
||||
|
strihash(string, modulus) |
||||
|
register char *string; |
||||
|
int modulus; |
||||
|
|
||||
|
/* Case insensitive computation */ |
||||
|
{ |
||||
|
register int val = 0; |
||||
|
register int c; |
||||
|
|
||||
|
while ((c = *string++) != '\0') { |
||||
|
if (isupper(c)) |
||||
|
c = tolower(c); |
||||
|
val = val * 997 + c; |
||||
|
} |
||||
|
|
||||
|
return ((val < 0) ? -val : val) % modulus; |
||||
|
} |
||||
@ -0,0 +1,127 @@ |
|||||
|
/* |
||||
|
* Xgraph parameters |
||||
|
*/ |
||||
|
|
||||
|
#ifndef _PARAMS_H_ |
||||
|
#define _PARAMS_H_ |
||||
|
|
||||
|
#include "xgraph.h" |
||||
|
|
||||
|
/* If you have an ANSI compiler, some checking will be done */ |
||||
|
#ifdef __STDC__ |
||||
|
#define DECLARE(func, rtn, args) extern rtn func args |
||||
|
#else |
||||
|
#define DECLARE(func, rtn, args) extern rtn func () |
||||
|
#endif |
||||
|
|
||||
|
typedef enum param_types_defn { |
||||
|
INT, STR, PIXEL, FONT, STYLE, BOOL, DBL |
||||
|
} param_types; |
||||
|
|
||||
|
typedef struct params_int_defn { |
||||
|
param_types type; /* INT */ |
||||
|
int value; |
||||
|
} param_int; |
||||
|
|
||||
|
typedef struct params_str_defn { |
||||
|
param_types type; /* STR */ |
||||
|
char *value; |
||||
|
} param_str; |
||||
|
|
||||
|
typedef struct params_pix_defn { |
||||
|
param_types type; /* PIXEL */ |
||||
|
XColor value; |
||||
|
} param_pix; |
||||
|
|
||||
|
typedef struct params_font_defn { |
||||
|
param_types type; /* FONT */ |
||||
|
XFontStruct *value; |
||||
|
} param_font; |
||||
|
|
||||
|
typedef struct params_style_defn { |
||||
|
param_types type; /* STYLE */ |
||||
|
int len; |
||||
|
char *dash_list; |
||||
|
} param_style; |
||||
|
|
||||
|
typedef struct params_bool_defn { |
||||
|
param_types type; /* BOOL */ |
||||
|
int value; |
||||
|
} param_bool; |
||||
|
|
||||
|
typedef struct params_dbl_defn { |
||||
|
param_types type; /* DBL */ |
||||
|
double value; |
||||
|
} param_dbl; |
||||
|
|
||||
|
typedef union params_defn { |
||||
|
param_types type; |
||||
|
param_int intv; /* INT */ |
||||
|
param_str strv; /* STR */ |
||||
|
param_pix pixv; /* PIXEL */ |
||||
|
param_font fontv; /* FONT */ |
||||
|
param_style stylev; /* STYLE */ |
||||
|
param_bool boolv; /* BOOL */ |
||||
|
param_dbl dblv; /* DBL */ |
||||
|
} params; |
||||
|
|
||||
|
DECLARE(param_init, void, (Display * disp, Colormap cmap)); |
||||
|
DECLARE(param_set, void, (char *name, param_types type, char *val)); |
||||
|
DECLARE(param_reset, void, (char *name, char *val)); |
||||
|
DECLARE(param_get, params *, (char *name, params * val)); |
||||
|
DECLARE(param_dump, void, ()); |
||||
|
|
||||
|
#ifdef stricmp |
||||
|
#undef stricmp |
||||
|
#endif |
||||
|
DECLARE(stricmp, int, (char *a, char *b)); |
||||
|
|
||||
|
/* Some convenience macros */ |
||||
|
|
||||
|
extern params param_temp, |
||||
|
*param_temp_ptr; |
||||
|
extern XColor param_null_color; |
||||
|
extern param_style param_null_style; |
||||
|
|
||||
|
#define PM_INT(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->intv.value : \ |
||||
|
(abort(), (int) 0)) |
||||
|
|
||||
|
#define PM_STR(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->strv.value : \ |
||||
|
(abort(), (char *) 0)) |
||||
|
|
||||
|
#define PM_COLOR(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->pixv.value : \ |
||||
|
(abort(), param_null_color)) |
||||
|
|
||||
|
#define PM_PIXEL(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->pixv.value.pixel : \ |
||||
|
(abort(), (Pixel) 0)) |
||||
|
|
||||
|
#define PM_FONT(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->fontv.value : \ |
||||
|
(abort(), (XFontStruct *) 0)) |
||||
|
|
||||
|
#define PM_STYLE(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->stylev : \ |
||||
|
(abort(), param_null_style)) |
||||
|
|
||||
|
#define PM_BOOL(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->boolv.value : \ |
||||
|
(abort(), 0)) |
||||
|
|
||||
|
#define PM_DBL(name) \ |
||||
|
((param_temp_ptr = param_get(name, ¶m_temp)) ? \ |
||||
|
param_temp_ptr->dblv.value : \ |
||||
|
(abort(), 0.0)) |
||||
|
|
||||
|
|
||||
|
#endif /* _PARAMS_H_ */ |
||||
@ -0,0 +1,60 @@ |
|||||
|
#ifndef _h_plotter |
||||
|
#define _h_plotter |
||||
|
/* |
||||
|
* HP plotter definition - these are dependent on the SPECIFIC MODEL of HP |
||||
|
* plotter used, and should always be modified when going to a new |
||||
|
* plotter. |
||||
|
* |
||||
|
* all dimensions are in plotter units. |
||||
|
* |
||||
|
* MINX and MINY are the smallest x and y values that are inside the soft |
||||
|
* clip limits of the plotter MAXX and MAXY are the largest x and y values |
||||
|
* that are inside the soft clip limits of the plotter MINUS MINX and |
||||
|
* MINY, so they give the dimension of the soft clip area. |
||||
|
* |
||||
|
* PLOTTERTYPE is a character string which identifies the plotter that should |
||||
|
* be used. control information will be read for |
||||
|
* ~cad/lib/technology/$TECHNOLOGY/$PLOTTERTYPE.map and output will go to |
||||
|
* /usr/ucb/lpr -Pplt$PLOTTERTYPE |
||||
|
* |
||||
|
*/ |
||||
|
#define PLOTTERTYPE "7550" |
||||
|
#define P1X 80 |
||||
|
#define P1Y 320 |
||||
|
#define P2X 10080 |
||||
|
#define P2Y 7520 |
||||
|
#define MAXX 10000 |
||||
|
#define MAXY 7200 |
||||
|
|
||||
|
#define PLOTTERNAME "paper" |
||||
|
|
||||
|
#define PENGRID 1 |
||||
|
#define PENAXIS 2 |
||||
|
#define TEXTCOLOR 1 |
||||
|
#define PEN1 3 |
||||
|
#define PEN2 4 |
||||
|
#define PEN3 5 |
||||
|
#define PEN4 6 |
||||
|
#define PEN5 7 |
||||
|
#define PEN6 8 |
||||
|
#define PEN7 2 |
||||
|
#define PEN8 1 |
||||
|
|
||||
|
#define LINE1 2 |
||||
|
#define LINE2 4 |
||||
|
#define LINE3 5 |
||||
|
#define LINE4 6 |
||||
|
#define LINE5 2 |
||||
|
#define LINE6 4 |
||||
|
#define LINE7 5 |
||||
|
#define LINE8 6 |
||||
|
|
||||
|
#define MARK1 "L" |
||||
|
#define MARK2 "K" |
||||
|
#define MARK3 "M" |
||||
|
#define MARK4 "O" |
||||
|
#define MARK5 "G" |
||||
|
#define MARK6 "F" |
||||
|
#define MARK7 "E" |
||||
|
#define MARK8 "A" |
||||
|
#endif /* _h_plotter */ |
||||
@ -0,0 +1,620 @@ |
|||||
|
/* |
||||
|
* Postscript output for xgraph |
||||
|
* |
||||
|
* Rick Spickelmier |
||||
|
* David Harrison |
||||
|
*/ |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include <stdio.h> |
||||
|
#include "xgraph.h" |
||||
|
|
||||
|
/* |
||||
|
* Basic scaling parameters |
||||
|
*/ |
||||
|
|
||||
|
#define VDPI 1200.0 |
||||
|
#define LDIM 11.0 |
||||
|
#define SDIM 8.5 |
||||
|
#define MICRONS_PER_INCH 2.54E+04 |
||||
|
#define POINTS_PER_INCH 72.0 |
||||
|
#define INCHES_PER_POINT 1.0/72.0 |
||||
|
|
||||
|
/* |
||||
|
* Aesthetic parameters (inches) |
||||
|
*/ |
||||
|
|
||||
|
#define PS_BDR_PAD 0.075 |
||||
|
#define PS_AXIS_PAD 0.1 |
||||
|
#define PS_LEG_PAD 0.025 |
||||
|
#define PS_TICK_LEN 0.125 |
||||
|
#define BASE_DASH (1.0/48.0) |
||||
|
|
||||
|
#define BASE_WIDTH (1.0/8.0) |
||||
|
#define PS_AXIS_WBASE 1 |
||||
|
#define PS_ZERO_WBASE 4 |
||||
|
#define PS_DATA_WBASE 7 |
||||
|
#define PS_PIXEL 4 |
||||
|
#define PS_DOT 12 |
||||
|
#define PS_MARK 12 |
||||
|
|
||||
|
/* |
||||
|
* Other constants |
||||
|
*/ |
||||
|
|
||||
|
#define FONT_WIDTH_EST 0.55 |
||||
|
#define PS_MAX_SEGS 1000 |
||||
|
#define PS_NO_TSTYLE -1 |
||||
|
#define PS_NO_DSTYLE -1 |
||||
|
#define PS_NO_WIDTH -1 |
||||
|
#define PS_NO_LSTYLE -1 |
||||
|
#define PS_NO_COLOR -1 |
||||
|
|
||||
|
/* |
||||
|
* Working macros |
||||
|
*/ |
||||
|
|
||||
|
#define OUT (void) fprintf |
||||
|
#define PS(str) OUT(psFile, str) |
||||
|
#define PSU(str) OUT(ui->psFile, str) |
||||
|
#define IY(val) (ui->height_devs - val) |
||||
|
|
||||
|
#define TEXTCOLOR 0 |
||||
|
#define MAXCOLOR 8 /* Number of gray scales supported */ |
||||
|
|
||||
|
/* |
||||
|
* Globals |
||||
|
*/ |
||||
|
|
||||
|
static double PS_scale; /* devs/micron */ |
||||
|
|
||||
|
/* |
||||
|
* Externals and forwards |
||||
|
*/ |
||||
|
|
||||
|
static void psScale(), psFonts(), psMarks(), psText(), psSeg(), psDot(), psEnd(); |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* Local structures |
||||
|
*/ |
||||
|
|
||||
|
struct userInfo { |
||||
|
FILE *psFile; |
||||
|
int currentTextStyle; |
||||
|
int currentDashStyle; |
||||
|
int currentWidth; |
||||
|
int currentLStyle; |
||||
|
int currentColor; |
||||
|
int baseWidth; |
||||
|
int height_devs; |
||||
|
char *title_family; |
||||
|
double title_size; |
||||
|
char *axis_family; |
||||
|
double axis_size; |
||||
|
int flags; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
int |
||||
|
rd(dbl) |
||||
|
double dbl; |
||||
|
|
||||
|
/* Short and sweet rounding function */ |
||||
|
{ |
||||
|
if (dbl < 0.0) { |
||||
|
return ((int) (dbl - 0.5)); |
||||
|
} |
||||
|
else { |
||||
|
return ((int) (dbl + 0.5)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
int |
||||
|
psInit(psFile, width, height, tf, ts, af, as, flags, outInfo, errmsg) |
||||
|
FILE *psFile; /* Output file */ |
||||
|
int width, |
||||
|
height; /* In microns */ |
||||
|
char *tf, |
||||
|
*af; /* Title and axis font */ |
||||
|
double ts, |
||||
|
as; /* Title and axis size */ |
||||
|
int flags; /* Predicate flags */ |
||||
|
xgOut *outInfo; /* Returned device info */ |
||||
|
char errmsg[ERRBUFSIZE]; /* Returned error message */ |
||||
|
|
||||
|
/* |
||||
|
* The basic coordinate system is points (roughly 1/72 inch). |
||||
|
* However, most laser printers can do much better than that. |
||||
|
* We invent a coordinate system based on VDPI dots per inch. |
||||
|
* This goes along the long side of the page. The long side |
||||
|
* of the page is LDIM inches in length, the short side |
||||
|
* SDIM inches in length. We we call this unit a `dev'. |
||||
|
* We map `width' and `height' into devs. |
||||
|
*/ |
||||
|
{ |
||||
|
struct userInfo *ui; |
||||
|
double font_size; |
||||
|
|
||||
|
ui = (struct userInfo *) Malloc(sizeof(struct userInfo)); |
||||
|
ui->psFile = psFile; |
||||
|
ui->currentTextStyle = PS_NO_TSTYLE; |
||||
|
ui->currentDashStyle = PS_NO_DSTYLE; |
||||
|
ui->currentWidth = PS_NO_WIDTH; |
||||
|
ui->currentLStyle = PS_NO_LSTYLE; |
||||
|
ui->currentColor = PS_NO_COLOR; |
||||
|
ui->title_family = tf; |
||||
|
ui->title_size = ts; |
||||
|
ui->axis_family = af; |
||||
|
ui->axis_size = as; |
||||
|
/* Roughly, one-eighth a point in devs */ |
||||
|
ui->baseWidth = rd(VDPI / POINTS_PER_INCH * BASE_WIDTH); |
||||
|
ui->flags = flags; |
||||
|
|
||||
|
PS_scale = VDPI / MICRONS_PER_INCH; |
||||
|
|
||||
|
outInfo->dev_flags = 0; |
||||
|
outInfo->area_w = rd(((double) width) * PS_scale); |
||||
|
outInfo->area_h = rd(((double) height) * PS_scale); |
||||
|
ui->height_devs = outInfo->area_h; |
||||
|
outInfo->bdr_pad = rd(PS_BDR_PAD * VDPI); |
||||
|
outInfo->axis_pad = rd(PS_AXIS_PAD * VDPI); |
||||
|
outInfo->legend_pad = rd(PS_LEG_PAD * VDPI); |
||||
|
outInfo->tick_len = rd(PS_TICK_LEN * VDPI); |
||||
|
|
||||
|
/* Font estimates */ |
||||
|
font_size = as * INCHES_PER_POINT * VDPI; |
||||
|
outInfo->axis_height = rd(font_size); |
||||
|
outInfo->axis_width = rd(font_size * FONT_WIDTH_EST); |
||||
|
font_size = ts * INCHES_PER_POINT * VDPI; |
||||
|
outInfo->title_height = rd(font_size); |
||||
|
outInfo->title_width = rd(font_size * FONT_WIDTH_EST); |
||||
|
|
||||
|
outInfo->max_segs = PS_MAX_SEGS; |
||||
|
|
||||
|
outInfo->xg_text = psText; |
||||
|
outInfo->xg_seg = psSeg; |
||||
|
outInfo->xg_dot = psDot; |
||||
|
outInfo->xg_end = psEnd; |
||||
|
outInfo->user_state = (char *) ui; |
||||
|
|
||||
|
/* Postscript file identification */ |
||||
|
PS("%%!\n"); |
||||
|
|
||||
|
/* Definitions */ |
||||
|
psScale(psFile, width, height, flags); |
||||
|
psFonts(psFile); |
||||
|
psMarks(psFile); |
||||
|
|
||||
|
PS("%%\n%% Main body begins here\n%%\n"); |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psHeader(psFile, docu_flag) |
||||
|
FILE *psFile; |
||||
|
int docu_flag; |
||||
|
|
||||
|
/* |
||||
|
* Prints out a standard greeting to the Postscript file. |
||||
|
*/ |
||||
|
{ |
||||
|
PS("%%%%EndComments\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("%% Xgraph postscript output\n"); |
||||
|
PS("%% Rick Spickelmier and David Harrison\n"); |
||||
|
PS("%% University of California, Berkeley\n"); |
||||
|
if (docu_flag) { |
||||
|
PS("%%\n"); |
||||
|
PS("%% Output produced for inclusion in another document.\n"); |
||||
|
PS("%% This file will not work properly if sent directly to a printer.\n"); |
||||
|
} |
||||
|
PS("%%\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psScale(psFile, width, height, flags) |
||||
|
FILE *psFile; /* Output stream */ |
||||
|
int width; /* Output width */ |
||||
|
int height; /* Output height */ |
||||
|
int flags; /* Output options */ |
||||
|
|
||||
|
/* |
||||
|
* This routine figures out how transform the basic postscript |
||||
|
* transformation into one suitable for direct use by |
||||
|
* the drawing primitives. Two variables X-CENTER-PLOT |
||||
|
* and Y-CENTER-PLOT determine whether the plot is centered |
||||
|
* on the page. If `flags' has D_DOCU set, then the plot |
||||
|
* will not be rotated or centered and a bounding box will |
||||
|
* be displayed. |
||||
|
*/ |
||||
|
{ |
||||
|
double factor; |
||||
|
double pnt_width, |
||||
|
pnt_height; |
||||
|
|
||||
|
if (flags & D_DOCU) { |
||||
|
OUT(psFile, "%%%%BoundingBox: %ld %ld %ld %ld\n", |
||||
|
0, 0, |
||||
|
(int) (((double) width) / |
||||
|
(MICRONS_PER_INCH * INCHES_PER_POINT) + 0.5), |
||||
|
(int) (((double) height) / |
||||
|
(MICRONS_PER_INCH * INCHES_PER_POINT) + 0.5) |
||||
|
); |
||||
|
psHeader(psFile, 1); |
||||
|
PS("%% Rotation and centering are turned off for inclusion in a document\n"); |
||||
|
} |
||||
|
else { |
||||
|
psHeader(psFile, 0); |
||||
|
PS("%% Scaling information\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("%% Change these if you would like to change the centering\n"); |
||||
|
PS("%% of the plot in either dimension\n"); |
||||
|
PS("/X-CENTER-PLOT 1 def\n"); |
||||
|
PS("/Y-CENTER-PLOT 1 def\n"); |
||||
|
PS("%%\n"); |
||||
|
/* |
||||
|
* Determine page size |
||||
|
*/ |
||||
|
PS("%% Page size computation\n"); |
||||
|
PS("clippath pathbbox\n"); |
||||
|
PS("/page-height exch def\n"); |
||||
|
PS("/page-width exch def\n"); |
||||
|
PS("pop pop\n"); |
||||
|
|
||||
|
/* |
||||
|
* First: rotation. If the width is greater than the short dimension, |
||||
|
* do the rotation. |
||||
|
*/ |
||||
|
pnt_width = ((double) width) / MICRONS_PER_INCH * POINTS_PER_INCH; |
||||
|
pnt_height = ((double) height) / MICRONS_PER_INCH * POINTS_PER_INCH; |
||||
|
PS("%% Determine whether rotation is required\n"); |
||||
|
OUT(psFile, "%lg page-width gt\n", pnt_width); |
||||
|
PS("{ %% Rotation required\n"); |
||||
|
PS(" 90 rotate\n"); |
||||
|
PS(" 0 page-width neg translate\n"); |
||||
|
PS(" %% Handle centering\n"); |
||||
|
PS(" Y-CENTER-PLOT 1 eq { %% Center in y\n"); |
||||
|
OUT(psFile, " page-height %lg sub 2 div\n", pnt_width); |
||||
|
PS(" } { %% Don't center in y\n"); |
||||
|
PS(" 0\n"); |
||||
|
PS(" } ifelse\n"); |
||||
|
PS(" X-CENTER-PLOT 1 eq { %% Center in x\n"); |
||||
|
OUT(psFile, " page-width %lg sub 2 div\n", pnt_height); |
||||
|
PS(" } { %% Don't center in x\n"); |
||||
|
PS(" 0\n"); |
||||
|
PS(" } ifelse\n"); |
||||
|
PS(" translate\n"); |
||||
|
PS("} { %% No rotation - just handle centering\n"); |
||||
|
PS(" X-CENTER-PLOT 1 eq { %% Center in x\n"); |
||||
|
OUT(psFile, " page-width %lg sub 2 div\n", pnt_width); |
||||
|
PS(" } { %% Don't center in x\n"); |
||||
|
PS(" 0\n"); |
||||
|
PS(" } ifelse\n"); |
||||
|
PS(" Y-CENTER-PLOT 1 eq { %% Center in y\n"); |
||||
|
OUT(psFile, " page-height %lg sub 2 div\n", pnt_height); |
||||
|
PS(" } { %% Don't center in y\n"); |
||||
|
PS(" 0\n"); |
||||
|
PS(" } ifelse\n"); |
||||
|
PS(" translate\n"); |
||||
|
PS("} ifelse\n"); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Now: scaling. We have points. We want devs. |
||||
|
*/ |
||||
|
factor = POINTS_PER_INCH / VDPI; |
||||
|
PS("%% Set the scale\n"); |
||||
|
OUT(psFile, "%lg %lg scale\n", factor, factor); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psFonts(psFile) |
||||
|
FILE *psFile; /* Output stream */ |
||||
|
|
||||
|
/* |
||||
|
* Downloads code for drawing title and axis labels |
||||
|
*/ |
||||
|
{ |
||||
|
PS("%% Font Handling Functions\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("%% Function giving y-offset to center of font\n"); |
||||
|
PS("%% Assumes font is set and uses numbers to gauge center\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/choose-font %% stack: fontsize fontname => ---\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" findfont \n"); |
||||
|
PS(" exch scalefont \n"); |
||||
|
PS(" setfont\n"); |
||||
|
PS(" newpath\n"); |
||||
|
PS(" 0 0 moveto (0) true charpath flattenpath pathbbox\n"); |
||||
|
PS(" /top exch def pop\n"); |
||||
|
PS(" /bottom exch def pop\n"); |
||||
|
PS(" bottom top bottom top add 2 div\n"); |
||||
|
PS(" /center-font-val exch def \n"); |
||||
|
PS(" /upper-font-val exch def \n"); |
||||
|
PS(" /lower-font-val exch def\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("%% Justfication offset routines\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/center-x-just %% stack: (string) x y => (string) newx y\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" exch 2 index stringwidth pop 2 div sub exch\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/left-x-just %% stack: (string) x y => (string) newx y\n"); |
||||
|
PS("{ \n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/right-x-just %% stack: (string) x y => (string) newx y\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" exch 2 index stringwidth pop sub exch\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/center-y-just %% stack: (string) x y => (string) x newy\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" center-font-val sub\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/lower-y-just %% stack: (string) x y => (string) x newy\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" lower-font-val sub\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("/upper-y-just %% stack: (string) x y => (string) x newy\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" upper-font-val sub\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
PS("%% Shows a string on the page subject to justification\n"); |
||||
|
PS("%% \n"); |
||||
|
PS("/just-string %% stack: (string) x y just => ---\n"); |
||||
|
PS("{\n"); |
||||
|
PS(" dup 0 eq { pop center-x-just center-y-just } if\n"); |
||||
|
PS(" dup 1 eq { pop left-x-just center-y-just } if\n"); |
||||
|
PS(" dup 2 eq { pop left-x-just upper-y-just } if\n"); |
||||
|
PS(" dup 3 eq { pop center-x-just upper-y-just } if\n"); |
||||
|
PS(" dup 4 eq { pop right-x-just upper-y-just } if\n"); |
||||
|
PS(" dup 5 eq { pop right-x-just center-y-just } if\n"); |
||||
|
PS(" dup 6 eq { pop right-x-just lower-y-just } if\n"); |
||||
|
PS(" dup 7 eq { pop center-x-just lower-y-just } if\n"); |
||||
|
PS(" dup 8 eq { pop left-x-just lower-y-just } if\n"); |
||||
|
PS(" moveto show\n"); |
||||
|
PS("} def\n"); |
||||
|
PS("%%\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psMarks(psFile) |
||||
|
FILE *psFile; |
||||
|
|
||||
|
/* |
||||
|
* Writes out marker definitions |
||||
|
*/ |
||||
|
{ |
||||
|
PS("%% Marker definitions\n"); |
||||
|
PS("/mark0 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x size sub y size sub moveto\n"); |
||||
|
PS("size size add 0 rlineto 0 size size add rlineto\n"); |
||||
|
PS("0 size size add sub 0 rlineto closepath fill} def\n"); |
||||
|
|
||||
|
PS("/mark1 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x size sub y size sub moveto\n"); |
||||
|
PS("size size add 0 rlineto 0 size size add rlineto\n"); |
||||
|
PS("0 size size add sub 0 rlineto closepath stroke} def\n"); |
||||
|
|
||||
|
PS("/mark2 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x y moveto x y size 0 360 arc stroke} def\n"); |
||||
|
|
||||
|
PS("/mark3 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x size sub y size sub moveto x size add y size add lineto\n"); |
||||
|
PS("x size sub y size add moveto x size add y size sub lineto stroke} def\n"); |
||||
|
|
||||
|
PS("/mark4 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x size sub y moveto x y size add lineto\n"); |
||||
|
PS("x size add y lineto x y size sub lineto\n"); |
||||
|
PS("closepath stroke} def\n"); |
||||
|
|
||||
|
PS("/mark5 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("x y size mark1\n"); |
||||
|
PS("newpath x size sub y moveto size size add 0 rlineto stroke} def\n"); |
||||
|
|
||||
|
PS("/mark6 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x y moveto x y size 0 360 arc fill} def\n"); |
||||
|
|
||||
|
PS("/mark7 {/size exch def /y exch def /x exch def\n"); |
||||
|
PS("newpath x y moveto x size sub y size sub lineto\n"); |
||||
|
PS("x size add y size sub lineto closepath fill\n"); |
||||
|
PS("newpath x y moveto x size add y size add lineto\n"); |
||||
|
PS("x size sub y size add lineto closepath fill} def\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psText(state, x, y, text, just, style) |
||||
|
char *state; /* Really (struct userInfo *) */ |
||||
|
int x, |
||||
|
y; /* Text position (devs) */ |
||||
|
char *text; /* Text itself */ |
||||
|
int just; /* Justification */ |
||||
|
int style; /* Style */ |
||||
|
|
||||
|
/* |
||||
|
* Draws text at the given location with the given justification |
||||
|
* and style. |
||||
|
*/ |
||||
|
{ |
||||
|
struct userInfo *ui = (struct userInfo *) state; |
||||
|
|
||||
|
if (TEXTCOLOR != ui->currentColor) { |
||||
|
OUT(ui->psFile, "%lg setgray\n", (double) TEXTCOLOR / 8); |
||||
|
ui->currentColor = TEXTCOLOR; |
||||
|
} |
||||
|
|
||||
|
if (style != ui->currentTextStyle) { |
||||
|
switch (style) { |
||||
|
case T_AXIS: |
||||
|
OUT(ui->psFile, "%lg /%s choose-font\n", |
||||
|
ui->axis_size * INCHES_PER_POINT * VDPI, ui->axis_family); |
||||
|
break; |
||||
|
case T_TITLE: |
||||
|
OUT(ui->psFile, "%lg /%s choose-font\n", |
||||
|
ui->title_size * INCHES_PER_POINT * VDPI, ui->title_family); |
||||
|
break; |
||||
|
} |
||||
|
ui->currentTextStyle = style; |
||||
|
} |
||||
|
OUT(ui->psFile, "(%s) %d %d %d just-string\n", text, x, IY(y), just); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static void |
||||
|
psSeg(state, ns, seglist, width, style, lappr, color) |
||||
|
char *state; /* Really (struct userInfo *) */ |
||||
|
int ns; /* Number of segments */ |
||||
|
XSegment *seglist; /* X array of segments */ |
||||
|
int width; /* Width of lines (devcoords) */ |
||||
|
int style; /* L_AXIS, L_ZERO, L_VAR */ |
||||
|
int lappr; /* Zero to seven */ |
||||
|
int color; /* Zero to seven */ |
||||
|
|
||||
|
/* |
||||
|
* Draws a number of line segments. Grid lines are drawn using |
||||
|
* light lines. Variable lines (L_VAR) are drawn wider. This |
||||
|
* version ignores the color argument. |
||||
|
*/ |
||||
|
{ |
||||
|
struct userInfo *ui = (struct userInfo *) state; |
||||
|
int newwidth = 0, |
||||
|
i; |
||||
|
|
||||
|
if ((style != ui->currentLStyle) || (width != ui->currentWidth)) { |
||||
|
switch (style) { |
||||
|
case L_AXIS: |
||||
|
newwidth = PS_AXIS_WBASE * ui->baseWidth; |
||||
|
PSU("[] 0 setdash\n"); |
||||
|
break; |
||||
|
case L_ZERO: |
||||
|
newwidth = PS_ZERO_WBASE * ui->baseWidth; |
||||
|
PSU("[] 0 setdash\n"); |
||||
|
break; |
||||
|
case L_VAR: |
||||
|
newwidth = PS_DATA_WBASE * ui->baseWidth; |
||||
|
break; |
||||
|
} |
||||
|
ui->currentWidth = MAX(newwidth, width); |
||||
|
ui->currentLStyle = style; |
||||
|
OUT(ui->psFile, "%d setlinewidth\n", ui->currentWidth); |
||||
|
} |
||||
|
if (width > 4) { |
||||
|
if (color > MAXCOLOR) |
||||
|
color -= MAXCOLOR; |
||||
|
else |
||||
|
lappr = 0; |
||||
|
} |
||||
|
else |
||||
|
color = TEXTCOLOR; |
||||
|
|
||||
|
if ((lappr != ui->currentDashStyle) && (style == L_VAR)) { |
||||
|
if (lappr == 0) { |
||||
|
PSU("[] 0 setdash\n"); |
||||
|
} |
||||
|
else { |
||||
|
OUT(ui->psFile, "[%lg] 0 setdash\n", |
||||
|
((double) lappr) * BASE_DASH * VDPI); |
||||
|
} |
||||
|
ui->currentDashStyle = lappr; |
||||
|
} |
||||
|
if ((color != ui->currentColor) && (style == L_VAR)) { |
||||
|
OUT(ui->psFile, "%lg setgray\n", (double) color / MAXCOLOR); |
||||
|
ui->currentColor = color; |
||||
|
} |
||||
|
PSU("newpath\n"); |
||||
|
OUT(ui->psFile, " %d %d moveto\n", seglist[0].x1, IY(seglist[0].y1)); |
||||
|
OUT(ui->psFile, " %d %d lineto\n", seglist[0].x2, IY(seglist[0].y2)); |
||||
|
for (i = 1; i < ns; i++) { |
||||
|
if ((seglist[i].x1 != seglist[i - 1].x2) || |
||||
|
(seglist[i].y1 != seglist[i - 1].y2)) { |
||||
|
OUT(ui->psFile, " %d %d moveto\n", seglist[i].x1, IY(seglist[i].y1)); |
||||
|
} |
||||
|
OUT(ui->psFile, " %d %d lineto\n", seglist[i].x2, IY(seglist[i].y2)); |
||||
|
} |
||||
|
PSU("stroke\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
static void |
||||
|
psDot(state, x, y, style, type, color) |
||||
|
char *state; /* state information */ |
||||
|
int x, |
||||
|
y; /* coord of dot */ |
||||
|
int style; /* type of dot */ |
||||
|
int type; /* dot style variation */ |
||||
|
int color; /* color of dot */ |
||||
|
|
||||
|
/* |
||||
|
* Prints out a dot at the given location |
||||
|
*/ |
||||
|
{ |
||||
|
struct userInfo *ui = (struct userInfo *) state; |
||||
|
|
||||
|
if (ui->currentDashStyle != PS_NO_DSTYLE) { |
||||
|
OUT(ui->psFile, "[] 0 setdash "); |
||||
|
ui->currentDashStyle = PS_NO_DSTYLE; |
||||
|
} |
||||
|
if (ui->currentWidth != PS_ZERO_WBASE * ui->baseWidth) { |
||||
|
ui->currentWidth = PS_ZERO_WBASE * ui->baseWidth; |
||||
|
OUT(ui->psFile, "%d setlinewidth ", ui->currentWidth); |
||||
|
} |
||||
|
if (color > MAXCOLOR) |
||||
|
color -= MAXCOLOR; |
||||
|
if ((color != ui->currentColor)) { |
||||
|
OUT(ui->psFile, "%lg setgray\n", (double) color / MAXCOLOR); |
||||
|
ui->currentColor = color; |
||||
|
} |
||||
|
|
||||
|
switch (style) { |
||||
|
case P_PIXEL: |
||||
|
OUT(ui->psFile, "newpath %d %d moveto %d %d %d 0 360 arc fill\n", |
||||
|
x, IY(y), x, IY(y), PS_PIXEL * ui->baseWidth); |
||||
|
break; |
||||
|
case P_DOT: |
||||
|
OUT(ui->psFile, "newpath %d %d moveto %d %d %d 0 360 arc fill\n", |
||||
|
x, IY(y), x, IY(y), PS_DOT * ui->baseWidth); |
||||
|
break; |
||||
|
case P_MARK: |
||||
|
OUT(ui->psFile, "%d %d %d mark%d\n", |
||||
|
x, IY(y), PS_MARK * ui->baseWidth, type); |
||||
|
break; |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void |
||||
|
psEnd(userState) |
||||
|
char *userState; /* state information */ |
||||
|
{ |
||||
|
struct userInfo *ui = (struct userInfo *) userState; |
||||
|
|
||||
|
if (!(ui->flags & D_DOCU)) { |
||||
|
PSU("showpage\n"); |
||||
|
} |
||||
|
PSU("%% End of xgraph output\n"); |
||||
|
} |
||||
@ -0,0 +1,365 @@ |
|||||
|
/* $Header$ */ |
||||
|
/* |
||||
|
* read.c: Dataset read code |
||||
|
* |
||||
|
* Routines: |
||||
|
* int ReadData(); |
||||
|
* |
||||
|
* $Log$ |
||||
|
* Revision 1.1 2004-01-25 09:00:49 pnenzi |
||||
|
* |
||||
|
* Added xgraph plotting program. |
||||
|
* |
||||
|
* Revision 1.2 1999/12/03 23:17:45 heideman |
||||
|
* apply xgraph_no_animation.patch |
||||
|
* |
||||
|
* Revision 1.1.1.1 1999/12/03 23:15:53 heideman |
||||
|
* xgraph-12.0 |
||||
|
* |
||||
|
*/ |
||||
|
#ifndef lint |
||||
|
static char rcsid[] = "$Id$"; |
||||
|
#endif |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include <stdio.h> |
||||
|
#include <math.h> |
||||
|
#include <pwd.h> |
||||
|
#include <ctype.h> |
||||
|
#include "xgraph.h" |
||||
|
#include "xtb.h" |
||||
|
#include "hard_devices.h" |
||||
|
#include "params.h" |
||||
|
/* |
||||
|
* New dataset reading code |
||||
|
*/ |
||||
|
|
||||
|
static int setNumber = 0; |
||||
|
static PointList **curSpot = (PointList **) 0; |
||||
|
static PointList *curList = (PointList *) 0; |
||||
|
static int newGroup = 0; |
||||
|
static int redundant_set = 0; |
||||
|
|
||||
|
#ifdef DO_DER |
||||
|
extern void Der1(); |
||||
|
#endif |
||||
|
|
||||
|
static int |
||||
|
rdSet(fn) |
||||
|
char *fn; /* Reading from file `fn' */ |
||||
|
|
||||
|
/* |
||||
|
* Set up new dataset. Will return zero if there are too many data sets. |
||||
|
*/ |
||||
|
{ |
||||
|
char setname[100]; |
||||
|
|
||||
|
if (!redundant_set) { |
||||
|
if (setNumber < MAXSETS) { |
||||
|
(void) sprintf(setname, "Set %d", setNumber); |
||||
|
if ((strcmp(PlotData[setNumber].setName, setname) == 0) && fn) { |
||||
|
PlotData[setNumber].setName = fn; |
||||
|
} |
||||
|
curSpot = &(PlotData[setNumber].list); |
||||
|
PlotData[setNumber].list = (PointList *) 0; |
||||
|
newGroup = 1; |
||||
|
setNumber++; |
||||
|
redundant_set = 1; |
||||
|
return 1; |
||||
|
} |
||||
|
else { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
rdSetName(name) |
||||
|
char *name; /* New set name */ |
||||
|
|
||||
|
/* |
||||
|
* Sets the name of a data set. Automatically makes a copy. |
||||
|
*/ |
||||
|
{ |
||||
|
PlotData[setNumber - 1].setName = STRDUP(name); |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
rdGroup() |
||||
|
/* |
||||
|
* Set up for reading new group of points within a dataset. |
||||
|
*/ |
||||
|
{ |
||||
|
newGroup = 1; |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
rdPoint(xval, yval) |
||||
|
double xval, |
||||
|
yval; /* New point */ |
||||
|
|
||||
|
/* |
||||
|
* Adds a new point to the current group of the current |
||||
|
* data set. |
||||
|
*/ |
||||
|
{ |
||||
|
if (newGroup) { |
||||
|
*curSpot = (PointList *) Malloc(sizeof(PointList)); |
||||
|
curList = *curSpot; |
||||
|
curSpot = &(curList->next); |
||||
|
curList->numPoints = 0; |
||||
|
curList->allocSize = INITSIZE; |
||||
|
curList->xvec = (double *) Malloc((unsigned) |
||||
|
(INITSIZE * sizeof(double))); |
||||
|
curList->yvec = (double *) Malloc((unsigned) |
||||
|
(INITSIZE * sizeof(double))); |
||||
|
curList->next = (PointList *) 0; |
||||
|
newGroup = 0; |
||||
|
} |
||||
|
if (curList->numPoints >= curList->allocSize) { |
||||
|
curList->allocSize *= 2; |
||||
|
curList->xvec = (double *) Realloc((char *) curList->xvec, |
||||
|
(unsigned) (curList->allocSize * |
||||
|
sizeof(double))); |
||||
|
curList->yvec = (double *) Realloc((char *) curList->yvec, |
||||
|
(unsigned) (curList->allocSize * |
||||
|
sizeof(double))); |
||||
|
} |
||||
|
|
||||
|
curList->xvec[curList->numPoints] = xval; |
||||
|
curList->yvec[curList->numPoints] = yval; |
||||
|
|
||||
|
(curList->numPoints)++; |
||||
|
redundant_set = 0; |
||||
|
} |
||||
|
|
||||
|
static int |
||||
|
rdFindMax() |
||||
|
/* |
||||
|
* Returns the maximum number of items in any one group of any |
||||
|
* data set. |
||||
|
*/ |
||||
|
{ |
||||
|
int i; |
||||
|
PointList *list; |
||||
|
int max = -1; |
||||
|
|
||||
|
for (i = 0; i < setNumber; i++) { |
||||
|
for (list = PlotData[i].list; list; list = list->next) { |
||||
|
if (list->numPoints > max) |
||||
|
max = list->numPoints; |
||||
|
} |
||||
|
} |
||||
|
return max; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
typedef enum line_type { |
||||
|
EMPTY, COMMENT, SETNAME, DRAWPNT, MOVEPNT, SETPARAM, ERROR |
||||
|
} LineType; |
||||
|
|
||||
|
typedef struct point_defn { |
||||
|
double xval, |
||||
|
yval; |
||||
|
} Point; |
||||
|
|
||||
|
typedef struct parmval_defn { |
||||
|
char *name, |
||||
|
*value; |
||||
|
} ParmVals; |
||||
|
|
||||
|
typedef struct line_info { |
||||
|
LineType type; |
||||
|
union val_defn { |
||||
|
char *str; /* SETNAME, ERROR */ |
||||
|
Point pnt; /* DRAWPNT, MOVEPNT */ |
||||
|
ParmVals parm; /* SETPARAM */ |
||||
|
} val; |
||||
|
} LineInfo; |
||||
|
|
||||
|
static LineType |
||||
|
parse_line(line, result) |
||||
|
char *line; /* Line to parse */ |
||||
|
LineInfo *result; /* Returned result */ |
||||
|
|
||||
|
/* |
||||
|
* Parses `line' into one of the types given in the definition |
||||
|
* of LineInfo. The appropriate values are filled into `result'. |
||||
|
* Below are the current formats for each type: |
||||
|
* EMPTY: All white space |
||||
|
* COMMENT: Starts with "#" |
||||
|
* SETNAME: A name enclosed in double quotes |
||||
|
* DRAWPNT: Two numbers optionally preceded by keyword "draw" |
||||
|
* MOVEPNT: Two numbers preceded by keyword "move" |
||||
|
* SETPARAM: Two non-null strings separated by ":" |
||||
|
* ERROR: Not any of the above (an error message is returned) |
||||
|
* Note that often the values are pointers into the line itself |
||||
|
* and should be copied if they are to be used over a long period. |
||||
|
*/ |
||||
|
{ |
||||
|
char *first; |
||||
|
|
||||
|
/* Find first non-space character */ |
||||
|
while (*line && isspace(*line)) |
||||
|
line++; |
||||
|
if (*line) { |
||||
|
if (*line == '#') { |
||||
|
/* comment */ |
||||
|
result->type = COMMENT; |
||||
|
} |
||||
|
else if (*line == '"') { |
||||
|
/* setname */ |
||||
|
result->type = SETNAME; |
||||
|
line++; |
||||
|
result->val.str = line; |
||||
|
while (*line && (*line != '\n') && (*line != '"')) |
||||
|
line++; |
||||
|
if (*line) |
||||
|
*line = '\0'; |
||||
|
} |
||||
|
else { |
||||
|
first = line; |
||||
|
while (*line && !isspace(*line)) |
||||
|
line++; |
||||
|
if (*line) { |
||||
|
*line = '\0'; |
||||
|
if (stricmp(first, "move") == 0) { |
||||
|
/* MOVEPNT */ |
||||
|
if (sscanf(line + 1, "%lf %lf", |
||||
|
&result->val.pnt.xval, |
||||
|
&result->val.pnt.yval) == 2) { |
||||
|
result->type = MOVEPNT; |
||||
|
} |
||||
|
else { |
||||
|
result->type = ERROR; |
||||
|
result->val.str = "Cannot read move coordinates"; |
||||
|
} |
||||
|
} |
||||
|
else if (stricmp(first, "draw") == 0) { |
||||
|
/* DRAWPNT */ |
||||
|
if (sscanf(line + 1, "%lf %lf", |
||||
|
&result->val.pnt.xval, |
||||
|
&result->val.pnt.yval) == 2) { |
||||
|
result->type = DRAWPNT; |
||||
|
} |
||||
|
else { |
||||
|
result->type = ERROR; |
||||
|
result->val.str = "Cannot read draw coordinates"; |
||||
|
} |
||||
|
} |
||||
|
else if (first[strlen(first) - 1] == ':') { |
||||
|
/* SETPARAM */ |
||||
|
first[strlen(first) - 1] = '\0'; |
||||
|
result->val.parm.name = first; |
||||
|
line++; |
||||
|
while (*line && isspace(*line)) |
||||
|
line++; |
||||
|
/* may be a \n at end of it */ |
||||
|
if (line[strlen(line) - 1] == '\n') { |
||||
|
line[strlen(line) - 1] = '\0'; |
||||
|
} |
||||
|
result->val.parm.value = line; |
||||
|
result->type = SETPARAM; |
||||
|
} |
||||
|
else if (sscanf(first, "%lf", &result->val.pnt.xval) == 1) { |
||||
|
/* DRAWPNT */ |
||||
|
if (sscanf(line + 1, "%lf", &result->val.pnt.yval) == 1) { |
||||
|
result->type = DRAWPNT; |
||||
|
} |
||||
|
else { |
||||
|
result->type = ERROR; |
||||
|
result->val.str = "Cannot read second coordinate"; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* ERROR */ |
||||
|
result->type = ERROR; |
||||
|
result->val.str = "Unknown line type"; |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* ERROR */ |
||||
|
result->type = ERROR; |
||||
|
result->val.str = "Premature end of line"; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* empty */ |
||||
|
result->type = EMPTY; |
||||
|
} |
||||
|
return result->type; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int |
||||
|
ReadData(stream, filename) |
||||
|
FILE *stream; |
||||
|
char *filename; |
||||
|
|
||||
|
/* |
||||
|
* Reads in the data sets from the supplied stream. If the format |
||||
|
* is correct, it returns the current maximum number of points across |
||||
|
* all data sets. If there is an error, it returns -1. |
||||
|
*/ |
||||
|
{ |
||||
|
char buffer[MAXBUFSIZE]; |
||||
|
LineInfo info; |
||||
|
int line_count = 0; |
||||
|
int errors = 0; |
||||
|
|
||||
|
if (!rdSet(filename)) { |
||||
|
(void) fprintf(stderr, "Error in file `%s' at line %d:\n %s\n", |
||||
|
filename, line_count, |
||||
|
"Too many data sets - extra data ignored"); |
||||
|
return -1; |
||||
|
} |
||||
|
while (fgets(buffer, MAXBUFSIZE, stream)) { |
||||
|
line_count++; |
||||
|
switch (parse_line(buffer, &info)) { |
||||
|
case EMPTY: |
||||
|
if (!rdSet(filename)) { |
||||
|
(void) fprintf(stderr, "Error in file `%s' at line %d:\n %s\n", |
||||
|
filename, line_count, |
||||
|
"Too many data sets - extra data ignored"); |
||||
|
return -1; |
||||
|
} |
||||
|
break; |
||||
|
case COMMENT: |
||||
|
/* nothing */ |
||||
|
break; |
||||
|
case SETNAME: |
||||
|
rdSetName(info.val.str); |
||||
|
break; |
||||
|
case DRAWPNT: |
||||
|
rdPoint(info.val.pnt.xval, info.val.pnt.yval); |
||||
|
break; |
||||
|
case MOVEPNT: |
||||
|
rdGroup(); |
||||
|
rdPoint(info.val.pnt.xval, info.val.pnt.yval); |
||||
|
break; |
||||
|
case SETPARAM: |
||||
|
param_reset(info.val.parm.name, info.val.parm.value); |
||||
|
break; |
||||
|
default: |
||||
|
if (filename) { |
||||
|
(void) fprintf(stderr, "Error in file `%s' at line %d:\n %s\n", |
||||
|
filename, line_count, info.val.str); |
||||
|
errors++; |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
#ifdef DO_DER |
||||
|
Der1(); |
||||
|
#endif |
||||
|
if (errors) |
||||
|
return -1; |
||||
|
else |
||||
|
return rdFindMax(); |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -0,0 +1,571 @@ |
|||||
|
/*LINTLIBRARY*/ |
||||
|
/* |
||||
|
* String Table (Hash) Package |
||||
|
* |
||||
|
* Peter Moore |
||||
|
* University of California, Berkeley |
||||
|
* 1985 |
||||
|
* |
||||
|
* This is a general purpose hash table package. |
||||
|
*/ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include "copyright.h" |
||||
|
#include "st.h" |
||||
|
#include "xgraph.h" |
||||
|
|
||||
|
#define max(a,b) ((a) > (b) ? (a) : (b)) |
||||
|
#define nil(type) ((type *) 0) |
||||
|
#define alloc(type) (type *) Malloc(sizeof(type)) |
||||
|
|
||||
|
#define ABS(x) ((x) < 0 ? -(x) : (x)) |
||||
|
#define ST_NUMCMP(x,y) ((int) (x) - (int) (y)) |
||||
|
#define ST_NUMHASH(x,size) (ABS((int)x)%(size)) |
||||
|
#define ST_PTRHASH(x,size) ((int)((unsigned)(x)>>2)%size) |
||||
|
#define EQUAL(func, x, y) \ |
||||
|
((((func) == st_numcmp) || ((func) == st_ptrcmp)) ?\ |
||||
|
(ST_NUMCMP((x),(y)) == 0) : ((*func)((x), (y)) == 0)) |
||||
|
|
||||
|
|
||||
|
#define do_hash(key, table)\ |
||||
|
((table->hash == st_ptrhash) ? ST_PTRHASH((key),(table)->num_bins) :\ |
||||
|
(table->hash == st_numhash) ? ST_NUMHASH((key), (table)->num_bins) :\ |
||||
|
(*table->hash)((key), (table)->num_bins)) |
||||
|
|
||||
|
char st_pkg_name[] = "st"; |
||||
|
|
||||
|
/* Possible error conditions */ |
||||
|
char *st_no_mem = "out of memory"; |
||||
|
char *st_bad_ret = "bad return code from function passed to st_foreach"; |
||||
|
char *st_bad_gen = "null or zero generator"; |
||||
|
|
||||
|
/* Forward declarations */ |
||||
|
int st_numhash(), st_ptrhash(), st_numcmp(), st_ptrcmp(); |
||||
|
static void rehash(); |
||||
|
static void errRaise(); |
||||
|
|
||||
|
|
||||
|
st_table * |
||||
|
st_init_table_with_params(compare, hash, size, density, grow_factor, |
||||
|
reorder_flag) |
||||
|
int (*compare) (); |
||||
|
int (*hash) (); |
||||
|
int size; |
||||
|
int density; |
||||
|
double grow_factor; |
||||
|
int reorder_flag; |
||||
|
|
||||
|
/* Detailed table allocator */ |
||||
|
{ |
||||
|
st_table *new; |
||||
|
|
||||
|
new = alloc(st_table); |
||||
|
if (!new) { |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
new->compare = compare; |
||||
|
new->hash = hash; |
||||
|
new->num_entries = 0; |
||||
|
new->max_density = density; |
||||
|
new->grow_factor = grow_factor; |
||||
|
new->reorder_flag = reorder_flag; |
||||
|
if (size <= 0) { |
||||
|
size = 1; |
||||
|
} |
||||
|
new->num_bins = size; |
||||
|
new->bins = |
||||
|
(st_table_entry **) Calloc((unsigned) size, sizeof(st_table_entry *)); |
||||
|
if (!new->bins) { |
||||
|
Free((char *) new); |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
return new; |
||||
|
} |
||||
|
|
||||
|
st_table * |
||||
|
st_init_table(compare, hash) |
||||
|
int (*compare) (); |
||||
|
int (*hash) (); |
||||
|
|
||||
|
/* Default table allocator */ |
||||
|
{ |
||||
|
return st_init_table_with_params(compare, hash, ST_DEFAULT_INIT_TABLE_SIZE, |
||||
|
ST_DEFAULT_MAX_DENSITY, |
||||
|
ST_DEFAULT_GROW_FACTOR, |
||||
|
ST_DEFAULT_REORDER_FLAG); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void |
||||
|
st_Free_table(table) |
||||
|
st_table *table; |
||||
|
|
||||
|
/* Destroy a table */ |
||||
|
{ |
||||
|
register st_table_entry *ptr, |
||||
|
*next; |
||||
|
int i; |
||||
|
|
||||
|
for (i = 0; i < table->num_bins; i++) { |
||||
|
ptr = table->bins[i]; |
||||
|
while (ptr != nil(st_table_entry)) { |
||||
|
next = ptr->next; |
||||
|
Free((char *) ptr); |
||||
|
ptr = next; |
||||
|
} |
||||
|
} |
||||
|
Free((char *) table->bins); |
||||
|
Free((char *) table); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#define PTR_NOT_EQUAL(table, ptr, user_key)\ |
||||
|
(ptr != nil(st_table_entry) && !EQUAL(table->compare, user_key, (ptr)->key)) |
||||
|
|
||||
|
#define FIND_ENTRY(table, hash_val, key, ptr, last) \ |
||||
|
(last) = &(table)->bins[hash_val];\ |
||||
|
(ptr) = *(last);\ |
||||
|
while (PTR_NOT_EQUAL((table), (ptr), (key))) {\ |
||||
|
(last) = &(ptr)->next; (ptr) = *(last);\ |
||||
|
}\ |
||||
|
if ((ptr) != nil(st_table_entry) && (table)->reorder_flag) {\ |
||||
|
*(last) = (ptr)->next;\ |
||||
|
(ptr)->next = (table)->bins[hash_val];\ |
||||
|
(table)->bins[hash_val] = (ptr);\ |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_lookup(table, key, value) |
||||
|
st_table *table; |
||||
|
register char *key; |
||||
|
char **value; |
||||
|
|
||||
|
/* Look up item in table -- return zero if not found */ |
||||
|
{ |
||||
|
int hash_val; |
||||
|
register st_table_entry *ptr, |
||||
|
**last; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
|
||||
|
FIND_ENTRY(table, hash_val, key, ptr, last); |
||||
|
|
||||
|
if (ptr == nil(st_table_entry)) { |
||||
|
return 0; |
||||
|
} |
||||
|
else { |
||||
|
if (value != nil(char *)) |
||||
|
*value = ptr->record; |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#define ADD_DIRECT(table, key, value, hash_val, new)\ |
||||
|
{\ |
||||
|
if (table->num_entries/table->num_bins >= table->max_density) {\ |
||||
|
(void) rehash(table);\ |
||||
|
hash_val = do_hash(key,table);\ |
||||
|
}\ |
||||
|
\ |
||||
|
new = alloc(st_table_entry);\ |
||||
|
\ |
||||
|
if (new) {\ |
||||
|
new->key = key;\ |
||||
|
new->record = value;\ |
||||
|
new->next = table->bins[hash_val];\ |
||||
|
table->bins[hash_val] = new;\ |
||||
|
table->num_entries++;\ |
||||
|
} else {\ |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem);\ |
||||
|
/* NOTREACHED */ \ |
||||
|
} \ |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_insert(table, key, value) |
||||
|
register st_table *table; |
||||
|
register char *key; |
||||
|
char *value; |
||||
|
|
||||
|
/* Insert an item into the table - replacing if it already exists */ |
||||
|
{ |
||||
|
int hash_val; |
||||
|
st_table_entry *new; |
||||
|
register st_table_entry *ptr, |
||||
|
**last; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
|
||||
|
FIND_ENTRY(table, hash_val, key, ptr, last); |
||||
|
|
||||
|
if (ptr == nil(st_table_entry)) { |
||||
|
ADD_DIRECT(table, key, value, hash_val, new); |
||||
|
return 0; |
||||
|
} |
||||
|
else { |
||||
|
ptr->record = value; |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
st_add_direct(table, key, value) |
||||
|
st_table *table; |
||||
|
char *key; |
||||
|
char *value; |
||||
|
|
||||
|
/* Add item to table without checking for existing item */ |
||||
|
{ |
||||
|
int hash_val; |
||||
|
st_table_entry *new; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
ADD_DIRECT(table, key, value, hash_val, new); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_find_or_add(table, key, slot) |
||||
|
st_table *table; |
||||
|
char *key; |
||||
|
char ***slot; |
||||
|
|
||||
|
/* Return slot for key - make one if one doesn't exist */ |
||||
|
{ |
||||
|
int hash_val; |
||||
|
st_table_entry *new, |
||||
|
*ptr, |
||||
|
**last; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
|
||||
|
FIND_ENTRY(table, hash_val, key, ptr, last); |
||||
|
|
||||
|
if (ptr == nil(st_table_entry)) { |
||||
|
ADD_DIRECT(table, key, (char *) 0, hash_val, new); |
||||
|
if (slot != nil(char **)) |
||||
|
*slot = &new->record; |
||||
|
return 0; |
||||
|
} |
||||
|
else { |
||||
|
if (slot != nil(char **)) |
||||
|
*slot = &ptr->record; |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_find(table, key, slot) |
||||
|
st_table *table; |
||||
|
char *key; |
||||
|
char ***slot; |
||||
|
|
||||
|
/* Finds an entry in table */ |
||||
|
{ |
||||
|
int hash_val; |
||||
|
st_table_entry *ptr, |
||||
|
**last; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
|
||||
|
FIND_ENTRY(table, hash_val, key, ptr, last); |
||||
|
|
||||
|
if (ptr == nil(st_table_entry)) { |
||||
|
return 0; |
||||
|
} |
||||
|
else { |
||||
|
if (slot != nil(char **)) |
||||
|
*slot = &ptr->record; |
||||
|
return 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static void |
||||
|
rehash(table) |
||||
|
register st_table *table; |
||||
|
|
||||
|
/* Grows table */ |
||||
|
{ |
||||
|
register st_table_entry *ptr, |
||||
|
*next, |
||||
|
**old_bins = table->bins; |
||||
|
int i, |
||||
|
old_num_bins = table->num_bins, |
||||
|
hash_val; |
||||
|
|
||||
|
table->num_bins = table->grow_factor * old_num_bins; |
||||
|
|
||||
|
if (table->num_bins % 2 == 0) { |
||||
|
table->num_bins += 1; |
||||
|
} |
||||
|
|
||||
|
table->bins = |
||||
|
(st_table_entry **) Calloc((unsigned) table->num_bins, |
||||
|
sizeof(st_table_entry *)); |
||||
|
|
||||
|
if (!table->bins) { |
||||
|
/* If out of memory: don't resize */ |
||||
|
table->bins = old_bins; |
||||
|
table->num_bins = old_num_bins; |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
table->num_entries = 0; |
||||
|
|
||||
|
for (i = 0; i < old_num_bins; i++) { |
||||
|
ptr = old_bins[i]; |
||||
|
while (ptr != nil(st_table_entry)) { |
||||
|
next = ptr->next; |
||||
|
hash_val = do_hash(ptr->key, table); |
||||
|
ptr->next = table->bins[hash_val]; |
||||
|
table->bins[hash_val] = ptr; |
||||
|
table->num_entries++; |
||||
|
ptr = next; |
||||
|
} |
||||
|
} |
||||
|
Free((char *) old_bins); |
||||
|
} |
||||
|
|
||||
|
st_table * |
||||
|
st_copy(old_table) |
||||
|
st_table *old_table; |
||||
|
{ |
||||
|
st_table *new_table; |
||||
|
st_table_entry *ptr, |
||||
|
*new; |
||||
|
int i, |
||||
|
num_bins = old_table->num_bins; |
||||
|
|
||||
|
new_table = alloc(st_table); |
||||
|
if (new_table == nil(st_table)) { |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
|
||||
|
*new_table = *old_table; |
||||
|
new_table->bins = |
||||
|
(st_table_entry **) Calloc((unsigned) num_bins, sizeof(st_table_entry *)); |
||||
|
|
||||
|
if (new_table->bins == nil(st_table_entry *)) { |
||||
|
Free((char *) new_table); |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
|
||||
|
for (i = 0; i < num_bins; i++) { |
||||
|
new_table->bins[i] = nil(st_table_entry); |
||||
|
ptr = old_table->bins[i]; |
||||
|
while (ptr != nil(st_table_entry)) { |
||||
|
new = alloc(st_table_entry); |
||||
|
if (new == nil(st_table_entry)) { |
||||
|
Free((char *) new_table->bins); |
||||
|
Free((char *) new_table); |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
*new = *ptr; |
||||
|
new->next = new_table->bins[i]; |
||||
|
new_table->bins[i] = new; |
||||
|
ptr = ptr->next; |
||||
|
} |
||||
|
} |
||||
|
return new_table; |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_delete(table, keyp, value) |
||||
|
register st_table *table; |
||||
|
register char **keyp; |
||||
|
char **value; |
||||
|
{ |
||||
|
int hash_val; |
||||
|
char *key = *keyp; |
||||
|
register st_table_entry *ptr, |
||||
|
**last; |
||||
|
|
||||
|
hash_val = do_hash(key, table); |
||||
|
|
||||
|
FIND_ENTRY(table, hash_val, key, ptr, last); |
||||
|
|
||||
|
if (ptr == nil(st_table_entry)) { |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
*last = ptr->next; |
||||
|
if (value != nil(char *)) |
||||
|
*value = ptr->record; |
||||
|
*keyp = ptr->key; |
||||
|
Free((char *) ptr); |
||||
|
table->num_entries--; |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_foreach(table, func, arg) |
||||
|
st_table *table; |
||||
|
enum st_retval (*func) (); |
||||
|
char *arg; |
||||
|
{ |
||||
|
st_table_entry *ptr, |
||||
|
**last; |
||||
|
enum st_retval retval; |
||||
|
int i; |
||||
|
|
||||
|
for (i = 0; i < table->num_bins; i++) { |
||||
|
last = &table->bins[i]; |
||||
|
ptr = *last; |
||||
|
while (ptr != nil(st_table_entry)) { |
||||
|
retval = (*func) (ptr->key, ptr->record, arg); |
||||
|
switch (retval) { |
||||
|
case ST_CONTINUE: |
||||
|
last = &ptr->next; |
||||
|
ptr = *last; |
||||
|
break; |
||||
|
case ST_STOP: |
||||
|
return 0; |
||||
|
case ST_DELETE: |
||||
|
*last = ptr->next; |
||||
|
Free((char *) ptr); |
||||
|
ptr = *last; |
||||
|
break; |
||||
|
default: |
||||
|
errRaise(st_pkg_name, ST_BAD_RET, st_bad_ret); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_strhash(string, modulus) |
||||
|
register char *string; |
||||
|
int modulus; |
||||
|
{ |
||||
|
register int val = 0; |
||||
|
register int c; |
||||
|
|
||||
|
while ((c = *string++) != '\0') { |
||||
|
val = val * 997 + c; |
||||
|
} |
||||
|
|
||||
|
return ((val < 0) ? -val : val) % modulus; |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_numhash(x, size) |
||||
|
char *x; |
||||
|
int size; |
||||
|
{ |
||||
|
return ST_NUMHASH(x, size); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_ptrhash(x, size) |
||||
|
char *x; |
||||
|
int size; |
||||
|
{ |
||||
|
return ST_PTRHASH(x, size); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_numcmp(x, y) |
||||
|
char *x; |
||||
|
char *y; |
||||
|
{ |
||||
|
return ST_NUMCMP(x, y); |
||||
|
} |
||||
|
|
||||
|
int |
||||
|
st_ptrcmp(x, y) |
||||
|
char *x; |
||||
|
char *y; |
||||
|
{ |
||||
|
return ST_NUMCMP(x, y); |
||||
|
} |
||||
|
|
||||
|
st_generator * |
||||
|
st_init_gen(table) |
||||
|
st_table *table; |
||||
|
|
||||
|
/* Initializes generation of items in table */ |
||||
|
{ |
||||
|
st_generator *gen; |
||||
|
|
||||
|
gen = alloc(st_generator); |
||||
|
if (!gen) { |
||||
|
errRaise(st_pkg_name, ST_NO_MEM, st_no_mem); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
gen->table = table; |
||||
|
gen->entry = nil(st_table_entry); |
||||
|
gen->idx = 0; |
||||
|
return gen; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int |
||||
|
st_gen(gen, key_p, value_p) |
||||
|
st_generator *gen; |
||||
|
char **key_p; |
||||
|
char **value_p; |
||||
|
|
||||
|
/* Generates next item in generation sequence */ |
||||
|
{ |
||||
|
register int i; |
||||
|
|
||||
|
if (!gen) { |
||||
|
errRaise(st_pkg_name, ST_BAD_GEN, st_bad_gen); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
|
||||
|
if (gen->entry == nil(st_table_entry)) { |
||||
|
/* try to find next entry */ |
||||
|
for (i = gen->idx; i < gen->table->num_bins; i++) { |
||||
|
if (gen->table->bins[i] != nil(st_table_entry)) { |
||||
|
gen->idx = i + 1; |
||||
|
gen->entry = gen->table->bins[i]; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
if (gen->entry == nil(st_table_entry)) { |
||||
|
return 0; /* that's all folks ! */ |
||||
|
} |
||||
|
} |
||||
|
*key_p = gen->entry->key; |
||||
|
if (value_p != 0) |
||||
|
*value_p = gen->entry->record; |
||||
|
gen->entry = gen->entry->next; |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void |
||||
|
st_Free_gen(gen) |
||||
|
st_generator *gen; |
||||
|
{ |
||||
|
if (gen) { |
||||
|
Free((char *) gen); |
||||
|
} |
||||
|
else { |
||||
|
errRaise(st_pkg_name, ST_BAD_GEN, st_bad_gen); |
||||
|
/* NOTREACHED */ |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static void |
||||
|
errRaise(pkg, num, msg) |
||||
|
char *pkg; |
||||
|
int num; |
||||
|
char *msg; |
||||
|
|
||||
|
/* |
||||
|
* In this standalone version of st, and error raise causes |
||||
|
* an abort after printing a message. |
||||
|
*/ |
||||
|
{ |
||||
|
(void) fprintf(stderr, "%s: %s\n", pkg, msg); |
||||
|
abort(); |
||||
|
} |
||||
@ -0,0 +1,119 @@ |
|||||
|
/* $Header$ */ |
||||
|
|
||||
|
#ifndef ST_INCLUDED |
||||
|
#define ST_INCLUDED |
||||
|
|
||||
|
/* Function prototypes */ |
||||
|
#ifdef __STDC__ |
||||
|
#define ARGS(args) args |
||||
|
#else |
||||
|
#define ARGS(args) () |
||||
|
#endif |
||||
|
|
||||
|
extern char st_pkg_name[]; |
||||
|
|
||||
|
/* Fatal error codes */ |
||||
|
#define ST_NO_MEM 0 |
||||
|
#define ST_BAD_RET 1 |
||||
|
#define ST_BAD_GEN 2 |
||||
|
|
||||
|
typedef struct st_table_entry st_table_entry; |
||||
|
struct st_table_entry { |
||||
|
char *key; |
||||
|
char *record; |
||||
|
st_table_entry *next; |
||||
|
}; |
||||
|
|
||||
|
typedef struct st_table st_table; |
||||
|
struct st_table { |
||||
|
int (*compare) (); |
||||
|
int (*hash) (); |
||||
|
int num_bins; |
||||
|
int num_entries; |
||||
|
int max_density; |
||||
|
int reorder_flag; |
||||
|
double grow_factor; |
||||
|
st_table_entry **bins; |
||||
|
}; |
||||
|
|
||||
|
typedef struct st_generator st_generator; |
||||
|
struct st_generator { |
||||
|
st_table *table; |
||||
|
st_table_entry *entry; |
||||
|
int idx; |
||||
|
}; |
||||
|
|
||||
|
#define st_is_member(table,key) st_lookup(table,key,(char **) 0) |
||||
|
#define st_count(table) ((table)->num_entries) |
||||
|
|
||||
|
enum st_retval { |
||||
|
ST_CONTINUE, ST_STOP, ST_DELETE |
||||
|
}; |
||||
|
|
||||
|
extern st_table *st_init_table_with_params |
||||
|
ARGS((int (*compare) (), int (*hash) (), int size, int density, |
||||
|
double grow_factor, int reorder_flag)); |
||||
|
|
||||
|
extern st_table *st_init_table |
||||
|
ARGS((int (*compare) (), int (*hash) ())); |
||||
|
|
||||
|
extern void st_free_table |
||||
|
ARGS((st_table * table)); |
||||
|
|
||||
|
extern int st_lookup |
||||
|
ARGS((st_table * table, char *key, char **value)); |
||||
|
|
||||
|
extern int st_insert |
||||
|
ARGS((st_table * table, char *key, char *value)); |
||||
|
|
||||
|
extern void st_add_direct |
||||
|
ARGS((st_table * table, char *key, char *value)); |
||||
|
|
||||
|
extern int st_find_or_add |
||||
|
ARGS((st_table * table, char *key, char ***slot)); |
||||
|
|
||||
|
extern int st_find |
||||
|
ARGS((st_table * table, char *key, char ***slot)); |
||||
|
|
||||
|
extern st_table *st_copy |
||||
|
ARGS((st_table * old_table)); |
||||
|
|
||||
|
extern int st_delete |
||||
|
ARGS((st_table * table, char **keyp, char **value)); |
||||
|
|
||||
|
extern int st_foreach |
||||
|
ARGS((st_table * table, enum st_retval(*func) (), char *arg)); |
||||
|
|
||||
|
extern int st_strhash |
||||
|
ARGS((char *string, int modulus)); |
||||
|
|
||||
|
extern int st_numhash |
||||
|
ARGS((char *x, int size)); |
||||
|
|
||||
|
extern int st_ptrhash |
||||
|
ARGS((char *x, int size)); |
||||
|
|
||||
|
extern int st_numcmp |
||||
|
ARGS((char *x, char *y)); |
||||
|
|
||||
|
extern int st_ptrcmp |
||||
|
ARGS((char *x, char *y)); |
||||
|
|
||||
|
extern st_generator *st_init_gen |
||||
|
ARGS((st_table * table)); |
||||
|
|
||||
|
extern int st_gen |
||||
|
ARGS((st_generator * gen, char **key_p, char **value_p)); |
||||
|
|
||||
|
extern void st_free_gen |
||||
|
ARGS((st_generator * gen)); |
||||
|
|
||||
|
#define ST_DEFAULT_MAX_DENSITY 5 |
||||
|
#define ST_DEFAULT_INIT_TABLE_SIZE 11 |
||||
|
#define ST_DEFAULT_GROW_FACTOR 2.0 |
||||
|
#define ST_DEFAULT_REORDER_FLAG 0 |
||||
|
|
||||
|
#define st_foreach_item(table, gen, key_p, value_p) \ |
||||
|
for(gen=st_init_gen(table); st_gen(gen,key_p,value_p) || (st_free_gen(gen),0);) |
||||
|
|
||||
|
#endif /* ST_INCLUDED */ |
||||
@ -0,0 +1 @@ |
|||||
|
timestamp |
||||
@ -0,0 +1,329 @@ |
|||||
|
/* |
||||
|
* Tgif Output |
||||
|
* |
||||
|
* Christos Zoulas |
||||
|
*/ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <X11/Xlib.h> |
||||
|
#include "hard_devices.h" |
||||
|
#include "xgout.h" |
||||
|
|
||||
|
#define COLOR "DarkSlateGray" |
||||
|
|
||||
|
typedef struct { |
||||
|
char *title_font; |
||||
|
char *axis_font; |
||||
|
int title_size; |
||||
|
int axis_size; |
||||
|
FILE *strm; |
||||
|
} Info; |
||||
|
|
||||
|
char *tgif_prologue[] = |
||||
|
{ |
||||
|
"state(0,13,0,0,0,16,1,5,1,1,0,0,1,0,1,0,1,0,4,0,0,0,10,0).\n", |
||||
|
"%\n", |
||||
|
"% Tgif xgraph output.\n", |
||||
|
"%\n", |
||||
|
0 |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
* Hardcopy Interface for Xgraph |
||||
|
* |
||||
|
* Major differences from first version: |
||||
|
* Four new parameters are passed to the device initialization routine: |
||||
|
* title_family, title_size, axis_family, and axis_size. See the |
||||
|
* description of xg_init() for details. |
||||
|
* |
||||
|
* Clipping is done automatically by xgraph. The xg_clip() routine |
||||
|
* is obsolete. |
||||
|
* |
||||
|
* The xg_line() routine has become the xg_seg() routine. It now |
||||
|
* draws segments rather than a series of lines. |
||||
|
* |
||||
|
* A new field (max_segs) in the device structure now specifies |
||||
|
* the maximum number of segments the device can handle in a group. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
void tgifText(); |
||||
|
void tgifDot(); |
||||
|
void tgifSeg(); |
||||
|
void tgifEnd(); |
||||
|
|
||||
|
int |
||||
|
tgifInit(strm, width, height, title_family, title_size, |
||||
|
axis_family, axis_size, flags, out_info, errmsg) |
||||
|
FILE *strm; /* Output stream */ |
||||
|
int width, |
||||
|
height; /* Size of space (microns) */ |
||||
|
char *title_family; /* Name of title font family */ |
||||
|
double title_size; /* Title font height (points) */ |
||||
|
char *axis_family; /* Name of axis font family */ |
||||
|
double axis_size; /* Axis font height (points) */ |
||||
|
int flags; /* Flags */ |
||||
|
xgOut *out_info; /* Device info (RETURN) */ |
||||
|
char errmsg[ERRBUFSIZE]; /* Error message area */ |
||||
|
|
||||
|
{ |
||||
|
Info *tgif_info; |
||||
|
char **l; |
||||
|
double scx, |
||||
|
scy; |
||||
|
|
||||
|
tgif_info = (Info *) Malloc(sizeof(*tgif_info)); |
||||
|
|
||||
|
for (l = tgif_prologue; *l; l++) |
||||
|
fprintf(strm, "%s\n", *l); |
||||
|
|
||||
|
out_info->dev_flags = 0; |
||||
|
scx = width / 512.0; |
||||
|
scy = height / 512.0; |
||||
|
if (scx > scy) { |
||||
|
scy /= scx; |
||||
|
scx = 1; |
||||
|
} |
||||
|
else { |
||||
|
scx /= scy; |
||||
|
scy = 1; |
||||
|
} |
||||
|
out_info->bdr_pad = title_size / 4; |
||||
|
out_info->axis_pad = 2.0 * axis_size; |
||||
|
out_info->legend_pad = 0; |
||||
|
|
||||
|
out_info->area_w = width * 0.00283 * scx; /* pts per micron */ |
||||
|
out_info->area_h = height * 0.00283 * scy; |
||||
|
|
||||
|
out_info->tick_len = axis_size; |
||||
|
out_info->axis_height = axis_size; |
||||
|
out_info->title_height = title_size; |
||||
|
out_info->axis_width = (axis_size * 5.0) / 12.0; |
||||
|
out_info->title_width = (title_size * 5.0) / 12.0; |
||||
|
out_info->max_segs = 100; |
||||
|
out_info->xg_text = tgifText; |
||||
|
out_info->xg_seg = tgifSeg; |
||||
|
out_info->xg_dot = tgifDot; |
||||
|
out_info->xg_end = tgifEnd; |
||||
|
out_info->user_state = (char *) tgif_info; |
||||
|
|
||||
|
tgif_info->title_font = title_family; |
||||
|
tgif_info->axis_font = axis_family; |
||||
|
tgif_info->title_size = title_size; |
||||
|
tgif_info->axis_size = axis_size; |
||||
|
tgif_info->strm = strm; |
||||
|
return 1; |
||||
|
} |
||||
|
|
||||
|
/* Text justifications */ |
||||
|
#define T_CENTER 0 |
||||
|
#define T_LEFT 1 |
||||
|
#define T_UPPERLEFT 2 |
||||
|
#define T_TOP 3 |
||||
|
#define T_UPPERRIGHT 4 |
||||
|
#define T_RIGHT 5 |
||||
|
#define T_LOWERRIGHT 6 |
||||
|
#define T_BOTTOM 7 |
||||
|
#define T_LOWERLEFT 8 |
||||
|
|
||||
|
/* Text styles */ |
||||
|
#define T_AXIS 0 |
||||
|
#define T_TITLE 1 |
||||
|
|
||||
|
static void |
||||
|
tgif_just(x, y, just, size, len) |
||||
|
int *x, |
||||
|
*y; /* Given location (lower left) */ |
||||
|
int just; /* Justification */ |
||||
|
int size; /* Size in points */ |
||||
|
int len; /* Number of chars */ |
||||
|
|
||||
|
/* |
||||
|
* Unfortunately, tgif really can't display text with a justification. |
||||
|
* This is a horrible hack to try to get around the problem. It tries |
||||
|
* to compute a rough bounding box for the text based on the text height |
||||
|
* and the string length and offset `x,y' appropriately for the justification. |
||||
|
* This is only a hack... |
||||
|
*/ |
||||
|
{ |
||||
|
int t_width, |
||||
|
t_height; |
||||
|
|
||||
|
t_height = size; |
||||
|
t_width = (size * len * 5) / 12; /* Horrible estimate */ |
||||
|
|
||||
|
switch (just) { |
||||
|
case T_CENTER: |
||||
|
*x -= t_width / 2; |
||||
|
*y -= t_height / 2; |
||||
|
break; |
||||
|
case T_LEFT: |
||||
|
*y -= t_height / 2; |
||||
|
break; |
||||
|
case T_UPPERLEFT: |
||||
|
/* nothing */ |
||||
|
break; |
||||
|
case T_TOP: |
||||
|
*x -= t_width / 2; |
||||
|
break; |
||||
|
case T_UPPERRIGHT: |
||||
|
*x -= t_width; |
||||
|
break; |
||||
|
case T_RIGHT: |
||||
|
*x -= t_width; |
||||
|
*y -= t_height / 2; |
||||
|
break; |
||||
|
case T_LOWERRIGHT: |
||||
|
*x -= t_width; |
||||
|
*y -= t_height; |
||||
|
break; |
||||
|
case T_BOTTOM: |
||||
|
*x -= t_width / 2; |
||||
|
*y -= t_height; |
||||
|
break; |
||||
|
case T_LOWERLEFT: |
||||
|
*y -= t_height; |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Also, tgif seems to put a space above all text it draws. The |
||||
|
* computation below compensates for this. |
||||
|
*/ |
||||
|
*y += (size / 3); |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
tgifText(user_state, x, y, text, just, style) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Text position (pixels) */ |
||||
|
char *text; /* Null terminated text */ |
||||
|
int just; /* Justification (above) */ |
||||
|
int style; /* Text style (above) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw text at the indicated position using |
||||
|
* the indicated justification and style. The justification refers |
||||
|
* to the location of the point in reference to the text. For example, |
||||
|
* if just is T_LOWERLEFT, (x,y) should be located at the lower left |
||||
|
* edge of the text string. |
||||
|
*/ |
||||
|
{ |
||||
|
char *font; |
||||
|
int size; |
||||
|
Info *tgif = (Info *) user_state; |
||||
|
|
||||
|
/* |
||||
|
* Obj = text(_Color,_X,_Y,_Font,_TextStyle,_TextSize,_NumLines,_TextJust, |
||||
|
* _TextRotate,_PenPat,_BBoxW,_BBoxH,_Id,_TextDPI,_Asc,_Des, |
||||
|
* _ObjFill,_Vspace,StrList), |
||||
|
*/ |
||||
|
/* font ok too */ |
||||
|
style == T_AXIS ? tgif->axis_font : |
||||
|
tgif->title_font; |
||||
|
/* ok 0, 1 as in tgif */ |
||||
|
size = style == T_AXIS ? tgif->axis_size : |
||||
|
tgif->title_size; |
||||
|
tgif_just(&x, &y, just, size, strlen(text)); |
||||
|
|
||||
|
if (size <= 8) |
||||
|
size = 0; |
||||
|
else if (size <= 10) |
||||
|
size = 1; |
||||
|
else if (size <= 12) |
||||
|
size = 2; |
||||
|
else if (size <= 14) |
||||
|
size = 3; |
||||
|
else if (size <= 18) |
||||
|
size = 4; |
||||
|
else |
||||
|
size = 5; |
||||
|
|
||||
|
fprintf(tgif->strm, |
||||
|
"text('%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,[\n\t", |
||||
|
COLOR, x, y, 0, style, size, 1, 0, 0, 1, 0, 0, 0, 0, 18, 4, 0, 0); |
||||
|
fprintf(tgif->strm, |
||||
|
"\"%s\"]).\n", text); |
||||
|
} |
||||
|
|
||||
|
/* Line Styles */ |
||||
|
#define L_AXIS 0 |
||||
|
#define L_ZERO 1 |
||||
|
#define L_VAR 2 |
||||
|
|
||||
|
void |
||||
|
tgifSeg(user_state, ns, seglist, width, style, lappr, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int ns; /* Number of segments */ |
||||
|
XSegment *seglist; /* X array of segments */ |
||||
|
int width; /* Width of lines */ |
||||
|
int style; /* See above */ |
||||
|
int lappr; /* Line appearence */ |
||||
|
int color; /* Line color (if any) */ |
||||
|
{ |
||||
|
Info *tgif = (Info *) user_state; |
||||
|
int i, |
||||
|
j, |
||||
|
k; |
||||
|
|
||||
|
/* |
||||
|
* poly(_Color,_NumVs,_Vs,_LineStyle,_LineWidth,_PenPat,_Id,_Spline, |
||||
|
* _ObjFill,_Dash,AttrList), |
||||
|
*/ |
||||
|
static int style_list[] = |
||||
|
{ |
||||
|
1, 10, 7, 6, 5, 4, 3, 2 |
||||
|
}; |
||||
|
|
||||
|
for (i = 0; i < ns; i++) { |
||||
|
fprintf(tgif->strm, "poly('%s',2,[%d,%d,%d,%d],", COLOR, |
||||
|
seglist[i].x1, seglist[i].y1, |
||||
|
seglist[i].x2, seglist[i].y2); |
||||
|
fprintf(tgif->strm, "%d,%d,%d,%d,%d,%d,%d,[\n]).\n", 0, width, |
||||
|
style_list[lappr], 0, 0, style_list[lappr], 0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* Marker styles */ |
||||
|
#define P_PIXEL 0 |
||||
|
#define P_DOT 1 |
||||
|
#define P_MARK 2 |
||||
|
|
||||
|
void |
||||
|
tgifDot(user_state, x, y, style, type, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Location in pixel units */ |
||||
|
int style; /* Dot style */ |
||||
|
int type; /* Type of marker */ |
||||
|
int color; /* Marker color (if any) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw a marker at location `x,y'. If the |
||||
|
* style is P_PIXEL, the dot should be a single pixel. If |
||||
|
* the style is P_DOT, the dot should be a reasonably large |
||||
|
* dot. If the style is P_MARK, it should be a distinguished |
||||
|
* mark which is specified by `type' (0-7). If the output |
||||
|
* device is capable of color, the marker should be drawn in |
||||
|
* `color' (0-7) which corresponds with the color for xg_line. |
||||
|
*/ |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
void |
||||
|
tgifEnd(user_state) |
||||
|
char *user_state; |
||||
|
|
||||
|
/* |
||||
|
* This routine is called after a drawing sequence is complete. |
||||
|
* It can be used to clean up the user state and set the device |
||||
|
* state appropriately. This routine is optional in the structure. |
||||
|
*/ |
||||
|
{ |
||||
|
Info *tgif = (Info *) user_state; |
||||
|
|
||||
|
fclose(tgif->strm); |
||||
|
} |
||||
@ -0,0 +1,480 @@ |
|||||
|
/* |
||||
|
* Generic Output Driver for X |
||||
|
* X version 11 |
||||
|
* |
||||
|
* This is the primary output driver used by the new X graph |
||||
|
* to display output to the X server. It has been factored |
||||
|
* out of the original xgraph to allow mulitple hardcopy |
||||
|
* output devices to share xgraph's capabilities. Note: |
||||
|
* xgraph is still heavily X oriented. This is not intended |
||||
|
* for porting to other window systems. |
||||
|
*/ |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
#include "xgout.h" |
||||
|
#include "params.h" |
||||
|
|
||||
|
#define PADDING 2 |
||||
|
#define SPACE 10 |
||||
|
#define TICKLENGTH 5 |
||||
|
#define MAXSEGS 1000 |
||||
|
|
||||
|
struct x_state { |
||||
|
Window win; /* Primary window */ |
||||
|
}; |
||||
|
|
||||
|
void text_X(); |
||||
|
void seg_X(); |
||||
|
void dot_X(); |
||||
|
|
||||
|
|
||||
|
typedef struct attr_set { |
||||
|
char lineStyle[MAXLS]; |
||||
|
int lineStyleLen; |
||||
|
Pixel pixelValue; |
||||
|
Pixmap markStyle; |
||||
|
} AttrSet; |
||||
|
|
||||
|
static AttrSet AllAttrs[MAXATTR]; |
||||
|
|
||||
|
static Pixmap dotMap = (Pixmap) 0; |
||||
|
|
||||
|
/* |
||||
|
* Marker bitmaps |
||||
|
*/ |
||||
|
|
||||
|
#include "bitmaps/dot.11" |
||||
|
|
||||
|
#include "bitmaps/mark1.11" |
||||
|
#include "bitmaps/mark2.11" |
||||
|
#include "bitmaps/mark3.11" |
||||
|
#include "bitmaps/mark4.11" |
||||
|
#include "bitmaps/mark5.11" |
||||
|
#include "bitmaps/mark6.11" |
||||
|
#include "bitmaps/mark7.11" |
||||
|
#include "bitmaps/mark8.11" |
||||
|
|
||||
|
/* Sizes exported for marker drawing */ |
||||
|
static unsigned int dot_w = dot_width; |
||||
|
static unsigned int dot_h = dot_height; |
||||
|
static unsigned int mark_w = mark1_width; |
||||
|
static unsigned int mark_h = mark1_height; |
||||
|
static int mark_cx = mark1_x_hot; |
||||
|
static int mark_cy = mark1_y_hot; |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
set_X(new_win, out_info) |
||||
|
Window new_win; /* Newly created window */ |
||||
|
xgOut *out_info; /* Information to set */ |
||||
|
|
||||
|
/* |
||||
|
* Sets some of the common parameters for the X output device. |
||||
|
*/ |
||||
|
{ |
||||
|
struct x_state *new_state; |
||||
|
XFontStruct *font; |
||||
|
|
||||
|
out_info->dev_flags = ((depth > 3) ? D_COLOR : 0); |
||||
|
out_info->area_w = out_info->area_h = 0; /* Set later */ |
||||
|
out_info->bdr_pad = PADDING; |
||||
|
out_info->axis_pad = SPACE; |
||||
|
out_info->legend_pad = 0; |
||||
|
out_info->tick_len = TICKLENGTH; |
||||
|
|
||||
|
font = PM_FONT("LabelFont"); |
||||
|
#ifdef OLD |
||||
|
out_info->axis_width = |
||||
|
font->max_bounds.rbearing - font->max_bounds.lbearing; |
||||
|
#endif |
||||
|
out_info->axis_width = XTextWidth(font, "8", 1); |
||||
|
out_info->axis_height = |
||||
|
font->max_bounds.ascent + font->max_bounds.descent; |
||||
|
|
||||
|
font = PM_FONT("TitleFont"); |
||||
|
#ifdef OLD |
||||
|
out_info->title_width = |
||||
|
font->max_bounds.rbearing - font->max_bounds.lbearing; |
||||
|
#endif |
||||
|
out_info->title_width = XTextWidth(font, "8", 1); |
||||
|
out_info->title_height = |
||||
|
font->max_bounds.ascent + font->max_bounds.descent; |
||||
|
out_info->max_segs = MAXSEGS; |
||||
|
|
||||
|
out_info->xg_text = text_X; |
||||
|
out_info->xg_seg = seg_X; |
||||
|
out_info->xg_dot = dot_X; |
||||
|
out_info->xg_end = (void (*) ()) 0; |
||||
|
new_state = (struct x_state *) Malloc(sizeof(struct x_state)); |
||||
|
new_state->win = new_win; |
||||
|
out_info->user_state = (char *) new_state; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
static void |
||||
|
init_once() |
||||
|
/* |
||||
|
* Initializes AllAttrs. |
||||
|
*/ |
||||
|
{ |
||||
|
Window temp_win; |
||||
|
XSetWindowAttributes wattr; |
||||
|
char name[1024]; |
||||
|
int idx; |
||||
|
params style_val; |
||||
|
|
||||
|
/* Get attributes out parameters database */ |
||||
|
for (idx = 0; idx < MAXATTR; idx++) { |
||||
|
(void) sprintf(name, "%d.Style", idx); |
||||
|
(void) param_get(name, &style_val); |
||||
|
AllAttrs[idx].lineStyleLen = style_val.stylev.len; |
||||
|
(void) strncpy(AllAttrs[idx].lineStyle, style_val.stylev.dash_list, |
||||
|
style_val.stylev.len); |
||||
|
(void) sprintf(name, "%d.Color", idx); |
||||
|
AllAttrs[idx].pixelValue = PM_PIXEL(name); |
||||
|
} |
||||
|
|
||||
|
/* Create a temporary window for representing depth */ |
||||
|
temp_win = XCreateWindow(disp, RootWindow(disp, screen), |
||||
|
0, 0, 10, 10, 0, depth, InputOutput, |
||||
|
vis, (unsigned long) 0, &wattr); |
||||
|
|
||||
|
/* Store bitmaps for dots and markers */ |
||||
|
dotMap = XCreateBitmapFromData(disp, temp_win, dot_bits, dot_w, dot_h); |
||||
|
|
||||
|
AllAttrs[0].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark1_bits, mark_w, mark_h); |
||||
|
AllAttrs[1].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark2_bits, mark_w, mark_h); |
||||
|
AllAttrs[2].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark3_bits, mark_w, mark_h); |
||||
|
AllAttrs[3].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark4_bits, mark_w, mark_h); |
||||
|
AllAttrs[4].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark5_bits, mark_w, mark_h); |
||||
|
AllAttrs[5].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark6_bits, mark_w, mark_h); |
||||
|
AllAttrs[6].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark7_bits, mark_w, mark_h); |
||||
|
AllAttrs[7].markStyle = XCreateBitmapFromData(disp, temp_win, |
||||
|
mark8_bits, mark_w, mark_h); |
||||
|
XDestroyWindow(disp, temp_win); |
||||
|
} |
||||
|
|
||||
|
/*ARGSUSED*/ |
||||
|
void |
||||
|
init_X(user_state) |
||||
|
char *user_state; |
||||
|
|
||||
|
/* |
||||
|
* Initializes for an X drawing sequence. Sets up drawing attributes |
||||
|
* by reading values from the parameter database. |
||||
|
*/ |
||||
|
{ |
||||
|
static int initialized = 0; |
||||
|
|
||||
|
if (!initialized) { |
||||
|
init_once(); |
||||
|
initialized = 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static GC |
||||
|
textGC(t_win, t_font) |
||||
|
Window t_win; /* Window for making GC */ |
||||
|
XFontStruct *t_font; /* Text font */ |
||||
|
|
||||
|
/* |
||||
|
* Sets the fields above in a global graphics context. If |
||||
|
* the graphics context does not exist, it is created. |
||||
|
*/ |
||||
|
{ |
||||
|
static GC text_gc = (GC) 0; |
||||
|
XGCValues gcvals; |
||||
|
unsigned long gcmask; |
||||
|
|
||||
|
gcvals.font = t_font->fid; |
||||
|
gcmask = GCFont; |
||||
|
if (text_gc == (GC) 0) { |
||||
|
gcvals.foreground = PM_PIXEL("Foreground"); |
||||
|
gcmask |= GCForeground; |
||||
|
text_gc = XCreateGC(disp, t_win, gcmask, &gcvals); |
||||
|
} |
||||
|
else { |
||||
|
XChangeGC(disp, text_gc, gcmask, &gcvals); |
||||
|
} |
||||
|
return text_gc; |
||||
|
} |
||||
|
|
||||
|
static GC |
||||
|
segGC(l_win, l_fg, l_style, l_width, l_chars, l_len) |
||||
|
Window l_win; /* Window for making GC */ |
||||
|
Pixel l_fg; /* Foreground color */ |
||||
|
int l_style; /* Line style */ |
||||
|
int l_width; /* Line width */ |
||||
|
char *l_chars; /* Character spec */ |
||||
|
int l_len; /* Length of spec */ |
||||
|
|
||||
|
/* |
||||
|
* Sets the fields above in a global graphics context. If the |
||||
|
* graphics context does not exist, it is created. |
||||
|
*/ |
||||
|
{ |
||||
|
static GC segment_gc = (GC) 0; |
||||
|
XGCValues gcvals; |
||||
|
unsigned long gcmask; |
||||
|
|
||||
|
gcvals.foreground = l_fg; |
||||
|
gcvals.line_style = l_style; |
||||
|
gcvals.line_width = l_width; |
||||
|
gcmask = GCForeground | GCLineStyle | GCLineWidth; |
||||
|
if (segment_gc == (GC) 0) { |
||||
|
segment_gc = XCreateGC(disp, l_win, gcmask, &gcvals); |
||||
|
} |
||||
|
else { |
||||
|
XChangeGC(disp, segment_gc, gcmask, &gcvals); |
||||
|
} |
||||
|
if (l_len > 0) { |
||||
|
XSetDashes(disp, segment_gc, 0, l_chars, l_len); |
||||
|
} |
||||
|
return segment_gc; |
||||
|
} |
||||
|
|
||||
|
static GC |
||||
|
dotGC(d_win, d_fg, d_clipmask, d_xorg, d_yorg) |
||||
|
Window d_win; /* Window for making GC */ |
||||
|
Pixel d_fg; /* Foreground color */ |
||||
|
Pixmap d_clipmask; /* Clipmask */ |
||||
|
int d_xorg, |
||||
|
d_yorg; /* Clipmask origin */ |
||||
|
|
||||
|
/* |
||||
|
* Sets the fields above in a global graphics context. If the |
||||
|
* graphics context does not exist, it is created. |
||||
|
*/ |
||||
|
{ |
||||
|
static GC dot_gc = (GC) 0; |
||||
|
XGCValues gcvals; |
||||
|
unsigned long gcmask; |
||||
|
|
||||
|
gcvals.foreground = d_fg; |
||||
|
gcvals.clip_mask = d_clipmask; |
||||
|
gcvals.clip_x_origin = d_xorg; |
||||
|
gcvals.clip_y_origin = d_yorg; |
||||
|
gcmask = GCForeground | GCClipMask | GCClipXOrigin | GCClipYOrigin; |
||||
|
if (dot_gc == (GC) 0) { |
||||
|
dot_gc = XCreateGC(disp, d_win, gcmask, &gcvals); |
||||
|
} |
||||
|
else { |
||||
|
XChangeGC(disp, dot_gc, gcmask, &gcvals); |
||||
|
} |
||||
|
return dot_gc; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
text_X(user_state, x, y, text, just, style) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Text position (pixels) */ |
||||
|
char *text; /* Null terminated text */ |
||||
|
int just; /* Justification (above) */ |
||||
|
int style; /* Text style (above) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw text at the indicated position using |
||||
|
* the indicated justification and style. The justification refers |
||||
|
* to the location of the point in reference to the text. For example, |
||||
|
* if just is T_LOWERLEFT, (x,y) should be located at the lower left |
||||
|
* edge of the text string. |
||||
|
*/ |
||||
|
{ |
||||
|
struct x_state *st = (struct x_state *) user_state; |
||||
|
XCharStruct bb; |
||||
|
int rx = 0, |
||||
|
ry = 0, |
||||
|
len, |
||||
|
height, |
||||
|
width, |
||||
|
dir; |
||||
|
int ascent, |
||||
|
descent; |
||||
|
XFontStruct *font; |
||||
|
|
||||
|
len = strlen(text); |
||||
|
font = ((style == T_TITLE) ? PM_FONT("TitleFont") : PM_FONT("LabelFont")); |
||||
|
XTextExtents(font, text, len, &dir, &ascent, &descent, &bb); |
||||
|
width = bb.rbearing - bb.lbearing; |
||||
|
height = bb.ascent + bb.descent; |
||||
|
|
||||
|
switch (just) { |
||||
|
case T_CENTER: |
||||
|
rx = x - (width / 2); |
||||
|
ry = y - (height / 2); |
||||
|
break; |
||||
|
case T_LEFT: |
||||
|
rx = x; |
||||
|
ry = y - (height / 2); |
||||
|
break; |
||||
|
case T_UPPERLEFT: |
||||
|
rx = x; |
||||
|
ry = y; |
||||
|
break; |
||||
|
case T_TOP: |
||||
|
rx = x - (width / 2); |
||||
|
ry = y; |
||||
|
break; |
||||
|
case T_UPPERRIGHT: |
||||
|
rx = x - width; |
||||
|
ry = y; |
||||
|
break; |
||||
|
case T_RIGHT: |
||||
|
rx = x - width; |
||||
|
ry = y - (height / 2); |
||||
|
break; |
||||
|
case T_LOWERRIGHT: |
||||
|
rx = x - width; |
||||
|
ry = y - height; |
||||
|
break; |
||||
|
case T_BOTTOM: |
||||
|
rx = x - (width / 2); |
||||
|
ry = y - height; |
||||
|
break; |
||||
|
case T_LOWERLEFT: |
||||
|
rx = x; |
||||
|
ry = y - height; |
||||
|
break; |
||||
|
} |
||||
|
XDrawString(disp, st->win, |
||||
|
textGC(st->win, font), |
||||
|
rx, ry + bb.ascent, text, len); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
void |
||||
|
seg_X(user_state, ns, segs, width, style, lappr, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int ns; /* Number of segments */ |
||||
|
XSegment *segs; /* X array of segments */ |
||||
|
int width; /* Width of lines */ |
||||
|
int style; /* See above */ |
||||
|
int lappr; /* Line appearence */ |
||||
|
int color; /* Line color (if any) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine draws a number of line segments at the points |
||||
|
* given in `seglist'. Note that contiguous segments need not share |
||||
|
* endpoints but often do. All segments should be `width' devcoords wide |
||||
|
* and drawn in style `style'. If `style' is L_VAR, the parameters |
||||
|
* `color' and `lappr' should be used to draw the line. Both |
||||
|
* parameters vary from 0 to 7. If the device is capable of |
||||
|
* color, `color' varies faster than `style'. If the device |
||||
|
* has no color, `style' will vary faster than `color' and |
||||
|
* `color' can be safely ignored. However, if the |
||||
|
* the device has more than 8 line appearences, the two can |
||||
|
* be combined to specify 64 line style variations. |
||||
|
* Xgraph promises not to send more than the `max_segs' in the |
||||
|
* xgOut structure passed back from xg_init(). |
||||
|
*/ |
||||
|
{ |
||||
|
struct x_state *st = (struct x_state *) user_state; |
||||
|
param_style ps; |
||||
|
GC gc; |
||||
|
|
||||
|
if (style == L_AXIS) { |
||||
|
ps = PM_STYLE("GridStyle"); |
||||
|
if (ps.len < 2) { |
||||
|
gc = segGC(st->win, PM_PIXEL("Foreground"), |
||||
|
LineSolid, PM_INT("GridSize"), (char *) 0, 0); |
||||
|
} |
||||
|
else { |
||||
|
gc = segGC(st->win, PM_PIXEL("Foreground"), |
||||
|
LineOnOffDash, PM_INT("GridSize"), |
||||
|
ps.dash_list, ps.len); |
||||
|
} |
||||
|
} |
||||
|
else if (style == L_ZERO) { |
||||
|
/* Set the color and line style */ |
||||
|
ps = PM_STYLE("ZeroStyle"); |
||||
|
if (ps.len < 2) { |
||||
|
gc = segGC(st->win, PM_PIXEL("ZeroColor"), |
||||
|
LineSolid, PM_INT("ZeroWidth"), (char *) 0, 0); |
||||
|
} |
||||
|
else { |
||||
|
gc = segGC(st->win, PM_PIXEL("ZeroColor"), |
||||
|
LineOnOffDash, PM_INT("ZeroWidth"), |
||||
|
ps.dash_list, ps.len); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
/* Color and line style vary */ |
||||
|
if (lappr == 0) { |
||||
|
gc = segGC(st->win, AllAttrs[color].pixelValue, LineSolid, |
||||
|
width, (char *) 0, 0); |
||||
|
} |
||||
|
else { |
||||
|
gc = segGC(st->win, AllAttrs[color].pixelValue, LineOnOffDash, |
||||
|
width, AllAttrs[lappr].lineStyle, AllAttrs[lappr].lineStyleLen); |
||||
|
} |
||||
|
/* PW */ |
||||
|
if (lappr == 16) { |
||||
|
gc = segGC(st->win, PM_PIXEL("BackGround"), LineSolid, |
||||
|
width, (char *) 0, 0); |
||||
|
} |
||||
|
} |
||||
|
XDrawSegments(disp, st->win, gc, segs, ns); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#define LAST_CHECK |
||||
|
|
||||
|
void |
||||
|
dot_X(user_state, x, y, style, type, color) |
||||
|
char *user_state; /* Value set in xg_init */ |
||||
|
int x, |
||||
|
y; /* Location in pixel units */ |
||||
|
int style; /* Dot style */ |
||||
|
int type; /* Type of marker */ |
||||
|
int color; /* Marker color (if any) */ |
||||
|
|
||||
|
/* |
||||
|
* This routine should draw a marker at location `x,y'. If the |
||||
|
* style is P_PIXEL, the dot should be a single pixel. If |
||||
|
* the style is P_DOT, the dot should be a reasonably large |
||||
|
* dot. If the style is P_MARK, it should be a distinguished |
||||
|
* mark which is specified by `type' (0-7). If the output |
||||
|
* device is capable of color, the marker should be drawn in |
||||
|
* `color' (0-7) which corresponds with the color for xg_line. |
||||
|
*/ |
||||
|
{ |
||||
|
struct x_state *st = (struct x_state *) user_state; |
||||
|
|
||||
|
switch (style) { |
||||
|
case P_PIXEL: |
||||
|
XDrawPoint(disp, st->win, |
||||
|
dotGC(st->win, AllAttrs[color].pixelValue, (Pixmap) 0, 0, 0), |
||||
|
x, y); |
||||
|
break; |
||||
|
case P_DOT: |
||||
|
XFillRectangle(disp, st->win, |
||||
|
dotGC(st->win, AllAttrs[color].pixelValue, dotMap, |
||||
|
(int) (x - (dot_w >> 1)), |
||||
|
(int) (y - (dot_h >> 1))), |
||||
|
(int) (x - (dot_w >> 1)), (int) (y - (dot_h >> 1)), |
||||
|
dot_w, dot_h); |
||||
|
break; |
||||
|
case P_MARK: |
||||
|
XFillRectangle(disp, st->win, |
||||
|
dotGC(st->win, AllAttrs[color].pixelValue, |
||||
|
AllAttrs[type].markStyle, |
||||
|
(int) (x - mark_cx), |
||||
|
(int) (y - mark_cy)), |
||||
|
(int) (x - mark_cx), (int) (y - mark_cy), |
||||
|
mark_w, mark_h); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,65 @@ |
|||||
|
/* |
||||
|
* Output Device Information |
||||
|
* |
||||
|
* This file contains definitions for output device interfaces |
||||
|
* to the graphing program xgraph. |
||||
|
*/ |
||||
|
#ifndef _h_xgout |
||||
|
#define _h_xgout |
||||
|
/* Passed device option flags */ |
||||
|
#define D_DOCU 0x01 |
||||
|
|
||||
|
/* Returned device capability flags */ |
||||
|
#define D_COLOR 0x01 |
||||
|
|
||||
|
/* Text justifications */ |
||||
|
#define T_CENTER 0 |
||||
|
#define T_LEFT 1 |
||||
|
#define T_UPPERLEFT 2 |
||||
|
#define T_TOP 3 |
||||
|
#define T_UPPERRIGHT 4 |
||||
|
#define T_RIGHT 5 |
||||
|
#define T_LOWERRIGHT 6 |
||||
|
#define T_BOTTOM 7 |
||||
|
#define T_LOWERLEFT 8 |
||||
|
|
||||
|
/* Text styles */ |
||||
|
#define T_AXIS 0 |
||||
|
#define T_TITLE 1 |
||||
|
|
||||
|
/* Line Styles */ |
||||
|
#define L_AXIS 0 |
||||
|
#define L_ZERO 1 |
||||
|
#define L_VAR 2 |
||||
|
|
||||
|
/* Marker Styles */ |
||||
|
#define P_PIXEL 0 |
||||
|
#define P_DOT 1 |
||||
|
#define P_MARK 2 |
||||
|
|
||||
|
/* Output device information returned by initialization routine */ |
||||
|
|
||||
|
typedef struct xg_out { |
||||
|
int dev_flags; /* Device characteristic flags */ |
||||
|
int area_w, |
||||
|
area_h; /* Width and height in pixels */ |
||||
|
int bdr_pad; /* Padding from border */ |
||||
|
int axis_pad; /* Extra space around axis labels */ |
||||
|
int tick_len; /* Length of tick mark on axis */ |
||||
|
int legend_pad; /* Top of legend text to legend line */ |
||||
|
int axis_width; /* Width of big character of axis font */ |
||||
|
int axis_height; /* Height of big character of axis font */ |
||||
|
int title_width; /* Width of big character of title font */ |
||||
|
int title_height; /* Height of big character of title font */ |
||||
|
int max_segs; /* Maximum number of segments in group */ |
||||
|
|
||||
|
void (*xg_text) (); /* Draws text at a location */ |
||||
|
void (*xg_seg) (); /* Draws a series of segments */ |
||||
|
void (*xg_dot) (); /* Draws a dot or marker at a location */ |
||||
|
void (*xg_end) (); /* Stops the drawing sequence */ |
||||
|
|
||||
|
char *user_state; /* User supplied data */ |
||||
|
} xgOut; |
||||
|
|
||||
|
#define ERRBUFSIZE 2048 |
||||
|
#endif /* _h_xgout */ |
||||
1279
xgraph/xgraph.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,210 @@ |
|||||
|
/* |
||||
|
* Globally accessible information from xgraph |
||||
|
*/ |
||||
|
|
||||
|
#ifndef _XGRAPH_H_ |
||||
|
#define _XGRAPH_H_ |
||||
|
|
||||
|
#include "autoconf.h" |
||||
|
|
||||
|
#include <X11/Xos.h> |
||||
|
#include <X11/Xlib.h> |
||||
|
#include <X11/Xutil.h> |
||||
|
#include <X11/cursorfont.h> |
||||
|
|
||||
|
/* |
||||
|
* Get definitions from headers. |
||||
|
*/ |
||||
|
#include <stdio.h> /* sprintf */ |
||||
|
|
||||
|
#ifdef HAVE_STRING_H |
||||
|
#include <string.h> /* str* */ |
||||
|
#else |
||||
|
#ifdef HAVE_STRINGS_H |
||||
|
#include <strings.h> /* str* */ |
||||
|
#else |
||||
|
extern char *strcpy(); |
||||
|
extern char *strcat(); |
||||
|
extern char *rindex(); |
||||
|
extern char *index(); |
||||
|
#endif /* HAVE_STRINGS_H */ |
||||
|
#endif /* HAVE_STRING_H */ |
||||
|
|
||||
|
#ifdef HAVE_UNISTD_H |
||||
|
#include <unistd.h> /* exit, abort */ |
||||
|
#endif /* HAVE_UNISTD_H */ |
||||
|
#ifdef HAVE_STDLIB_H |
||||
|
#include <stdlib.h> /* atof */ |
||||
|
#endif /* HAVE_STDLIB_H */ |
||||
|
|
||||
|
#include "xgout.h" |
||||
|
|
||||
|
#define VERSION_STRING "12.1 December 1999 " |
||||
|
|
||||
|
#define MAXKEYS 50 |
||||
|
#define MAXATTR 8 |
||||
|
#define MAXSETS 112 |
||||
|
#define MAXBUFSIZE 120 |
||||
|
#define MAXLS 50 |
||||
|
|
||||
|
#define STRDUP(xx) (strcpy(Malloc((unsigned) (strlen(xx)+1)), (xx))) |
||||
|
#define SCREENX(ws, userX) \ |
||||
|
(((int) (((userX) - ws->UsrOrgX)/ws->XUnitsPerPixel + 0.5)) + ws->XOrgX) |
||||
|
#define SCREENY(ws, userY) \ |
||||
|
(ws->XOppY - ((int) (((userY) - ws->UsrOrgY)/ws->YUnitsPerPixel + 0.5))) |
||||
|
#define HARDCOPY_IN_PROGRESS 0x01 |
||||
|
|
||||
|
/* Portability */ |
||||
|
/* try to get those constants */ |
||||
|
#include <math.h> |
||||
|
#ifdef HAVE_LIMITS_H |
||||
|
#include <limits.h> |
||||
|
#endif /* HAVE_LIMITS */ |
||||
|
#ifdef HAVE_FLOAT_H |
||||
|
#include <float.h> |
||||
|
#endif /* HAVE_FLOAT_H */ |
||||
|
|
||||
|
#ifdef CRAY |
||||
|
#undef MAXFLOAT |
||||
|
#define MAXFLOAT 10.e300 |
||||
|
#endif /* CRAY */ |
||||
|
|
||||
|
#ifndef MAXFLOAT |
||||
|
#if defined(FLT_MAX) |
||||
|
#define MAXFLOAT FLT_MAX |
||||
|
#elif defined(HUGE) |
||||
|
#define MAXFLOAT HUGE |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
#ifndef BIGINT |
||||
|
#if defined(INT_MAX) |
||||
|
#define BIGINT INT_MAX |
||||
|
#elif defined(MAXINT) |
||||
|
#define BIGINT MAXINT |
||||
|
#else |
||||
|
#define BIGINT 0xffffffff |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
#define GRIDPOWER 10 |
||||
|
#define INITSIZE 128 |
||||
|
|
||||
|
#define CONTROL_D '\004' |
||||
|
#define CONTROL_C '\003' |
||||
|
#define TILDE '~' |
||||
|
|
||||
|
#define BTNPAD 1 |
||||
|
#define BTNINTER 3 |
||||
|
|
||||
|
#ifndef MAX |
||||
|
#define MAX(a,b) ((a) > (b) ? (a) : (b)) |
||||
|
#endif |
||||
|
#ifndef MIN |
||||
|
#define MIN(a,b) ((a) < (b) ? (a) : (b)) |
||||
|
#endif |
||||
|
#ifndef ABS |
||||
|
#define ABS(x) ((x) < 0 ? -(x) : (x)) |
||||
|
#endif |
||||
|
#define ZERO_THRES 1.0E-07 |
||||
|
|
||||
|
/* To get around an inaccurate log */ |
||||
|
#define nlog10(x) (x == 0.0 ? 0.0 : log10(x) + 1e-15) |
||||
|
|
||||
|
#define ISCOLOR (wi->dev_info.dev_flags & D_COLOR) |
||||
|
|
||||
|
#define PIXVALUE(set) ((set) % MAXATTR) |
||||
|
|
||||
|
#define LINESTYLE(set) \ |
||||
|
(ISCOLOR ? ((set)/MAXATTR) : ((set) % MAXATTR)) |
||||
|
|
||||
|
#define MARKSTYLE(set) \ |
||||
|
(colorMark ? COLMARK(set) : BWMARK(set)) |
||||
|
|
||||
|
#define COLMARK(set) \ |
||||
|
((set) / MAXATTR) |
||||
|
|
||||
|
#define BWMARK(set) \ |
||||
|
((set) % MAXATTR) |
||||
|
|
||||
|
#define LOG_X 0x01 |
||||
|
#define LOG_Y 0x02 |
||||
|
#define STK 0x04 |
||||
|
#define FITX 0x08 |
||||
|
#define FITY 0x10 |
||||
|
typedef unsigned long Pixel; |
||||
|
|
||||
|
/* Globally accessible values */ |
||||
|
extern Display *disp; /* Open display */ |
||||
|
extern Visual *vis; /* Standard visual */ |
||||
|
extern Colormap cmap; /* Standard colormap */ |
||||
|
extern int screen; /* Screen number */ |
||||
|
extern int depth; /* Depth of screen */ |
||||
|
|
||||
|
extern void do_hardcopy(); /* Carries out hardcopy */ |
||||
|
extern void ho_dialog(); /* Hardcopy dialog */ |
||||
|
extern void set_X(); /* Initializes X device */ |
||||
|
|
||||
|
typedef struct point_list { |
||||
|
int numPoints; /* Number of points in group */ |
||||
|
int allocSize; /* Allocated size */ |
||||
|
double *xvec; /* X values */ |
||||
|
double *yvec; /* Y values */ |
||||
|
struct point_list *next; /* Next set of points */ |
||||
|
} PointList; |
||||
|
|
||||
|
typedef struct new_data_set { |
||||
|
char *setName; /* Name of data set */ |
||||
|
PointList *list; /* List of point arrays */ |
||||
|
} NewDataSet; |
||||
|
|
||||
|
typedef struct local_win { |
||||
|
double loX, |
||||
|
loY, |
||||
|
hiX, |
||||
|
hiY; /* Local bounding box of window */ |
||||
|
int XOrgX, |
||||
|
XOrgY; /* Origin of bounding box on screen */ |
||||
|
int XOppX, |
||||
|
XOppY; /* Other point defining bounding box */ |
||||
|
double UsrOrgX, |
||||
|
UsrOrgY; /* Origin of bounding box in user space */ |
||||
|
double UsrOppX, |
||||
|
UsrOppY; /* Other point of bounding box */ |
||||
|
double XUnitsPerPixel; /* X Axis scale factor */ |
||||
|
double YUnitsPerPixel; /* Y Axis scale factor */ |
||||
|
struct xg_out dev_info; /* Device information */ |
||||
|
Window close, |
||||
|
hardcopy; /* Buttons for closing and hardcopy */ |
||||
|
Window about; /* Version information */ |
||||
|
Window rewind; /* PW Added this, for animation. */ |
||||
|
Window replot; /* PW Added this, for animation. */ |
||||
|
Window deriv; /* PW Added this, for animation. */ |
||||
|
int flags; /* Window flags */ |
||||
|
int DOrder; /* Which order of Derivative is being set? */ |
||||
|
} LocalWin; |
||||
|
|
||||
|
extern NewDataSet PlotData[MAXSETS], DataD1[MAXSETS], DataD2[MAXSETS]; |
||||
|
extern XSegment *Xsegs[2]; /* Point space for X */ |
||||
|
extern double llx, lly, urx, ury; /* Bounding box of all data */ |
||||
|
extern int numFiles; /* Number of input files */ |
||||
|
extern char *inFileNames[MAXSETS]; /* File names */ |
||||
|
|
||||
|
/* Total number of active windows */ |
||||
|
extern int Num_Windows; |
||||
|
extern char *Prog_Name; |
||||
|
extern char *disp_name; |
||||
|
|
||||
|
/* To make lint happy */ |
||||
|
extern char *Malloc(); |
||||
|
extern char *Realloc(); |
||||
|
extern void Free(); |
||||
|
|
||||
|
#ifndef _POSIX_SOURCE |
||||
|
/* extern int sprintf(); ---conflicts with sunos */ |
||||
|
extern void exit(); |
||||
|
extern double atof(); |
||||
|
extern void abort(); |
||||
|
#endif /* _POSIX_SOURCE */ |
||||
|
|
||||
|
#endif /* _XGRAPH_H_ */ |
||||
@ -0,0 +1,389 @@ |
|||||
|
.TH XGRAPH 1 "December, 1989" |
||||
|
.SH NAME |
||||
|
xgraph \- Draw a graph on an X11 Display |
||||
|
.SH SYNOPSIS |
||||
|
.B xgraph |
||||
|
[ options ] [[-geometry |=]WxH+X+Y ] [ -display host:display.screen ] [ file ... ] |
||||
|
.SH DESCRIPTION |
||||
|
The |
||||
|
.I xgraph |
||||
|
program draws a graph on an X display given data read from either |
||||
|
data files or from standard input if no files are specified. |
||||
|
It can display up to 64 independent data sets using different colors |
||||
|
and/or line styles for each set. |
||||
|
It annotates the graph with a title, axis labels, grid lines or tick |
||||
|
marks, grid labels, |
||||
|
and a legend. |
||||
|
There are options to control the appearance of most components of |
||||
|
the graph. |
||||
|
.PP |
||||
|
The input format is similar to |
||||
|
.I graph(1G) |
||||
|
but differs slightly. |
||||
|
The data consists of a number of |
||||
|
.I "data sets." |
||||
|
Data sets are separated by a blank line. |
||||
|
A new data set is also |
||||
|
assumed at the start of each input file. |
||||
|
A data set consists of an ordered list of points of the form "{directive} X Y". |
||||
|
The directive is either "draw" or "move" and can be omitted. |
||||
|
If the directive is "draw", a line will be drawn between the previous |
||||
|
point and the current point (if a line graph is chosen). |
||||
|
Specifying a "move" directive tells xgraph not to draw a line between |
||||
|
the points. |
||||
|
If the directive is omitted, "draw" is assumed for all points in |
||||
|
a data set except the |
||||
|
first point where "move" is assumed. |
||||
|
The "move" directive is used most often to allow discontinuous data |
||||
|
in a data set. |
||||
|
The name of a data set can be specified by |
||||
|
enclosing the name in double quotes on a line by itself in the |
||||
|
body of the data set. The trailing double quote is optional. |
||||
|
Overall graphing options for the graph can be specified in data |
||||
|
files by writing lines of the form "<option>: <value>". The |
||||
|
option names are the same as those used for specifying X |
||||
|
resources (see below). The option and value must be separated by at |
||||
|
bleast one space. |
||||
|
An example input file with three data sets is shown below. Note |
||||
|
that set three is not named, set two has discontinuous data, |
||||
|
and the title of the graph is specified near the top of the file. |
||||
|
.sp 1 |
||||
|
.nf |
||||
|
TitleText: Sample Data |
||||
|
0.5 7.8 |
||||
|
1.0 6.2 |
||||
|
"set one |
||||
|
1.5 8.9 |
||||
|
|
||||
|
"set two" |
||||
|
-3.4 1.4e-3 |
||||
|
-2.0 1.9e-2 |
||||
|
move -1.0 2.0e-2 |
||||
|
-0.65 2.2e-4 |
||||
|
|
||||
|
2.2 12.8 |
||||
|
2.4 -3.3 |
||||
|
2.6 -32.2 |
||||
|
2.8 -10.3 |
||||
|
.fi |
||||
|
.PP |
||||
|
After |
||||
|
.I xgraph |
||||
|
has read the data, it will create a new window to graphically |
||||
|
display the data. |
||||
|
The interface used to specify the size and location of this window depends |
||||
|
on the window manager currently in use. |
||||
|
Refer to the reference manual of the window manager for details. |
||||
|
.PP |
||||
|
Once the window has been opened, all of the data sets will be displayed |
||||
|
graphically (subject to the options explained below) with a legend in |
||||
|
the upper right corner of the screen. |
||||
|
To zoom in on a portion of the graph, depress a mouse button in |
||||
|
the window and sweep out a region. |
||||
|
.I xgraph |
||||
|
will then open a new window looking at just that portion of the graph. |
||||
|
.I xgraph |
||||
|
also presents three control buttons in the upper left corner of |
||||
|
each window: |
||||
|
.I Close, |
||||
|
.I Hardcopy, |
||||
|
and |
||||
|
.I About. |
||||
|
Windows are closed by depressing a mouse button while the mouse |
||||
|
cursor is inside the |
||||
|
.I Close |
||||
|
button. Typing EOF (control-D) in a window also closes that window. |
||||
|
Depressing a mouse button while the mouse cursor is in the |
||||
|
.I Hardcopy |
||||
|
button causes a dialog to appear asking about hardcopy (printout) |
||||
|
options. These options are described below: |
||||
|
.IP "Output Device" |
||||
|
Specifies the type of the output device (e.g. "HPGL", "Postscript", etc). |
||||
|
An output device is chosen by depressing the mouse inside its name. |
||||
|
The default values of other fields will change when you select a |
||||
|
different output device. |
||||
|
.IP "Disposition" |
||||
|
Specifies whether the output should go directly to a device |
||||
|
or to a file. Again, the default values of other fields will change |
||||
|
when you select a different disposition. |
||||
|
.IP "File or Device Name" |
||||
|
If the disposition is "To Device", this field specifies the device |
||||
|
name. |
||||
|
A device name is the same as the name given for the -P command |
||||
|
of lpr(1). |
||||
|
If the disposition is "To File", this field specifies the name |
||||
|
of the output file. |
||||
|
.IP "Maximum Dimension" |
||||
|
This specifies the maximum size of the plot on the hardcopy |
||||
|
device in centimeters. |
||||
|
.I xgraph |
||||
|
takes in account the aspect ratio of the plot on the screen |
||||
|
and will scale the plot so that the longer side of the plot |
||||
|
is no more than the value of this parameter. |
||||
|
If the device supports it, the plot may also be rotated on the page |
||||
|
based on the value of the maximum dimension. |
||||
|
.IP "Include in Document" |
||||
|
If selected, this option causes |
||||
|
.I xgraph |
||||
|
to produce harcopy output that is suitable for inclusion in other |
||||
|
larger documents. |
||||
|
As an example, when this option is selected the Postscript output |
||||
|
produced by xgraph will have a bounding box suitable for use with |
||||
|
psfig. |
||||
|
.IP "Title Font Family" |
||||
|
This field specifies the name of a font to use when drawing |
||||
|
the graph title. Suitable defaults are initially chosen for |
||||
|
any given hardcopy device. |
||||
|
The value of this field is hardware specific -- refer to |
||||
|
the device reference manual for details. |
||||
|
.IP "Title Font Size" |
||||
|
This field specifies the desired size of the title fonts in points |
||||
|
(1/72 of an inch). |
||||
|
If the device supports scalable fonts, the |
||||
|
font will be scaled to this size. |
||||
|
.IP "Axis Font Family and Axis Font Size" |
||||
|
These fields are like |
||||
|
.I "Title Font Family" |
||||
|
and |
||||
|
.I "Title Font Size" |
||||
|
except they specify values for the font |
||||
|
.I xgraph |
||||
|
uses to draw axis labels, and legend descriptions. |
||||
|
.IP "Control Buttons" |
||||
|
After specifing the parameters for the plot, the "Ok" button causes |
||||
|
.I xgraph |
||||
|
to produce a hardcopy. |
||||
|
Pressing the "Cancel" button will abort the hardcopy operation. |
||||
|
Depressing the |
||||
|
.I About |
||||
|
button causes Xgraph to display a window containing the version of |
||||
|
the program and an electronic mailing address for the author |
||||
|
for comments and suggestions. |
||||
|
.PP |
||||
|
.I xgraph |
||||
|
accepts a large number of options most of which can be specified |
||||
|
either on the command line, in the user's .Xdefaults or .Xresources file, |
||||
|
or in the data files themselves. |
||||
|
A list of these options is given below. The command line |
||||
|
option is specified first with its X default or data file name (if any) |
||||
|
in parenthesis afterward. |
||||
|
The format of the option in the X defaults file is "program.option: value" |
||||
|
where program is the program name (xgraph) and the option name is the |
||||
|
one specified below. |
||||
|
Option specifications in the data file are similar to the X defaults file |
||||
|
specification except the program name is omitted. |
||||
|
.TP |
||||
|
.B \-geometry WxH+X+Y or \=WxH+X+Y (Geometry) |
||||
|
Specifies the initial size and location of the xgraph window. |
||||
|
.TP |
||||
|
.B \-<digit> <name> |
||||
|
These options specify the data set name for the corresponding data set. |
||||
|
The digit should be in the range '0' to '63'. |
||||
|
This name will be used in the legend. |
||||
|
.TP |
||||
|
.B \-bar (BarGraph) |
||||
|
Specifies that vertical bars should be drawn from the data points to |
||||
|
a base point which can be specified with -brb. Usually, the -nl |
||||
|
flag is used with this option. The point itself is located at |
||||
|
the center of the bar. |
||||
|
.TP |
||||
|
.B \-bof (BarGraph) |
||||
|
Offset the bars for additional datasets by the specified amount. |
||||
|
.TP |
||||
|
.B \-device <name> |
||||
|
Set the output device for xgraph. The default is 'X'; other valid |
||||
|
devices are 'ps', 'hpgl', 'idraw' and tgif. |
||||
|
.TP |
||||
|
.B \-o <filename> \-O <filename> |
||||
|
Set the output file name for postscript, hpgl and idraw devices. |
||||
|
Files created with -O can be used other documents, and files generated |
||||
|
with -o can be printed directly. |
||||
|
.TP |
||||
|
.B \-P<printername> |
||||
|
Set the printer name for postscript or hpgl devices. This and the -o or -O |
||||
|
option are mutually exclusive. |
||||
|
.TP |
||||
|
.B \-stk |
||||
|
Stack elements coming from different datasets, instead of plotting them |
||||
|
from the same baseline. Datasets must match exactly. |
||||
|
.TP |
||||
|
.B \-fitx |
||||
|
Translate and scale the x data from all datasets to fit [0..1]. |
||||
|
.B \-fity |
||||
|
Translate and scale the y data from all datasets to fit [0..1]. |
||||
|
.TP |
||||
|
.B \-scale <factor> |
||||
|
Output scale factor for postscript, hpgl and idraw devices. The default |
||||
|
is 1.0, and 0.5 will generate a 50% reduced plot. |
||||
|
.TP |
||||
|
.B \-fmtx <printf-format> \-fmty <printf-format> |
||||
|
Use the format specified to generate the legents for the x or y axis. |
||||
|
.TP |
||||
|
.B \-bb (BoundBox) |
||||
|
Draw a bounding box around the data region. This is very useful |
||||
|
if you prefer to see tick marks rather than grid lines (see -tk). |
||||
|
.TP |
||||
|
.B \-bd <color> (Border) |
||||
|
This specifies the border color of the |
||||
|
.I xgraph |
||||
|
window. |
||||
|
.TP |
||||
|
.B \-bg <color> (Background) |
||||
|
Background color of the |
||||
|
.I xgraph |
||||
|
window. |
||||
|
.TP |
||||
|
.B \-brb <base> (BarBase) |
||||
|
This specifies the base for a bar graph. By default, the base is zero. |
||||
|
.TP |
||||
|
.B \-brw <width> (BarWidth) |
||||
|
This specifies the width of bars in a bar graph. The amount is specified |
||||
|
in the user's units. By default, a bar one pixel wide is drawn. |
||||
|
.TP |
||||
|
.B \-bw <size> (BorderSize) |
||||
|
Border width (in pixels) of the |
||||
|
.I xgraph |
||||
|
window. |
||||
|
.TP |
||||
|
.B \-db (Debug) |
||||
|
Causes xgraph to run in synchronous mode and prints out the values |
||||
|
of all known defaults. |
||||
|
.TP |
||||
|
.B \-fg <color> (Foreground) |
||||
|
Foreground color. This color is used to draw all text and the normal |
||||
|
grid lines in the window. |
||||
|
.TP |
||||
|
.B \-gw (GridSize) |
||||
|
Width, in pixels, of normal grid lines. |
||||
|
.TP |
||||
|
.B \-gs (GridStyle) |
||||
|
Line style pattern of normal grid lines. |
||||
|
.TP |
||||
|
.B \-lf <fontname> (LabelFont) |
||||
|
Label font. All axis labels and grid labels are drawn using this font. |
||||
|
A font name may be specified exactly (e.g. "9x15" or |
||||
|
"-*-courier-bold-r-normal-*-140-*") or in an abbreviated form: <family>-<size>. |
||||
|
The family is the family name (like helvetica) and the size is the font |
||||
|
size in points (like 12). The default for this parameter is "helvetica-12". |
||||
|
.TP |
||||
|
.B \-lnx (LogX) |
||||
|
Specifies a logarithmic X axis. Grid labels represent powers of ten. |
||||
|
.TP |
||||
|
.B \-lny (LogY) |
||||
|
Specifies a logarithmic Y axis. Grid labels represent powers of ten. |
||||
|
.TP |
||||
|
.B \-lw width (LineWidth) |
||||
|
Specifies the width of the data lines in pixels. The default is zero. |
||||
|
.TP |
||||
|
.B \-lx <xl,xh> (XLowLimit, XHighLimit) |
||||
|
This option limits the range of the X axis to the specified |
||||
|
interval. This (along with -ly) can be used to "zoom in" on a particularly |
||||
|
interesting portion of a larger graph. |
||||
|
.TP |
||||
|
.B \-ly <yl,yh> (YLowLimit, YHighLimit) |
||||
|
This option limits the range of the Y axis to the specified |
||||
|
interval. |
||||
|
.TP |
||||
|
.B \-m (Markers) |
||||
|
Mark each data point with a distinctive marker. |
||||
|
There are eight distinctive markers used by xgraph. |
||||
|
These markers are assigned uniquely to each different line style on |
||||
|
black and white machines and varies with each color on color machines. |
||||
|
.TP |
||||
|
.B \-M (StyleMarkers) |
||||
|
Similar to -m but markers are assigned uniquely to each eight consecutive |
||||
|
data sets (this corresponds to each different line style on color machines). |
||||
|
.TP |
||||
|
.B \-nl (NoLines) |
||||
|
Turn off drawing lines. When used with -m, -M, -p, or -P this can be used to |
||||
|
produce scatter plots. When used with -bar, it can be used to |
||||
|
produce standard bar graphs. |
||||
|
.TP |
||||
|
.B \-ng (NoLegend) |
||||
|
Turn off drawing Legends. Can be used to increase the drawing area. |
||||
|
.TP |
||||
|
.B \-p (PixelMarkers) |
||||
|
Marks each data point with a small marker (pixel sized). This is |
||||
|
usually used with the -nl option for scatter plots. |
||||
|
.TP |
||||
|
.B \-P (LargePixels) |
||||
|
Similar to -p but marks each pixel with a large dot. |
||||
|
.TP |
||||
|
.B \-rv (ReverseVideo) |
||||
|
Reverse video. On black and white displays, this will invert |
||||
|
the foreground and background colors. |
||||
|
The behaviour on color displays is undefined. |
||||
|
.TP |
||||
|
.B \-t <string> (TitleText) |
||||
|
Title of the plot. This string is centered at the top of the graph. |
||||
|
.TP |
||||
|
.B \-tf <fontname> (TitleFont) |
||||
|
Title font. This is the name of the font to use for the graph title. |
||||
|
A font name may be specified exactly (e.g. "9x15" or |
||||
|
"-*-courier-bold-r-normal-*-140-*") or in an abbreviated form: <family>-<size>. |
||||
|
The family is the family name (like helvetica) and the size is the font |
||||
|
size in points (like 12). The default for this parameter is "helvetica-18". |
||||
|
.TP |
||||
|
.B \-tk (Ticks) |
||||
|
This option causes |
||||
|
.I xgraph |
||||
|
to draw tick marks rather than full grid lines. The -bb option |
||||
|
is also useful when viewing graphs with tick marks only. |
||||
|
.TP |
||||
|
.B \-tkax (Tick Axis) |
||||
|
When tick marks are enabled, plot the axes. |
||||
|
.TP |
||||
|
.B \-x <unitname> (XUnitText) |
||||
|
This is the unit name for the X axis. Its default is "X". |
||||
|
.TP |
||||
|
.B \-y <unitname> (YUnitText) |
||||
|
This is the unit name for the Y axis. Its default is "Y". |
||||
|
.TP |
||||
|
.B \-zg <color> (ZeroColor) |
||||
|
This is the color used to draw the zero grid line. |
||||
|
.TP |
||||
|
.B \-zw <width> (ZeroWidth) |
||||
|
This is the width of the zero grid line in pixels. |
||||
|
.PP |
||||
|
Some options can only be specified in the X defaults file or in the |
||||
|
data files. These options are described below: |
||||
|
.TP |
||||
|
.B <digit>.Color |
||||
|
Specifies the color for a data set. Eight independent colors can |
||||
|
be specified. Thus, the digit should be between '0' and '7'. |
||||
|
If there are more than eight data sets, the colors |
||||
|
will repeat but with a new line style (see below). |
||||
|
.TP |
||||
|
.B <digit>.Style |
||||
|
Specifies the line style for a data set. A string of ones |
||||
|
and zeros specifies the pattern used for the line style. |
||||
|
Eight independent line styles can be specified. Thus, the |
||||
|
digit should be between '0' and '7'. If there are more |
||||
|
than eight data sets, these styles will be reused. On color |
||||
|
workstations, one line style is used for each of eight colors. |
||||
|
Thus, 64 unique data sets can be displayed. |
||||
|
.TP |
||||
|
.B Device |
||||
|
The default output form presented in the hardcopy dialog (i.e. "Postscript", |
||||
|
"HPGL", etc). |
||||
|
.TP |
||||
|
.B Disposition |
||||
|
The default setting of whether output goes directly to a device or to a file. |
||||
|
This must be one of the strings "To File" or "To Device". |
||||
|
.TP |
||||
|
.B FileOrDev |
||||
|
The default file name or device string in the hardcopy dialog. |
||||
|
.TP |
||||
|
.B ZeroWidth |
||||
|
Width, in pixels, of the zero grid line. |
||||
|
.TP |
||||
|
.B ZeroStyle |
||||
|
Line style pattern of the zero grid line. |
||||
|
.SH AUTHOR |
||||
|
David Harrison |
||||
|
University of California |
||||
|
.SH BUGS |
||||
|
.br |
||||
|
- Zooming in on bar graphs doesn't work right. |
||||
|
.br |
||||
|
- There is no way to produce hardcopy without running xgraph interactively. |
||||
1617
xgraph/xtb.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,192 @@ |
|||||
|
/* |
||||
|
* xtb - a mini-toolbox for X11 |
||||
|
* |
||||
|
* David Harrison |
||||
|
* University of California, Berkeley |
||||
|
* 1988 |
||||
|
*/ |
||||
|
|
||||
|
#ifndef _XTB_ |
||||
|
#define _XTB_ |
||||
|
|
||||
|
#include "copyright.h" |
||||
|
|
||||
|
/* Handler function return codes */ |
||||
|
typedef enum xtb_hret_defn { |
||||
|
XTB_NOTDEF, XTB_HANDLED, XTB_STOP |
||||
|
} xtb_hret; |
||||
|
|
||||
|
/* If you have an ANSI compiler, some checking will be done */ |
||||
|
#ifdef __STDC__ |
||||
|
#define DECLARE(func, rtn, args) extern rtn func args |
||||
|
typedef void *xtb_data; |
||||
|
|
||||
|
#else |
||||
|
#define DECLARE(func, rtn, args) extern rtn func () |
||||
|
typedef char *xtb_data; |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
/* Basic return value */ |
||||
|
typedef struct xtb_frame_defn { |
||||
|
Window win; |
||||
|
int x_loc, |
||||
|
y_loc; |
||||
|
unsigned int width, |
||||
|
height; |
||||
|
} xtb_frame; |
||||
|
|
||||
|
DECLARE(xtb_init, void, (Display * disp, int scrn, |
||||
|
unsigned long foreground, |
||||
|
unsigned long background, |
||||
|
XFontStruct * font)); |
||||
|
/* Initializes mini-toolbox */ |
||||
|
|
||||
|
/* |
||||
|
* Basic event handling |
||||
|
*/ |
||||
|
|
||||
|
DECLARE(xtb_register, void, (Window win, |
||||
|
xtb_hret(*func) (XEvent * evt, xtb_data info), |
||||
|
xtb_data info)); |
||||
|
/* Registers call-back function */ |
||||
|
|
||||
|
DECLARE(xtb_lookup, xtb_data, (Window win)); |
||||
|
/* Returns data associated with window */ |
||||
|
|
||||
|
DECLARE(xtb_dispatch, xtb_hret, (XEvent * evt)); |
||||
|
/* Dispatches events for mini-toolbox */ |
||||
|
|
||||
|
DECLARE(xtb_unregister, int, (Window win, xtb_data * info)); |
||||
|
/* Unregisters a call-back function */ |
||||
|
|
||||
|
/* |
||||
|
* Command button frame |
||||
|
*/ |
||||
|
|
||||
|
DECLARE(xtb_bt_new, void, (Window win, char *text, |
||||
|
xtb_hret(*func) (Window win, int state, |
||||
|
xtb_data val), |
||||
|
xtb_data val, |
||||
|
xtb_frame * frame)); |
||||
|
/* Creates new button */ |
||||
|
|
||||
|
DECLARE(xtb_bt_get, int, (Window win, xtb_data * stuff, int *na)); |
||||
|
/* Returns state of button */ |
||||
|
DECLARE(xtb_bt_set, int, (Window win, int val, xtb_data stuff, int na)); |
||||
|
/* Sets state of button */ |
||||
|
DECLARE(xtb_bt_del, void, (Window win, xtb_data * info)); |
||||
|
/* Deletes a button */ |
||||
|
|
||||
|
/* |
||||
|
* Button row frame - built on top of buttons |
||||
|
*/ |
||||
|
|
||||
|
DECLARE(xtb_br_new, void, (Window win, int cnt, char *lbls[], int init, |
||||
|
xtb_hret(*func) (Window win, int prev, |
||||
|
int this, xtb_data val), |
||||
|
xtb_data val, |
||||
|
xtb_frame * frame)); |
||||
|
/* Creates a new button row frame */ |
||||
|
|
||||
|
DECLARE(xtb_br_get, int, (Window win)); |
||||
|
/* Returns currently selected button */ |
||||
|
DECLARE(xtb_br_del, void, (Window win)); |
||||
|
/* Deletes a button row */ |
||||
|
|
||||
|
/* |
||||
|
* Text output (label) frames |
||||
|
*/ |
||||
|
|
||||
|
DECLARE(xtb_to_new, void, (Window win, char *text, |
||||
|
XFontStruct * ft, xtb_frame * frame)); |
||||
|
/* Create new text output frame */ |
||||
|
DECLARE(xtb_to_del, void, (Window win)); |
||||
|
|
||||
|
/* |
||||
|
* Text input (editable text) frames |
||||
|
*/ |
||||
|
|
||||
|
#define MAXCHBUF 1024 |
||||
|
|
||||
|
DECLARE(xtb_ti_new, void, (Window win, char *text, int maxchar, |
||||
|
xtb_hret(*func) (Window win, int ch, |
||||
|
char *textcopy, xtb_data * val), |
||||
|
xtb_data val, xtb_frame * frame)); |
||||
|
/* Creates a new text input frame */ |
||||
|
|
||||
|
DECLARE(xtb_ti_get, void, (Window win, char text[MAXCHBUF], xtb_data * val)); |
||||
|
/* Returns state of text input frame */ |
||||
|
DECLARE(xtb_ti_set, int, (Window win, char *text, xtb_data val)); |
||||
|
/* Sets the state of text input frame */ |
||||
|
DECLARE(xtb_ti_ins, int, (Window win, int ch)); |
||||
|
/* Inserts character onto end of text input frame */ |
||||
|
DECLARE(xtb_ti_dch, int, (Window win)); |
||||
|
/* Deletes character from end of text input frame */ |
||||
|
DECLARE(xtb_ti_del, void, (Window win, xtb_data * info)); |
||||
|
/* Deletes an text input frame */ |
||||
|
|
||||
|
/* |
||||
|
* Block frame |
||||
|
*/ |
||||
|
|
||||
|
DECLARE(xtb_bk_new, void, (Window win, unsigned width, unsigned height, |
||||
|
xtb_frame * frame)); |
||||
|
/* Makes a new block frame */ |
||||
|
DECLARE(xtb_bk_del, void, (Window win)); |
||||
|
/* Deletes a block frame */ |
||||
|
|
||||
|
|
||||
|
/* |
||||
|
* Formatting support |
||||
|
*/ |
||||
|
|
||||
|
#define MAX_BRANCH 50 |
||||
|
|
||||
|
typedef enum xtb_fmt_types_defn { |
||||
|
W_TYPE, A_TYPE |
||||
|
} xtb_fmt_types; |
||||
|
typedef enum xtb_fmt_dir_defn { |
||||
|
HORIZONTAL, VERTICAL |
||||
|
} xtb_fmt_dir; |
||||
|
typedef enum xtb_just_defn { |
||||
|
XTB_CENTER = 0, XTB_LEFT, XTB_RIGHT, XTB_TOP, XTB_BOTTOM |
||||
|
} xtb_just; |
||||
|
|
||||
|
typedef struct xtb_fmt_widget_defn { |
||||
|
xtb_fmt_types type; /* W_TYPE */ |
||||
|
xtb_frame *w; |
||||
|
} xtb_fmt_widget; |
||||
|
|
||||
|
typedef struct xtb_fmt_align_defn { |
||||
|
xtb_fmt_types type; /* A_TYPE */ |
||||
|
xtb_fmt_dir dir; /* HORIZONTAL or VERTICAL */ |
||||
|
int padding; /* Outside padding */ |
||||
|
int interspace; /* Internal padding */ |
||||
|
xtb_just just; /* Justification */ |
||||
|
int ni; /* Number of items */ |
||||
|
union xtb_fmt_defn *items[MAX_BRANCH]; /* Branches themselves */ |
||||
|
} xtb_fmt_align; |
||||
|
|
||||
|
typedef union xtb_fmt_defn { |
||||
|
xtb_fmt_types type; /* W_TYPE or A_TYPE */ |
||||
|
xtb_fmt_widget wid; |
||||
|
xtb_fmt_align align; |
||||
|
} xtb_fmt; |
||||
|
|
||||
|
#define NE 0 |
||||
|
|
||||
|
DECLARE(xtb_w, xtb_fmt *, (xtb_frame * w)); |
||||
|
/* Returns formatting structure for frame */ |
||||
|
DECLARE(xtb_hort, xtb_fmt *, (xtb_just just, int padding, int interspace,...)); |
||||
|
/* Varargs routine for horizontal formatting */ |
||||
|
DECLARE(xtb_vert, xtb_fmt *, (xtb_just just, int padding, int interspace,...)); |
||||
|
/* Varargs routine for vertical formatting */ |
||||
|
DECLARE(xtb_fmt_do, xtb_fmt *, (xtb_fmt * def, unsigned *w, unsigned *h)); |
||||
|
/* Carries out formatting */ |
||||
|
DECLARE(xtb_mv_frames, void, (int nf, xtb_frame frames[])); |
||||
|
/* Actually moves widgets */ |
||||
|
DECLARE(xtb_fmt_free, void, (xtb_fmt * def)); |
||||
|
/* Frees resources claimed by xtb_w, xtb_hort, and xtb_vert */ |
||||
|
|
||||
|
#endif /* _XTB_ */ |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue