Added xgraph plotting program.
This commit is contained in:
parent
4b6bef82fe
commit
e2d91d1909
|
|
@ -1,6 +1,6 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = doc src man tests
|
||||
SUBDIRS = @XGRAPHDIR@ doc src man tests
|
||||
|
||||
EXTRA_DIST = FAQ acconfig.h autogen.sh NOTES BUGS AUTHORS ChangeLog \
|
||||
DEVICES NEWS README
|
||||
|
|
|
|||
28
configure.in
28
configure.in
|
|
@ -116,12 +116,20 @@ dnl --enable-numparams: define NUMPARAMS in the code. This is for .param support
|
|||
AC_ARG_ENABLE(numparam,
|
||||
[ --enable-numparam Enable numparams library support, experimental *not in standard distribution*])
|
||||
|
||||
dnl --enable-xgraph: Compile the xgraph plotting program. Default is "no".
|
||||
dnl Xgraph is a plotitng package for X11 once very popular.
|
||||
AC_ARG_ENABLE(xgraph,
|
||||
[ --enable-xgraph Enable xgraph compilation.])
|
||||
|
||||
dnl --with-readline: Includes GNU readline support into CLI. Default is "no".
|
||||
dnl Including readline into ngspice is a violation of GPL license. It's use
|
||||
dnl is discouraged.
|
||||
AC_ARG_WITH(readline,
|
||||
[ --with-readline[=yes/no] Enable GNU readline support for CLI. Default=no.])
|
||||
|
||||
|
||||
|
||||
|
||||
dnl Enable maintainer commands only if requested
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
|
|
@ -394,6 +402,16 @@ if test "$enable_pzdebug" = "yes"; then
|
|||
AC_MSG_RESULT(WARNING: Pole/Zero analysis debug is enabled)
|
||||
fi
|
||||
|
||||
if test "$enable_xgraph" = "yes"; then
|
||||
AC_MSG_RESULT(Xgraph compilation enabled.)
|
||||
AC_CONFIG_SUBDIRS(xgraph)
|
||||
XGRAPHDIR="xgraph"
|
||||
else
|
||||
XGRAPHDIR=""
|
||||
fi
|
||||
|
||||
AC_SUBST(XGRAPHDIR)
|
||||
|
||||
if test "$enable_ekv" = "yes"; then
|
||||
AC_MSG_RESULT(Model EKV included)
|
||||
AC_DEFINE(HAVE_EKV)
|
||||
|
|
@ -502,9 +520,11 @@ AC_SUBST(NUMPARAMDIR)
|
|||
AC_SUBST(NUMPARAMLIB)
|
||||
|
||||
dnl ---- Option to include GNU readline support in ngspice CLI ----
|
||||
if test "$with_readline" != "yes"; then
|
||||
dnl ---- Default: disabled. ----
|
||||
dnl ---- Hope to see in the future readline replacement. ----
|
||||
|
||||
if test "$with_readline" = "yes"; then
|
||||
AC_MSG_RESULT(GNU readline disabled.)
|
||||
|
||||
else
|
||||
AC_MSG_RESULT(Checking for readline:)
|
||||
AC_CHECK_HEADERS([readline/readline.h readline/history.h],
|
||||
|
|
@ -512,9 +532,11 @@ else
|
|||
[AC_MSG_ERROR(Couldn't find GNU readline headers.)])
|
||||
AC_CHECK_LIB(readline, readline,
|
||||
[LIBS="$LIBS -lreadline"],
|
||||
[AC_MSG_ERROR(Couldn't find readline libraries.)])
|
||||
[AC_MSG_ERROR(Couldn't find readline libraries.)])
|
||||
fi
|
||||
|
||||
|
||||
|
||||
AC_OUTPUT( \
|
||||
Makefile \
|
||||
doc/Makefile \
|
||||
|
|
|
|||
|
|
@ -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};
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -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
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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 */
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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.
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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_ */
|
||||
Loading…
Reference in New Issue