summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoye <joye>2013-09-10 19:15:01 (GMT)
committerjoye <joye>2013-09-10 19:15:01 (GMT)
commitd2d5654b7141082d48dc0ea1b3a066f664d64426 (patch)
tree25ef8b10aafc8f009e60e929435c7f962395a485
parent75d6fe14a8ec2e37acf6787432db00d55b2ef9ec (diff)
downloadblt-d2d5654b7141082d48dc0ea1b3a066f664d64426.zip
blt-d2d5654b7141082d48dc0ea1b3a066f664d64426.tar.gz
blt-d2d5654b7141082d48dc0ea1b3a066f664d64426.tar.bz2
*** empty log message ***
-rwxr-xr-xMakefile.in449
-rwxr-xr-xaclocal.m49
-rwxr-xr-xconfigure2
-rwxr-xr-xconfigure.in2
-rw-r--r--doc/BLT.n153
-rw-r--r--doc/barchart.n2236
-rw-r--r--doc/graph.n2397
-rw-r--r--doc/vector.n1130
-rw-r--r--src/bltGrPSOutput.C8
-rw-r--r--src/bltGrText.C8
-rw-r--r--src/bltNsUtil.C8
-rw-r--r--tclconfig/ChangeLog980
-rw-r--r--tclconfig/README.txt26
-rwxr-xr-xtclconfig/install-sh528
-rw-r--r--tclconfig/tcl.m44150
15 files changed, 12060 insertions, 26 deletions
diff --git a/Makefile.in b/Makefile.in
new file mode 100755
index 0000000..b9abd63
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,449 @@
+# Makefile.in --
+#
+# This file is a Makefile for Sample TEA Extension. If it has the name
+# "Makefile.in" then it is a template for a Makefile; to generate the
+# actual Makefile, run "./configure", which is a configuration script
+# generated by the "autoconf" program (constructs like "@foo@" will get
+# replaced in the actual Makefile.
+#
+# Copyright (c) 1999 Scriptics Corporation.
+# Copyright (c) 2002-2005 ActiveState Corporation.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+#========================================================================
+# Add additional lines to handle any additional AC_SUBST cases that
+# have been added in a customized configure script.
+#========================================================================
+
+#SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@
+
+#========================================================================
+# Nothing of the variables below this line should need to be changed.
+# Please check the TARGETS section below to make sure the make targets
+# are correct.
+#========================================================================
+
+#========================================================================
+# The names of the source files is defined in the configure script.
+# The object files are used for linking into the final library.
+# This will be used when a dist target is added to the Makefile.
+# It is not important to specify the directory, as long as it is the
+# $(srcdir) or in the generic, win or unix subdirectory.
+#========================================================================
+
+PKG_SOURCES = @PKG_SOURCES@
+PKG_OBJECTS = @PKG_OBJECTS@
+
+PKG_STUB_SOURCES = @PKG_STUB_SOURCES@
+PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@
+
+#========================================================================
+# PKG_TCL_SOURCES identifies Tcl runtime files that are associated with
+# this package that need to be installed, if any.
+#========================================================================
+
+PKG_TCL_SOURCES = @PKG_TCL_SOURCES@
+
+#========================================================================
+# This is a list of public header files to be installed, if any.
+#========================================================================
+
+PKG_HEADERS = @PKG_HEADERS@
+
+#========================================================================
+# "PKG_LIB_FILE" refers to the library (dynamic or static as per
+# configuration options) composed of the named objects.
+#========================================================================
+
+PKG_LIB_FILE = @PKG_LIB_FILE@
+PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@
+
+lib_BINARIES = $(PKG_LIB_FILE)
+BINARIES = $(lib_BINARIES)
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+datarootdir = @datarootdir@
+datadir = @datadir@
+mandir = @mandir@
+
+DESTDIR =
+
+PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION)
+pkgdatadir = $(datadir)/$(PKG_DIR)
+pkglibdir = $(libdir)/$(PKG_DIR)
+pkgincludedir = $(includedir)/$(PKG_DIR)
+
+top_builddir = .
+
+INSTALL_OPTIONS =
+INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS}
+INSTALL_DATA_DIR = ${INSTALL} -d -m 755
+INSTALL_PROGRAM = ${INSTALL} -m 555
+INSTALL_DATA = ${INSTALL} -m 444
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+INSTALL_LIBRARY = ${INSTALL_DATA}
+
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+CC = @CC@
+CFLAGS_DEFAULT = @CFLAGS_DEFAULT@
+CFLAGS_WARNING = @CFLAGS_WARNING@
+EXEEXT = @EXEEXT@
+LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@
+MAKE_LIB = @MAKE_LIB@
+MAKE_SHARED_LIB = @MAKE_SHARED_LIB@
+MAKE_STATIC_LIB = @MAKE_STATIC_LIB@
+MAKE_STUB_LIB = @MAKE_STUB_LIB@
+OBJEXT = @OBJEXT@
+RANLIB = @RANLIB@
+RANLIB_STUB = @RANLIB_STUB@
+SHLIB_CFLAGS = @SHLIB_CFLAGS@
+SHLIB_LD = @SHLIB_LD@
+SHLIB_LD_LIBS = @SHLIB_LD_LIBS@
+STLIB_LD = @STLIB_LD@
+#TCL_DEFS = @TCL_DEFS@
+TCL_BIN_DIR = @TCL_BIN_DIR@
+TCL_SRC_DIR = @TCL_SRC_DIR@
+TK_BIN_DIR = @TK_BIN_DIR@
+TK_SRC_DIR = @TK_SRC_DIR@
+
+# Not used, but retained for reference of what libs Tcl required
+#TCL_LIBS = @TCL_LIBS@
+
+#========================================================================
+# TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our
+# package without installing. The other environment variables allow us
+# to test against an uninstalled Tcl. Add special env vars that you
+# require for testing here (like TCLX_LIBRARY).
+#========================================================================
+
+#EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR)
+EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR)
+TCLLIBPATH = $(top_builddir)
+TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library`
+PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \
+ PATH="$(EXTRA_PATH):$(PATH)" \
+ TCLLIBPATH="$(TCLLIBPATH)"
+
+TCLSH_PROG = @TCLSH_PROG@
+TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG)
+
+WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library`
+WISH_PROG = @WISH_PROG@
+WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG)
+
+SHARED_BUILD = @SHARED_BUILD@
+
+#INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@
+INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@
+
+PKG_CFLAGS = @PKG_CFLAGS@
+
+# TCL_DEFS is not strictly need here, but if you remove it, then you
+# must make sure that configure.in checks for the necessary components
+# that your library may use. TCL_DEFS can actually be a problem if
+# you do not compile with a similar machine setup as the Tcl core was
+# compiled with.
+#DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS)
+DEFS = @DEFS@ $(PKG_CFLAGS)
+
+# Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile
+CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl
+CLEANFILES = @CLEANFILES@
+
+CPPFLAGS = @CPPFLAGS@
+LIBS = @PKG_LIBS@ @LIBS@
+AR = @AR@
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+
+.SUFFIXES: .c .$(OBJEXT)
+
+#========================================================================
+# Start of user-definable TARGETS section
+#========================================================================
+
+#========================================================================
+# TEA TARGETS. Please note that the "libraries:" target refers to platform
+# independent files, and the "binaries:" target includes executable programs and
+# platform-dependent libraries. Modify these targets so that they install
+# the various pieces of your package. The make and install rules
+# for the BINARIES that you specified above have already been done.
+#========================================================================
+
+all: binaries libraries doc
+
+#========================================================================
+# The binaries target builds executable programs, Windows .dll's, unix
+# shared/static libraries, and any other platform-dependent files.
+# The list of targets to build for "binaries:" is specified at the top
+# of the Makefile, in the "BINARIES" variable.
+#========================================================================
+
+binaries: $(BINARIES)
+
+libraries:
+
+#========================================================================
+# Your doc target should differentiate from doc builds (by the developer)
+# and doc installs (see install-doc), which just install the docs on the
+# end user machine when building from source.
+#========================================================================
+
+doc:
+ @echo "If you have documentation to create, place the commands to"
+ @echo "build the docs in the 'doc:' target. For example:"
+ @echo " xml2nroff sample.xml > sample.n"
+ @echo " xml2html sample.xml > sample.html"
+
+install: all install-binaries install-libraries install-doc
+
+install-binaries: binaries install-lib-binaries install-bin-binaries
+
+#========================================================================
+# This rule installs platform-independent files, such as header files.
+# The list=...; for p in $$list handles the empty list case x-platform.
+#========================================================================
+
+install-libraries: libraries
+ @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir)
+ @echo "Installing header files in $(DESTDIR)$(includedir)"
+ @list='$(PKG_HEADERS)'; for i in $$list; do \
+ echo "Installing $(srcdir)/$$i" ; \
+ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \
+ done;
+
+#========================================================================
+# Install documentation. Unix manpages should go in the $(mandir)
+# directory.
+#========================================================================
+
+install-doc: doc
+ @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann
+ @echo "Installing documentation in $(DESTDIR)$(mandir)"
+ @list='$(srcdir)/doc/*.n'; for i in $$list; do \
+ echo "Installing $$i"; \
+ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \
+ done
+
+test: binaries libraries
+ $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \
+ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \
+ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]"
+
+shell: binaries libraries
+ @$(TCLSH) $(SCRIPT)
+
+gdb:
+ $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT)
+
+VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \
+ --leak-check=yes --show-reachable=yes -v
+
+valgrind: binaries libraries
+ $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \
+ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS)
+
+valgrindshell: binaries libraries
+ $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT)
+
+depend:
+
+#========================================================================
+# $(PKG_LIB_FILE) should be listed as part of the BINARIES variable
+# mentioned above. That will ensure that this target is built when you
+# run "make binaries".
+#
+# The $(PKG_OBJECTS) objects are created and linked into the final
+# library. In most cases these object files will correspond to the
+# source files above.
+#========================================================================
+
+$(PKG_LIB_FILE): $(PKG_OBJECTS)
+ -rm -f $(PKG_LIB_FILE)
+ ${MAKE_LIB}
+ $(RANLIB) $(PKG_LIB_FILE)
+
+$(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS)
+ -rm -f $(PKG_STUB_LIB_FILE)
+ ${MAKE_STUB_LIB}
+ $(RANLIB_STUB) $(PKG_STUB_LIB_FILE)
+
+#========================================================================
+# We need to enumerate the list of .c to .o lines here.
+#
+# In the following lines, $(srcdir) refers to the toplevel directory
+# containing your extension. If your sources are in a subdirectory,
+# you will have to modify the paths to reflect this:
+#
+# sample.$(OBJEXT): $(srcdir)/generic/sample.c
+# $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@
+#
+# Setting the VPATH variable to a list of paths will cause the makefile
+# to look into these paths when resolving .c to .obj dependencies.
+# As necessary, add $(srcdir):$(srcdir)/compat:....
+#========================================================================
+
+VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx
+
+.c.@OBJEXT@:
+ $(COMPILE) -c `@CYGPATH@ $<` -o $@
+
+#========================================================================
+# Distribution creation
+# You may need to tweak this target to make it work correctly.
+#========================================================================
+
+#COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar
+COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR)
+DIST_ROOT = /tmp/dist
+DIST_DIR = $(DIST_ROOT)/$(PKG_DIR)
+
+dist-clean:
+ rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.*
+
+dist: dist-clean
+ $(INSTALL_DATA_DIR) $(DIST_DIR)
+ cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \
+ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \
+ $(DIST_DIR)/
+ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4
+ chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in
+
+ for i in $(srcdir)/*.[ch]; do \
+ if [ -f $$i ]; then \
+ cp -p $$i $(DIST_DIR)/ ; \
+ fi; \
+ done;
+
+ $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig
+ cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \
+ $(DIST_DIR)/tclconfig/
+ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4
+ chmod +x $(DIST_DIR)/tclconfig/install-sh
+
+ list='demos doc generic library mac tests unix win'; \
+ for p in $$list; do \
+ if test -d $(srcdir)/$$p ; then \
+ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \
+ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \
+ fi; \
+ done
+
+ (cd $(DIST_ROOT); $(COMPRESS);)
+
+#========================================================================
+# End of user-definable section
+#========================================================================
+
+#========================================================================
+# Don't modify the file to clean here. Instead, set the "CLEANFILES"
+# variable in configure.in
+#========================================================================
+
+clean:
+ -test -z "$(BINARIES)" || rm -f $(BINARIES)
+ -rm -f *.$(OBJEXT) core *.core
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean: clean
+ -rm -f *.tab.c
+ -rm -f $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log config.status
+
+#========================================================================
+# Install binary object libraries. On Windows this includes both .dll and
+# .lib files. Because the .lib files are not explicitly listed anywhere,
+# we need to deduce their existence from the .dll file of the same name.
+# Library files go into the lib directory.
+# In addition, this will generate the pkgIndex.tcl
+# file in the install location (assuming it can find a usable tclsh shell)
+#
+# You should not have to modify this target.
+#========================================================================
+
+install-lib-binaries: binaries
+ @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir)
+ @list='$(lib_BINARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \
+ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \
+ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \
+ if test "x$$stub" = "xstub"; then \
+ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \
+ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \
+ else \
+ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \
+ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \
+ fi; \
+ ext=`echo $$p|sed -e "s/.*\.//"`; \
+ if test "x$$ext" = "xdll"; then \
+ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \
+ if test -f $$lib; then \
+ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \
+ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \
+ fi; \
+ fi; \
+ fi; \
+ done
+ @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ destp=`basename $$p`; \
+ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \
+ fi; \
+ done
+ @if test "x$(SHARED_BUILD)" = "x1"; then \
+ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \
+ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \
+ fi
+
+#========================================================================
+# Install binary executables (e.g. .exe files and dependent .dll files)
+# This is for files that must go in the bin directory (located next to
+# wish and tclsh), like dependent .dll files on Windows.
+#
+# You should not have to modify this target, except to define bin_BINARIES
+# above if necessary.
+#========================================================================
+
+install-bin-binaries: binaries
+ @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir)
+ @list='$(bin_BINARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
+ fi; \
+ done
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+uninstall-binaries:
+ list='$(lib_BINARIES)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(pkglibdir)/$$p; \
+ done
+ list='$(PKG_TCL_SOURCES)'; for p in $$list; do \
+ p=`basename $$p`; \
+ rm -f $(DESTDIR)$(pkglibdir)/$$p; \
+ done
+ list='$(bin_BINARIES)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/$$p; \
+ done
+
+.PHONY: all binaries clean depend distclean doc install libraries test
+
+# 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:
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100755
index 0000000..0b05739
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,9 @@
+#
+# Include the TEA standard macro set
+#
+
+builtin(include,tclconfig/tcl.m4)
+
+#
+# Add here whatever m4 macros you want to define for your package
+#
diff --git a/configure b/configure
index d1477f9..4c33fbe 100755
--- a/configure
+++ b/configure
@@ -5676,7 +5676,7 @@ done
# TEA_ADD_* any platform specific compiler/build info here.
#--------------------------------------------------------------------
-#CLEANFILES="$CLEANFILES pkgIndex.tcl"
+CLEANFILES="$CLEANFILES pkgIndex.tcl config.status config.log Makefile"
if test "${TEA_PLATFORM}" = "windows" ; then
# Ensure no empty if clauses
:
diff --git a/configure.in b/configure.in
index 58df377..55007f6 100755
--- a/configure.in
+++ b/configure.in
@@ -133,7 +133,7 @@ TEA_ADD_TCL_SOURCES([library/graph.tcl library/bltGraph.pro])
# TEA_ADD_* any platform specific compiler/build info here.
#--------------------------------------------------------------------
-#CLEANFILES="$CLEANFILES pkgIndex.tcl"
+CLEANFILES="$CLEANFILES pkgIndex.tcl config.status config.log Makefile"
if test "${TEA_PLATFORM}" = "windows" ; then
# Ensure no empty if clauses
:
diff --git a/doc/BLT.n b/doc/BLT.n
new file mode 100644
index 0000000..1593029
--- /dev/null
+++ b/doc/BLT.n
@@ -0,0 +1,153 @@
+'\"
+'\" Copyright 1991-1997 by Bell Labs Innovations for Lucent Technologies.
+'\"
+'\" Permission to use, copy, modify, and distribute this software and its
+'\" documentation for any purpose and without fee is hereby granted, provided
+'\" that the above copyright notice appear in all copies and that both that the
+'\" copyright notice and warranty disclaimer appear in supporting documentation,
+'\" and that the names of Lucent Technologies any of their entities not be used
+'\" in advertising or publicity pertaining to distribution of the software
+'\" without specific, written prior permission.
+'\"
+'\" Lucent Technologies disclaims all warranties with regard to this software,
+'\" including all implied warranties of merchantability and fitness. In no event
+'\" shall Lucent Technologies be liable for any special, indirect or
+'\" consequential damages or any damages whatsoever resulting from loss of use,
+'\" data or profits, whether in an action of contract, negligence or other
+'\" tortuous action, arising out of or in connection with the use or performance
+'\" of this software.
+'\"
+.so man.macros
+.TH intro n BLT_VERSION BLT "BLT Built-In Commands"
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+BLT \- Introduction to the BLT library
+.BE
+.SH DESCRIPTION
+BLT is a library of extensions to the Tk library. It adds new
+commands and variables to the application's interpreter.
+.LP
+.SH COMMANDS
+The following commands are added to the interpreter from the BLT library:
+.TP 15
+\fBtable\fR
+A table geometry manager for Tk. You specify window placements as table
+row,column positions and windows can also span multiple rows or columns.
+It also has many options for setting and/or bounding window sizes.
+.TP 15
+\fBgraph\fR
+A 2D plotting widget. Plots two variable data in a window with an optional
+legend and annotations. It has of several components; coordinate axes,
+crosshairs, a legend, and a collection of elements and tags.
+.TP 15
+\fBbarchart\fR
+A barchart widget. Plots two-variable data as rectangular bars in a
+window. The x-coordinate values designate the position of the bar along
+the x-axis, while the y-coordinate values designate the magnitude.
+The \fBbarchart\fR widget has of several components; coordinate axes,
+crosshairs, a legend, and a collection of elements and tags.
+.TP 15
+\fBvector\fR
+Creates a vector of floating point values. The vector's components
+can be manipulated in three ways: through a Tcl array variable, a Tcl
+command, or the C API.
+.TP
+\fBspline\fR
+Computes a spline fitting a set of data points (x and y vectors) and
+produces a vector of the interpolated images (y-coordinates) at a
+given set of x-coordinates.
+.TP 15
+\fBbgexec\fR
+Like Tcl's \fBexec\fR command, \fBbgexec\fR runs a pipeline of Unix
+commands in the background. Unlike \fBexec\fR, the output of the last
+process is collected and a global Tcl variable is set upon its completion.
+\fBbgexec\fR can be used with \fBtkwait\fR to wait for Unix commands
+to finish while still handling expose events. Intermediate output is
+also available while the pipeline is active.
+.TP 15
+\fBbusy\fR
+Creates a "busy window" which prevents user-interaction when an
+application is busy. The busy window also provides an easy way
+to have temporary busy cursors (such as a watch or hourglass).
+.TP 15
+\fBbitmap\fR
+Reads and writes bitmaps from Tcl. New X bitmaps can be defined
+on-the-fly from Tcl, obviating the need to copy around bitmap files.
+Other options query loaded X bitmap's dimensions and data.
+.TP 15
+\fBdrag&drop\fR
+Provides a drag-and-drop facility for Tk. Information (represented
+by a token window) can be dragged to and from any Tk window, including
+those of another Tk application. \fBdrag&drop\fR acts as a
+coordinator, directing Tk \fBsend\fR commands between (or within) TCL/Tk
+applications.
+.TP 15
+\fBhtext\fR
+A simple hypertext widget. Combines text and Tk widgets into a single
+scroll-able window. Tcl commands can be embedded into text, which are
+invoked as the text is parsed. In addition, Tk widgets can be
+appended to the window at the current point in the text. \fBHtext\fR
+can be also used to create scrolled windows of Tk widgets.
+.TP 15
+\fBwinop\fR
+Raise, lower, map, or, unmap any window. The raise and lower functions
+are useful for stacking windows above or below "busy windows".
+.TP 15
+\fBwatch\fR
+Arranges for Tcl procedures to be called before and/or after the execution
+of every Tcl command. This command
+may be used in the logging, profiling, or tracing of Tcl code.
+.TP 15
+\fBbltdebug\fR
+A simple Tcl command tracing facility useful for debugging Tcl code.
+Displays each Tcl command before and after substitution along its level
+in the interpreter on standard error.
+.SH VARIABLES
+.PP
+The following Tcl variables are either set or used by BLT at various times
+in its execution:
+.TP 15
+\fBblt_library\fR
+This variable contains the name of a directory containing a library
+of Tcl scripts and other files related to BLT. Currently, this
+directory contains the \fBdrag&drop\fR protocol scripts and the
+PostScript prolog
+used by \fBgraph\fR and \fBbarchart\fR.
+The value of this variable is taken from the BLT_LIBRARY environment
+variable, if one exists, or else from a default value compiled into
+the \fBBLT\fR library.
+.TP 15
+\fBblt_versions\fR
+This variable is set in the interpreter for each application. It is an
+array of the current version numbers for each
+of the BLT commands in the form \fImajor\fR.\fIminor\fR. \fIMajor\fR and
+\fIminor\fR are integers. The major version number increases in
+any command that includes changes that are not backward compatible
+(i.e. whenever existing applications and scripts may have to change to
+work with the new release). The minor version number increases with
+each new release of a command, except that it resets to zero whenever the
+major version number changes. The array is indexed by the individual
+command name.
+.SH ADDING BLT TO YOUR APPLICATIONS
+It's easy to add BLT to an existing Tk application. BLT requires no
+patches or edits to the Tcl or Tk libraries. To add BLT, simply add the
+following code snippet to your application's tkAppInit.c file.
+.CS
+if (Blt_Init(interp) != TCL_OK) {
+ return TCL_ERROR;
+}
+.CE
+Recompile and link with the BLT library (libBLT.a) and that's it.
+.PP
+Alternately, you can dynamically load BLT, simply by invoking the
+command
+.CS
+package require BLT
+.CE
+from your Tcl script.
+.SH BUGS
+Send bug reports, requests, suggestions, etc. to
+gah@siliconmetrics.com or ghowlett@grandecom.net
+.SH KEYWORDS
+BLT
diff --git a/doc/barchart.n b/doc/barchart.n
new file mode 100644
index 0000000..ec2b5f4
--- /dev/null
+++ b/doc/barchart.n
@@ -0,0 +1,2236 @@
+'\"
+'\" Copyright 1991-1998 by Bell Labs Innovations for Lucent Technologies.
+'\"
+'\" Permission to use, copy, modify, and distribute this software and its
+'\" documentation for any purpose and without fee is hereby granted, provided
+'\" that the above copyright notice appear in all copies and that both that the
+'\" copyright notice and warranty disclaimer appear in supporting documentation,
+'\" and that the names of Lucent Technologies any of their entities not be used
+'\" in advertising or publicity pertaining to distribution of the software
+'\" without specific, written prior permission.
+'\"
+'\" Lucent Technologies disclaims all warranties with regard to this software,
+'\" including all implied warranties of merchantability and fitness. In no event
+'\" shall Lucent Technologies be liable for any special, indirect or
+'\" consequential damages or any damages whatsoever resulting from loss of use,
+'\" data or profits, whether in an action of contract, negligence or other
+'\" tortuous action, arising out of or in connection with the use or performance
+'\" of this software.
+'\"
+'\" Barchart widget created by Sani Nassif and George Howlett.
+'\"
+.so man.macros
+.TH barchart n BLT_VERSION BLT "BLT Built-In Commands"
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+barchart \- Bar chart for plotting X-Y coordinate data.
+.SH SYNOPSIS
+\fBbarchart\fI \fIpathName \fR?\fIoption value\fR?...
+.BE
+.SH DESCRIPTION
+The \fBbarchart\fR command creates a bar chart for plotting
+two-dimensional data (X-Y coordinates). A bar chart is a graphic means
+of comparing numbers by displaying bars of lengths proportional to the
+y-coordinates of the points they represented. The bar chart has many
+configurable components: coordinate axes, elements, legend, grid
+lines, cross hairs, etc. They allow you to customize the look and
+feel of the graph.
+.SH INTRODUCTION
+The \fBbarchart\fR command creates a new window for plotting
+two-dimensional data (X-Y coordinates), using bars of
+various lengths to represent the data points. The bars are drawn in a
+rectangular area displayed in the center of the new window. This is the
+\fIplotting area\fR. The coordinate axes are drawn in
+the margins surrounding the plotting area. By default, the legend is
+drawn in the right margin. The title is displayed in top margin.
+.PP
+A \fBbarchart\fR widget has several configurable components:
+coordinate axes, data elements, legend, grid, cross hairs, pens,
+postscript, and annotation markers. Each component can be queried or
+modified.
+.TP 1i
+\f(CWaxis\fR
+
+Up to four coordinate axes (two X\-coordinate and two Y\-coordinate
+axes) can be displayed, but you can create and use any number of
+axes. Axes control what region of data is displayed and how the data
+is scaled. Each axis consists of the axis line, title, major and minor
+ticks, and tick labels. Tick labels display the value at each major
+tick.
+.TP 1i
+\f(CWcrosshairs\fR
+Cross hairs are used to position the mouse pointer relative to the X
+and Y coordinate axes. Two perpendicular lines, intersecting at the
+current location of the mouse, extend across the plotting area to the
+coordinate axes.
+.TP 1i
+\f(CWelement\fR
+An element represents a set of data to be plotted. It contains an x
+and y vector of values representing the data points. Each
+data point is displayed as a bar where the length of the bar is
+proportional to the ordinate (Y-coordinate) of the data point.
+The appearance of the bar, such as its color, stipple, or relief
+is configurable.
+.sp
+A special case exists when two or more data points have the same
+abscissa (X-coordinate). By default, the bars are overlayed, one on
+top of the other. The bars are drawn in the order of the element
+display list. But you can also configure the bars to be displayed in
+two other ways. They may be displayed as a stack, where each bar
+(with the same abscissa) is stacked on the previous. Or they can be
+drawn side-by-side as thin bars. The width of each bar is a function
+of the number of data points with the same abscissa.
+.TP 1i
+\f(CWgrid\fR
+Extends the major and minor ticks of the X\-axis and/or Y\-axis across the
+plotting area.
+.TP 1i
+\f(CWlegend\fR
+The legend displays the name and symbol of each data element.
+The legend can be drawn in any margin or in the plotting area.
+.TP 1i
+\f(CWmarker\fR
+Markers are used annotate or highlight areas of the graph. For
+example, you could use a text marker to label a particular data
+point. Markers come in various forms: text strings, bitmaps, connected
+line segments, images, polygons, or embedded widgets.
+.TP 1i
+\f(CWpen\fR
+Pens define attributes for elements. Data elements use pens to
+specify how they should be drawn. A data element may use many pens at
+once. Here the particular pen used for a data point is determined
+from each element's weight vector (see the element's \fB\-weight\fR
+and \fB\-style\fR options).
+.TP 1i
+\f(CWpostscript\fR
+The widget can generate encapsulated PostScript output. This component
+has several options to configure how the PostScript is generated.
+.SH SYNTAX
+.DS
+\fBbarchart \fIpathName \fR?\fIoption value\fR?...
+.DE
+The \fBbarchart\fR command creates a new window \fIpathName\fR and makes
+it into a \fBbarchart\fR widget. At the time this command is invoked, there
+must not exist a window named \fIpathName\fR, but \fIpathName\fR's
+parent must exist. Additional options may be specified on the
+command line or in the option database to configure aspects of the
+graph such as its colors and font. See the \fBconfigure\fR operation
+below for the exact details about what \fIoption\fR and \fIvalue\fR
+pairs are valid.
+.PP
+If successful, \fBbarchart\fR returns the path name of the widget. It
+also creates a new Tcl command by the same name. You can use this
+command to invoke various operations that query or modify the graph.
+The general form is:
+.DS
+\fIpathName \fIoperation\fR \fR?\fIarg\fR?...
+.DE
+Both \fIoperation\fR and its arguments determine the exact behavior of
+the command. The operations available for the graph are described in
+the
+.SB "BARCHART OPERATIONS"
+section.
+.PP
+The command can also be used to access components of the graph.
+.DS
+\fIpathName component operation\fR ?\fIarg\fR?...
+.DE
+The operation, now located after the name of the component, is the
+function to be performed on that component. Each component has its own
+set of operations that manipulate that component. They will be
+described below in their own sections.
+.SH EXAMPLE
+The \fBbarchart\fR command creates a new bar chart.
+.CS
+# Create a new bar chart. Plotting area is black.
+barchart .b -plotbackground black
+.CE
+A new Tcl command \f(CW.b\fR is created. This command can be used
+to query and modify the bar chart. For
+example, to change the title of the graph to "My Plot", you use the
+new command and the \fBconfigure\fR operation.
+.CS
+# Change the title.
+\&.b configure -title "My Plot"
+.CE
+To add data elements, you use the command and the \fBelement\fR component.
+.CS
+# Create a new element named "e1"
+\&.b element create e1 \\
+ -xdata { 1 2 3 4 5 6 7 8 9 10 } \\
+ -ydata { 26.18 50.46 72.85 93.31 111.86 128.47 143.14
+ 155.85 166.60 175.38 }
+.CE
+The element's X-Y coordinates are specified using lists of
+numbers. Alternately, BLT vectors could be used to hold the X-Y
+coordinates.
+.CS
+# Create two vectors and add them to the barchart.
+vector xVector yVector
+xVector set { 1 2 3 4 5 6 7 8 9 10 }
+yVector set { 26.18 50.46 72.85 93.31 111.86 128.47 143.14 155.85
+ 166.60 175.38 }
+\&n.b element create e1 -xdata xVector -ydata yVector
+.CE
+The advantage of using vectors is that when you modify one, the graph
+is automatically redrawn to reflect the new values.
+.CS
+# Change the y coordinate of the first point.
+set yVector(0) 25.18
+.CE
+An element named \f(CWe1\fR is now created in \f(CW.b\fR. It
+is automatically added to the display list of elements. You can
+use this list to control in what order elements are displayed.
+To query or reset the element display list, you use the element's
+\fBshow\fR operation.
+.CS
+# Get the current display list
+set elemList [.b element show]
+# Remove the first element so it won't be displayed.
+\&.b element show [lrange $elemList 0 end]
+.CE
+The element will be displayed by as many bars as there are data points
+(in this case there are ten). The bars will be drawn centered at the
+x-coordinate of the data point. All the bars will have the same
+attributes (colors, stipple, etc). The width of each bar is by
+default one unit. You can change this with using the \fB\-barwidth\fR
+option.
+.CS
+# Change the scale of the x-coordinate data
+xVector set { 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 }
+# Make sure we change the bar width too.
+\&.b configure -barwidth 0.2
+.CE
+The height of each bar is proportional to the ordinate (Y-coordinate)
+of the data point.
+.PP
+If two or more data points have the same abscissa (X-coordinate
+value), the bars representing those data points may be drawn in
+various ways.
+The default is to overlay the bars, one on top of the other.
+The ordering is determined from the of element display list. If
+the stacked mode is selected (using the \fB\-barmode\fR configuration
+option), the bars are stacked, each bar above the previous.
+.CS
+# Display the elements as stacked.
+\&.b configure -barmode stacked
+.CE
+If the aligned mode is selected, the bars having the same
+x-coordinates are displayed side by side. The width of each bar is a
+fraction of its normal width, based upon the number of bars with the
+same x-coordinate.
+.CS
+# Display the elements side-by-side.
+\&.b configure -barmode aligned
+.CE
+By default, the element's label in the legend will be also
+\f(CWe1\fR. You can change the label, or specify no legend entry,
+again using the element's \fBconfigure\fR operation.
+.CS
+# Don't display "e1" in the legend.
+\&.b element configure e1 -label ""
+.CE
+You can configure more than just the element's label. An element has
+many attributes such as stipple, foreground and background colors,
+relief, etc.
+.CS
+\&.b element configure e1 -fg red -bg pink \\
+ -stipple gray50
+.CE
+Four coordinate axes are automatically created: \f(CWx\fR, \f(CWx2\fR,
+\f(CWy\fR, and \f(CWy2\fR. And by default, elements are mapped onto the
+axes \f(CWx\fR and \f(CWy\fR. This can be changed with the \fB\-mapx\fR
+and \fB\-mapy\fR options.
+.CS
+# Map "e1" on the alternate y axis "y2".
+\&.b element configure e1 -mapy y2
+.CE
+Axes can be configured in many ways too. For example, you change the
+scale of the Y\-axis from linear to log using the \fBaxis\fR component.
+.CS
+# Y-axis is log scale.
+\&.b axis configure y -logscale yes
+.CE
+One important way axes are used is to zoom in on a particular data
+region. Zooming is done by simply specifying new axis limits using
+the \fB\-min\fR and \fB\-max\fR configuration options.
+.CS
+\&.b axis configure x \-min 1.0 \-max 1.5
+\&.b axis configure y \-min 12.0 \-max 55.15
+.CE
+To zoom interactively, you link the\fBaxis configure\fR operations with
+some user interaction (such as pressing the mouse button), using the
+\fBbind\fR command. To convert between screen and graph coordinates,
+use the \fBinvtransform\fR operation.
+.CS
+# Click the button to set a new minimum
+bind .b <ButtonPress-1> {
+ %W axis configure x \-min [%W axis invtransform x %x]
+ %W axis configure x \-min [%W axis invtransform x %y]
+}
+.CE
+By default, the limits of the axis are determined from data values.
+To reset back to the default limits, set the \fB\-min\fR and
+\fB\-max\fR options to the empty value.
+.CS
+# Reset the axes to autoscale again.
+\&.b axis configure x \-min {} \-max {}
+\&.b axis configure y \-min {} \-max {}
+.CE
+By default, the legend is drawn in the right margin. You can
+change this or any legend configuration options using the
+\fBlegend\fR component.
+.CS
+# Configure the legend font, color, and relief
+\&.b legend configure -position left -relief raised \\
+ -font fixed -fg blue
+.CE
+To prevent the legend from being displayed, turn on the \fB\-hide\fR
+option.
+.CS
+# Don't display the legend.
+\&.b legend configure \-hide yes\fR
+.CE
+The \fBbarchart\fR has simple drawing procedures called markers. They can be
+used to highlight or annotate data in the graph. The types of markers
+available are bitmaps, polygons, lines, or windows. Markers can be
+used, for example, to mark or brush points. For example there may be
+a line marker which indicates some low-water value. Markers are created
+using the \fBmarker\fR operation.
+.CS
+# Create a line represent the low water mark at 10.0
+\&.b marker create line -name "low_water" \\
+ -coords { -Inf 10.0 Inf 10.0 } \\
+ -dashes { 2 4 2 } -fg red -bg blue
+.CE
+This creates a line marker named \f(CWlow_water\fR. It will display a
+horizontal line stretching across the plotting area at the
+y-coordinate 10.0. The coordinates "-Inf" and "Inf" indicate the
+relative minimum and maximum of the axis (in this case the x-axis). By
+default, markers are drawn last, on top of the bars. You can change this
+with the \fB\-under\fR option.
+.CS
+# Draw the marker before elements are drawn.
+\&.b marker configure low_water -under yes
+.CE
+You can add cross hairs or grid lines using the \fBcrosshairs\fR and
+\fBgrid\fR components.
+.CS
+# Display both cross hairs and grid lines.
+\&.b crosshairs configure -hide no -color red
+\&.b grid configure -hide no -dashes { 2 2 }
+.CE
+Finally, to get hardcopy of the graph, use the \fBpostscript\fR
+component.
+.CS
+# Print the bar chart into file "file.ps"
+\&.b postscript output file.ps -maxpect yes -decorations no
+.CE
+This generates a file \f(CWfile.ps\fR containing the encapsulated
+PostScript of the graph. The option \fB\-maxpect\fR says to scale the
+plot to the size of the page. Turning off the \fB\-decorations\fR
+option denotes that no borders or color backgrounds should be
+drawn (i.e. the background of the margins, legend, and plotting
+area will be white).
+.SH SYNTAX
+.DS
+\fBbarchart \fIpathName \fR?\fIoption value\fR?...
+.DE
+The \fBbarchart\fR command creates a new window \fIpathName\fR and makes
+it into a barchart widget. At the time this command is invoked, there
+must not exist a window named \fIpathName\fR, but \fIpathName\fR's
+parent must exist. Additional options may may be specified on the
+command line or in the option database to configure aspects of the
+bar chart such as its colors and font. See the \fBconfigure\fR operation
+below for the exact details as to what \fIoption\fR and \fIvalue\fR
+pairs are valid.
+.PP
+If successful, \fBbarchart\fR returns \fIpathName\fR. It also creates a
+new Tcl command \fIpathName\fR. This command may be used to invoke
+various operations to query or modify the bar chart. It has the general
+form:
+.DS
+\fIpathName \fIoperation\fR \fR?\fIarg\fR?...
+.DE
+Both \fIoperation\fR and its arguments determine the exact behavior of
+the command. The operations available for the bar chart are described in
+the following section.
+.SH "BARCHART OPERATIONS"
+.TP
+\fIpathName \fBbar \fIelemName \fR?\fIoption value\fR?...
+Creates a new barchart element \fIelemName\fR. It's an
+error if an element \fIelemName\fR already exists.
+See the manual for \fBbarchart\fR for details about
+what \fIoption\fR and \fIvalue\fR pairs are valid.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below for the \fBconfigure\fR operation.
+.TP
+\fIpathName \fBconfigure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options of the graph. If
+\fIoption\fR isn't specified, a list describing the current
+options for \fIpathName\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the option \fIoption\fR is set to \fIvalue\fR.
+The following options are valid.
+.RS
+.TP
+\fB\-background \fIcolor\fR
+Sets the background color. This includes the margins and
+legend, but not the plotting area.
+.TP
+\fB\-barmode \fImode\fR
+Indicates how related bar elements will be drawn. Related elements
+have data points with the same abscissas (X-coordinates). \fIMode\fR
+indicates how those segments should be drawn. \fIMode\fR can be
+\f(CWinfront\fR, \f(CWaligned\fR, \f(CWoverlap\fR, or \f(CWstacked\fR.
+The default mode is \f(CWinfront\fR.
+.RS
+.TP 1i
+\f(CWinfront\fR
+Each successive segment is drawn in front of the previous.
+.TP 1i
+\f(CWstacked\fR
+Each successive segment is stacked vertically on top of the previous.
+.TP 1i
+\f(CWaligned\fR
+Segments is displayed aligned from right-to-left.
+.TP 1i
+\f(CWoverlap\fR
+Like \f(CWaligned\fR but segments slightly overlap each other.
+.RE
+.TP
+\fB\-barwidth \fIvalue\fR
+Specifies the width of the bars. This value can be overrided by the
+individual elements using their \fB\-barwidth\fR configuration option.
+\fIValue\fR is the width in terms of graph-coordinates. The
+default width is \f(CW1.0\fR.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the width of the 3\-D border around the outside edge of the widget. The
+\fB\-relief\fR option determines if the border is to be drawn. The
+default is \f(CW2\fR.
+.TP
+\fB\-bottommargin \fIpixels\fR
+Specifies the size of the margin below the X\-coordinate axis. If
+\fIpixels\fR is \f(CW0\fR, the size of the margin is selected automatically.
+The default is \f(CW0\fR.
+.TP
+\fB\-bufferelements \fIboolean\fR
+Indicates whether an internal pixmap to buffer the display of data
+elements should be used. If \fIboolean\fR is true, data elements are
+drawn to an internal pixmap. This option is especially useful when
+the graph is redrawn frequently while the remains data unchanged (for
+example, moving a marker across the plot). See the
+.SB "SPEED TIPS"
+section.
+The default is \f(CW1\fR.
+.TP
+\fB\-cursor \fIcursor\fR
+Specifies the widget's cursor. The default cursor is \f(CWcrosshair\fR.
+.TP
+\fB\-font \fIfontName\fR
+Specifies the font of the graph title. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-18-180-*\fR.
+.TP
+\fB\-halo \fIpixels\fR
+Specifies a maximum distance to consider when searching for the
+closest data point (see the element's \fBclosest\fR operation below).
+Data points further than \fIpixels\fR away are ignored. The default is
+\f(CW0.5i\fR.
+.TP
+\fB\-height \fIpixels\fR
+Specifies the requested height of widget. The default is
+\f(CW4i\fR.
+.TP
+\fB\-invertxy \fIboolean\fR
+Indicates whether the placement X\-axis and Y\-axis should be inverted. If
+\fIboolean\fR is true, the X and Y axes are swapped. The default is
+\f(CW0\fR.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the title should be justified. This matters only when
+the title contains more than one line of text. \fIJustify\fR must be
+\f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-leftmargin \fIpixels\fR
+Sets the size of the margin from the left edge of the window to
+the Y\-coordinate axis. If \fIpixels\fR is \f(CW0\fR, the size is
+calculated automatically. The default is \f(CW0\fR.
+.TP
+\fB\-plotbackground \fIcolor\fR
+Specifies the background color of the plotting area. The default is
+\f(CWwhite\fR.
+.TP
+\fB\-plotborderwidth \fIpixels\fR
+Sets the width of the 3-D border around the plotting area. The
+\fB\-plotrelief\fR option determines if a border is drawn. The
+default is \f(CW2\fR.
+.TP
+\fB\-plotpadx \fIpad\fR
+Sets the amount of padding to be added to the left and right sides of
+the plotting area. \fIPad\fR can be a list of one or two screen
+distances. If \fIpad\fR has two elements, the left side of the
+plotting area entry is padded by the first distance and the right side
+by the second. If \fIpad\fR is just one distance, both the left and
+right sides are padded evenly. The default is \f(CW8\fR.
+.TP
+\fB\-plotpady \fIpad\fR
+Sets the amount of padding to be added to the top and bottom of the
+plotting area. \fIPad\fR can be a list of one or two screen
+distances. If \fIpad\fR has two elements, the top of the plotting
+area is padded by the first distance and the bottom by the second. If
+\fIpad\fR is just one distance, both the top and bottom are padded
+evenly. The default is \f(CW8\fR.
+.TP
+\fB\-plotrelief \fIrelief\fR
+Specifies the 3-D effect for the plotting area. \fIRelief\fR
+specifies how the interior of the plotting area should appear relative
+to rest of the graph; for example, \f(CWraised\fR means the plot should
+appear to protrude from the graph, relative to the surface of the
+graph. The default is \f(CWsunken\fR.
+.TP
+\fB\-relief \fIrelief\fR
+Specifies the 3-D effect for the barchart widget. \fIRelief\fR
+specifies how the graph should appear relative to widget it is packed
+into; for example, \f(CWraised\fR means the graph should
+appear to protrude. The default is \f(CWflat\fR.
+.TP
+\fB\-rightmargin \fIpixels\fR
+Sets the size of margin from the plotting area to the right edge of
+the window. By default, the legend is drawn in this margin. If
+\fIpixels\fR is than 1, the margin size is selected automatically.
+.TP
+\fB\-takefocus\fR \fIfocus\fR
+Provides information used when moving the focus from window to window
+via keyboard traversal (e.g., Tab and Shift-Tab). If \fIfocus\fR is
+\f(CW0\fR, this means that this window should be skipped entirely during
+keyboard traversal. \f(CW1\fR means that the this window should always
+receive the input focus. An empty value means that the traversal
+scripts make the decision whether to focus on the window.
+The default is \f(CW""\fR.
+.TP
+\fB\-tile \fIimage\fR
+Specifies a tiled background for the widget. If \fIimage\fR isn't
+\f(CW""\fR, the background is tiled using \fIimage\fR.
+Otherwise, the normal background color is drawn (see the
+\fB\-background\fR option). \fIImage\fR must be an image created
+using the Tk \fBimage\fR command. The default is \f(CW""\fR.
+.TP
+\fB\-title \fItext\fR
+Sets the title to \fItext\fR. If \fItext\fR is \f(CW""\fR,
+no title will be displayed.
+.TP
+\fB\-topmargin \fIpixels\fR
+Specifies the size of the margin above the x2 axis. If \fIpixels\fR
+is \f(CW0\fR, the margin size is calculated automatically.
+.TP
+\fB\-width \fIpixels\fR
+Specifies the requested width of the widget. The default is
+\f(CW5i\fR.
+.RE
+.TP
+\fIpathName \fBcrosshairs \fIoperation \fR?\fIarg\fR?
+See the
+.SB "CROSSHAIRS COMPONENT"
+section.
+.TP
+\fIpathName \fBelement \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "ELEMENT COMPONENTS"
+section.
+.TP
+\fIpathName \fBextents \fIitem\fR
+Returns the size of a particular item in the graph. \fIItem\fR must
+be either \f(CWleftmargin\fR, \f(CWrightmargin\fR, \f(CWtopmargin\fR,
+\f(CWbottommargin\fR, \f(CWplotwidth\fR, or \f(CWplotheight\fR.
+.TP
+\fIpathName \fBgrid \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "GRID COMPONENT"
+section.
+.TP
+\fIpathName \fBinvtransform \fIwinX winY\fR
+Performs an inverse coordinate transformation, mapping window
+coordinates back to graph-coordinates, using the standard X\-axis and Y\-axis.
+Returns a list of containing the X-Y graph-coordinates.
+.TP
+\fIpathName \fBinside \fIx y\fR
+Returns \f(CW1\fR is the designated screen-coordinate (\fIx\fR and \fIy\fR)
+is inside the plotting area and \f(CW0\fR otherwise.
+.TP
+\fIpathName \fBlegend \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "LEGEND COMPONENT"
+section.
+.TP
+\fIpathName \fBline\fB operation arg\fR...
+The operation is the same as \fBelement\fR.
+.TP
+\fIpathName \fBmarker \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "MARKER COMPONENTS"
+section.
+.TP
+\fIpathName\fR \fBmetafile\fR ?\fIfileName\fR?
+\fIThis operation is for Window platforms only\fR.
+Creates a Windows enhanced metafile of the barchart.
+If present, \fIfileName\fR is the file name of the new metafile.
+Otherwise, the metafile is automatically added to the clipboard.
+.TP
+\fIpathName \fBpostscript \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "POSTSCRIPT COMPONENT"
+section.
+.TP
+\fIpathName \fBsnap \fIphotoName\fR
+Takes a snapshot of the graph and stores the contents in the photo
+image \fIphotoName\fR. \fIPhotoName\fR is the name of a Tk photo
+image that must already exist.
+.TP
+\fIpathName \fBtransform \fIx y\fR
+Performs a coordinate transformation, mapping graph-coordinates to
+window coordinates, using the standard X\-axis and Y\-axis.
+Returns a list containing the X\-Y screen-coordinates.
+.TP
+\fIpathName \fBxaxis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fBx2axis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fByaxis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fBy2axis \fIoperation\fR ?\fIarg\fR?...
+See the
+.SB "AXIS COMPONENTS"
+section.
+.SH "BARCHART COMPONENTS"
+A graph is composed of several components: coordinate axes, data
+elements, legend, grid, cross hairs, postscript, and annotation
+markers. Instead of one big set of configuration options and
+operations, the graph is partitioned, where each component has its own
+configuration options and operations that specifically control that
+aspect or part of the graph.
+.SS "AXIS COMPONENTS"
+Four coordinate axes are automatically created: two X\-coordinate axes
+(\f(CWx\fR and \f(CWx2\fR) and two Y\-coordinate axes (\f(CWy\fR, and
+\f(CWy2\fR). By default, the axis \f(CWx\fR is located in the bottom
+margin, \f(CWy\fR in the left margin, \f(CWx2\fR in the top margin, and
+\f(CWy2\fR in the right margin.
+.PP
+An axis consists of the axis line, title, major and minor ticks, and
+tick labels. Major ticks are drawn at uniform intervals along the
+axis. Each tick is labeled with its coordinate value. Minor ticks
+are drawn at uniform intervals within major ticks.
+.PP
+The range of the axis controls what region of data is plotted.
+Data points outside the minimum and maximum limits of the axis are
+not plotted. By default, the minimum and maximum limits are
+determined from the data, but you can reset either limit.
+.PP
+You can create and use several axes. To create an axis, invoke
+the axis component and its create operation.
+.CS
+# Create a new axis called "temperature"
+\&.b axis create temperature
+.CE
+You map data elements to an axis using the element's \-mapy and \-mapx
+configuration options. They specify the coordinate axes an element
+is mapped onto.
+.CS
+# Now map the temperature data to this axis.
+\&.b element create "temp" \-xdata $x \-ydata $tempData \\
+ \-mapy temperature
+.CE
+While you can have many axes, only four axes can be displayed
+simultaneously. They are drawn in each of the margins surrounding
+the plotting area. The axes \f(CWx\fR and \f(CWy\fR are drawn in the
+bottom and left margins. The axes \f(CWx2\fR and \f(CWy2\fR are drawn in
+top and right margins. Only \f(CWx\fR and \f(CWy\fR are shown by
+default. Note that the axes can have different scales.
+.PP
+To display a different axis, you invoke one of the following
+components: \fBxaxis\fR, \fByaxis\fR, \fBx2axis\fR, and \fBy2axis\fR.
+The \fBuse\fR operation designates the axis to be drawn in the
+corresponding margin: \fBxaxis\fR in the bottom, \fByaxis\fR in the left,
+\fBx2axis\fR in the top, and \fBy2axis\fR in the right.
+.CS
+# Display the axis temperature in the left margin.
+\&.b yaxis use temperature
+.CE
+.PP
+You can configure axes in many ways. The axis scale can be linear or
+logarithmic. The values along the axis can either monotonically
+increase or decrease. If you need custom tick labels, you can specify
+a Tcl procedure to format the label any way you wish. You can
+control how ticks are drawn, by changing the major tick interval
+or the number of minor ticks. You can define non-uniform tick intervals,
+such as for time-series plots.
+.PP
+.TP
+\fIpathName \fBaxis \fBcget \fIaxisName \fIoption\fR
+Returns the current value of the option given by \fIoption\fR for
+\fIaxisName\fR. \fIOption\fR may be any option described below
+for the axis \fBconfigure\fR operation.
+.TP
+\fIpathName \fBaxis \fBconfigure \fIaxisName \fR?\fIaxisName\fR?... ?\fIoption value\fR?...
+Queries or modifies the configuration options of \fIaxisName\fR.
+Several axes can be changed. If \fIoption\fR isn't specified, a list
+describing all the current options for \fIaxisName\fR is returned. If
+\fIoption\fR is specified, but not \fIvalue\fR, then a list describing
+\fIoption\fR is returned. If one or more \fIoption\fR and \fIvalue\fR
+pairs are specified, then for each pair, the axis option \fIoption\fR
+is set to \fIvalue\fR. The following options are valid for axes.
+.RS
+.TP
+\fB\-autorange \fIrange\fR
+Sets the range of values for the axis to \fIrange\fR. The axis limits
+are automatically reset to display the most recent data points in this range.
+If \fIrange\fR is 0.0, the range is
+determined from the limits of the data. If \fB\-min\fR or \fB-max\fR
+are specified, they override this option. The default is \f(CW0.0\fR.
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the axis and tick labels.
+The default is \f(CWblack\fR.
+.TP
+\fB\-command \fIprefix\fR
+Specifies a Tcl command to be invoked when formatting the axis tick
+labels. \fIPrefix\fR is a string containing the name of a Tcl proc and
+any extra arguments for the procedure. This command is invoked for each
+major tick on the axis. Two additional arguments are passed to the
+procedure: the pathname of the widget and the current the numeric
+value of the tick. The procedure returns the formatted tick label. If
+\f(CW""\fR is returned, no label will appear next to the tick. You can
+get the standard tick labels again by setting \fIprefix\fR to
+\f(CW""\fR. The default is \f(CW""\fR.
+.sp 1
+Please note that this procedure is invoked while the bar chart is redrawn.
+You may query the widget's configuration options. But do not reset
+options, because this can have unexpected results.
+.TP
+\fB\-descending \fIboolean\fR
+Indicates whether the values along the axis are monotonically increasing or
+decreasing. If \fIboolean\fR is true, the axis values will be
+decreasing. The default is \f(CW0\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the axis is displayed.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the axis title should be justified. This matters only
+when the axis title contains more than one line of text. \fIJustify\fR
+must be \f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-limits \fIformatStr\fR
+Specifies a printf-like description to format the minimum and maximum
+limits of the axis. The limits are displayed at the top/bottom or
+left/right sides of the plotting area. \fIFormatStr\fR is a list of
+one or two format descriptions. If one description is supplied, both
+the minimum and maximum limits are formatted in the same way. If two,
+the first designates the format for the minimum limit, the second for
+the maximum. If \f(CW""\fR is given as either description, then
+the that limit will not be displayed. The default is \f(CW""\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the axis and tick lines. The default is \f(CW1\fR
+pixel.
+.TP
+\fB\-logscale \fIboolean\fR
+Indicates whether the scale of the axis is logarithmic or linear. If
+\fIboolean\fR is true, the axis is logarithmic. The default scale is
+linear.
+.TP
+\fB\-loose \fIboolean\fR
+Indicates whether the limits of the axis should fit the data points tightly,
+at the outermost data points, or loosely, at the outer tick intervals.
+This is relevant only when the axis limit is automatically calculated.
+If \fIboolean\fR is true, the axis range is "loose".
+The default is \f(CW0\fR.
+.TP
+\fB\-majorticks \fImajorList\fR
+Specifies where to display major axis ticks. You can use this option
+to display ticks at non-uniform intervals. \fIMajorList\fR is a list
+of axis coordinates designating the location of major ticks. No
+minor ticks are drawn. If \fImajorList\fR is \f(CW""\fR,
+major ticks will be automatically computed. The default is \f(CW""\fR.
+.TP
+\fB\-max \fIvalue\fR
+Sets the maximum limit of \fIaxisName\fR. Any data point greater
+than \fIvalue\fR is not displayed. If \fIvalue\fR is \f(CW""\fR,
+the maximum limit is calculated using the largest data value.
+The default is \f(CW""\fR.
+.TP
+\fB\-min \fIvalue\fR
+Sets the minimum limit of \fIaxisName\fR. Any data point less than
+\fIvalue\fR is not displayed. If \fIvalue\fR is \f(CW""\fR,
+the minimum limit is calculated using the smallest data value.
+The default is \f(CW""\fR.
+.TP
+\fB\-minorticks \fIminorList\fR
+Specifies where to display minor axis ticks. You can use this option
+to display minor ticks at non-uniform intervals. \fIMinorList\fR is a
+list of real values, ranging from 0.0 to 1.0, designating the placement of
+a minor tick. No minor ticks are drawn if the \fB\-majortick\fR
+option is also set. If \fIminorList\fR is \f(CW""\fR, minor ticks will
+be automatically computed. The default is \f(CW""\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Specifies the how many degrees to rotate the axis tick labels.
+\fITheta\fR is a real value representing the number of degrees
+to rotate the tick labels. The default is \f(CW0.0\fR degrees.
+.TP
+\fB\-shiftby \fIvalue\fR
+Specifies how much to automatically shift the range of the axis.
+When the new data exceeds the current axis maximum, the maximum
+is increased in increments of \fIvalue\fR. You can use this
+option to prevent the axis limits from being recomputed
+at each new time point. If \fIvalue\fR is 0.0, then no automatic
+shifting is down. The default is \f(CW0.0\fR.
+.TP
+\fB\-showticks \fIboolean\fR
+Indicates whether axis ticks should be drawn. If \fIboolean\fR is
+true, ticks are drawn. If false, only the
+axis line is drawn. The default is \f(CW1\fR.
+.TP
+\fB\-stepsize \fIvalue\fR
+Specifies the interval between major axis ticks. If \fIvalue\fR isn't
+a valid interval (must be less than the axis range),
+the request is ignored and the step size is automatically calculated.
+.TP
+\fB\-subdivisions \fInumber\fR
+Indicates how many minor axis ticks are
+to be drawn. For example, if \fInumber\fR is two, only one minor
+tick is drawn. If \fInumber\fR is one, no minor ticks are
+displayed. The default is \f(CW2\fR.
+.TP
+\fB\-tickfont \fIfontName\fR
+Specifies the font for axis tick labels. The default is
+\f(CW*-Courier-Bold-R-Normal-*-100-*\fR.
+.TP
+\fB\-ticklength \fIpixels\fR
+Sets the length of major and minor ticks (minor ticks are half the
+length of major ticks). If \fIpixels\fR is less than zero, the axis
+will be inverted with ticks drawn pointing towards the plot. The
+default is \f(CW0.1i\fR.
+.TP
+\fB\-title \fItext\fR
+Sets the title of the axis. If \fItext\fR is
+\f(CW""\fR, no axis title will be displayed.
+.TP
+\fB\-titlecolor \fIcolor\fR
+Sets the color of the axis title. The default is \f(CWblack\fR.
+.TP
+\fB\-titlefont \fIfontName\fR
+Specifies the font for axis title. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-14-140-*\fR.
+.PP
+Axis configuration options may be also be set by the \fBoption\fR
+command. The resource class is \f(CWAxis\fR. The resource names
+are the names of the axes (such as \f(CWx\fR or \f(CWx2\fR).
+.CS
+option add *Barchart.Axis.Color blue
+option add *Barchart.x.LogScale true
+option add *Barchart.x2.LogScale false
+.CE
+.RE
+.TP
+\fIpathName \fBaxis \fBcreate \fIaxisName \fR?\fIoption value\fR?...
+Creates a new axis by the name \fIaxisName\fR. No axis by the same
+name can already exist. \fIOption\fR and \fIvalue\fR are described
+in above in the axis \fBconfigure\fR operation.
+.TP
+\fIpathName \fBaxis \fBdelete \fR?\fIaxisName\fR?...
+Deletes the named axes. An axis is not really
+deleted until it is not longer in use, so it's safe to delete
+axes mapped to elements.
+.TP
+\fIpathName \fBaxis invtransform \fIaxisName value\fR
+Performs the inverse transformation, changing the screen-coordinate
+\fIvalue\fR to a graph-coordinate, mapping the value mapped to
+\fIaxisName\fR. Returns the graph-coordinate.
+.TP
+\fIpathName \fBaxis limits \fIaxisName\fR
+Returns a list of the minimum and maximum limits for \fIaxisName\fR. The order
+of the list is \f(CWmin max\fR.
+.TP
+\fIpathName \fBaxis names \fR?\fIpattern\fR?...
+Returns a list of axes matching zero or more patterns. If no
+\fIpattern\fR argument is give, the names of all axes are returned.
+.TP
+\fIpathName \fBaxis transform \fIaxisName value\fR
+Transforms the coordinate \fIvalue\fR to a screen-coordinate by mapping
+the it to \fIaxisName\fR. Returns the transformed screen-coordinate.
+.PP
+Only four axes can be displayed simultaneously. By default, they are
+\f(CWx\fR, \f(CWy\fR, \f(CWx2\fR, and \f(CWy2\fR. You can swap in a different
+axis with \fBuse\fR operation of the special axis components:
+\fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, and \fBy2axis\fR.
+.CS
+\&.g create axis temp
+\&.g create axis time
+\&...
+\&.g xaxis use temp
+\&.g yaxis use time
+.CE
+Only the axes specified for use are displayed on the screen.
+.PP
+The \fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, and \fBy2axis\fR
+components operate on an axis location rather than a specific axis
+like the more general \fBaxis\fR component does. The \fBxaxis\fR
+component manages the X-axis located in the bottom margin (whatever
+axis that happens to be). Likewise, \fByaxis\fR uses the Y-axis in
+the left margin, \fBx2axis\fR the top X-axis, and \fBy2axis\fR the
+right Y-axis.
+.PP
+They implicitly control the axis that is currently using to that
+location. By default, \fBxaxis\fR uses the \f(CWx\fR axis, \fByaxis\fR
+uses \f(CWy\fR, \fBx2axis\fR uses \f(CWx2\fR, and \fBy2axis\fR uses
+\f(CWy2\fR. These components can be more convenient to use than always
+determining what axes are current being displayed by the graph.
+.PP
+The following operations are available for axes. They mirror exactly
+the operations of the \fBaxis\fR component. The \fIaxis\fR argument
+must be \fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, or \fBy2axis\fR.
+.TP
+\fIpathName \fIaxis \fBcget \fIoption\fR
+.TP
+\fIpathName \fIaxis \fBconfigure \fR?\fIoption value\fR?...
+.TP
+\fIpathName \fIaxis\fB invtransform \fIvalue\fR
+.TP
+\fIpathName \fIaxis \fBlimits\fR
+.TP
+\fIpathName \fIaxis\fB transform \fIvalue\fR
+.TP
+\fIpathName \fIaxis\fB use \fR?\fIaxisName\fR?
+Designates the axis \fIaxisName\fR is to be displayed at this
+location. \fIAxisName\fR can not be already in use at another location.
+This command returns the name of the axis currently using this location.
+.SS "CROSSHAIRS COMPONENT"
+Cross hairs consist of two intersecting lines (one vertical and one horizontal)
+drawn completely across the plotting area. They are used to position
+the mouse in relation to the coordinate axes. Cross hairs differ from line
+markers in that they are implemented using XOR drawing primitives.
+This means that they can be quickly drawn and erased without redrawing
+the entire widget.
+.PP
+The following operations are available for cross hairs:
+.TP
+\fIpathName \fBcrosshairs cget \fIoption\fR
+Returns the current value of the cross hairs configuration option
+given by \fIoption\fR. \fIOption\fR may be any option
+described below for the cross hairs \fBconfigure\fR operation.
+.TP
+\fIpathName \fBcrosshairs configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options of the cross hairs. If
+\fIoption\fR isn't specified, a list describing all the current
+options for the cross hairs is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the cross hairs option \fIoption\fR is set to
+\fIvalue\fR.
+The following options are available for cross hairs.
+.RS
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the cross hairs. The default is \f(CWblack\fR.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the cross hairs. \fIDashList\fR is a list of up
+to 11 numbers that alternately represent the lengths of the dashes
+and gaps on the cross hair lines. Each number must be between 1 and
+255. If \fIdashList\fR is \f(CW""\fR, the cross hairs will be solid
+lines.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether cross hairs are drawn. If \fIboolean\fR is true,
+cross hairs are not drawn. The default is \f(CWyes\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Set the width of the cross hair lines. The default is \f(CW1\fR.
+.TP
+\fB\-position \fIpos\fR
+Specifies the screen position where the cross hairs intersect.
+\fIPos\fR must be in the form "\fI@x,y\fR", where \fIx\fR and \fIy\fR
+are the window coordinates of the intersection.
+.PP
+Cross hairs configuration options may be also be set by the
+\fBoption\fR command. The resource name and class are
+\f(CWcrosshairs\fR and \f(CWCrosshairs\fR respectively.
+.CS
+option add *Barchart.Crosshairs.LineWidth 2
+option add *Barchart.Crosshairs.Color red
+.CE
+.RE
+.TP
+\fIpathName \fBcrosshairs off\fR
+Turns off the cross hairs.
+.TP
+\fIpathName \fBcrosshairs on\fR
+Turns on the display of the cross hairs.
+.TP
+\fIpathName \fBcrosshairs toggle\fR
+Toggles the current state of the cross hairs, alternately mapping and
+unmapping the cross hairs.
+.SH "ELEMENTS"
+A data element represents a set of data. It contains x and y vectors
+which are the coordinates of the data points. Elements are displayed
+as bars where the length of the bar is proportional to the ordinate of
+the data point. Elements also control the appearance of the data,
+such as the color, stipple, relief, etc.
+.PP
+When new data elements are created, they are automatically added to a
+list of displayed elements. The display list controls what elements
+are drawn and in what order.
+.PP
+The following operations are available for elements.
+.TP
+\fIpathName \fBelement activate \fIelemName \fR?\fIindex\fR?...
+Specifies the data points of element \fIelemName\fR to be drawn
+using active foreground and background colors. \fIElemName\fR is the
+name of the element and \fIindex\fR is a number representing the index
+of the data point. If no indices are present then all data points
+become active.
+.TP
+\fIpathName \fBelement bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for an element with this
+tag, \fIcommand\fR will be invoked. The syntax is similar to the
+\fBbind\fR command except that it operates on graph elements, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBelement cget \fIelemName \fIoption\fR
+Returns the current value of the element configuration option given by
+\fIoption\fR. \fIOption\fR may be any of the options described below
+for the element \fBconfigure\fR operation.
+.TP
+\fIpathName \fBelement closest \fIx y\fR ?\fIoption value\fR?... ?\fIelemName\fR?...
+Finds the data point representing the bar closest to the window
+coordinates \fIx\fR and \fIy\fR in the element \fIelemName\fR.
+\fIElemName\fR is the name of an element, which must be currently displayed.
+If no elements are specified, then all displayed elements are searched. It
+returns a key-value list containing the name of the closest element,
+the index of its closest point, and the graph-coordinates of the
+point. If no data point within the threshold distance can be found,
+\f(CW""\fR is returned. The following \fIoption\fR-\fIvalue\fR pairs
+are available.
+.RS
+.TP
+\fB\-halo \fIpixels\fR
+Specifies a threshold distance where selected data points are ignored.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+If this option isn't specified, then it defaults to the value of the
+\fBbarchart\fR's \fB\-halo\fR option.
+.RE
+.TP
+\fIpathName \fBelement configure \fIelemName \fR?\fIelemName\fR... ?\fIoption value\fR?...
+Queries or modifies the configuration options for elements. Several
+elements can be modified at the same time. If \fIoption\fR isn't
+specified, a list describing all the current options for
+\fIelemName\fR is returned. If \fIoption\fR is specified, but not
+\fIvalue\fR, then a list describing the option \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the element option \fIoption\fR is set
+to \fIvalue\fR. The following options are valid for elements.
+.RS
+.TP
+\fB\-activepen \fIpenName\fR
+Specifies pen to use to draw active element. If \fIpenName\fR is
+\f(CW""\fR, no active elements will be drawn. The default is
+\f(CWactiveLine\fR.
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for the element. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events for elements. Each tag in the list matching the current event
+sequence will have its Tcl command executed. Implicitly the name of
+the element is always the first tag in the list. The default value is
+\f(CWall\fR.
+.TP
+\fB\-background \fIcolor\fR
+Sets the the color of the border around each bar. The default is
+\f(CWwhite\fR.
+.TP
+\fB\-barwidth \fIvalue\fR
+Specifies the width the bars drawn for the element. \fIValue\fR is
+the width in X-coordinates. If this option isn't
+specified, the width of each bar is the value of the widget's
+\fB\-barwidth\fR option.
+.TP
+\fB\-baseline \fIvalue\fR
+Specifies the baseline of the bar segments. This affects how bars are
+drawn since bars are drawn from their respective y-coordinate the
+baseline. By default the baseline is \f(CW0.0\fR.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the border width of the 3-D border drawn around the outside of
+each bar. The \fB\-relief\fR option determines if such a border is
+drawn. \fIPixels\fR must be a valid screen distance like \f(CW2\fR or
+\f(CW0.25i\fR. The default is \f(CW2\fR.
+.TP
+\fB\-data \fIcoordList\fR
+Specifies the X\-Y coordinates of the data. \fICoordList\fR is a
+list of numeric expressions representing the X\-Y coordinate pairs
+of each data point.
+.TP
+\fB\-foreground \fIcolor\fR
+Sets the color of the interior of the bars.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the element is displayed. The default is \f(CWno\fR.
+.TP
+\fB\-label \fItext\fR
+Sets the element's label in the legend. If \fItext\fR
+is \f(CW""\fR, the element will have no entry in the legend.
+The default label is the element's name.
+.TP
+\fB\-mapx \fIxAxis\fR
+Selects the X\-axis to map the element's X\-coordinates onto.
+\fIXAxis\fR must be the name of an axis. The default is \f(CWx\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Selects the Y\-axis to map the element's Y\-coordinates onto.
+\fIYAxis\fR must be the name of an axis. The default is \f(CWy\fR.
+.TP
+\fB\-relief \fIstring\fR
+Specifies the 3-D effect desired for bars. \fIRelief\fR indicates how
+the interior of the bar should appear relative to the surface of the
+chart; for example, \f(CWraised\fR means the bar should appear to
+protrude from the surface of the plotting area. The default is
+\f(CWraised\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies a stipple pattern with which to draw the bars. If
+\fIbitmap\fR is \f(CW""\fR, then the bar is drawn in a solid fashion.
+.TP
+\fB\-xdata \fIxVector\fR
+Specifies the x-coordinate vector of the data.
+\fIXVector\fR is the name of a BLT vector or a
+list of numeric expressions.
+.TP
+\fB\-ydata \fIyVector\fR
+Specifies the y-coordinate vector of the data.
+\fIYVector\fR is the name of a BLT vector or a list of
+numeric expressions.
+.PP
+Element configuration options may also be set by the
+\fBoption\fR command. The resource names in the option database
+are prefixed by \f(CWelem\fR.
+.CS
+option add *Barchart.Element.background blue
+.CE
+.RE
+.TP
+\fIpathName \fBelement create \fIelemName\fR ?\fIoption value\fR?...
+Creates a new element \fIelemName\fR. Element
+names must be unique, so an element \fIelemName\fR may not already
+exist. If additional arguments are present, they specify any of the
+element options valid for element \fBconfigure\fR operation.
+.TP
+\fIpathName \fBelement deactivate \fIpattern\fR...
+Deactivates all the elements matching \fIpattern\fR for the graph.
+Elements whose names match any of the patterns given are redrawn
+using their normal colors.
+.TP
+\fIpathName \fBelement delete\fR ?\fIpattern\fR?...
+Deletes all the elements matching \fIpattern\fR for the graph.
+Elements whose names match any of the patterns given are deleted.
+The graph will be redrawn without the deleted elements.
+.TP
+\fIpathName \fBelement exists \fIelemName\fR
+Returns \f(CW1\fR if an element \fIelemName\fR currently exists and
+\f(CW0\fR otherwise.
+.TP
+\fIpathName \fBelement names \fR?\fIpattern\fR?...
+Returns the elements matching one or more pattern. If no
+\fIpattern\fR is given, the names of all elements is returned.
+.TP
+\fIpathName \fBelement show\fR ?\fInameList\fR?
+Queries or modifies the element display list. The element display
+list designates the elements drawn and in what
+order. \fINameList\fR is a list of elements to be displayed in the
+order they are named. If there is no \fInameList\fR argument,
+the current display list is returned.
+.TP
+\fIpathName \fBelement type\fR \fIelemName\fR
+Returns the type of \fIelemName\fR.
+If the element is a bar element, the commands returns the string
+\f(CW"bar"\fR, otherwise it returns \f(CW"line"\fR.
+.CE
+.SS "GRID COMPONENT"
+Grid lines extend from the major and minor ticks of each axis
+horizontally or vertically across the plotting area. The following
+operations are available for grid lines.
+.TP
+\fIpathName \fBgrid cget \fIoption\fR
+Returns the current value of the grid line configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described below
+for the grid \fBconfigure\fR operation.
+.TP
+\fIpathName \fBgrid configure\fR ?\fIoption value\fR?...
+Queries or modifies the configuration options for grid lines. If
+\fIoption\fR isn't specified, a list describing all the current
+grid options for \fIpathName\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the grid line option \fIoption\fR is set to
+\fIvalue\fR. The following options are valid for grid lines.
+.RS
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the grid lines. The default is \f(CWblack\fR.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the grid lines. \fIDashList\fR is a list of up
+to 11 numbers that alternately represent the lengths of the dashes
+and gaps on the grid lines. Each number must be between 1 and 255.
+If \fIdashList\fR is \f(CW""\fR, the grid will be solid lines.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the grid should be drawn. If \fIboolean\fR
+is true, grid lines are not shown. The default is \f(CWyes\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of grid lines. The default width is \f(CW1\fR.
+.TP
+\fB\-mapx \fIxAxis\fR
+Specifies the X\-axis to display grid lines. \fIXAxis\fR
+must be the name of an axis or \f(CW""\fR for no grid lines.
+The default is \f(CW""\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Specifies the Y\-axis to display grid lines. \fIYAxis\fR
+must be the name of an axis or \f(CW""\fR for no grid lines.
+The default is \f(CWy\fR.
+.TP
+\fB\-minor \fIboolean\fR
+Indicates whether the grid lines should be drawn for minor ticks.
+If \fIboolean\fR is true, the lines will appear at
+minor tick intervals. The default is \f(CW1\fR.
+.PP
+Grid configuration options may also be set by the
+\fBoption\fR command. The resource name and class are \f(CWgrid\fR and
+\f(CWGrid\fR respectively.
+.CS
+option add *Barchart.grid.LineWidth 2
+option add *Barchart.Grid.Color black
+.CE
+.RE
+.TP
+\fIpathName \fBgrid off\fR
+Turns off the display the grid lines.
+.TP
+\fIpathName \fBgrid on\fR
+Turns on the display the grid lines.
+.TP
+\fIpathName \fBgrid toggle\fR
+Toggles the display of the grid.
+.SS "LEGEND COMPONENT"
+The legend displays a list of the data elements. Each entry consists
+of the element's symbol and label. The legend can appear in any
+margin (the default location is in the right margin). It
+can also be positioned anywhere within the plotting area.
+.PP
+The following operations are valid for the legend.
+.TP
+\fIpathName \fBlegend activate \fIpattern\fR...
+Selects legend entries to be drawn using the active legend colors and relief.
+All entries whose element names match \fIpattern\fR are selected. To
+be selected, the element name must match only one \fIpattern\fR.
+.TP
+\fIpathName \fBlegend bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for a legend entry with this
+tag, \fIcommand\fR will be invoked. Implicitly the element names
+in the entry are tags. The syntax is similar to the
+\fBbind\fR command except that it operates on legend entries, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBlegend cget \fIoption\fR
+Returns the current value of a legend configuration option.
+\fIOption\fR may be any option described below in the
+legend \fBconfigure\fR operation.
+.TP
+\fIpathName \fBlegend configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options for the legend. If
+\fIoption\fR isn't specified, a list describing the current
+legend options for \fIpathName\fR is returned. If \fIoption\fR is
+specified, but not \fIvalue\fR, then a list describing \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the legend option \fIoption\fR is set
+to \fIvalue\fR. The following options are valid for the legend.
+.RS
+.TP
+\fB\-activebackground \fIcolor\fR
+Sets the background color for active legend entries. All legend
+entries marked active (see the legend \fBactivate\fR operation) are
+drawn using this background color.
+.TP
+\fB\-activeborderwidth \fIpixels\fR
+Sets the width of the 3-D border around the outside edge of the active legend
+entries. The default is \f(CW2\fR.
+.TP
+\fB\-activeforeground \fIcolor\fR
+Sets the foreground color for active legend entries. All legend
+entries marked as active (see the legend \fBactivate\fR operation) are
+drawn using this foreground color.
+.TP
+\fB\-activerelief \fIrelief\fR
+Specifies the 3-D effect desired for active legend entries.
+\fIRelief\fR denotes how the interior of the entry should appear
+relative to the legend; for example, \f(CWraised\fR means the entry
+should appear to protrude from the legend, relative to the surface of
+the legend. The default is \f(CWflat\fR.
+.TP
+\fB\-anchor \fIanchor\fR
+Tells how to position the legend relative to the positioning point for
+the legend. This is dependent on the value of the \fB\-position\fR
+option. The default is \f(CWcenter\fR.
+.RS
+.TP 1.25i
+\f(CWleft\fR or \f(CWright\fR
+The anchor describes how to position the legend vertically.
+.TP
+\f(CWtop\fR or \f(CWbottom\fR
+The anchor describes how to position the legend horizontally.
+.TP
+\f(CW@x,y\fR
+The anchor specifies how to position the legend relative to the
+positioning point. For example, if \fIanchor\fR is \f(CWcenter\fR then
+the legend is centered on the point; if \fIanchor\fR is \f(CWn\fR then
+the legend will be drawn such that the top center point of the
+rectangular region occupied by the legend will be at the positioning
+point.
+.TP
+\f(CWplotarea\fR
+The anchor specifies how to position the legend relative to the
+plotting area. For example, if \fIanchor\fR is \f(CWcenter\fR then the
+legend is centered in the plotting area; if \fIanchor\fR is \f(CWne\fR
+then the legend will be drawn such that occupies the upper right
+corner of the plotting area.
+.RE
+.TP
+\fB\-background \fIcolor\fR
+Sets the background color of the legend. If \fIcolor\fR is \f(CW""\fR,
+the legend background with be transparent.
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for legend entries. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events for legend entries. Each tag in the list matching the current
+event sequence will have its Tcl command executed. The default value
+is \f(CWall\fR.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the width of the 3-D border around the outside edge of the legend (if
+such border is being drawn; the \fBrelief\fR option determines this).
+The default is \f(CW2\fR pixels.
+.TP
+\fB\-font \fIfontName\fR
+\fIFontName\fR specifies a font to use when drawing the labels of each
+element into the legend. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-12-120-*\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Sets the foreground color of the text drawn for the element's label.
+The default is \f(CWblack\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the legend should be displayed. If \fIboolean\fR is
+true, the legend will not be draw. The default is \f(CWno\fR.
+.TP
+\fB\-ipadx \fIpad\fR
+Sets the amount of internal padding to be added to the width of each
+legend entry. \fIPad\fR can be a list of one or two screen distances. If
+\fIpad\fR has two elements, the left side of the legend entry is
+padded by the first distance and the right side by the second. If
+\fIpad\fR is just one distance, both the left and right sides are padded
+evenly. The default is \f(CW2\fR.
+.TP
+\fB\-ipady \fIpad\fR
+Sets an amount of internal padding to be added to the height of each
+legend entry. \fIPad\fR can be a list of one or two screen distances. If
+\fIpad\fR has two elements, the top of the entry is padded by the
+first distance and the bottom by the second. If \fIpad\fR is just
+one distance, both the top and bottom of the entry are padded evenly.
+The default is \f(CW2\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the padding to the left and right exteriors of the legend.
+\fIPad\fR can be a list of one or two screen distances. If \fIpad\fR
+has two elements, the left side of the legend is padded by the first
+distance and the right side by the second. If \fIpad\fR has just one
+distance, both the left and right sides are padded evenly. The
+default is \f(CW4\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the padding above and below the legend. \fIPad\fR can be a list
+of one or two screen distances. If \fIpad\fR has two elements, the area above
+the legend is padded by the first distance and the area below by the
+second. If \fIpad\fR is just one distance, both the top and
+bottom areas are padded evenly. The default is \f(CW0\fR.
+.TP
+\fB\-position \fIpos\fR
+Specifies where the legend is drawn. The
+\fB\-anchor\fR option also affects where the legend is positioned. If
+\fIpos\fR is \f(CWleft\fR, \f(CWleft\fR, \f(CWtop\fR, or \f(CWbottom\fR, the
+legend is drawn in the specified margin. If \fIpos\fR is
+\f(CWplotarea\fR, then the legend is drawn inside the plotting area at a
+particular anchor. If \fIpos\fR is in the form "\fI@x,y\fR", where
+\fIx\fR and \fIy\fR are the window coordinates, the legend is drawn in
+the plotting area at the specified coordinates. The default is
+\f(CWright\fR.
+.TP
+\fB\-raised \fIboolean\fR
+Indicates whether the legend is above or below the data elements. This
+matters only if the legend is in the plotting area. If \fIboolean\fR
+is true, the legend will be drawn on top of any elements that may
+overlap it. The default is \f(CWno\fR.
+.TP
+\fB\-relief \fIrelief\fR
+Specifies the 3-D effect for the border around the legend.
+\fIRelief\fR specifies how the interior of the legend should appear
+relative to the bar chart; for example, \f(CWraised\fR means the legend
+should appear to protrude from the bar chart, relative to the surface of
+the bar chart. The default is \f(CWsunken\fR.
+.PP
+Legend configuration options may also be set by the \fBoption\fR
+command. The resource name and class are \f(CWlegend\fR and
+\f(CWLegend\fR respectively.
+.CS
+option add *Barchart.legend.Foreground blue
+option add *Barchart.Legend.Relief raised
+.CE
+.RE
+.TP
+\fIpathName \fBlegend deactivate \fIpattern\fR...
+Selects legend entries to be drawn using the normal legend colors and
+relief. All entries whose element names match \fIpattern\fR are
+selected. To be selected, the element name must match only one
+\fIpattern\fR.
+.TP
+\fIpathName \fBlegend get \fIpos\fR
+Returns the name of the element whose entry is at the screen position
+\fIpos\fR in the legend. \fIPos\fR must be in the form "\fI@x,y\fR",
+where \fIx\fR and \fIy\fR are window coordinates. If the given
+coordinates do not lie over a legend entry, \f(CW""\fR is returned.
+.SS "PEN COMPONENTS"
+Pens define attributes for elements.
+Pens mirror the configuration options of data elements that pertain to
+how symbols and lines are drawn. Data elements use pens to determine
+how they are drawn. A data element may use several pens at once. In
+this case, the pen used for a particular data point is determined from
+each element's weight vector (see the element's \fB\-weight\fR and
+\fB\-style\fR options).
+.PP
+One pen, called \f(CWactiveBar\fR, is automatically created.
+It's used as the default active pen for elements. So you can change
+the active attributes for all elements by simply reconfiguring this
+pen.
+.CS
+\&.g pen configure "activeBar" -fg green -bg green4
+.CE
+You can create and use several pens. To create a pen, invoke
+the pen component and its create operation.
+.CS
+\&.g pen create myPen
+.CE
+You map pens to a data element using either the element's
+\fB\-pen\fR or \fB\-activepen\fR options.
+.CS
+\&.g element create "e1" -xdata $x -ydata $tempData \\
+ -pen myPen
+.CE
+An element can use several pens at once. This is done by specifying
+the name of the pen in the element's style list (see the
+\fB\-styles\fR option).
+.CS
+\&.g element configure "e1" -styles { myPen 2.0 3.0 }
+.CE
+This says that any data point with a weight between 2.0 and 3.0
+is to be drawn using the pen \f(CWmyPen\fR. All other points
+are drawn with the element's default attributes.
+.PP
+The following operations are available for pen components.
+.PP
+.TP
+\fIpathName \fBpen \fBcget \fIpenName \fIoption\fR
+Returns the current value of the option given by \fIoption\fR for
+\fIpenName\fR. \fIOption\fR may be any option described below
+for the pen \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpen \fBconfigure \fIpenName \fR?\fIpenName\fR... ?\fIoption value\fR?...
+Queries or modifies the configuration options of
+\fIpenName\fR. Several pens can be modified at once. If \fIoption\fR
+isn't specified, a list describing the current options for
+\fIpenName\fR is returned. If \fIoption\fR is specified, but not
+\fIvalue\fR, then a list describing \fIoption\fR is returned. If one
+or more \fIoption\fR and \fIvalue\fR pairs are specified, then for
+each pair, the pen option \fIoption\fR is set to \fIvalue\fR. The
+following options are valid for pens.
+.RS
+.TP
+\fB\-background \fIcolor\fR
+Sets the the color of the border around each bar. The default is
+\f(CWwhite\fR.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the border width of the 3-D border drawn around the outside of
+each bar. The \fB\-relief\fR option determines if such a border is
+drawn. \fIPixels\fR must be a valid screen distance like \f(CW2\fR or
+\f(CW0.25i\fR. The default is \f(CW2\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Sets the color of the interior of the bars.
+.TP
+\fB\-relief \fIstring\fR
+Specifies the 3-D effect desired for bars. \fIRelief\fR indicates how
+the interior of the bar should appear relative to the surface of the
+chart; for example, \f(CWraised\fR means the bar should appear to
+protrude from the bar chart, relative to the surface of the plotting
+area. The default is \f(CWraised\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies a stipple pattern with which to draw the bars. If
+\fIbitmap\fR is \f(CW""\fR, then the bar is drawn in a solid fashion.
+.TP
+\fB\-type \fIelemType\fR
+Specifies the type of element the pen is to be used with.
+This option should only be employed when creating the pen. This
+is for those that wish to mix different types of elements (bars and
+lines) on the same graph. The default type is "bar".
+.PP
+Pen configuration options may be also be set by the \fBoption\fR
+command. The resource class is \f(CWPen\fR. The resource names
+are the names of the pens.
+.CS
+option add *Barchart.Pen.Foreground blue
+option add *Barchart.activeBar.foreground green
+.CE
+.RE
+.TP
+\fIpathName \fBpen \fBcreate \fIpenName \fR?\fIoption value\fR?...
+Creates a new pen by the name \fIpenName\fR. No pen by the same
+name can already exist. \fIOption\fR and \fIvalue\fR are described
+in above in the pen \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpen \fBdelete \fR?\fIpenName\fR?...
+Deletes the named pens. A pen is not really
+deleted until it is not longer in use, so it's safe to delete
+pens mapped to elements.
+.TP
+\fIpathName \fBpen names \fR?\fIpattern\fR?...
+Returns a list of pens matching zero or more patterns. If no
+\fIpattern\fR argument is give, the names of all pens are returned.
+.SS "POSTSCRIPT COMPONENT"
+The barchart can generate encapsulated PostScript output. There
+are several configuration options you can specify to control how the
+plot will be generated. You can change the page dimensions and
+borders. The plot itself can be scaled, centered, or rotated to
+landscape. The PostScript output can be written directly to a file or
+returned through the interpreter.
+.PP
+The following postscript operations are available.
+.TP
+\fIpathName \fBpostscript cget \fIoption\fR
+Returns the current value of the postscript option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below for the postscript \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpostscript configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options for PostScript
+generation. If \fIoption\fR isn't specified, a list describing
+the current postscript options for \fIpathName\fR is returned. If
+\fIoption\fR is specified, but not \fIvalue\fR, then a list describing
+\fIoption\fR is returned. If one or more \fIoption\fR and \fIvalue\fR
+pairs are specified, then for each pair, the postscript option
+\fIoption\fR is set to \fIvalue\fR. The following postscript options
+are available.
+.RS
+.TP
+\fB\-center \fIboolean\fR
+Indicates whether the plot should be centered on the PostScript page. If
+\fIboolean\fR is false, the plot will be placed in the upper left
+corner of the page. The default is \f(CW1\fR.
+.TP
+\fB\-colormap \fIvarName\fR
+\fIVarName\fR must be the name of a global array variable that
+specifies a color mapping from the X color name to PostScript. Each
+element of \fIvarName\fR must consist of PostScript code to set a
+particular color value (e.g. ``\f(CW1.0 1.0 0.0 setrgbcolor\fR''). When
+generating color information in PostScript, the array variable \fIvarName\fR
+is checked if an element of the name as the color exists. If so, it uses
+its value as the PostScript
+command to set the color. If this option hasn't been specified, or if
+there isn't an entry in \fIvarName\fR for a given color, then it uses
+the red, green, and blue intensities from the X color.
+.TP
+\fB\-colormode \fImode\fR
+Specifies how to output color information. \fIMode\fR must be either
+\f(CWcolor\fR (for full color output), \f(CWgray\fR (convert all colors to
+their gray-scale equivalents) or \f(CWmono\fR (convert foreground colors
+to black and background colors to white). The default mode is
+\f(CWcolor\fR.
+.TP
+\fB\-fontmap \fIvarName\fR
+\fIVarName\fR must be the name of a global array variable that
+specifies a font mapping from the X font name to PostScript. Each
+element of \fIvarName\fR must consist of a Tcl list with one or two
+elements; the name and point size of a PostScript font.
+When outputting PostScript commands for a particular font, the array
+variable \fIvarName\fR is checked to see if an element by the
+specified font exists. If there is such an element, then the font
+information contained in that element is used in the PostScript
+output. (If the point size is omitted from the list, the point size
+of the X font is used). Otherwise the X font is examined in an
+attempt to guess what PostScript font to use. This works only for
+fonts whose foundry property is \fIAdobe\fR (such as Times, Helvetica,
+Courier, etc.). If all of this fails then the font defaults to
+\f(CWHelvetica-Bold\fR.
+.TP
+\fB\-decorations \fIboolean\fR
+Indicates whether PostScript commands to generate color backgrounds and 3-D
+borders will be output. If \fIboolean\fR is false, the graph will
+background will be white and no 3-D borders will be generated. The
+default is \f(CW1\fR.
+.TP
+\fB\-height \fIpixels\fR
+Sets the height of the plot. This lets you print the bar chart with a
+height different from the one drawn on the screen. If
+\fIpixels\fR is 0, the height is the same as the widget's height.
+The default is \f(CW0\fR.
+.TP
+\fB\-landscape \fIboolean\fR
+If \fIboolean\fR is true, this specifies the printed area is to be
+rotated 90 degrees. In non-rotated output the X\-axis of the printed
+area runs along the short dimension of the page (``portrait''
+orientation); in rotated output the X\-axis runs along the long
+dimension of the page (``landscape'' orientation). Defaults to
+\f(CW0\fR.
+.TP
+\fB\-maxpect \fIboolean\fR
+Indicates to scale the plot so that it fills the PostScript page.
+The aspect ratio of the barchart is still retained. The default is
+\f(CW0\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the horizontal padding for the left and right page borders. The
+borders are exterior to the plot. \fIPad\fR can be a list of one or
+two screen distances. If \fIpad\fR has two elements, the left border is padded
+by the first distance and the right border by the second. If
+\fIpad\fR has just one distance, both the left and right borders are
+padded evenly. The default is \f(CW1i\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the vertical padding for the top and bottom page borders. The
+borders are exterior to the plot. \fIPad\fR can be a list of one or
+two screen distances. If \fIpad\fR has two elements, the top border is padded
+by the first distance and the bottom border by the second. If
+\fIpad\fR has just one distance, both the top and bottom borders are
+padded evenly. The default is \f(CW1i\fR.
+.TP
+\fB\-paperheight \fIpixels\fR
+Sets the height of the postscript page. This can be used to select
+between different page sizes (letter, A4, etc). The default height is
+\f(CW11.0i\fR.
+.TP
+\fB\-paperwidth \fIpixels\fR
+Sets the width of the postscript page. This can be used to select
+between different page sizes (letter, A4, etc). The default width is
+\f(CW8.5i\fR.
+.TP
+\fB\-width \fIpixels\fR
+Sets the width of the plot. This lets you generate a plot
+of a width different from that of the widget. If \fIpixels\fR
+is 0, the width is the same as the widget's width. The default is
+\f(CW0\fR.
+.PP
+Postscript configuration options may be also be set by the
+\fBoption\fR command. The resource name and class are
+\f(CWpostscript\fR and \f(CWPostscript\fR respectively.
+.CS
+option add *Barchart.postscript.Decorations false
+option add *Barchart.Postscript.Landscape true
+.CE
+.RE
+.TP
+\fIpathName \fBpostscript output \fR?\fIfileName\fR? ?\fIoption value\fR?...
+Outputs a file of encapsulated PostScript. If a
+\fIfileName\fR argument isn't present, the command returns the
+PostScript. If any \fIoption-value\fR pairs are present, they set
+configuration options controlling how the PostScript is generated.
+\fIOption\fR and \fIvalue\fR can be anything accepted by the
+postscript \fBconfigure\fR operation above.
+.SS "MARKER COMPONENTS"
+Markers are simple drawing procedures used to annotate or highlight
+areas of the graph. Markers have various types: text strings,
+bitmaps, images, connected lines, windows, or polygons. They can be
+associated with a particular element, so that when the element is
+hidden or un-hidden, so is the marker. By default, markers are the
+last items drawn, so that data elements will appear in
+behind them. You can change this by configuring the \fB\-under\fR
+option.
+.PP
+Markers, in contrast to elements, don't affect the scaling of the
+coordinate axes. They can also have \fIelastic\fR coordinates
+(specified by \f(CW-Inf\fR and \f(CWInf\fR respectively) that translate
+into the minimum or maximum limit of the axis. For example, you can
+place a marker so it always remains in the lower left corner of the
+plotting area, by using the coordinates \f(CW-Inf\fR,\f(CW-Inf\fR.
+.PP
+The following operations are available for markers.
+.TP
+\fIpathName \fBmarker after \fImarkerId\fR ?\fIafterId\fR?
+Changes the order of the markers, drawing the first
+marker after the second. If no second \fIafterId\fR argument is
+specified, the marker is placed at the end of the display list. This
+command can be used to control how markers are displayed since markers
+are drawn in the order of this display list.
+.TP
+\fIpathName \fBmarker before \fImarkerId\fR ?\fIbeforeId\fR?
+Changes the order of the markers, drawing the first
+marker before the second. If no second \fIbeforeId\fR argument is
+specified, the marker is placed at the beginning of the display list.
+This command can be used to control how markers are displayed since
+markers are drawn in the order of this display list.
+.TP
+\fIpathName \fBmarker bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for a marker with this
+tag, \fIcommand\fR will be invoked. The syntax is similar to the
+\fBbind\fR command except that it operates on graph markers, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBmarker cget \fIoption\fR
+Returns the current value of the marker configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below in the \fBconfigure\fR operation.
+.TP
+\fIpathName \fBmarker configure \fImarkerId\fR ?\fIoption value\fR?...
+Queries or modifies the configuration options for markers. If
+\fIoption\fR isn't specified, a list describing the current
+options for \fImarkerId\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the marker option \fIoption\fR is set to \fIvalue\fR.
+.sp
+The following options are valid for all markers.
+Each type of marker also has its own type-specific options.
+They are described in the sections below.
+.RS
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for the marker. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events for markers are handled. Each tag in the list matching the
+current event sequence will have its Tcl command executed. Implicitly
+the name of the marker is always the first tag in the list.
+The default value is \f(CWall\fR.
+.TP
+\fB\-coords \fIcoordList\fR
+Specifies the coordinates of the marker. \fICoordList\fR is
+a list of graph-coordinates. The number of coordinates required
+is dependent on the type of marker. Text, image, and window markers
+need only two coordinates (an X\-Y coordinate). Bitmap markers
+can take either two or four coordinates (if four, they represent the
+corners of the bitmap). Line markers
+need at least four coordinates, polygons at least six.
+If \fIcoordList\fR is \f(CW""\fR, the marker will not be displayed.
+The default is \f(CW""\fR.
+.TP
+\fB\-element \fIelemName\fR
+Links the marker with the element \fIelemName\fR. The marker is
+drawn only if the element is also currently displayed (see the
+element's \fBshow\fR operation). If \fIelemName\fR is \f(CW""\fR, the
+marker is always drawn. The default is \f(CW""\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the marker is drawn. If \fIboolean\fR is true,
+the marker is not drawn. The default is \f(CWno\fR.
+.TP
+\fB\-mapx \fIxAxis\fR
+Specifies the X\-axis to map the marker's X\-coordinates onto.
+\fIXAxis\fR must the name of an axis. The default is \f(CWx\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Specifies the Y\-axis to map the marker's Y\-coordinates onto.
+\fIYAxis\fR must the name of an axis. The default is \f(CWy\fR.
+.TP
+\fB\-name \fImarkerId\fR
+Changes the identifier for the marker. The identifier \fImarkerId\fR
+can not already be used by another marker. If this option
+isn't specified, the marker's name is uniquely generated.
+.TP
+\fB\-under \fIboolean\fR
+Indicates whether the marker is drawn below/above data
+elements. If \fIboolean\fR is true, the marker is be drawn
+underneath the data elements. Otherwise, the marker is
+drawn on top of the element. The default is \f(CW0\fR.
+.TP
+\fB\-xoffset \fIpixels\fR
+Specifies a screen distance to offset the marker horizontally.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+The default is \f(CW0\fR.
+.TP
+\fB\-yoffset \fIpixels\fR
+Specifies a screen distance to offset the markers vertically.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+The default is \f(CW0\fR.
+.PP
+Marker configuration options may also be set by the \fBoption\fR command.
+The resource class is either \f(CWBitmapMarker\fR, \f(CWImageMarker\fR,
+\f(CWLineMarker\fR, \f(CWPolygonMarker\fR, \f(CWTextMarker\fR, or \f(CWWindowMarker\fR,
+depending on the type of marker. The resource name is the name of the
+marker.
+.CS
+option add *Barchart.TextMarker.Foreground white
+option add *Barchart.BitmapMarker.Foreground white
+option add *Barchart.m1.Background blue
+.CE
+.RE
+.TP
+\fIpathName \fBmarker create \fItype\fR ?\fIoption value\fR?...
+Creates a marker of the selected type. \fIType\fR may be either
+\f(CWtext\fR, \f(CWline\fR, \f(CWbitmap\fR, \f(CWimage\fR, \f(CWpolygon\fR, or
+\f(CWwindow\fR. This command returns the marker identifier,
+used as the \fImarkerId\fR argument in the other marker-related
+commands. If the \fB\-name\fR option is used, this overrides the
+normal marker identifier. If the name provided is already used for
+another marker, the new marker will replace the old.
+.TP
+\fIpathName \fBmarker delete\fR ?\fIname\fR?...
+Removes one of more markers. The graph will automatically be redrawn
+without the marker.\fR.
+.TP
+\fIpathName \fBmarker exists \fImarkerId\fR
+Returns \f(CW1\fR if the marker \fImarkerId\fR exists and \f(CW0\fR
+otherwise.
+.TP
+\fIpathName \fBmarker names\fR ?\fIpattern\fR?
+Returns the names of all the markers that currently exist. If
+\fIpattern\fR is supplied, only those markers whose names match it
+will be returned.
+.TP
+\fIpathName \fBmarker type \fImarkerId\fR
+Returns the type of the marker given by \fImarkerId\fR, such as
+\f(CWline\fR or \f(CWtext\fR. If \fImarkerId\fR is not a valid a marker
+identifier, \f(CW""\fR is returned.
+.SS "BITMAP MARKERS"
+A bitmap marker displays a bitmap. The size of the
+bitmap is controlled by the number of coordinates specified. If two
+coordinates, they specify the position of the top-left corner of the
+bitmap. The bitmap retains its normal width and height. If four
+coordinates, the first and second pairs of coordinates represent the
+corners of the bitmap. The bitmap will be stretched or reduced as
+necessary to fit into the bounding rectangle.
+.PP
+Bitmap markers are created with the marker's \fBcreate\fR operation in
+the form:
+.DS
+\fIpathName \fBmarker create bitmap \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR pairs, each
+sets a configuration options for the marker. These
+same \fIoption\fR\-\fIvalue\fR pairs may be used with the marker's
+\fBconfigure\fR operation.
+.PP
+The following options are specific to bitmap markers:
+.TP
+\fB\-background \fIcolor\fR
+Same as the \fB\-fill\fR option.
+.TP
+\fB\-bitmap \fIbitmap\fR
+Specifies the bitmap to be displayed. If \fIbitmap\fR is \f(CW""\fR,
+the marker will not be displayed. The default is \f(CW""\fR.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the bitmap. If \fIcolor\fR is the empty
+string, no background will be transparent. The default background color is
+\f(CW""\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Same as the \fB\-outline\fR option.
+.TP
+\fB\-mask \fImask\fR
+Specifies a mask for the bitmap to be displayed. This mask is a bitmap
+itself, denoting the pixels that are transparent. If \fImask\fR is
+\f(CW""\fR, all pixels of the bitmap will be drawn. The default is
+\f(CW""\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the foreground color of the bitmap. The default value is \f(CWblack\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Sets the rotation of the bitmap. \fITheta\fR is a real number
+representing the angle of rotation in degrees. The marker is first
+rotated and then placed according to its anchor position. The default
+rotation is \f(CW0.0\fR.
+.SS "IMAGE MARKERS"
+A image marker displays an image. Image markers are
+created with the marker's \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create image \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to image markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the image relative to the
+positioning point for the image. For example, if \fIanchor\fR
+is \f(CWcenter\fR then the image is centered on the point; if
+\fIanchor\fR is \f(CWn\fR then the image will be drawn such that
+the top center point of the rectangular region occupied by the
+image will be at the positioning point.
+This option defaults to \f(CWcenter\fR.
+.TP
+\fB\-image \fIimage\fR
+Specifies the image to be drawn.
+If \fIimage\fR is \f(CW""\fR, the marker will not be
+drawn. The default is \f(CW""\fR.
+.SS "LINE MARKERS"
+A line marker displays one or more connected line segments.
+Line markers are created with marker's \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create line \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to line markers:
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the line. \fIDashList\fR is a list of up to 11
+numbers that alternately represent the lengths of the dashes and gaps
+on the line. Each number must be between 1 and 255. If
+\fIdashList\fR is \f(CW""\fR, the marker line will be solid.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the line. This color is used with
+striped lines (see the \fB\-fdashes\R option). If \fIcolor\fR is
+the empty string, no background color is drawn (the line will be
+dashed, not striped). The default background color is \f(CW""\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the lines.
+The default width is \f(CW0\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the foreground color of the line. The default value is \f(CWblack\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies a stipple pattern used to draw the line, rather than
+a solid line.
+\fIBitmap\fR specifies a bitmap to use as the stipple
+pattern. If \fIbitmap\fR is \f(CW""\fR, then the
+line is drawn in a solid fashion. The default is \f(CW""\fR.
+.SS "POLYGON MARKERS"
+A polygon marker displays a closed region described as two or more
+connected line segments. It is assumed the first and
+last points are connected. Polygon markers are created using the
+marker \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create polygon \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the \fBmarker configure\fR command to change the marker's
+configuration.
+The following options are supported for polygon markers:
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the outline of the polygon. \fIDashList\fR is a
+list of up to 11 numbers that alternately represent the lengths of
+the dashes and gaps on the outline. Each number must be between 1 and
+255. If \fIdashList\fR is \f(CW""\fR, the outline will be a solid line.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the fill color of the polygon. If \fIcolor\fR is \f(CW""\fR, then
+the interior of the polygon is transparent.
+The default is \f(CWwhite\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the outline of the polygon. If \fIpixels\fR is zero,
+no outline is drawn. The default is \f(CW0\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color of the outline of the polygon. If the polygon is
+stippled (see the \fB\-stipple\fR option), then this represents the
+foreground color of the stipple. The default is \f(CWblack\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies that the polygon should be drawn with a stippled pattern
+rather than a solid color. \fIBitmap\fR specifies a bitmap to use as
+the stipple pattern. If \fIbitmap\fR is \f(CW""\fR, then the polygon is
+filled with a solid color (if the \fB\-fill\fR option is set). The
+default is \f(CW""\fR.
+.SS "TEXT MARKERS"
+A text marker displays a string of characters on one or more lines of
+text. Embedded newlines cause line breaks. They may be used to
+annotate regions of the graph. Text markers are created with the
+\fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create text \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR pairs,
+each sets a configuration option for the text marker.
+These same \fIoption\fR\-\fIvalue\fR pairs may be used with the
+marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to text markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the text relative to the
+positioning point for the text. For example, if \fIanchor\fR is
+\f(CWcenter\fR then the text is centered on the point; if
+\fIanchor\fR is \f(CWn\fR then the text will be drawn such that the
+top center point of the rectangular region occupied by the text will
+be at the positioning point. This default is \f(CWcenter\fR.
+.TP
+\fB\-background \fIcolor\fR
+Same as the \fB\-fill\fR option.
+.TP
+\fB\-font \fIfontName\fR
+Specifies the font of the text. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-120-*\fR.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the text. If \fIcolor\fR is the empty
+string, no background will be transparent. The default background color is
+\f(CW""\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Same as the \fB\-outline\fR option.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the text should be justified. This matters only when
+the marker contains more than one line of text. \fIJustify\fR must be
+\f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color of the text. The default value is \f(CWblack\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the padding to the left and right exteriors of the text.
+\fIPad\fR can be a list of one or two screen distances. If \fIpad\fR
+has two elements, the left side of the text is padded by the first
+distance and the right side by the second. If \fIpad\fR has just one
+distance, both the left and right sides are padded evenly. The
+default is \f(CW4\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the padding above and below the text. \fIPad\fR can be a list of
+one or two screen distances. If \fIpad\fR has two elements, the area above the
+text is padded by the first distance and the area below by the second.
+If \fIpad\fR is just one distance, both the top and bottom areas
+are padded evenly. The default is \f(CW4\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Specifies the number of degrees to rotate the text. \fITheta\fR is a
+real number representing the angle of rotation. The marker is first
+rotated along its center and is then drawn according to its anchor
+position. The default is \f(CW0.0\fR.
+.TP
+\fB\-text \fItext\fR
+Specifies the text of the marker. The exact way the text is
+displayed may be affected by other options such as \fB\-anchor\fR or
+\fB\-rotate\fR.
+.SS "WINDOW MARKERS"
+A window marker displays a widget at a given position.
+Window markers are created with the marker's \fBcreate\fR operation in
+the form:
+.DS
+\fIpathName \fBmarker create window \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR command.
+.PP
+The following options are specific to window markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the widget relative to the
+positioning point for the widget. For example, if \fIanchor\fR is
+\f(CWcenter\fR then the widget is centered on the point; if \fIanchor\fR
+is \f(CWn\fR then the widget will be displayed such that the top center
+point of the rectangular region occupied by the widget will be at the
+positioning point. This option defaults to \f(CWcenter\fR.
+.TP
+\fB\-height \fIpixels\fR
+Specifies the height to assign to the marker's window. If this option
+isn't specified, or if it is specified as \f(CW""\fR, then the window is
+given whatever height the widget requests internally.
+.TP
+\fB\-width \fIpixels\fR
+Specifies the width to assign to the marker's window. If this option
+isn't specified, or if it is specified as \f(CW""\fR, then the window is
+given whatever width the widget requests internally.
+.TP
+\fB\-window \fIpathName\fR
+Specifies the widget to be managed by the barchart. \fIPathName\fR must
+be a child of the \fBbarchart\fR widget.
+.SH "GRAPH COMPONENT BINDINGS"
+Specific barchart components, such as elements, markers and legend
+entries, can have a command trigger when event occurs in them, much
+like canvas items in Tk's canvas widget. Not all event sequences are
+valid. The only binding events that may be specified are those
+related to the mouse and keyboard (such as \fBEnter\fR, \fBLeave\fR,
+\fBButtonPress\fR, \fBMotion\fR, and \fBKeyPress\fR).
+.PP
+Only one element or marker can be picked during an event. This means,
+that if the mouse is directly over both an element and a marker, only
+the uppermost component is selected. This isn't true for legend entries.
+Both a legend entry and an element (or marker) binding commands
+will be invoked if both items are picked.
+.PP
+It is possible for multiple bindings to match a particular event.
+This could occur, for example, if one binding is associated with the
+element name and another is associated with one of the element's tags
+(see the \fB\-bindtags\fR option). When this occurs, all of the
+matching bindings are invoked. A binding associated with the element
+name is invoked first, followed by one binding for each of the element's
+bindtags. If there are multiple matching bindings for a single tag,
+then only the most specific binding is invoked. A continue command
+in a binding script terminates that script, and a break command
+terminates that script and skips any remaining scripts for the event,
+just as for the bind command.
+.PP
+The \fB\-bindtags\fR option for these components controls addition
+tag names which can be matched. Implicitly elements and markers
+always have tags matching their names. Setting the value of
+the \fB\-bindtags\fR option doesn't change this.
+.SH "C LANGUAGE API"
+You can manipulate data elements from the C language. There
+may be situations where it is too expensive to translate the data
+values from ASCII strings. Or you might want to read data in a
+special file format.
+.PP
+Data can manipulated from the C language using BLT vectors.
+You specify the X-Y data coordinates of an element as vectors and
+manipulate the vector from C. The barchart will be redrawn automatically
+after the vectors are updated.
+.PP
+From Tcl, create the vectors and configure the element to use them.
+.CS
+vector X Y
+\&.g element configure line1 -xdata X -ydata Y
+.CE
+To set data points from C, you pass the values as arrays of doubles
+using the \fBBlt_ResetVector\fR call. The vector is reset with the
+new data and at the next idle point (when Tk re-enters its event
+loop), the graph will be redrawn automatically.
+.CS
+#include <tcl.h>
+#include <blt.h>
+
+register int i;
+Blt_Vector *xVec, *yVec;
+double x[50], y[50];
+
+/* Get the BLT vectors "X" and "Y" (created above from Tcl) */
+if ((Blt_GetVector(interp, "X", 50, &xVec) != TCL_OK) ||
+ (Blt_GetVector(interp, "Y", 50, &yVec) != TCL_OK)) {
+ return TCL_ERROR;
+}
+
+for (i = 0; i < 50; i++) {
+ x[i] = i * 0.02;
+ y[i] = sin(x[i]);
+}
+
+/* Put the data into BLT vectors */
+if ((Blt_ResetVector(xVec, x, 50, 50, TCL_VOLATILE) != TCL_OK) ||
+ (Blt_ResetVector(yVec, y, 50, 50, TCL_VOLATILE) != TCL_OK)) {
+ return TCL_ERROR;
+}
+.CE
+See the \fBvector\fR manual page for more details.
+.SH SPEED TIPS
+There may be cases where the bar chart needs to be drawn and updated as
+quickly as possible. If drawing speed becomes a big
+problem, here are a few tips to speed up displays.
+.TP 2
+\(bu
+Try to minimize the number of data points. The more data points
+looked at, the more work the bar chart must do.
+.TP 2
+\(bu
+If your data is generated as floating point values, the time required
+to convert the data values to and from ASCII strings can be
+significant, especially when there any many data points. You can
+avoid the redundant string-to-decimal conversions using the C API to
+BLT vectors.
+.TP 2
+\(bu
+Don't stipple or dash the element. Solid bars are much faster.
+.TP 2
+\(bu
+If you update data elements frequently, try turning off the
+widget's \fB\-bufferelements\fR option. When the bar chart is first
+displayed, it draws data elements into an internal pixmap. The pixmap
+acts as a cache, so that when the bar chart needs to be redrawn again, and
+the data elements or coordinate axes haven't changed, the pixmap is
+simply copied to the screen. This is especially useful when you are
+using markers to highlight points and regions on the bar chart. But if
+the bar chart is updated frequently, changing either the element data or
+coordinate axes, the buffering becomes redundant.
+.SH LIMITATIONS
+Auto-scale routines do not use requested min/max limits
+as boundaries when the axis is logarithmically scaled.
+.PP
+The PostScript output generated for polygons with more than 1500
+points may exceed the limits of some printers (See PostScript Language
+Reference Manual, page 568). The work-around is to break the polygon
+into separate pieces.
+.SH KEYWORDS
+bar chart, widget
diff --git a/doc/graph.n b/doc/graph.n
new file mode 100644
index 0000000..c631975
--- /dev/null
+++ b/doc/graph.n
@@ -0,0 +1,2397 @@
+'\"
+'\" Copyright 1991-1998 by Bell Labs Innovations for Lucent Technologies.
+'\"
+'\" Permission to use, copy, modify, and distribute this software and its
+'\" documentation for any purpose and without fee is hereby granted, provided
+'\" that the above copyright notice appear in all copies and that both that the
+'\" copyright notice and warranty disclaimer appear in supporting documentation,
+'\" and that the names of Lucent Technologies any of their entities not be used
+'\" in advertising or publicity pertaining to distribution of the software
+'\" without specific, written prior permission.
+'\"
+'\" Lucent Technologies disclaims all warranties with regard to this software,
+'\" including all implied warranties of merchantability and fitness. In no event
+'\" shall Lucent Technologies be liable for any special, indirect or
+'\" consequential damages or any damages whatsoever resulting from loss of use,
+'\" data or profits, whether in an action of contract, negligence or other
+'\" tortuous action, arising out of or in connection with the use or performance
+'\" of this software.
+'\"
+'\" Graph widget created by Sani Nassif and George Howlett.
+'\"
+.so man.macros
+.TH graph n BLT_VERSION BLT "BLT Built-In Commands"
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+graph \- 2D graph for plotting X\-Y coordinate data.
+.SH SYNOPSIS
+\fBgraph\fI \fIpathName \fR?\fIoption value\fR?...
+.BE
+.SH DESCRIPTION
+The \fBgraph\fR command creates a graph for plotting
+two-dimensional data (X\-Y coordinates). It has many configurable
+components: coordinate axes, elements, legend, grid lines, cross
+hairs, etc. They allow you to customize the look and feel of the
+graph.
+.SH INTRODUCTION
+The \fBgraph\fR command creates a new window for plotting
+two-dimensional data (X\-Y coordinates). Data points are plotted in a
+rectangular area displayed in the center of the new window. This is the
+\fIplotting area\fR. The coordinate axes are drawn in the
+margins around the plotting area. By default, the legend is displayed
+in the right margin. The title is displayed in top margin.
+.PP
+The \fBgraph\fR widget is composed of several components: coordinate
+axes, data elements, legend, grid, cross hairs, pens, postscript, and
+annotation markers.
+.TP 1i
+\f(CWaxis\fR
+The graph has four standard axes (\f(CWx\fR, \f(CWx2\fR,
+\f(CWy\fR, and \f(CWy2\fR), but you can create and display any number
+of axes. Axes control what region of data is
+displayed and how the data is scaled. Each axis consists of the axis
+line, title, major and minor ticks, and tick labels. Tick labels
+display the value at each major tick.
+.TP 1i
+\f(CWcrosshairs\fR
+Cross hairs are used to position the mouse pointer relative to the X
+and Y coordinate axes. Two perpendicular lines, intersecting at the
+current location of the mouse, extend across the plotting area to the
+coordinate axes.
+.TP 1i
+\f(CWelement\fR
+An element represents a set of data points. Elements can be plotted
+with a symbol at each data point and lines connecting the points.
+The appearance of the element, such as its symbol, line width, and
+color is configurable.
+.TP 1i
+\f(CWgrid\fR
+Extends the major and minor ticks of the X\-axis and/or Y\-axis across the
+plotting area.
+.TP 1i
+\f(CWlegend\fR
+The legend displays the name and symbol of each data element.
+The legend can be drawn in any margin or in the plotting area.
+.TP 1i
+\f(CWmarker\fR
+Markers are used annotate or highlight areas of the graph. For
+example, you could use a polygon marker to fill an area under a
+curve, or a text marker to label a particular data point. Markers
+come in various forms: text strings, bitmaps, connected line
+segments, images, polygons, or embedded widgets.
+.TP 1i
+\f(CWpen\fR
+Pens define attributes (both symbol and line style) for elements.
+Data elements use pens to specify how they should be drawn. A data
+element may use many pens at once. Here, the particular pen
+used for a data point is determined from each element's weight
+vector (see the element's \fB\-weight\fR and \fB\-style\fR options).
+.TP 1i
+\f(CWpostscript\fR
+The widget can generate encapsulated PostScript output. This component
+has several options to configure how the PostScript is generated.
+.SH SYNTAX
+.DS
+\fBgraph \fIpathName \fR?\fIoption value\fR?...
+.DE
+The \fBgraph\fR command creates a new window \fIpathName\fR and makes
+it into a \fBgraph\fR widget. At the time this command is invoked, there
+must not exist a window named \fIpathName\fR, but \fIpathName\fR's
+parent must exist. Additional options may be specified on the
+command line or in the option database to configure aspects of the
+graph such as its colors and font. See the \fBconfigure\fR operation
+below for the exact details about what \fIoption\fR and \fIvalue\fR
+pairs are valid.
+.PP
+If successful, \fBgraph\fR returns the path name of the widget. It
+also creates a new Tcl command by the same name. You can use this
+command to invoke various operations that query or modify the graph.
+The general form is:
+.DS
+\fIpathName \fIoperation\fR \fR?\fIarg\fR?...
+.DE
+Both \fIoperation\fR and its arguments determine the exact behavior of
+the command. The operations available for the graph are described in
+the
+.SB "GRAPH OPERATIONS"
+section.
+.PP
+The command can also be used to access components of the graph.
+.DS
+\fIpathName component operation\fR ?\fIarg\fR?...
+.DE
+The operation, now located after the name of the component, is the
+function to be performed on that component. Each component has its own
+set of operations that manipulate that component. They will be
+described below in their own sections.
+.SH EXAMPLE
+The \fBgraph\fR command creates a new graph.
+.CS
+# Create a new graph. Plotting area is black.
+graph .g \-plotbackground black
+.CE
+A new Tcl command \f(CW.g\fR is also created. This command can be used
+to query and modify the graph. For example, to change the title of
+the graph to "My Plot", you use the new command and the graph's
+\fBconfigure\fR operation.
+.CS
+# Change the title.
+\&.g configure \-title "My Plot"
+.CE
+A graph has several components. To access a particular component you
+use the component's name. For example, to add data elements, you use
+the new command and the \fBelement\fR component.
+.CS
+# Create a new element named "line1"
+\&.g element create line1 \\
+ \-xdata { 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 } \\
+ \-ydata { 26.18 50.46 72.85 93.31 111.86 128.47 143.14
+ 155.85 166.60 175.38 }
+.CE
+The element's X-Y coordinates are specified using lists of
+numbers. Alternately, BLT vectors could be used to hold the X\-Y
+coordinates.
+.CS
+# Create two vectors and add them to the graph.
+vector xVec yVec
+xVec set { 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 }
+yVec set { 26.18 50.46 72.85 93.31 111.86 128.47 143.14 155.85
+ 166.60 175.38 }
+\&.g element create line1 \-xdata xVec \-ydata yVec
+.CE
+The advantage of using vectors is that when you modify one, the graph
+is automatically redrawn to reflect the new values.
+.CS
+# Change the y coordinate of the first point.
+set yVector(0) 25.18
+.CE
+An element named \f(CWe1\fR is now created in \f(CW.b\fR. It
+is automatically added to the display list of elements. You can
+use this list to control in what order elements are displayed.
+To query or reset the element display list, you use the element's
+\fBshow\fR operation.
+.CS
+# Get the current display list
+set elemList [.b element show]
+# Remove the first element so it won't be displayed.
+\&.b element show [lrange $elemList 0 end]
+.CE
+The element will be displayed by as many bars as there are data points
+(in this case there are ten). The bars will be drawn centered at the
+x-coordinate of the data point. All the bars will have the same
+attributes (colors, stipple, etc). The width of each bar is by
+default one unit. You can change this with using the \fB\-barwidth\fR
+option.
+.CS
+# Change the X\-Y coordinates of the first point.
+set xVec(0) 0.18
+set yVec(0) 25.18
+.CE
+An element named \f(CWline1\fR is now created in \f(CW.g\fR. By
+default, the element's label in the legend will be also \f(CWline1\fR.
+You can change the label, or specify no legend entry, again using the
+element's \fBconfigure\fR operation.
+.CS
+# Don't display "line1" in the legend.
+\&.g element configure line1 \-label ""
+.CE
+You can configure more than just the element's label. An element has
+many attributes such as symbol type and size, dashed or solid lines,
+colors, line width, etc.
+.CS
+\&.g element configure line1 \-symbol square \-color red \\
+ \-dashes { 2 4 2 } \-linewidth 2 \-pixels 2c
+.CE
+Four coordinate axes are automatically created: \f(CWx\fR, \f(CWx2\fR,
+\f(CWy\fR, and \f(CWy2\fR. And by default, elements are mapped onto the
+axes \f(CWx\fR and \f(CWy\fR. This can be changed with the \fB\-mapx\fR
+and \fB\-mapy\fR options.
+.CS
+# Map "line1" on the alternate Y\-axis "y2".
+\&.g element configure line1 \-mapy y2
+.CE
+Axes can be configured in many ways too. For example, you change the
+scale of the Y\-axis from linear to log using the \fBaxis\fR component.
+.CS
+# Y\-axis is log scale.
+\&.g axis configure y \-logscale yes
+.CE
+One important way axes are used is to zoom in on a particular data
+region. Zooming is done by simply specifying new axis limits using
+the \fB\-min\fR and \fB\-max\fR configuration options.
+.CS
+\&.g axis configure x \-min 1.0 \-max 1.5
+\&.g axis configure y \-min 12.0 \-max 55.15
+.CE
+To zoom interactively, you link the \fBaxis configure\fR operations with
+some user interaction (such as pressing the mouse button), using the
+\fBbind\fR command. To convert between screen and graph coordinates,
+use the \fBinvtransform\fR operation.
+.CS
+# Click the button to set a new minimum
+bind .g <ButtonPress-1> {
+ %W axis configure x \-min [%W axis invtransform x %x]
+ %W axis configure x \-min [%W axis invtransform x %y]
+}
+.CE
+By default, the limits of the axis are determined from data values.
+To reset back to the default limits, set the \fB\-min\fR and
+\fB\-max\fR options to the empty value.
+.CS
+# Reset the axes to autoscale again.
+\&.g axis configure x \-min {} \-max {}
+\&.g axis configure y \-min {} \-max {}
+.CE
+By default, the legend is drawn in the right margin. You can
+change this or any legend configuration options using the
+\fBlegend\fR component.
+.CS
+# Configure the legend font, color, and relief
+\&.g legend configure \-position left \-relief raised \\
+ \-font fixed \-fg blue
+.CE
+To prevent the legend from being displayed, turn on the \fB\-hide\fR
+option.
+.CS
+# Don't display the legend.
+\&.g legend configure \-hide yes\fR
+.CE
+The \fBgraph\fR widget has simple drawing procedures called markers.
+They can be used to highlight or annotate data in the graph. The types
+of markers available are bitmaps, images, polygons, lines, or windows.
+Markers can be used, for example, to mark or brush points. In this
+example, is a text marker that labels the data first point. Markers
+are created using the \fBmarker\fR component.
+.CS
+# Create a label for the first data point of "line1".
+\&.g marker create text \-name first_marker \-coords { 0.2 26.18 } \\
+ \-text "start" \-anchor se \-xoffset -10 \-yoffset -10
+.CE
+This creates a text marker named \f(CWfirst_marker\fR. It will display
+the text "start" near the coordinates of the first data point. The
+\fB\-anchor\fR, \fB\-xoffset\fR, and \fB\-yoffset\fR options are used
+to display the marker above and to the left of the data point, so that
+the data point isn't covered by the marker. By default,
+markers are drawn last, on top of data. You can change this with the
+\fB\-under\fR option.
+.CS
+# Draw the label before elements are drawn.
+\&.g marker configure first_marker \-under yes
+.CE
+You can add cross hairs or grid lines using the \fBcrosshairs\fR and
+\fBgrid\fR components.
+.CS
+# Display both cross hairs and grid lines.
+\&.g crosshairs configure \-hide no \-color red
+\&.g grid configure \-hide no \-dashes { 2 2 }
+# Set up a binding to reposition the crosshairs.
+bind .g <Motion> {
+ .g crosshairs configure -position @%x,%y
+}
+.CE
+The crosshairs are repositioned as the mouse pointer is moved
+in the graph. The pointer X-Y coordinates define the center
+of the crosshairs.
+.PP
+Finally, to get hardcopy of the graph, use the \fBpostscript\fR
+component.
+.CS
+# Print the graph into file "file.ps"
+\&.g postscript output file.ps \-maxpect yes \-decorations no
+.CE
+This generates a file \f(CWfile.ps\fR containing the encapsulated
+PostScript of the graph. The option \fB\-maxpect\fR says to scale the
+plot to the size of the page. Turning off the \fB\-decorations\fR
+option denotes that no borders or color backgrounds should be
+drawn (i.e. the background of the margins, legend, and plotting
+area will be white).
+.SH "GRAPH OPERATIONS"
+.TP
+\fIpathName \fBaxis \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "AXIS COMPONENTS"
+section.
+.TP
+\fIpathName \fBbar \fIelemName \fR?\fIoption value\fR?...
+Creates a new barchart element \fIelemName\fR. It's an
+error if an element \fIelemName\fR already exists.
+See the manual for \fBbarchart\fR for details about
+what \fIoption\fR and \fIvalue\fR pairs are valid.
+.TP
+\fIpathName \fBcget\fR \fIoption\fR
+Returns the current value of the configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below for the \fBconfigure\fR operation.
+.TP
+\fIpathName \fBconfigure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options of the graph. If
+\fIoption\fR isn't specified, a list describing the current
+options for \fIpathName\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the option \fIoption\fR is set to \fIvalue\fR.
+The following options are valid.
+.RS
+.TP
+\fB\-aspect \fIwidth/height\fR
+Force a fixed aspect ratio of \fIwidth/height\fR, a floating point number.
+.TP
+\fB\-background \fIcolor\fR
+Sets the background color. This includes the margins and
+legend, but not the plotting area.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the width of the 3\-D border around the outside edge of the widget. The
+\fB\-relief\fR option determines if the border is to be drawn. The
+default is \f(CW2\fR.
+.TP
+\fB\-bottommargin \fIpixels\fR
+If non-zero, overrides the computed size of the margin extending
+below the X\-coordinate axis.
+If \fIpixels\fR is \f(CW0\fR, the automatically computed size is used.
+The default is \f(CW0\fR.
+.TP
+\fB\-bufferelements \fIboolean\fR
+Indicates whether an internal pixmap to buffer the display of data
+elements should be used. If \fIboolean\fR is true, data elements are
+drawn to an internal pixmap. This option is especially useful when
+the graph is redrawn frequently while the remains data unchanged (for
+example, moving a marker across the plot). See the
+.SB "SPEED TIPS"
+section.
+The default is \f(CW1\fR.
+.TP
+\fB\-cursor \fIcursor\fR
+Specifies the widget's cursor. The default cursor is \f(CWcrosshair\fR.
+.TP
+\fB\-font \fIfontName\fR
+Specifies the font of the graph title. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-18-180-*\fR.
+.TP
+\fB\-halo \fIpixels\fR
+Specifies a maximum distance to consider when searching for the
+closest data point (see the element's \fBclosest\fR operation below).
+Data points further than \fIpixels\fR away are ignored. The default is
+\f(CW0.5i\fR.
+.TP
+\fB\-height \fIpixels\fR
+Specifies the requested height of widget. The default is
+\f(CW4i\fR.
+.TP
+\fB\-invertxy \fIboolean\fR
+Indicates whether the placement X\-axis and Y\-axis should be inverted. If
+\fIboolean\fR is true, the X and Y axes are swapped. The default is
+\f(CW0\fR.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the title should be justified. This matters only when
+the title contains more than one line of text. \fIJustify\fR must be
+\f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-leftmargin \fIpixels\fR
+If non-zero, overrides the computed size of the margin extending
+from the left edge of the window to the Y\-coordinate axis.
+If \fIpixels\fR is \f(CW0\fR, the automatically computed size is used.
+The default is \f(CW0\fR.
+.TP
+\fB\-plotbackground \fIcolor\fR
+Specifies the background color of the plotting area. The default is
+\f(CWwhite\fR.
+.TP
+\fB\-plotborderwidth \fIpixels\fR
+Sets the width of the 3-D border around the plotting area. The
+\fB\-plotrelief\fR option determines if a border is drawn. The
+default is \f(CW2\fR.
+.TP
+\fB\-plotpadx \fIpad\fR
+Sets the amount of padding to be added to the left and right sides of
+the plotting area. \fIPad\fR can be a list of one or two screen
+distances. If \fIpad\fR has two elements, the left side of the
+plotting area entry is padded by the first distance and the right side
+by the second. If \fIpad\fR is just one distance, both the left and
+right sides are padded evenly. The default is \f(CW8\fR.
+.TP
+\fB\-plotpady \fIpad\fR
+Sets the amount of padding to be added to the top and bottom of the
+plotting area. \fIPad\fR can be a list of one or two screen
+distances. If \fIpad\fR has two elements, the top of the plotting
+area is padded by the first distance and the bottom by the second. If
+\fIpad\fR is just one distance, both the top and bottom are padded
+evenly. The default is \f(CW8\fR.
+.TP
+\fB\-plotrelief \fIrelief\fR
+Specifies the 3-D effect for the plotting area. \fIRelief\fR
+specifies how the interior of the plotting area should appear relative
+to rest of the graph; for example, \f(CWraised\fR means the plot should
+appear to protrude from the graph, relative to the surface of the
+graph. The default is \f(CWsunken\fR.
+.TP
+\fB\-relief \fIrelief\fR
+Specifies the 3-D effect for the graph widget. \fIRelief\fR
+specifies how the graph should appear relative to widget it is packed
+into; for example, \f(CWraised\fR means the graph should
+appear to protrude. The default is \f(CWflat\fR.
+.TP
+\fB\-rightmargin \fIpixels\fR
+If non-zero, overrides the computed size of the margin extending
+from the plotting area to the right edge of
+the window. By default, the legend is drawn in this margin.
+If \fIpixels\fR is \f(CW0\fR, the automatically computed size is used.
+The default is \f(CW0\fR.
+.TP
+\fB\-takefocus\fR \fIfocus\fR
+Provides information used when moving the focus from window to window
+via keyboard traversal (e.g., Tab and Shift-Tab). If \fIfocus\fR is
+\f(CW0\fR, this means that this window should be skipped entirely during
+keyboard traversal. \f(CW1\fR means that the this window should always
+receive the input focus. An empty value means that the traversal
+scripts make the decision whether to focus on the window.
+The default is \f(CW""\fR.
+.TP
+\fB\-tile \fIimage\fR
+Specifies a tiled background for the widget. If \fIimage\fR isn't
+\f(CW""\fR, the background is tiled using \fIimage\fR.
+Otherwise, the normal background color is drawn (see the
+\fB\-background\fR option). \fIImage\fR must be an image created
+using the Tk \fBimage\fR command. The default is \f(CW""\fR.
+.TP
+\fB\-title \fItext\fR
+Sets the title to \fItext\fR. If \fItext\fR is \f(CW""\fR,
+no title will be displayed.
+.TP
+\fB\-topmargin \fIpixels\fR
+If non-zero, overrides the computed size of the margin above the x2
+axis. If \fIpixels\fR is \f(CW0\fR, the automatically computed size
+is used. The default is \f(CW0\fR.
+.TP
+\fB\-width \fIpixels\fR
+Specifies the requested width of the widget. The default is
+\f(CW5i\fR.
+.RE
+.TP
+\fIpathName \fBcrosshairs \fIoperation \fR?\fIarg\fR?
+See the
+.SB "CROSSHAIRS COMPONENT"
+section.
+.TP
+\fIpathName \fBelement \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "ELEMENT COMPONENTS"
+section.
+.TP
+\fIpathName \fBextents \fIitem\fR
+Returns the size of a particular item in the graph. \fIItem\fR must
+be either \f(CWleftmargin\fR, \f(CWrightmargin\fR, \f(CWtopmargin\fR,
+\f(CWbottommargin\fR, \f(CWplotwidth\fR, or \f(CWplotheight\fR.
+.TP
+\fIpathName \fBgrid \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "GRID COMPONENT"
+section.
+.TP
+\fIpathName \fBinvtransform \fIwinX winY\fR
+Performs an inverse coordinate transformation, mapping window
+coordinates back to graph coordinates, using the standard X\-axis and Y\-axis.
+Returns a list of containing the X-Y graph coordinates.
+.TP
+\fIpathName \fBinside \fIx y\fR
+Returns \f(CW1\fR is the designated screen coordinate (\fIx\fR and \fIy\fR)
+is inside the plotting area and \f(CW0\fR otherwise.
+.TP
+\fIpathName \fBlegend \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "LEGEND COMPONENT"
+section.
+.TP
+\fIpathName \fBline\fB operation arg\fR...
+The operation is the same as \fBelement\fR.
+.TP
+\fIpathName \fBmarker \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "MARKER COMPONENTS"
+section.
+.TP
+\fIpathName \fBpostscript \fIoperation \fR?\fIarg\fR?...
+See the
+.SB "POSTSCRIPT COMPONENT"
+section.
+.TP
+\fIpathName \fBsnap \fR?\fIswitches\fR? \fIoutputName\fR
+Takes a snapshot of the graph, saving the output in \fIoutputName\fR.
+The following switches are available.
+.RS
+.TP 1i
+\fB\-format\fR \fIformat\fR
+Specifies how the snapshot is output. \fIFormat\fR may be one of
+the following listed below. The default is \f(CWphoto\fR.
+.RS
+.TP
+\f(CWphoto\fR
+Saves a Tk photo image. \fIOutputName\fR represents the name of a
+Tk photo image that must already have been created.
+.TP
+\f(CWwmf\fR
+Saves an Aldus Placeable Metafile. \fIOutputName\fR represents the
+filename where the metafile is written. If \fIoutputName\fR is
+\f(CWCLIPBOARD\fR, then output is written directly to the Windows
+clipboard. This format is available only under Microsoft Windows.
+.TP
+\f(CWemf\fR
+Saves an Enhanced Metafile. \fIOutputName\fR represents the filename
+where the metafile is written. If \fIoutputName\fR is
+\f(CWCLIPBOARD\fR, then output is written directly to the Windows
+clipboard. This format is available only under Microsoft Windows.
+.RE
+.TP 1i
+\fB\-height\fR \fIsize\fR
+Specifies the height of the graph. \fISize\fR is a screen distance.
+The graph will be redrawn using this dimension, rather than its
+current window height.
+.TP 1i
+\fB\-width\fR \fIsize\fR
+Specifies the width of the graph. \fISize\fR is a screen distance.
+The graph will be redrawn using this dimension, rather than its
+current window width.
+.RE
+.TP
+\fIpathName \fBtransform \fIx y\fR
+Performs a coordinate transformation, mapping graph coordinates to
+window coordinates, using the standard X\-axis and Y\-axis.
+Returns a list containing the X\-Y screen coordinates.
+.TP
+\fIpathName \fBxaxis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fBx2axis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fByaxis \fIoperation\fR ?\fIarg\fR?...
+.TP
+\fIpathName \fBy2axis \fIoperation\fR ?\fIarg\fR?...
+See the
+.SB "AXIS COMPONENTS"
+section.
+.SH "GRAPH COMPONENTS"
+A graph is composed of several components: coordinate axes, data
+elements, legend, grid, cross hairs, postscript, and annotation
+markers. Instead of one big set of configuration options and
+operations, the graph is partitioned, where each component has its own
+configuration options and operations that specifically control that
+aspect or part of the graph.
+.SS "AXIS COMPONENTS"
+Four coordinate axes are automatically created: two X\-coordinate axes
+(\f(CWx\fR and \f(CWx2\fR) and two Y\-coordinate axes (\f(CWy\fR, and
+\f(CWy2\fR). By default, the axis \f(CWx\fR is located in the bottom
+margin, \f(CWy\fR in the left margin, \f(CWx2\fR in the top margin, and
+\f(CWy2\fR in the right margin.
+.PP
+An axis consists of the axis line, title, major and minor ticks, and
+tick labels. Major ticks are drawn at uniform intervals along the
+axis. Each tick is labeled with its coordinate value. Minor ticks
+are drawn at uniform intervals within major ticks.
+.PP
+The range of the axis controls what region of data is plotted.
+Data points outside the minimum and maximum limits of the axis are
+not plotted. By default, the minimum and maximum limits are
+determined from the data, but you can reset either limit.
+.PP
+You can have several axes. To create an axis, invoke
+the axis component and its create operation.
+.CS
+# Create a new axis called "tempAxis"
+\&.g axis create tempAxis
+.CE
+You map data elements to an axis using the element's \-mapy and \-mapx
+configuration options. They specify the coordinate axes an element
+is mapped onto.
+.CS
+# Now map the tempAxis data to this axis.
+\&.g element create "e1" \-xdata $x \-ydata $y \-mapy tempAxis
+.CE
+Any number of axes can be displayed simultaneously. They are drawn in
+the margins surrounding the plotting area. The default axes \f(CWx\fR
+and \f(CWy\fR are drawn in the bottom and left margins. The axes
+\f(CWx2\fR and \f(CWy2\fR are drawn in top and right margins. By
+default, only \f(CWx\fR and \f(CWy\fR are shown. Note that the axes
+can have different scales.
+.PP
+To display a different axis or more than one axis, you invoke one of
+the following components: \fBxaxis\fR, \fByaxis\fR, \fBx2axis\fR, and
+\fBy2axis\fR. Each component has a \fBuse\fR operation that
+designates the axis (or axes) to be drawn in that corresponding
+margin: \fBxaxis\fR in the bottom, \fByaxis\fR in the left,
+\fBx2axis\fR in the top, and \fBy2axis\fR in the right.
+.CS
+# Display the axis tempAxis in the left margin.
+\&.g yaxis use tempAxis
+.CE
+The \fBuse\fR operation takes a list of axis names as its last
+argument. This is the list of axes to be drawn in this margin.
+.PP
+You can configure axes in many ways. The axis scale can be linear or
+logarithmic. The values along the axis can either monotonically
+increase or decrease. If you need custom tick labels, you can specify
+a Tcl procedure to format the label any way you wish. You can control
+how ticks are drawn, by changing the major tick interval or the number
+of minor ticks. You can define non-uniform tick intervals, such as
+for time-series plots.
+.PP
+.TP
+\fIpathName \fBaxis bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for an axis with this
+tag, \fIcommand\fR will be invoked. The syntax is similar to the
+\fBbind\fR command except that it operates on graph axes, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBaxis \fBcget \fIaxisName \fIoption\fR
+Returns the current value of the option given by \fIoption\fR for
+\fIaxisName\fR. \fIOption\fR may be any option described below
+for the axis \fBconfigure\fR operation.
+.TP
+\fIpathName \fBaxis \fBconfigure \fIaxisName \fR?\fIaxisName\fR?... ?\fIoption value\fR?...
+Queries or modifies the configuration options of \fIaxisName\fR.
+Several axes can be changed. If \fIoption\fR isn't specified, a list
+describing all the current options for \fIaxisName\fR is returned. If
+\fIoption\fR is specified, but not \fIvalue\fR, then a list describing
+\fIoption\fR is returned. If one or more \fIoption\fR and \fIvalue\fR
+pairs are specified, then for each pair, the axis option \fIoption\fR
+is set to \fIvalue\fR. The following options are valid for axes.
+.RS
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for the axis. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events for axes are handled. Each tag in the list matching the current event
+sequence will have its Tcl command executed. Implicitly the name of
+the element is always the first tag in the list. The default value is
+\f(CWall\fR.
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the axis and tick labels.
+The default is \f(CWblack\fR.
+.TP
+\fB\-command \fIprefix\fR
+Specifies a Tcl command to be invoked when formatting the axis tick
+labels. \fIPrefix\fR is a string containing the name of a Tcl proc and
+any extra arguments for the procedure. This command is invoked for each
+major tick on the axis. Two additional arguments are passed to the
+procedure: the pathname of the widget and the current the numeric
+value of the tick. The procedure returns the formatted tick label. If
+\f(CW""\fR is returned, no label will appear next to the tick. You can
+get the standard tick labels again by setting \fIprefix\fR to
+\f(CW""\fR. The default is \f(CW""\fR.
+.sp 1
+Please note that this procedure is invoked while the graph is redrawn.
+You may query configuration options. But do not them, because this
+can have unexpected results.
+.TP
+\fB\-descending \fIboolean\fR
+Indicates whether the values along the axis are monotonically increasing or
+decreasing. If \fIboolean\fR is true, the axis values will be
+decreasing. The default is \f(CW0\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates if the axis is displayed. If \fIboolean\fR is false the axis
+will be displayed. Any element mapped to the axis is displayed regardless.
+The default value is \f(CW0\fR.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the axis title should be justified. This matters only
+when the axis title contains more than one line of text. \fIJustify\fR
+must be \f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-limits \fIformatStr\fR
+Specifies a printf-like description to format the minimum and maximum
+limits of the axis. The limits are displayed at the top/bottom or
+left/right sides of the plotting area. \fIFormatStr\fR is a list of
+one or two format descriptions. If one description is supplied, both
+the minimum and maximum limits are formatted in the same way. If two,
+the first designates the format for the minimum limit, the second for
+the maximum. If \f(CW""\fR is given as either description, then
+the that limit will not be displayed. The default is \f(CW""\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the axis and tick lines. The default is \f(CW1\fR
+pixel.
+.TP
+\fB\-logscale \fIboolean\fR
+Indicates whether the scale of the axis is logarithmic or linear. If
+\fIboolean\fR is true, the axis is logarithmic. The default scale is
+linear.
+.TP
+\fB\-loose \fIboolean\fR
+Indicates whether the limits of the axis should fit the data points tightly,
+at the outermost data points, or loosely, at the outer tick intervals.
+If the axis limit is set with the -min or -max option, the axes are
+displayed tightly.
+If \fIboolean\fR is true, the axis range is "loose".
+The default is \f(CW0\fR.
+.TP
+\fB\-majorticks \fImajorList\fR
+Specifies where to display major axis ticks. You can use this option
+to display ticks at non-uniform intervals. \fIMajorList\fR is a list
+of axis coordinates designating the location of major ticks. No
+minor ticks are drawn. If \fImajorList\fR is \f(CW""\fR,
+major ticks will be automatically computed. The default is \f(CW""\fR.
+.TP
+\fB\-max \fIvalue\fR
+Sets the maximum limit of \fIaxisName\fR. Any data point greater
+than \fIvalue\fR is not displayed. If \fIvalue\fR is \f(CW""\fR,
+the maximum limit is calculated using the largest data value.
+The default is \f(CW""\fR.
+.TP
+\fB\-min \fIvalue\fR
+Sets the minimum limit of \fIaxisName\fR. Any data point less than
+\fIvalue\fR is not displayed. If \fIvalue\fR is \f(CW""\fR,
+the minimum limit is calculated using the smallest data value.
+The default is \f(CW""\fR.
+.TP
+\fB\-minorticks \fIminorList\fR
+Specifies where to display minor axis ticks. You can use this option
+to display minor ticks at non-uniform intervals. \fIMinorList\fR is a
+list of real values, ranging from 0.0 to 1.0, designating the placement of
+a minor tick. No minor ticks are drawn if the \fB\-majortick\fR
+option is also set. If \fIminorList\fR is \f(CW""\fR, minor ticks will
+be automatically computed. The default is \f(CW""\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Specifies the how many degrees to rotate the axis tick labels.
+\fITheta\fR is a real value representing the number of degrees
+to rotate the tick labels. The default is \f(CW0.0\fR degrees.
+.TP
+\fB\-scrollcommand \fIcommand\fR
+Specify the prefix for a command used to communicate with scrollbars
+for this axis, such as \fI.sbar set\fP.
+.TP
+\fB\-scrollmax \fIvalue\fR
+Sets the maximum limit of the axis scroll region. If \fIvalue\fR is
+\f(CW""\fR, the maximum limit is calculated using the largest data
+value. The default is \f(CW""\fR.
+.TP
+\fB\-scrollmin \fIvalue\fR
+Sets the minimum limit of axis scroll region. If \fIvalue\fR is
+\f(CW""\fR, the minimum limit is calculated using the smallest data
+value. The default is \f(CW""\fR.
+.TP
+\fB\-showticks \fIboolean\fR
+Indicates whether axis ticks should be drawn. If \fIboolean\fR is
+true, ticks are drawn. If false, only the
+axis line is drawn. The default is \f(CW1\fR.
+.TP
+\fB\-stepsize \fIvalue\fR
+Specifies the interval between major axis ticks. If \fIvalue\fR isn't
+a valid interval (must be less than the axis range),
+the request is ignored and the step size is automatically calculated.
+.TP
+\fB\-subdivisions \fInumber\fR
+Indicates how many minor axis ticks are
+to be drawn. For example, if \fInumber\fR is two, only one minor
+tick is drawn. If \fInumber\fR is one, no minor ticks are
+displayed. The default is \f(CW2\fR.
+.TP
+\fB\-tickfont \fIfontName\fR
+Specifies the font for axis tick labels. The default is
+\f(CW*-Courier-Bold-R-Normal-*-100-*\fR.
+.TP
+\fB\-ticklength \fIpixels\fR
+Sets the length of major and minor ticks (minor ticks are half the
+length of major ticks). If \fIpixels\fR is less than zero, the axis
+will be inverted with ticks drawn pointing towards the plot. The
+default is \f(CW0.1i\fR.
+.TP
+\fB\-title \fItext\fR
+Sets the title of the axis. If \fItext\fR is
+\f(CW""\fR, no axis title will be displayed.
+.TP
+\fB\-titlealternate \fIboolean\fR
+Indicates to display the axis title in its alternate location.
+Normally the axis title is centered along the axis. This option
+places the axis either to the right (horizontal axes) or above
+(vertical axes) the axis. The default is \f(CW0\fR.
+.TP
+\fB\-titlecolor \fIcolor\fR
+Sets the color of the axis title. The default is \f(CWblack\fR.
+.TP
+\fB\-titlefont \fIfontName\fR
+Specifies the font for axis title. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-14-140-*\fR.
+.PP
+Axis configuration options may be also be set by the \fBoption\fR
+command. The resource class is \f(CWAxis\fR. The resource names
+are the names of the axes (such as \f(CWx\fR or \f(CWx2\fR).
+.CS
+option add *Graph.Axis.Color blue
+option add *Graph.x.LogScale true
+option add *Graph.x2.LogScale false
+.CE
+.RE
+.TP
+\fIpathName \fBaxis \fBcreate \fIaxisName \fR?\fIoption value\fR?...
+Creates a new axis by the name \fIaxisName\fR. No axis by the same
+name can already exist. \fIOption\fR and \fIvalue\fR are described
+in above in the axis \fBconfigure\fR operation.
+.TP
+\fIpathName \fBaxis \fBdelete \fR?\fIaxisName\fR?...
+Deletes the named axes. An axis is not really
+deleted until it is not longer in use, so it's safe to delete
+axes mapped to elements.
+.TP
+\fIpathName \fBaxis invtransform \fIaxisName value\fR
+Performs the inverse transformation, changing the screen coordinate
+\fIvalue\fR to a graph coordinate, mapping the value mapped to
+\fIaxisName\fR. Returns the graph coordinate.
+.TP
+\fIpathName \fBaxis limits \fIaxisName\fR
+Returns a list of the minimum and maximum limits for \fIaxisName\fR. The order
+of the list is \f(CWmin max\fR.
+.TP
+\fIpathName \fBaxis names \fR?\fIpattern\fR?...
+Returns a list of axes matching zero or more patterns. If no
+\fIpattern\fR argument is give, the names of all axes are returned.
+.TP
+\fIpathName \fBaxis transform \fIaxisName value\fR
+Transforms the coordinate \fIvalue\fR to a screen coordinate by mapping
+the it to \fIaxisName\fR. Returns the transformed screen coordinate.
+.TP
+\fIpathName \fBaxis view \fIaxisName\fR
+Change the viewable area of this axis. Use as an argument to a scrollbar's "\fI\-command\fR".
+.PP
+The default axes are \f(CWx\fR, \f(CWy\fR, \f(CWx2\fR, and \f(CWy2\fR.
+But you can display more than four axes simultaneously. You can also
+swap in a different axis with \fBuse\fR operation of the special axis
+components: \fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, and \fBy2axis\fR.
+.CS
+\&.g create axis temp
+\&.g create axis time
+\&...
+\&.g xaxis use temp
+\&.g yaxis use time
+.CE
+Only the axes specified for use are displayed on the screen.
+.PP
+The \fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, and \fBy2axis\fR
+components operate on an axis location rather than a specific axis
+like the more general \fBaxis\fR component does. They implicitly
+control the axis that is currently using to that location. By
+default, \fBxaxis\fR uses the \f(CWx\fR axis, \fByaxis\fR uses
+\f(CWy\fR, \fBx2axis\fR uses \f(CWx2\fR, and \fBy2axis\fR uses
+\f(CWy2\fR. When more than one axis is displayed in a margin, it
+represents the first axis displayed.
+.PP
+The following operations are available for axes. They mirror exactly
+the operations of the \fBaxis\fR component. The \fIaxis\fR argument
+must be \fBxaxis\fR, \fBx2axis\fR, \fByaxis\fR, or \fBy2axis\fR. This
+feature is deprecated since more than one axis can now be used a
+margin. You should only use the \fBxaxis\fR, \fBx2axis\fR,
+\fByaxis\fR, and \fBy2axis\fR components with the \fBuse\fR operation.
+For all other operations, use the general \fBaxis\fR component
+instead.
+.TP
+\fIpathName \fIaxis \fBcget \fIoption\fR
+.TP
+\fIpathName \fIaxis \fBconfigure \fR?\fIoption value\fR?...
+.TP
+\fIpathName \fIaxis\fB invtransform \fIvalue\fR
+.TP
+\fIpathName \fIaxis \fBlimits\fR
+.TP
+\fIpathName \fIaxis\fB transform \fIvalue\fR
+.TP
+\fIpathName \fIaxis\fB use \fR?\fIaxisName\fR?
+Designates the axis \fIaxisName\fR is to be displayed at this
+location. \fIAxisName\fR can not be already in use at another location.
+This command returns the name of the axis currently using this location.
+.SS "CROSSHAIRS COMPONENT"
+Cross hairs consist of two intersecting lines (one vertical and one horizontal)
+drawn completely across the plotting area. They are used to position
+the mouse in relation to the coordinate axes. Cross hairs differ from line
+markers in that they are implemented using XOR drawing primitives.
+This means that they can be quickly drawn and erased without redrawing
+the entire graph.
+.PP
+The following operations are available for cross hairs:
+.TP
+\fIpathName \fBcrosshairs cget \fIoption\fR
+Returns the current value of the cross hairs configuration option
+given by \fIoption\fR. \fIOption\fR may be any option
+described below for the cross hairs \fBconfigure\fR operation.
+.TP
+\fIpathName \fBcrosshairs configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options of the cross hairs. If
+\fIoption\fR isn't specified, a list describing all the current
+options for the cross hairs is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the cross hairs option \fIoption\fR is set to
+\fIvalue\fR.
+The following options are available for cross hairs.
+.RS
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the cross hairs. The default is \f(CWblack\fR.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the cross hairs. \fIDashList\fR is a list of up
+to 11 numbers that alternately represent the lengths of the dashes
+and gaps on the cross hair lines. Each number must be between 1 and
+255. If \fIdashList\fR is \f(CW""\fR, the cross hairs will be solid
+lines.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether cross hairs are drawn. If \fIboolean\fR is true,
+cross hairs are not drawn. The default is \f(CWyes\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Set the width of the cross hair lines. The default is \f(CW1\fR.
+.TP
+\fB\-position \fIpos\fR
+Specifies the screen position where the cross hairs intersect.
+\fIPos\fR must be in the form "\fI@x,y\fR", where \fIx\fR and \fIy\fR
+are the window coordinates of the intersection.
+.PP
+Cross hairs configuration options may be also be set by the
+\fBoption\fR command. The resource name and class are
+\f(CWcrosshairs\fR and \f(CWCrosshairs\fR respectively.
+.CS
+option add *Graph.Crosshairs.LineWidth 2
+option add *Graph.Crosshairs.Color red
+.CE
+.RE
+.TP
+\fIpathName \fBcrosshairs off\fR
+Turns off the cross hairs.
+.TP
+\fIpathName \fBcrosshairs on\fR
+Turns on the display of the cross hairs.
+.TP
+\fIpathName \fBcrosshairs toggle\fR
+Toggles the current state of the cross hairs, alternately mapping and
+unmapping the cross hairs.
+.SS "ELEMENT COMPONENTS"
+A data element represents a set of data. It contains x and y vectors
+containing the coordinates of the data points. Elements can be
+displayed with a symbol at each data point and lines connecting the
+points. Elements also control the appearance of the data, such as the
+symbol type, line width, color etc.
+.PP
+When new data elements are created, they are automatically added to a
+list of displayed elements. The display list controls what elements
+are drawn and in what order.
+.PP
+The following operations are available for elements.
+.TP
+\fIpathName \fBelement activate \fIelemName \fR?\fIindex\fR?...
+Specifies the data points of element \fIelemName\fR to be drawn
+using active foreground and background colors. \fIElemName\fR is the
+name of the element and \fIindex\fR is a number representing the index
+of the data point. If no indices are present then all data points
+become active.
+.TP
+\fIpathName \fBelement bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for an element with this
+tag, \fIcommand\fR will be invoked. The syntax is similar to the
+\fBbind\fR command except that it operates on graph elements, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBelement cget \fIelemName \fIoption\fR
+Returns the current value of the element configuration option given by
+\fIoption\fR. \fIOption\fR may be any of the options described below
+for the element \fBconfigure\fR operation.
+.TP
+\fIpathName \fBelement closest \fIx y\fR ?\fIoption value\fR?... ?\fIelemName\fR?...
+Searches for the data point closest to the window coordinates \fIx\fR
+and \fIy\fR. By default, all elements are searched. Hidden elements
+(see the \fB\-hide\fR option is false) are ignored. You can limit the
+search by specifying only the elements you want to be considered.
+\fIElemName\fR must be the name of an element that can not be hidden.
+It returns a key-value list containing the name of the closest element,
+the index of the closest data point, and the graph-coordinates of the point.
+Returns \f(CW""\fR, if no data point within the threshold distance
+can be found. The following
+\fIoption\fR\-\fIvalue\fR pairs are available.
+.RS
+.TP
+\fB\-along \fIdirection\fR
+Search for the closest element using the following criteria:
+.RS
+.TP
+\f(CWx\fR
+Find closest element vertically from the given X-coordinate.
+.TP
+\f(CWy\fR
+Find the closest element horizontally from the given Y-coordinate.
+.TP
+\f(CWboth\fR
+Find the closest element for the given point (using both the X and Y
+coordinates).
+.RE
+.TP
+\fB\-halo \fIpixels\fR
+Specifies a threshold distance where selected data points are ignored.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+If this option isn't specified, then it defaults to the value of the
+graph's \fB\-halo\fR option.
+.TP
+\fB\-interpolate \fIstring\fR
+Indicates whether to consider projections that lie along the line segments
+connecting data points when searching for the closest point.
+The default value is \f(CW0\fR. The values for \fIstring\fR are
+described below.
+.RS
+.TP 1.25i
+\f(CWno\fR
+Search only for the closest data point.
+.TP
+\f(CWyes\fR
+Search includes projections that lie along the
+line segments connecting the data points.
+.RE
+.RE
+.TP
+\fIpathName \fBelement configure \fIelemName \fR?\fIelemName\fR... ?\fIoption value\fR?...
+Queries or modifies the configuration options for elements. Several
+elements can be modified at the same time. If \fIoption\fR isn't
+specified, a list describing all the current options for
+\fIelemName\fR is returned. If \fIoption\fR is specified, but not
+\fIvalue\fR, then a list describing the option \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the element option \fIoption\fR is set
+to \fIvalue\fR. The following options are valid for elements.
+.RS
+.TP
+\fB\-activepen \fIpenName\fR
+Specifies pen to use to draw active element. If \fIpenName\fR is
+\f(CW""\fR, no active elements will be drawn. The default is
+\f(CWactiveLine\fR.
+.TP
+\fB\-areabackground \fIcolor\fR
+Specifies the background color of the area under the curve. The
+background area color is drawn only for bitmaps (see the
+\fB\-areapattern\fR option). If \fIcolor\fR is \f(CW""\fR, the
+background is transparent. The default is \f(CWblack\fR.
+.TP
+\fB\-areaforeground \fIcolor\fR
+Specifies the foreground color of the area under the curve.
+The default is \f(CWblack\fR.
+.TP
+\fB\-areapattern \fIpattern\fR
+Specifies how to fill the area under the curve. \fIPattern\fR may be
+the name of a Tk bitmap, \f(CWsolid\fR, or \f(CW""\fR. If "solid",
+then the area under the curve is drawn with the color designated by
+the \fB\-areaforeground\fR option. If a bitmap, then the bitmap is
+stippled across the area. Here the bitmap colors are controlled by the
+\fB\-areaforeground\fR and \fB\-areabackground\fR options. If
+\fIpattern\fR is \f(CW""\fR, no filled area is drawn. The default is
+\f(CW""\fR.
+.TP
+\fB\-areatile \fIimage\fR
+Specifies the name of a Tk image to be used to tile the area under the
+curve. This option supersedes the \fB\-areapattern\fR option.
+\fIImage\fR must be a photo image. If \fIimage\fR is \f(CW""\fR, no
+tiling is performed. The default is \f(CW""\fR.
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for the element. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events are handled for elements. Each tag in the list matching the
+current event
+sequence will have its Tcl command executed. Implicitly the name of
+the element is always the first tag in the list. The default value is
+\f(CWall\fR.
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the traces connecting the data points.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of element line. \fIDashList\fR is a list of up to
+11 numbers that alternately represent the lengths of the dashes and
+gaps on the element line. Each number must be between 1 and 255. If
+\fIdashList\fR is \f(CW""\fR, the lines will be solid.
+.TP
+\fB\-data \fIcoordList\fR
+Specifies the X\-Y coordinates of the data. \fICoordList\fR is a
+list of numeric expressions representing the X\-Y coordinate pairs
+of each data point.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the interior color of symbols. If \fIcolor\fR is \f(CW""\fR, then
+the interior of the symbol is transparent. If \fIcolor\fR is
+\f(CWdefcolor\fR, then the color will be the same as the \fB\-color\fR
+option. The default is \f(CWdefcolor\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the element is displayed.
+The default is \f(CWno\fR.
+.TP
+\fB\-label \fItext\fR
+Sets the element's label in the legend. If \fItext\fR
+is \f(CW""\fR, the element will have no entry in the legend.
+The default label is the element's name.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the connecting lines between data points. If
+\fIpixels\fR is \f(CW0\fR, no connecting lines will be drawn between
+symbols. The default is \f(CW0\fR.
+.TP
+\fB\-mapx \fIxAxis\fR
+Selects the X\-axis to map the element's X\-coordinates onto.
+\fIXAxis\fR must be the name of an axis. The default is \f(CWx\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Selects the Y\-axis to map the element's Y\-coordinates onto.
+\fIYAxis\fR must be the name of an axis. The default is \f(CWy\fR.
+.TP
+\fB\-offdash \fIcolor\fR
+Sets the color of the stripes when traces are dashed (see the
+\fB\-dashes\fR option). If \fIcolor\fR is \f(CW""\fR, then the "off"
+pixels will represent gaps instead of stripes. If \fIcolor\fR is
+\f(CWdefcolor\fR, then the color will be the same as the \fB\-color\fR
+option. The default is \f(CWdefcolor\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color or the outline around each symbol. If \fIcolor\fR is
+\f(CW""\fR, then no outline is drawn. If \fIcolor\fR is \f(CWdefcolor\fR,
+then the color will be the same as the \fB\-color\fR option. The
+default is \f(CWdefcolor\fR.
+.TP
+\fB\-pen \fIpenname\fR
+Set the pen to use for this element.
+.TP
+\fB\-outlinewidth \fIpixels\fR
+Sets the width of the outline bordering each symbol. If \fIpixels\fR
+is \f(CW0\fR, no outline will be drawn. The default is \f(CW1\fR.
+.TP
+\fB\-pixels \fIpixels\fR
+Sets the size of symbols. If \fIpixels\fR is \f(CW0\fR, no symbols will
+be drawn. The default is \f(CW0.125i\fR.
+.TP
+\fB\-scalesymbols \fIboolean\fR
+If \fIboolean\fR is true, the size of the symbols
+drawn for \fIelemName\fR will change with scale of the X\-axis and Y\-axis.
+At the time this option is set, the current ranges of the axes are
+saved as the normalized scales (i.e scale factor is 1.0) and the
+element is drawn at its designated size (see the \fB\-pixels\fR
+option). As the scale of the axes change, the symbol will be scaled
+according to the smaller of the X\-axis and Y\-axis scales. If \fIboolean\fR
+is false, the element's symbols are drawn at the designated size,
+regardless of axis scales. The default is \f(CW0\fR.
+.TP
+\fB\-smooth \fIsmooth\fR
+Specifies how connecting line segments are drawn between data points.
+\fISmooth\fR can be either \f(CWlinear\fR, \f(CWstep\fR, \f(CWnatural\fR, or
+\f(CWquadratic\fR. If \fIsmooth\fR is \f(CWlinear\fR, a single line
+segment is drawn, connecting both data points. When \fIsmooth\fR is
+\f(CWstep\fR, two line segments are drawn. The first is a horizontal
+line segment that steps the next X\-coordinate. The second is a
+vertical line, moving to the next Y\-coordinate. Both \fInatural\fR and
+\fIquadratic\fR generate multiple segments between data points. If
+\fInatural\fR, the segments are generated using a cubic spline. If
+\fIquadratic\fR, a quadratic spline is used. The default is
+\fIlinear\fR.
+.TP
+\fB\-styles \fIstyleList\fR
+Specifies what pen to use based on the range of weights given.
+\fIStyleList\fR is a list of style specifications. Each style
+specification, in turn, is a list consisting of a pen name, and
+optionally a minimum and maximum range. Data points whose weight (see
+the \fB\-weight\fR option) falls in this range, are drawn with this
+pen. If no range is specified it defaults to the index of the pen in
+the list. Note that this affects only symbol attributes. Line
+attributes, such as line width, dashes, etc. are ignored.
+.TP
+\fB\-symbol \fIsymbol\fR
+Specifies the symbol for data points. \fISymbol\fR can be either
+\f(CWsquare\fR, \f(CWcircle\fR, \f(CWdiamond\fR, \f(CWplus\fR, \f(CWcross\fR,
+\f(CWsplus\fR, \f(CWscross\fR, \f(CWtriangle\fR, \f(CW""\fR (where no symbol
+is drawn), or a bitmap. Bitmaps are specified as "\fIsource\fR
+?\fImask\fR?", where \fIsource\fR is the name of the bitmap, and
+\fImask\fR is the bitmap's optional mask. The default is
+\f(CWcircle\fR.
+.TP
+\fB\-trace \fIdirection\fR
+Indicates whether connecting lines between data points (whose
+X\-coordinate values are either increasing or decreasing) are drawn.
+\fIDirection\fR
+must be \f(CWincreasing\fR, \f(CWdecreasing\fR, or \f(CWboth\fR. For
+example, if \fIdirection\fR is \f(CWincreasing\fR, connecting lines will
+be drawn only between those data points where X\-coordinate values are
+monotonically increasing. If \fIdirection\fR is \f(CWboth\fR,
+connecting lines will be draw between all data points. The default is
+\f(CWboth\fR.
+.TP
+\fB\-weights \fIwVec\fR
+Specifies the weights of the individual data points. This,
+with the list pen styles (see the \fB\-styles\fR option),
+controls how data points are drawn. \fIWVec\fR is the name of a BLT
+vector or a list of numeric expressions representing the weights for
+each data point.
+.TP
+\fB\-xdata \fIxVec\fR
+Specifies the X\-coordinates of the data. \fIXVec\fR is the name of
+a BLT vector or a list of numeric expressions.
+.TP
+\fB\-ydata \fIyVec\fR
+Specifies the Y\-coordinates of the data. \fIYVec\fR is the name of
+a BLT vector or a list of numeric expressions.
+.PP
+Element configuration options may also be set by the \fBoption\fR
+command. The resource class is \f(CWElement\fR. The resource name is
+the name of the element.
+.CS
+option add *Graph.Element.symbol line
+option add *Graph.e1.symbol line
+.CE
+.RE
+.TP
+\fIpathName \fBelement create \fIelemName\fR ?\fIoption value\fR?...
+Creates a new element \fIelemName\fR. It's an error is
+an element \fIelemName\fR already exists. If
+additional arguments are present, they specify options valid for
+the element \fBconfigure\fR operation.
+.TP
+\fIpathName \fBelement deactivate \fIelemName\fR ?\fIelemName\fR?...
+Deactivates all the elements matching \fIpattern\fR.
+Elements whose names match any of the patterns given are redrawn using
+their normal colors.
+.TP
+\fIpathName \fBelement delete\fR ?\fIelemName\fR?...
+Deletes all the named elements. The graph is automatically redrawn.
+.TP
+\fIpathName \fBelement exists \fIelemName\fR
+Returns \f(CW1\fR if an element \fIelemName\fR currently exists and
+\f(CW0\fR otherwise.
+.TP
+\fIpathName \fBelement names \fR?\fIpattern\fR?...
+Returns the elements matching one or more pattern. If no
+\fIpattern\fR is given, the names of all elements is returned.
+.TP
+\fIpathName \fBelement show\fR ?\fInameList\fR?
+Queries or modifies the element display list. The element display
+list designates the elements drawn and in what
+order. \fINameList\fR is a list of elements to be displayed in the
+order they are named. If there is no \fInameList\fR argument,
+the current display list is returned.
+.TP
+\fIpathName \fBelement type\fR \fIelemName\fR
+Returns the type of \fIelemName\fR.
+If the element is a bar element, the commands returns the string
+\f(CW"bar"\fR, otherwise it returns \f(CW"line"\fR.
+.CE
+.SS "GRID COMPONENT"
+Grid lines extend from the major and minor ticks of each axis
+horizontally or vertically across the plotting area. The following
+operations are available for grid lines.
+.TP
+\fIpathName \fBgrid cget \fIoption\fR
+Returns the current value of the grid line configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described below
+for the grid \fBconfigure\fR operation.
+.TP
+\fIpathName \fBgrid configure\fR ?\fIoption value\fR?...
+Queries or modifies the configuration options for grid lines. If
+\fIoption\fR isn't specified, a list describing all the current
+grid options for \fIpathName\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the grid line option \fIoption\fR is set to
+\fIvalue\fR. The following options are valid for grid lines.
+.RS
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the grid lines. The default is \f(CWblack\fR.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the grid lines. \fIDashList\fR is a list of up
+to 11 numbers that alternately represent the lengths of the dashes
+and gaps on the grid lines. Each number must be between 1 and 255.
+If \fIdashList\fR is \f(CW""\fR, the grid will be solid lines.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the grid should be drawn. If \fIboolean\fR
+is true, grid lines are not shown. The default is \f(CWyes\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of grid lines. The default width is \f(CW1\fR.
+.TP
+\fB\-mapx \fIxAxis\fR
+Specifies the X\-axis to display grid lines. \fIXAxis\fR
+must be the name of an axis or \f(CW""\fR for no grid lines.
+The default is \f(CW""\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Specifies the Y\-axis to display grid lines. \fIYAxis\fR
+must be the name of an axis or \f(CW""\fR for no grid lines.
+The default is \f(CWy\fR.
+.TP
+\fB\-minor \fIboolean\fR
+Indicates whether the grid lines should be drawn for minor ticks.
+If \fIboolean\fR is true, the lines will appear at
+minor tick intervals. The default is \f(CW1\fR.
+.PP
+Grid configuration options may also be set by the
+\fBoption\fR command. The resource name and class are \f(CWgrid\fR and
+\f(CWGrid\fR respectively.
+.CS
+option add *Graph.grid.LineWidth 2
+option add *Graph.Grid.Color black
+.CE
+.RE
+.TP
+\fIpathName \fBgrid off\fR
+Turns off the display the grid lines.
+.TP
+\fIpathName \fBgrid on\fR
+Turns on the display the grid lines.
+.TP
+\fIpathName \fBgrid toggle\fR
+Toggles the display of the grid.
+.SS "LEGEND COMPONENT"
+The legend displays a list of the data elements. Each entry consists
+of the element's symbol and label. The legend can appear in any
+margin (the default location is in the right margin). It
+can also be positioned anywhere within the plotting area.
+.PP
+The following operations are valid for the legend.
+.TP
+\fIpathName \fBlegend activate \fIpattern\fR...
+Selects legend entries to be drawn using the active legend colors and relief.
+All entries whose element names match \fIpattern\fR are selected. To
+be selected, the element name must match only one \fIpattern\fR.
+.TP
+\fIpathName \fBlegend bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for a legend entry with this
+tag, \fIcommand\fR will be invoked. Implicitly the element names
+in the entry are tags. The syntax is similar to the
+\fBbind\fR command except that it operates on legend entries, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBlegend cget \fIoption\fR
+Returns the current value of a legend configuration option.
+\fIOption\fR may be any option described below in the
+legend \fBconfigure\fR operation.
+.TP
+\fIpathName \fBlegend configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options for the legend. If
+\fIoption\fR isn't specified, a list describing the current
+legend options for \fIpathName\fR is returned. If \fIoption\fR is
+specified, but not \fIvalue\fR, then a list describing \fIoption\fR is
+returned. If one or more \fIoption\fR and \fIvalue\fR pairs are
+specified, then for each pair, the legend option \fIoption\fR is set
+to \fIvalue\fR. The following options are valid for the legend.
+.RS
+.TP
+\fB\-activebackground \fIcolor\fR
+Sets the background color for active legend entries. All legend
+entries marked active (see the legend \fBactivate\fR operation) are
+drawn using this background color.
+.TP
+\fB\-activeborderwidth \fIpixels\fR
+Sets the width of the 3-D border around the outside edge of the active legend
+entries. The default is \f(CW2\fR.
+.TP
+\fB\-activeforeground \fIcolor\fR
+Sets the foreground color for active legend entries. All legend
+entries marked as active (see the legend \fBactivate\fR operation) are
+drawn using this foreground color.
+.TP
+\fB\-activerelief \fIrelief\fR
+Specifies the 3-D effect desired for active legend entries.
+\fIRelief\fR denotes how the interior of the entry should appear
+relative to the legend; for example, \f(CWraised\fR means the entry
+should appear to protrude from the legend, relative to the surface of
+the legend. The default is \f(CWflat\fR.
+.TP
+\fB\-anchor \fIanchor\fR
+Tells how to position the legend relative to the positioning point for
+the legend. This is dependent on the value of the \fB\-position\fR
+option. The default is \f(CWcenter\fR.
+.RS
+.TP 1.25i
+\f(CWleft\fR or \f(CWright\fR
+The anchor describes how to position the legend vertically.
+.TP
+\f(CWtop\fR or \f(CWbottom\fR
+The anchor describes how to position the legend horizontally.
+.TP
+\f(CW@x,y\fR
+The anchor specifies how to position the legend relative to the
+positioning point. For example, if \fIanchor\fR is \f(CWcenter\fR then
+the legend is centered on the point; if \fIanchor\fR is \f(CWn\fR then
+the legend will be drawn such that the top center point of the
+rectangular region occupied by the legend will be at the positioning
+point.
+.TP
+\f(CWplotarea\fR
+The anchor specifies how to position the legend relative to the
+plotting area. For example, if \fIanchor\fR is \f(CWcenter\fR then the
+legend is centered in the plotting area; if \fIanchor\fR is \f(CWne\fR
+then the legend will be drawn such that occupies the upper right
+corner of the plotting area.
+.RE
+.TP
+\fB\-background \fIcolor\fR
+Sets the background color of the legend. If \fIcolor\fR is \f(CW""\fR,
+the legend background with be transparent.
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for legend entries. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events are handled for legend entries. Each tag in the list matching
+the current event sequence will have its Tcl command executed. The
+default value is \f(CWall\fR.
+.TP
+\fB\-borderwidth \fIpixels\fR
+Sets the width of the 3-D border around the outside edge of the legend (if
+such border is being drawn; the \fBrelief\fR option determines this).
+The default is \f(CW2\fR pixels.
+.TP
+\fB\-font \fIfontName\fR
+\fIFontName\fR specifies a font to use when drawing the labels of each
+element into the legend. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-12-120-*\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Sets the foreground color of the text drawn for the element's label.
+The default is \f(CWblack\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the legend should be displayed. If \fIboolean\fR is
+true, the legend will not be draw. The default is \f(CWno\fR.
+.TP
+\fB\-ipadx \fIpad\fR
+Sets the amount of internal padding to be added to the width of each
+legend entry. \fIPad\fR can be a list of one or two screen distances. If
+\fIpad\fR has two elements, the left side of the legend entry is
+padded by the first distance and the right side by the second. If
+\fIpad\fR is just one distance, both the left and right sides are padded
+evenly. The default is \f(CW2\fR.
+.TP
+\fB\-ipady \fIpad\fR
+Sets an amount of internal padding to be added to the height of each
+legend entry. \fIPad\fR can be a list of one or two screen distances. If
+\fIpad\fR has two elements, the top of the entry is padded by the
+first distance and the bottom by the second. If \fIpad\fR is just
+one distance, both the top and bottom of the entry are padded evenly.
+The default is \f(CW2\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the padding to the left and right exteriors of the legend.
+\fIPad\fR can be a list of one or two screen distances. If \fIpad\fR
+has two elements, the left side of the legend is padded by the first
+distance and the right side by the second. If \fIpad\fR has just one
+distance, both the left and right sides are padded evenly. The
+default is \f(CW4\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the padding above and below the legend. \fIPad\fR can be a list
+of one or two screen distances. If \fIpad\fR has two elements, the area above
+the legend is padded by the first distance and the area below by the
+second. If \fIpad\fR is just one distance, both the top and
+bottom areas are padded evenly. The default is \f(CW0\fR.
+.TP
+\fB\-position \fIpos\fR
+Specifies where the legend is drawn. The
+\fB\-anchor\fR option also affects where the legend is positioned. If
+\fIpos\fR is \f(CWleft\fR, \f(CWleft\fR, \f(CWtop\fR, or \f(CWbottom\fR, the
+legend is drawn in the specified margin. If \fIpos\fR is
+\f(CWplotarea\fR, then the legend is drawn inside the plotting area at a
+particular anchor. If \fIpos\fR is in the form "\fI@x,y\fR", where
+\fIx\fR and \fIy\fR are the window coordinates, the legend is drawn in
+the plotting area at the specified coordinates. The default is
+\f(CWright\fR.
+.TP
+\fB\-raised \fIboolean\fR
+Indicates whether the legend is above or below the data elements. This
+matters only if the legend is in the plotting area. If \fIboolean\fR
+is true, the legend will be drawn on top of any elements that may
+overlap it. The default is \f(CWno\fR.
+.TP
+\fB\-relief \fIrelief\fR
+Specifies the 3-D effect for the border around the legend.
+\fIRelief\fR specifies how the interior of the legend should appear
+relative to the graph; for example, \f(CWraised\fR means the legend
+should appear to protrude from the graph, relative to the surface of
+the graph. The default is \f(CWsunken\fR.
+.PP
+Legend configuration options may also be set by the \fBoption\fR
+command. The resource name and class are \f(CWlegend\fR and
+\f(CWLegend\fR respectively.
+.CS
+option add *Graph.legend.Foreground blue
+option add *Graph.Legend.Relief raised
+.CE
+.RE
+.TP
+\fIpathName \fBlegend deactivate \fIpattern\fR...
+Selects legend entries to be drawn using the normal legend colors and
+relief. All entries whose element names match \fIpattern\fR are
+selected. To be selected, the element name must match only one
+\fIpattern\fR.
+.TP
+\fIpathName \fBlegend get \fIpos\fR
+Returns the name of the element whose entry is at the screen position
+\fIpos\fR in the legend. \fIPos\fR must be in the form "\fI@x,y\fR",
+where \fIx\fR and \fIy\fR are window coordinates. If the given
+coordinates do not lie over a legend entry, \f(CW""\fR is returned.
+.SS "PEN COMPONENTS"
+Pens define attributes (both symbol and line style) for elements.
+Pens mirror the configuration options of data elements that pertain to
+how symbols and lines are drawn. Data elements use pens to determine
+how they are drawn. A data element may use several pens at once. In
+this case, the pen used for a particular data point is determined from
+each element's weight vector (see the element's \fB\-weight\fR and
+\fB\-style\fR options).
+.PP
+One pen, called \f(CWactiveLine\fR, is automatically created.
+It's used as the default active pen for elements. So you can change
+the active attributes for all elements by simply reconfiguring this
+pen.
+.CS
+\&.g pen configure "activeLine" -color green
+.CE
+You can create and use several pens. To create a pen, invoke
+the pen component and its create operation.
+.CS
+\&.g pen create myPen
+.CE
+You map pens to a data element using either the element's
+\fB\-pen\fR or \fB\-activepen\fR options.
+.CS
+\&.g element create "line1" -xdata $x -ydata $tempData \\
+ -pen myPen
+.CE
+An element can use several pens at once. This is done by specifying
+the name of the pen in the element's style list (see the
+\fB\-styles\fR option).
+.CS
+\&.g element configure "line1" -styles { myPen 2.0 3.0 }
+.CE
+This says that any data point with a weight between 2.0 and 3.0
+is to be drawn using the pen \f(CWmyPen\fR. All other points
+are drawn with the element's default attributes.
+.PP
+The following operations are available for pen components.
+.PP
+.TP
+\fIpathName \fBpen \fBcget \fIpenName \fIoption\fR
+Returns the current value of the option given by \fIoption\fR for
+\fIpenName\fR. \fIOption\fR may be any option described below
+for the pen \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpen \fBconfigure \fIpenName \fR?\fIpenName\fR... ?\fIoption value\fR?...
+Queries or modifies the configuration options of
+\fIpenName\fR. Several pens can be modified at once. If \fIoption\fR
+isn't specified, a list describing the current options for
+\fIpenName\fR is returned. If \fIoption\fR is specified, but not
+\fIvalue\fR, then a list describing \fIoption\fR is returned. If one
+or more \fIoption\fR and \fIvalue\fR pairs are specified, then for
+each pair, the pen option \fIoption\fR is set to \fIvalue\fR. The
+following options are valid for pens.
+.RS
+.TP
+\fB\-color \fIcolor\fR
+Sets the color of the traces connecting the data points.
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of element line. \fIDashList\fR is a list of up to
+11 numbers that alternately represent the lengths of the dashes and
+gaps on the element line. Each number must be between 1 and 255. If
+\fIdashList\fR is \f(CW""\fR, the lines will be solid.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the interior color of symbols. If \fIcolor\fR is \f(CW""\fR, then
+the interior of the symbol is transparent. If \fIcolor\fR is
+\f(CWdefcolor\fR, then the color will be the same as the \fB\-color\fR
+option. The default is \f(CWdefcolor\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the connecting lines between data points. If
+\fIpixels\fR is \f(CW0\fR, no connecting lines will be drawn between
+symbols. The default is \f(CW0\fR.
+.TP
+\fB\-offdash \fIcolor\fR
+Sets the color of the stripes when traces are dashed (see the
+\fB\-dashes\fR option). If \fIcolor\fR is \f(CW""\fR, then the "off"
+pixels will represent gaps instead of stripes. If \fIcolor\fR is
+\f(CWdefcolor\fR, then the color will be the same as the \fB\-color\fR
+option. The default is \f(CWdefcolor\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color or the outline around each symbol. If \fIcolor\fR is
+\f(CW""\fR, then no outline is drawn. If \fIcolor\fR is \f(CWdefcolor\fR,
+then the color will be the same as the \fB\-color\fR option. The
+default is \f(CWdefcolor\fR.
+.TP
+\fB\-outlinewidth \fIpixels\fR
+Sets the width of the outline bordering each symbol. If \fIpixels\fR
+is \f(CW0\fR, no outline will be drawn. The default is \f(CW1\fR.
+.TP
+\fB\-pixels \fIpixels\fR
+Sets the size of symbols. If \fIpixels\fR is \f(CW0\fR, no symbols will
+be drawn. The default is \f(CW0.125i\fR.
+.TP
+\fB\-symbol \fIsymbol\fR
+Specifies the symbol for data points. \fISymbol\fR can be either
+\f(CWsquare\fR, \f(CWcircle\fR, \f(CWdiamond\fR, \f(CWplus\fR, \f(CWcross\fR,
+\f(CWsplus\fR, \f(CWscross\fR, \f(CWtriangle\fR, \f(CW""\fR (where no symbol
+is drawn), or a bitmap. Bitmaps are specified as "\fIsource\fR
+?\fImask\fR?", where \fIsource\fR is the name of the bitmap, and
+\fImask\fR is the bitmap's optional mask. The default is
+\f(CWcircle\fR.
+.TP
+\fB\-type \fIelemType\fR
+Specifies the type of element the pen is to be used with.
+This option should only be employed when creating the pen. This
+is for those that wish to mix different types of elements (bars and
+lines) on the same graph. The default type is "line".
+.PP
+Pen configuration options may be also be set by the \fBoption\fR
+command. The resource class is \f(CWPen\fR. The resource names
+are the names of the pens.
+.CS
+option add *Graph.Pen.Color blue
+option add *Graph.activeLine.color green
+.CE
+.RE
+.TP
+\fIpathName \fBpen \fBcreate \fIpenName \fR?\fIoption value\fR?...
+Creates a new pen by the name \fIpenName\fR. No pen by the same
+name can already exist. \fIOption\fR and \fIvalue\fR are described
+in above in the pen \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpen \fBdelete \fR?\fIpenName\fR?...
+Deletes the named pens. A pen is not really
+deleted until it is not longer in use, so it's safe to delete
+pens mapped to elements.
+.TP
+\fIpathName \fBpen names \fR?\fIpattern\fR?...
+Returns a list of pens matching zero or more patterns. If no
+\fIpattern\fR argument is give, the names of all pens are returned.
+.SS "POSTSCRIPT COMPONENT"
+The graph can generate encapsulated PostScript output. There
+are several configuration options you can specify to control how the
+plot will be generated. You can change the page dimensions and
+borders. The plot itself can be scaled, centered, or rotated to
+landscape. The PostScript output can be written directly to a file or
+returned through the interpreter.
+.PP
+The following postscript operations are available.
+.TP
+\fIpathName \fBpostscript cget \fIoption\fR
+Returns the current value of the postscript option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below for the postscript \fBconfigure\fR operation.
+.TP
+\fIpathName \fBpostscript configure \fR?\fIoption value\fR?...
+Queries or modifies the configuration options for PostScript
+generation. If \fIoption\fR isn't specified, a list describing
+the current postscript options for \fIpathName\fR is returned. If
+\fIoption\fR is specified, but not \fIvalue\fR, then a list describing
+\fIoption\fR is returned. If one or more \fIoption\fR and \fIvalue\fR
+pairs are specified, then for each pair, the postscript option
+\fIoption\fR is set to \fIvalue\fR. The following postscript options
+are available.
+.RS
+.TP
+\fB\-center \fIboolean\fR
+Indicates whether the plot should be centered on the PostScript page. If
+\fIboolean\fR is false, the plot will be placed in the upper left
+corner of the page. The default is \f(CW1\fR.
+.TP
+\fB\-colormap \fIvarName\fR
+\fIVarName\fR must be the name of a global array variable that
+specifies a color mapping from the X color name to PostScript. Each
+element of \fIvarName\fR must consist of PostScript code to set a
+particular color value (e.g. ``\f(CW1.0 1.0 0.0 setrgbcolor\fR''). When
+generating color information in PostScript, the array variable \fIvarName\fR
+is checked if an element of the name as the color exists. If so, it uses
+its value as the PostScript
+command to set the color. If this option hasn't been specified, or if
+there isn't an entry in \fIvarName\fR for a given color, then it uses
+the red, green, and blue intensities from the X color.
+.TP
+\fB\-colormode \fImode\fR
+Specifies how to output color information. \fIMode\fR must be either
+\f(CWcolor\fR (for full color output), \f(CWgray\fR (convert all colors to
+their gray-scale equivalents) or \f(CWmono\fR (convert foreground colors
+to black and background colors to white). The default mode is
+\f(CWcolor\fR.
+.TP
+\fB\-fontmap \fIvarName\fR
+\fIVarName\fR must be the name of a global array variable that
+specifies a font mapping from the X font name to PostScript. Each
+element of \fIvarName\fR must consist of a Tcl list with one or two
+elements; the name and point size of a PostScript font.
+When outputting PostScript commands for a particular font, the array
+variable \fIvarName\fR is checked to see if an element by the
+specified font exists. If there is such an element, then the font
+information contained in that element is used in the PostScript
+output. (If the point size is omitted from the list, the point size
+of the X font is used). Otherwise the X font is examined in an
+attempt to guess what PostScript font to use. This works only for
+fonts whose foundry property is \fIAdobe\fR (such as Times, Helvetica,
+Courier, etc.). If all of this fails then the font defaults to
+\f(CWHelvetica-Bold\fR.
+.TP
+\fB\-decorations \fIboolean\fR
+Indicates whether PostScript commands to generate color backgrounds and 3-D
+borders will be output. If \fIboolean\fR is false, the background will be
+white and no 3-D borders will be generated. The
+default is \f(CW1\fR.
+.TP
+\fB\-height \fIpixels\fR
+Sets the height of the plot. This lets you print the graph with a
+height different from the one drawn on the screen. If
+\fIpixels\fR is 0, the height is the same as the widget's height.
+The default is \f(CW0\fR.
+.TP
+\fB\-landscape \fIboolean\fR
+If \fIboolean\fR is true, this specifies the printed area is to be
+rotated 90 degrees. In non-rotated output the X\-axis of the printed
+area runs along the short dimension of the page (``portrait''
+orientation); in rotated output the X\-axis runs along the long
+dimension of the page (``landscape'' orientation). Defaults to
+\f(CW0\fR.
+.TP
+\fB\-maxpect \fIboolean\fR
+Indicates to scale the plot so that it fills the PostScript page.
+The aspect ratio of the graph is still retained. The default is
+\f(CW0\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the horizontal padding for the left and right page borders. The
+borders are exterior to the plot. \fIPad\fR can be a list of one or
+two screen distances. If \fIpad\fR has two elements, the left border is padded
+by the first distance and the right border by the second. If
+\fIpad\fR has just one distance, both the left and right borders are
+padded evenly. The default is \f(CW1i\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the vertical padding for the top and bottom page borders. The
+borders are exterior to the plot. \fIPad\fR can be a list of one or
+two screen distances. If \fIpad\fR has two elements, the top border is padded
+by the first distance and the bottom border by the second. If
+\fIpad\fR has just one distance, both the top and bottom borders are
+padded evenly. The default is \f(CW1i\fR.
+.TP
+\fB\-paperheight \fIpixels\fR
+Sets the height of the postscript page. This can be used to select
+between different page sizes (letter, A4, etc). The default height is
+\f(CW11.0i\fR.
+.TP
+\fB\-paperwidth \fIpixels\fR
+Sets the width of the postscript page. This can be used to select
+between different page sizes (letter, A4, etc). The default width is
+\f(CW8.5i\fR.
+.TP
+\fB\-width \fIpixels\fR
+Sets the width of the plot. This lets you generate a plot
+of a width different from that of the widget. If \fIpixels\fR
+is 0, the width is the same as the widget's width. The default is
+\f(CW0\fR.
+.PP
+Postscript configuration options may be also be set by the
+\fBoption\fR command. The resource name and class are
+\f(CWpostscript\fR and \f(CWPostscript\fR respectively.
+.CS
+option add *Graph.postscript.Decorations false
+option add *Graph.Postscript.Landscape true
+.CE
+.RE
+.TP
+\fIpathName \fBpostscript output \fR?\fIfileName\fR? ?\fIoption value\fR?...
+Outputs a file of encapsulated PostScript. If a
+\fIfileName\fR argument isn't present, the command returns the
+PostScript. If any \fIoption-value\fR pairs are present, they set
+configuration options controlling how the PostScript is generated.
+\fIOption\fR and \fIvalue\fR can be anything accepted by the
+postscript \fBconfigure\fR operation above.
+.SS "MARKER COMPONENTS"
+Markers are simple drawing procedures used to annotate or highlight
+areas of the graph. Markers have various types: text strings,
+bitmaps, images, connected lines, windows, or polygons. They can be
+associated with a particular element, so that when the element is
+hidden or un-hidden, so is the marker. By default, markers are the
+last items drawn, so that data elements will appear in
+behind them. You can change this by configuring the \fB\-under\fR
+option.
+.PP
+Markers, in contrast to elements, don't affect the scaling of the
+coordinate axes. They can also have \fIelastic\fR coordinates
+(specified by \f(CW-Inf\fR and \f(CWInf\fR respectively) that translate
+into the minimum or maximum limit of the axis. For example, you can
+place a marker so it always remains in the lower left corner of the
+plotting area, by using the coordinates \f(CW-Inf\fR,\f(CW-Inf\fR.
+.PP
+The following operations are available for markers.
+.TP
+\fIpathName \fBmarker after \fImarkerId\fR ?\fIafterId\fR?
+Changes the order of the markers, drawing the first
+marker after the second. If no second \fIafterId\fR argument is
+specified, the marker is placed at the end of the display list. This
+command can be used to control how markers are displayed since markers
+are drawn in the order of this display list.
+.TP
+\fIpathName \fBmarker before \fImarkerId\fR ?\fIbeforeId\fR?
+Changes the order of the markers, drawing the first
+marker before the second. If no second \fIbeforeId\fR argument is
+specified, the marker is placed at the beginning of the display list.
+This command can be used to control how markers are displayed since
+markers are drawn in the order of this display list.
+.TP
+\fIpathName \fBmarker bind \fItagName\fR ?\fIsequence\fR? ?\fIcommand\fR?
+Associates \fIcommand\fR with \fItagName\fR such that whenever the
+event sequence given by \fIsequence\fR occurs for a marker with this
+tag, \fIcommand\fR will be invoked. The syntax is similar to the
+\fBbind\fR command except that it operates on graph markers, rather
+than widgets. See the \fBbind\fR manual entry for
+complete details on \fIsequence\fR and the substitutions performed on
+\fIcommand\fR before invoking it.
+.sp
+If all arguments are specified then a new binding is created, replacing
+any existing binding for the same \fIsequence\fR and \fItagName\fR.
+If the first character of \fIcommand\fR is \f(CW+\fR then \fIcommand\fR
+augments an existing binding rather than replacing it.
+If no \fIcommand\fR argument is provided then the command currently
+associated with \fItagName\fR and \fIsequence\fR (it's an error occurs
+if there's no such binding) is returned. If both \fIcommand\fR and
+\fIsequence\fR are missing then a list of all the event sequences for
+which bindings have been defined for \fItagName\fR.
+.TP
+\fIpathName \fBmarker cget \fIoption\fR
+Returns the current value of the marker configuration option given by
+\fIoption\fR. \fIOption\fR may be any option described
+below in the \fBconfigure\fR operation.
+.TP
+\fIpathName \fBmarker configure \fImarkerId\fR ?\fIoption value\fR?...
+Queries or modifies the configuration options for markers. If
+\fIoption\fR isn't specified, a list describing the current
+options for \fImarkerId\fR is returned. If \fIoption\fR is specified,
+but not \fIvalue\fR, then a list describing \fIoption\fR is returned.
+If one or more \fIoption\fR and \fIvalue\fR pairs are specified, then
+for each pair, the marker option \fIoption\fR is set to \fIvalue\fR.
+.sp
+The following options are valid for all markers.
+Each type of marker also has its own type-specific options.
+They are described in the sections below.
+.RS
+.TP
+\fB\-bindtags \fItagList\fR
+Specifies the binding tags for the marker. \fITagList\fR is a list
+of binding tag names. The tags and their order will determine how
+events for markers are handled. Each tag in the list matching the
+current event sequence will have its Tcl command executed. Implicitly
+the name of the marker is always the first tag in the list.
+The default value is \f(CWall\fR.
+.TP
+\fB\-coords \fIcoordList\fR
+Specifies the coordinates of the marker. \fICoordList\fR is
+a list of graph coordinates. The number of coordinates required
+is dependent on the type of marker. Text, image, and window markers
+need only two coordinates (an X\-Y coordinate). Bitmap markers
+can take either two or four coordinates (if four, they represent the
+corners of the bitmap). Line markers
+need at least four coordinates, polygons at least six.
+If \fIcoordList\fR is \f(CW""\fR, the marker will not be displayed.
+The default is \f(CW""\fR.
+.TP
+\fB\-element \fIelemName\fR
+Links the marker with the element \fIelemName\fR. The marker is
+drawn only if the element is also currently displayed (see the
+element's \fBshow\fR operation). If \fIelemName\fR is \f(CW""\fR, the
+marker is always drawn. The default is \f(CW""\fR.
+.TP
+\fB\-hide \fIboolean\fR
+Indicates whether the marker is drawn. If \fIboolean\fR is true,
+the marker is not drawn. The default is \f(CWno\fR.
+.TP
+\fB\-mapx \fIxAxis\fR
+Specifies the X\-axis to map the marker's X\-coordinates onto.
+\fIXAxis\fR must the name of an axis. The default is \f(CWx\fR.
+.TP
+\fB\-mapy \fIyAxis\fR
+Specifies the Y\-axis to map the marker's Y\-coordinates onto.
+\fIYAxis\fR must the name of an axis. The default is \f(CWy\fR.
+.TP
+\fB\-name \fImarkerId\fR
+Changes the identifier for the marker. The identifier \fImarkerId\fR
+can not already be used by another marker. If this option
+isn't specified, the marker's name is uniquely generated.
+.TP
+\fB\-under \fIboolean\fR
+Indicates whether the marker is drawn below/above data
+elements. If \fIboolean\fR is true, the marker is be drawn
+underneath the data element symbols and lines. Otherwise, the marker is
+drawn on top of the element. The default is \f(CW0\fR.
+.TP
+\fB\-xoffset \fIpixels\fR
+Specifies a screen distance to offset the marker horizontally.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+The default is \f(CW0\fR.
+.TP
+\fB\-yoffset \fIpixels\fR
+Specifies a screen distance to offset the markers vertically.
+\fIPixels\fR is a valid screen distance, such as \f(CW2\fR or \f(CW1.2i\fR.
+The default is \f(CW0\fR.
+.PP
+Marker configuration options may also be set by the \fBoption\fR command.
+The resource class is either \f(CWBitmapMarker\fR, \f(CWImageMarker\fR,
+\f(CWLineMarker\fR, \f(CWPolygonMarker\fR, \f(CWTextMarker\fR, or \f(CWWindowMarker\fR,
+depending on the type of marker. The resource name is the name of the
+marker.
+.CS
+option add *Graph.TextMarker.Foreground white
+option add *Graph.BitmapMarker.Foreground white
+option add *Graph.m1.Background blue
+.CE
+.RE
+.TP
+\fIpathName \fBmarker create \fItype\fR ?\fIoption value\fR?...
+Creates a marker of the selected type. \fIType\fR may be either
+\f(CWtext\fR, \f(CWline\fR, \f(CWbitmap\fR, \f(CWimage\fR, \f(CWpolygon\fR, or
+\f(CWwindow\fR. This command returns the marker identifier,
+used as the \fImarkerId\fR argument in the other marker-related
+commands. If the \fB\-name\fR option is used, this overrides the
+normal marker identifier. If the name provided is already used for
+another marker, the new marker will replace the old.
+.TP
+\fIpathName \fBmarker delete\fR ?\fIname\fR?...
+Removes one of more markers. The graph will automatically be redrawn
+without the marker.\fR.
+.TP
+\fIpathName \fBmarker exists \fImarkerId\fR
+Returns \f(CW1\fR if the marker \fImarkerId\fR exists and \f(CW0\fR
+otherwise.
+.TP
+\fIpathName \fBmarker names\fR ?\fIpattern\fR?
+Returns the names of all the markers that currently exist. If
+\fIpattern\fR is supplied, only those markers whose names match it
+will be returned.
+.TP
+\fIpathName \fBmarker type \fImarkerId\fR
+Returns the type of the marker given by \fImarkerId\fR, such as
+\f(CWline\fR or \f(CWtext\fR. If \fImarkerId\fR is not a valid a marker
+identifier, \f(CW""\fR is returned.
+.SS "BITMAP MARKERS"
+A bitmap marker displays a bitmap. The size of the
+bitmap is controlled by the number of coordinates specified. If two
+coordinates, they specify the position of the top-left corner of the
+bitmap. The bitmap retains its normal width and height. If four
+coordinates, the first and second pairs of coordinates represent the
+corners of the bitmap. The bitmap will be stretched or reduced as
+necessary to fit into the bounding rectangle.
+.PP
+Bitmap markers are created with the marker's \fBcreate\fR operation in
+the form:
+.DS
+\fIpathName \fBmarker create bitmap \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR pairs, each
+sets a configuration options for the marker. These
+same \fIoption\fR\-\fIvalue\fR pairs may be used with the marker's
+\fBconfigure\fR operation.
+.PP
+The following options are specific to bitmap markers:
+.TP
+\fB\-background \fIcolor\fR
+Same as the \fB\-fill\fR option.
+.TP
+\fB\-bitmap \fIbitmap\fR
+Specifies the bitmap to be displayed. If \fIbitmap\fR is \f(CW""\fR,
+the marker will not be displayed. The default is \f(CW""\fR.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the bitmap. If \fIcolor\fR is the empty
+string, no background will be transparent. The default background color is
+\f(CW""\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Same as the \fB\-outline\fR option.
+.TP
+\fB\-mask \fImask\fR
+Specifies a mask for the bitmap to be displayed. This mask is a bitmap
+itself, denoting the pixels that are transparent. If \fImask\fR is
+\f(CW""\fR, all pixels of the bitmap will be drawn. The default is
+\f(CW""\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the foreground color of the bitmap. The default value is \f(CWblack\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Sets the rotation of the bitmap. \fITheta\fR is a real number
+representing the angle of rotation in degrees. The marker is first
+rotated and then placed according to its anchor position. The default
+rotation is \f(CW0.0\fR.
+.SS "IMAGE MARKERS"
+A image marker displays an image. Image markers are
+created with the marker's \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create image \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to image markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the image relative to the
+positioning point for the image. For example, if \fIanchor\fR
+is \f(CWcenter\fR then the image is centered on the point; if
+\fIanchor\fR is \f(CWn\fR then the image will be drawn such that
+the top center point of the rectangular region occupied by the
+image will be at the positioning point.
+This option defaults to \f(CWcenter\fR.
+.TP
+\fB\-image \fIimage\fR
+Specifies the image to be drawn.
+If \fIimage\fR is \f(CW""\fR, the marker will not be
+drawn. The default is \f(CW""\fR.
+.SS "LINE MARKERS"
+A line marker displays one or more connected line segments.
+Line markers are created with marker's \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create line \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to line markers:
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the line. \fIDashList\fR is a list of up to 11
+numbers that alternately represent the lengths of the dashes and gaps
+on the line. Each number must be between 1 and 255. If
+\fIdashList\fR is \f(CW""\fR, the marker line will be solid.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the line. This color is used with
+striped lines (see the \fB\-fdashes\fR option). If \fIcolor\fR is
+the empty string, no background color is drawn (the line will be
+dashed, not striped). The default background color is \f(CW""\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the lines.
+The default width is \f(CW0\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the foreground color of the line. The default value is \f(CWblack\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies a stipple pattern used to draw the line, rather than
+a solid line.
+\fIBitmap\fR specifies a bitmap to use as the stipple
+pattern. If \fIbitmap\fR is \f(CW""\fR, then the
+line is drawn in a solid fashion. The default is \f(CW""\fR.
+.SS "POLYGON MARKERS"
+A polygon marker displays a closed region described as two or more
+connected line segments. It is assumed the first and
+last points are connected. Polygon markers are created using the
+marker \fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create polygon \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the \fBmarker configure\fR command to change the marker's
+configuration.
+The following options are supported for polygon markers:
+.TP
+\fB\-dashes \fIdashList\fR
+Sets the dash style of the outline of the polygon. \fIDashList\fR is a
+list of up to 11 numbers that alternately represent the lengths of
+the dashes and gaps on the outline. Each number must be between 1 and
+255. If \fIdashList\fR is \f(CW""\fR, the outline will be a solid line.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the fill color of the polygon. If \fIcolor\fR is \f(CW""\fR, then
+the interior of the polygon is transparent.
+The default is \f(CWwhite\fR.
+.TP
+\fB\-linewidth \fIpixels\fR
+Sets the width of the outline of the polygon. If \fIpixels\fR is zero,
+no outline is drawn. The default is \f(CW0\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color of the outline of the polygon. If the polygon is
+stippled (see the \fB\-stipple\fR option), then this represents the
+foreground color of the stipple. The default is \f(CWblack\fR.
+.TP
+\fB\-stipple \fIbitmap\fR
+Specifies that the polygon should be drawn with a stippled pattern
+rather than a solid color. \fIBitmap\fR specifies a bitmap to use as
+the stipple pattern. If \fIbitmap\fR is \f(CW""\fR, then the polygon is
+filled with a solid color (if the \fB\-fill\fR option is set). The
+default is \f(CW""\fR.
+.SS "TEXT MARKERS"
+A text marker displays a string of characters on one or more lines of
+text. Embedded newlines cause line breaks. They may be used to
+annotate regions of the graph. Text markers are created with the
+\fBcreate\fR operation in the form:
+.DS
+\fIpathName \fBmarker create text \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR pairs,
+each sets a configuration option for the text marker.
+These same \fIoption\fR\-\fIvalue\fR pairs may be used with the
+marker's \fBconfigure\fR operation.
+.PP
+The following options are specific to text markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the text relative to the
+positioning point for the text. For example, if \fIanchor\fR is
+\f(CWcenter\fR then the text is centered on the point; if
+\fIanchor\fR is \f(CWn\fR then the text will be drawn such that the
+top center point of the rectangular region occupied by the text will
+be at the positioning point. This default is \f(CWcenter\fR.
+.TP
+\fB\-background \fIcolor\fR
+Same as the \fB\-fill\fR option.
+.TP
+\fB\-font \fIfontName\fR
+Specifies the font of the text. The default is
+\f(CW*-Helvetica-Bold-R-Normal-*-120-*\fR.
+.TP
+\fB\-fill \fIcolor\fR
+Sets the background color of the text. If \fIcolor\fR is the empty
+string, no background will be transparent. The default background color is
+\f(CW""\fR.
+.TP
+\fB\-foreground \fIcolor\fR
+Same as the \fB\-outline\fR option.
+.TP
+\fB\-justify \fIjustify\fR
+Specifies how the text should be justified. This matters only when
+the marker contains more than one line of text. \fIJustify\fR must be
+\f(CWleft\fR, \f(CWright\fR, or \f(CWcenter\fR. The default is
+\f(CWcenter\fR.
+.TP
+\fB\-outline \fIcolor\fR
+Sets the color of the text. The default value is \f(CWblack\fR.
+.TP
+\fB\-padx \fIpad\fR
+Sets the padding to the left and right exteriors of the text.
+\fIPad\fR can be a list of one or two screen distances. If \fIpad\fR
+has two elements, the left side of the text is padded by the first
+distance and the right side by the second. If \fIpad\fR has just one
+distance, both the left and right sides are padded evenly. The
+default is \f(CW4\fR.
+.TP
+\fB\-pady \fIpad\fR
+Sets the padding above and below the text. \fIPad\fR can be a list of
+one or two screen distances. If \fIpad\fR has two elements, the area above the
+text is padded by the first distance and the area below by the second.
+If \fIpad\fR is just one distance, both the top and bottom areas
+are padded evenly. The default is \f(CW4\fR.
+.TP
+\fB\-rotate \fItheta\fR
+Specifies the number of degrees to rotate the text. \fITheta\fR is a
+real number representing the angle of rotation. The marker is first
+rotated along its center and is then drawn according to its anchor
+position. The default is \f(CW0.0\fR.
+.TP
+\fB\-text \fItext\fR
+Specifies the text of the marker. The exact way the text is
+displayed may be affected by other options such as \fB\-anchor\fR or
+\fB\-rotate\fR.
+.SS "WINDOW MARKERS"
+A window marker displays a widget at a given position.
+Window markers are created with the marker's \fBcreate\fR operation in
+the form:
+.DS
+\fIpathName \fBmarker create window \fR?\fIoption value\fR?...
+.DE
+There may be many \fIoption\fR-\fIvalue\fR
+pairs, each sets a configuration option
+for the marker. These same \fIoption\fR\-\fIvalue\fR pairs may be
+used with the marker's \fBconfigure\fR command.
+.PP
+The following options are specific to window markers:
+.TP
+\fB\-anchor \fIanchor\fR
+\fIAnchor\fR tells how to position the widget relative to the
+positioning point for the widget. For example, if \fIanchor\fR is
+\f(CWcenter\fR then the widget is centered on the point; if \fIanchor\fR
+is \f(CWn\fR then the widget will be displayed such that the top center
+point of the rectangular region occupied by the widget will be at the
+positioning point. This option defaults to \f(CWcenter\fR.
+.TP
+\fB\-height \fIpixels\fR
+Specifies the height to assign to the marker's window. If this option
+isn't specified, or if it is specified as \f(CW""\fR, then the window is
+given whatever height the widget requests internally.
+.TP
+\fB\-width \fIpixels\fR
+Specifies the width to assign to the marker's window. If this option
+isn't specified, or if it is specified as \f(CW""\fR, then the window is
+given whatever width the widget requests internally.
+.TP
+\fB\-window \fIpathName\fR
+Specifies the widget to be managed by the graph. \fIPathName\fR must
+be a child of the \fBgraph\fR widget.
+.SH "GRAPH COMPONENT BINDINGS"
+Specific graph components, such as elements, markers and legend
+entries, can have a command trigger when event occurs in them, much
+like canvas items in Tk's canvas widget. Not all event sequences are
+valid. The only binding events that may be specified are those
+related to the mouse and keyboard (such as \fBEnter\fR, \fBLeave\fR,
+\fBButtonPress\fR, \fBMotion\fR, and \fBKeyPress\fR).
+.PP
+Only one element or marker can be picked during an event. This means,
+that if the mouse is directly over both an element and a marker, only
+the uppermost component is selected. This isn't true for legend entries.
+Both a legend entry and an element (or marker) binding commands
+will be invoked if both items are picked.
+.PP
+It is possible for multiple bindings to match a particular event.
+This could occur, for example, if one binding is associated with the
+element name and another is associated with one of the element's tags
+(see the \fB\-bindtags\fR option). When this occurs, all of the
+matching bindings are invoked. A binding associated with the element
+name is invoked first, followed by one binding for each of the element's
+bindtags. If there are multiple matching bindings for a single tag,
+then only the most specific binding is invoked. A continue command
+in a binding script terminates that script, and a break command
+terminates that script and skips any remaining scripts for the event,
+just as for the bind command.
+.PP
+The \fB\-bindtags\fR option for these components controls addition
+tag names which can be matched. Implicitly elements and markers
+always have tags matching their names. Setting the value of
+the \fB\-bindtags\fR option doesn't change this.
+.SH "C LANGUAGE API"
+You can manipulate data elements from the C language. There
+may be situations where it is too expensive to translate the data
+values from ASCII strings. Or you might want to read data in a
+special file format.
+.PP
+Data can manipulated from the C language using BLT vectors.
+You specify the X-Y data coordinates of an element as vectors and
+manipulate the vector from C. The graph will be redrawn automatically
+after the vectors are updated.
+.PP
+From Tcl, create the vectors and configure the element to use them.
+.CS
+vector X Y
+\&.g element configure line1 -xdata X -ydata Y
+.CE
+To set data points from C, you pass the values as arrays of doubles
+using the \fBBlt_ResetVector\fR call. The vector is reset with the
+new data and at the next idle point (when Tk re-enters its event
+loop), the graph will be redrawn automatically.
+.CS
+#include <tcl.h>
+#include <blt.h>
+
+register int i;
+Blt_Vector *xVec, *yVec;
+double x[50], y[50];
+
+/* Get the BLT vectors "X" and "Y" (created above from Tcl) */
+if ((Blt_GetVector(interp, "X", &xVec) != TCL_OK) ||
+ (Blt_GetVector(interp, "Y", &yVec) != TCL_OK)) {
+ return TCL_ERROR;
+}
+
+for (i = 0; i < 50; i++) {
+ x[i] = i * 0.02;
+ y[i] = sin(x[i]);
+}
+
+/* Put the data into BLT vectors */
+if ((Blt_ResetVector(xVec, x, 50, 50, TCL_VOLATILE) != TCL_OK) ||
+ (Blt_ResetVector(yVec, y, 50, 50, TCL_VOLATILE) != TCL_OK)) {
+ return TCL_ERROR;
+}
+.CE
+See the \fBvector\fR manual page for more details.
+.SH SPEED TIPS
+There may be cases where the graph needs to be drawn and updated as
+quickly as possible. If drawing speed becomes a big
+problem, here are a few tips to speed up displays.
+.TP 2
+\(bu
+Try to minimize the number of data points. The more data points
+the looked at, the more work the graph must do.
+.TP 2
+\(bu
+If your data is generated as floating point values, the time required
+to convert the data values to and from ASCII strings can be
+significant, especially when there any many data points. You can
+avoid the redundant string-to-decimal conversions using the C API to
+BLT vectors.
+.TP 2
+\(bu
+Data elements without symbols are drawn faster than with symbols.
+Set the data element's \fB\-symbol\fR option to \f(CWnone\fR. If you need to
+draw symbols, try using the simple symbols such as \f(CWsplus\fR and
+\f(CWscross\fR.
+.TP 2
+\(bu
+Don't stipple or dash the element. Solid lines are much faster.
+.TP 2
+\(bu
+If you update data elements frequently, try turning off the
+widget's \fB\-bufferelements\fR option. When the graph is first
+displayed, it draws data elements into an internal pixmap. The pixmap
+acts as a cache, so that when the graph needs to be redrawn again, and
+the data elements or coordinate axes haven't changed, the pixmap is
+simply copied to the screen. This is especially useful when you are
+using markers to highlight points and regions on the graph. But if
+the graph is updated frequently, changing either the element data or
+coordinate axes, the buffering becomes redundant.
+.SH LIMITATIONS
+Auto-scale routines do not use requested min/max limits as boundaries
+when the axis is logarithmically scaled.
+.PP
+The PostScript output generated for polygons with more than 1500
+points may exceed the limits of some printers (See PostScript Language
+Reference Manual, page 568). The work-around is to break the polygon
+into separate pieces.
+.SH KEYWORDS
+graph, widget
diff --git a/doc/vector.n b/doc/vector.n
new file mode 100644
index 0000000..da7abf2
--- /dev/null
+++ b/doc/vector.n
@@ -0,0 +1,1130 @@
+'\"
+'\" Copyright 1991-1997 by Lucent Technologies, Inc.
+'\"
+'\" Permission to use, copy, modify, and distribute this software and its
+'\" documentation for any purpose and without fee is hereby granted, provided
+'\" that the above copyright notice appear in all copies and that both that the
+'\" copyright notice and warranty disclaimer appear in supporting documentation,
+'\" and that the names of Lucent Technologies any of their entities not be used
+'\" in advertising or publicity pertaining to distribution of the software
+'\" without specific, written prior permission.
+'\"
+'\" Lucent Technologies disclaims all warranties with regard to this software,
+'\" including all implied warranties of merchantability and fitness. In no event
+'\" shall Lucent Technologies be liable for any special, indirect or
+'\" consequential damages or any damages whatsoever resulting from loss of use,
+'\" data or profits, whether in an action of contract, negligence or other
+'\" tortuous action, arising out of or in connection with the use or performance
+'\" of this software.
+'\"
+'\" Vector command created by George Howlett.
+'\"
+.so man.macros
+.TH blt::vector n BLT_VERSION BLT "BLT Built-In Commands"
+.BS
+'\" Note: do not modify the .SH NAME line immediately below!
+.SH NAME
+\fBvector\fR \- Vector data type for Tcl
+.SH SYNOPSIS
+\fBblt::vector create \fIvecName \fR?\fIvecName\fR...? ?\fIswitches\fR?
+.sp
+\fBblt::vector destroy \fIvecName \fR?\fIvecName\fR...?
+.sp
+\fBblt::vector expr \fIexpression\fR
+.sp
+\fBblt::vector names \fR?\fIpattern\fR...?
+.BE
+.SH DESCRIPTION
+The \fBvector\fR command creates an array of floating point
+values. The vector's components can be manipulated in three ways:
+through a Tcl array variable, a Tcl command, or the C API.
+.SH INTRODUCTION
+A vector is an ordered set of real numbers. The components of a
+vector are indexed by integers.
+.PP
+Vectors are common data structures for many applications. For
+example, a graph may use two vectors to represent the X-Y
+coordinates of the data plotted. The graph will automatically
+be redrawn when the vectors are updated or changed. By using vectors,
+you can separate
+data analysis from the graph widget. This makes it easier, for
+example, to add data transformations, such as splines. It's possible
+to plot the same data to in multiple graphs, where each graph presents
+a different view or scale of the data.
+.PP
+You could try to use Tcl's associative arrays as vectors. Tcl arrays
+are easy to use. You can access individual elements randomly by
+specifying the index, or the set the entire array by providing a list
+of index and value pairs for each element. The disadvantages of
+associative arrays as vectors lie in the fact they are implemented as
+hash tables.
+.TP 2
+\(bu
+There's no implied ordering to the associative arrays. If you used
+vectors for plotting, you would want to insure the second component
+comes after the first, an so on. This isn't possible since arrays
+are actually hash tables. For example, you can't get a range of
+values between two indices. Nor can you sort an array.
+.TP 2
+\(bu
+Arrays consume lots of memory when the number of elements becomes
+large (tens of thousands). This is because each element's index and
+value are stored as strings in the hash table.
+.TP 2
+\(bu
+The C programming interface is unwieldy. Normally with vectors, you
+would like to view the Tcl array as you do a C array, as an array of
+floats or doubles. But with hash tables, you must convert both the
+index and value to and from decimal strings, just to access
+an element in the array. This makes it cumbersome to perform operations on
+the array as a whole.
+.PP
+The \fBvector\fR command tries to overcome these disadvantages while
+still retaining the ease of use of Tcl arrays. The \fBvector\fR
+command creates both a new Tcl command and associate array which are
+linked to the vector components. You can randomly access vector
+components though the elements of array. Not have all indices are
+generated for the array, so printing the array (using the \fBparray\fR
+procedure) does not print out all the component values. You can use
+the Tcl command to access the array as a whole. You can copy, append,
+or sort vector using its command. If you need greater performance, or
+customized behavior, you can write your own C code to manage vectors.
+.SH EXAMPLE
+You create vectors using the \fBvector\fR command and its \fBcreate\fR
+operation.
+.CS
+# Create a new vector.
+blt::vector create y(50)
+.CE
+This creates a new vector named \f(CWy\fR. It has fifty components, by
+default, initialized to \f(CW0.0\fR. In addition, both a Tcl command
+and array variable, both named \f(CWy\fR, are created. You can use
+either the command or variable to query or modify components of the
+vector.
+.CS
+# Set the first value.
+set y(0) 9.25
+puts "y has [y length] components"
+.CE
+The array \f(CWy\fR can be used to read or set individual components of
+the vector. Vector components are indexed from zero. The array index
+must be a number less than the number of components. For example,
+it's an error if you try to set the 51st element of \f(CWy\fR.
+.CS
+# This is an error. The vector only has 50 components.
+set y(50) 0.02
+.CE
+You can also specify a range of indices using a colon (:) to separate
+the first and last indices of the range.
+.CS
+# Set the first six components of y
+set y(0:5) 25.2
+.CE
+If you don't include an index, then it will default to the first
+and/or last component of the vector.
+.CS
+# Print out all the components of y
+puts "y = $y(:)"
+.CE
+There are special non-numeric indices. The index \f(CWend\fR, specifies
+the last component of the vector. It's an error to use this index if
+the vector is empty (length is zero). The index \f(CW++end\fR can be
+used to extend the vector by one component and initialize it to a specific
+value. You can't read from the array using this index, though.
+.CS
+# Extend the vector by one component.
+set y(++end) 0.02
+.CE
+The other special indices are \f(CWmin\fR and \f(CWmax\fR. They return the
+current smallest and largest components of the vector.
+.CS
+# Print the bounds of the vector
+puts "min=$y(min) max=$y(max)"
+.CE
+To delete components from a vector, simply unset the corresponding
+array element. In the following example, the first component of
+\f(CWy\fR is deleted. All the remaining components of \f(CWy\fR will be
+moved down by one index as the length of the vector is reduced by
+one.
+.CS
+# Delete the first component
+unset y(0)
+puts "new first element is $y(0)"
+.CE
+The vector's Tcl command can also be used to query or set the vector.
+.CS
+# Create and set the components of a new vector
+blt::vector create x
+x set { 0.02 0.04 0.06 0.08 0.10 0.12 0.14 0.16 0.18 0.20 }
+.CE
+Here we've created a vector \f(CWx\fR without a initial length specification.
+In this case, the length is zero. The \fBset\fR operation resets the vector,
+extending it and setting values for each new component.
+.PP
+There are several operations for vectors. The \fBrange\fR operation
+lists the components of a vector between two indices.
+.CS
+# List the components
+puts "x = [x range 0 end]"
+.CE
+You can search for a particular value using the \fBsearch\fR
+operation. It returns a list of indices of the components with the
+same value. If no component has the same value, it returns \f(CW""\fR.
+.CS
+# Find the index of the biggest component
+set indices [x search $x(max)]
+.CE
+Other operations copy, append, or sort vectors. You can append
+vectors or new values onto an existing vector with the \fBappend\fR
+operation.
+.CS
+# Append assorted vectors and values to x
+x append x2 x3 { 2.3 4.5 } x4
+.CE
+The \fBsort\fR operation sorts the vector. If any additional vectors
+are specified, they are rearranged in the same order as the vector.
+For example, you could use it to sort data points represented by x and
+y vectors.
+.CS
+# Sort the data points
+x sort y
+.CE
+The vector \f(CWx\fR is sorted while the components of \f(CWy\fR are
+rearranged so that the original x,y coordinate pairs are retained.
+.PP
+The \fBexpr\fR operation lets you perform arithmetic on vectors.
+The result is stored in the vector.
+.CS
+# Add the two vectors and a scalar
+x expr { x + y }
+x expr { x * 2 }
+.CE
+When a vector is modified, resized, or deleted, it may trigger
+call-backs to notify the clients of the vector. For example, when a
+vector used in the \fBgraph\fR widget is updated, the vector
+automatically notifies the widget that it has changed. The graph can
+then redrawn itself at the next idle point. By default, the
+notification occurs when Tk is next idle. This way you can modify the
+vector many times without incurring the penalty of the graph redrawing
+itself for each change. You can change this behavior using the
+\fBnotify\fR operation.
+.CS
+# Make vector x notify after every change
+x notify always
+ ...
+# Never notify
+x notify never
+ ...
+# Force notification now
+x notify now
+.CE
+To delete a vector, use the \fBvector delete\fR command.
+Both the vector and its corresponding Tcl command are destroyed.
+.CS
+# Remove vector x
+blt::vector destroy x
+.CE
+.SH SYNTAX
+Vectors are created using the \fBvector create\fR operation.
+Th \fBcreate\fR operation can be invoked in one of three forms:
+.TP
+\fBblt::vector create \fIvecName\fR
+This creates a new vector \fIvecName\fR which initially has no components.
+.TP
+\fBblt::vector create \fIvecName\fR(\fIsize\fR)
+This second form creates a new vector which will contain \fIsize\fR
+number of components. The components will be indexed starting from
+zero (0). The default value for the components is \f(CW0.0\fR.
+.TP
+\fBblt::vector create \fIvecName\fR(\fIfirst\fR:\fIlast\fR)
+The last form creates a new vector of indexed \fIfirst\fR through
+\fIlast\fR. \fIFirst\fR and \fIlast\fR can be any integer value
+so long as \fIfirst\fR is less than \fIlast\fR.
+.PP
+Vector names must start with a letter and consist of letters, digits,
+or underscores.
+.CS
+# Error: must start with letter
+blt::vector create 1abc
+.CE
+You can automatically generate vector names using the
+"\f(CW#auto\fR" vector name. The \fBcreate\fR operation will generate a
+unique vector name.
+.CS
+set vec [blt::vector create #auto]
+puts "$vec has [$vec length] components"
+.CE
+.SS VECTOR INDICES
+Vectors are indexed by integers. You can access the individual vector
+components via its array variable or Tcl command. The string
+representing the index can be an integer, a numeric expression, a
+range, or a special keyword.
+.PP
+The index must lie within the current range of the vector, otherwise
+an an error message is returned. Normally the indices of a vector
+are start from 0. But you can use the \fBoffset\fR operation to
+change a vector's indices on-the-fly.
+.CS
+puts $vecName(0)
+vecName offset -5
+puts $vecName(-5)
+.CE
+You can also use numeric expressions as indices. The result
+of the expression must be an integer value.
+.CS
+set n 21
+set vecName($n+3) 50.2
+.CE
+The following special non-numeric indices are available: \f(CWmin\fR, \f(CWmax\fR, \f(CWend\fR, and
+\f(CW++end\fR.
+.CS
+puts "min = $vecName($min)"
+set vecName(end) -1.2
+.CE
+The indices \f(CWmin\fR and \f(CWmax\fR will return the minimum and maximum
+values of the vector. The index \f(CWend\fR returns the value of the
+last component in the vector. The index \f(CW++end\fR is used to append
+new value onto the vector. It automatically extends the vector by
+one component and sets its value.
+.CS
+# Append an new component to the end
+set vecName(++end) 3.2
+.CE
+A range of indices can be indicated by a colon (:).
+.CS
+# Set the first six components to 1.0
+set vecName(0:5) 1.0
+.CE
+If no index is supplied the first or last component is assumed.
+.CS
+# Print the values of all the components
+puts $vecName(:)
+.CE
+.SH VECTOR OPERATIONS
+.TP
+\fBblt::vector create \fIvecName\fR?(\fIsize\fR)?... \fR?\fIswitches\fR?
+The \fBcreate\fR operation creates a new vector \fIvecName\fR. Both a
+Tcl command and array variable \fIvecName\fR are also created. The
+name \fIvecName\fR must be unique, so another Tcl command or array
+variable can not already exist in that scope. You can access the
+components of the vector using its variable. If you change a value in
+the array, or unset an array element, the vector is updated to reflect
+the changes. When the variable \fIvecName\fR is unset, the vector and
+its Tcl command are also destroyed.
+.sp
+The vector has optional switches that affect how the vector is created. They
+are as follows:
+.RS
+.TP
+\fB\-variable \fIvarName\fR
+Specifies the name of a Tcl variable to be mapped to the vector. If
+the variable already exists, it is first deleted, then recreated.
+If \fIvarName\fR is the empty string, then no variable will be mapped.
+You can always map a variable back to the vector using the vector's
+\fBvariable\fR operation.
+.TP
+\fB\-command \fIcmdName\fR
+Maps a Tcl command to the vector. The vector can be accessed using
+\fIcmdName\fR and one of the vector instance operations.
+A Tcl command by that name cannot already exist.
+If \fIcmdName\fR is the empty string, no command mapping
+will be made.
+.TP
+\fB\-watchunset \fIboolean\fR
+Indicates that the vector should automatically delete itself if
+the variable associated with the vector is unset. By default,
+the vector will not be deleted. This is different from previous
+releases. Set \fIboolean\fR to "true" to get the old behavior.
+.RE
+.TP
+\fBblt::vector destroy \fIvecName\fR \fR?\fIvecName...\fR?
+Deletes one or more vectors. Both the Tcl command and array variable
+are removed also.
+.TP
+\fBblt::vector expr \fIexpression\fR
+.RS
+All binary operators take vectors as operands (remember that numbers
+are treated as one-component vectors). The exact action of binary
+operators depends upon the length of the second operand. If the
+second operand has only one component, then each element of the first
+vector operand is computed by that value. For example, the expression
+"x * 2" multiples all elements of the vector x by 2. If the second
+operand has more than one component, both operands must be the same
+length. Each pair of corresponding elements are computed. So "x + y"
+adds the the first components of x and y together, the second, and so on.
+.sp
+The valid operators are listed below, grouped in decreasing order
+of precedence:
+.TP 20
+\fB\-\0\0!\fR
+Unary minus and logical NOT. The unary minus flips the sign of each
+component in the vector. The logical not operator returns a vector of
+whose values are 0.0 or 1.0. For each non-zero component 1.0 is returned,
+0.0 otherwise.
+.TP 20
+\fB^\fR
+Exponentiation.
+.TP 20
+\fB*\0\0/\0\0%\fR
+Multiply, divide, remainder.
+.TP 20
+\fB+\0\0\-\fR
+Add and subtract.
+.TP 20
+\fB<<\0\0>>\fR
+Left and right shift. Circularly shifts the values of the vector
+(not implemented yet).
+.TP 20
+\fB<\0\0>\0\0<=\0\0>=\fR
+Boolean less, greater, less than or equal, and greater than or equal.
+Each operator returns a vector of ones and zeros. If the condition is true,
+1.0 is the component value, 0.0 otherwise.
+.TP 20
+\fB==\0\0!=\fR
+Boolean equal and not equal.
+Each operator returns a vector of ones and zeros. If the condition is true,
+1.0 is the component value, 0.0 otherwise.
+.TP 20
+\fB|\fR
+Bit-wise OR. (Not implemented).
+.TP 20
+\fB&&\fR
+Logical AND. Produces a 1 result if both operands are non-zero, 0 otherwise.
+.TP 20
+\fB||\fR
+Logical OR. Produces a 0 result if both operands are zero, 1 otherwise.
+.TP 20
+\fIx\fB?\fIy\fB:\fIz\fR
+If-then-else, as in C. (Not implemented yet).
+.LP
+See the C manual for more details on the results produced by each
+operator. All of the binary operators group left-to-right within the
+same precedence level.
+.sp
+Several mathematical functions are supported for vectors. Each of
+the following functions invokes the math library function of the same name;
+see the manual entries for the library functions for details on what
+they do. The operation is applied to all elements of the vector
+returning the results.
+.CS
+.ta 3c 6c 9c
+\fBacos\fR \fBcos\fR \fBhypot\fR \fBsinh\fR
+\fBasin\fR \fBcosh\fR \fBlog\fR \fBsqrt\fR
+\fBatan\fR \fBexp\fR \fBlog10\fR \fBtan\fR
+\fBceil\fR \fBfloor\fR \fBsin\fR \fBtanh\fR
+.CE
+Additional functions are:
+.TP 1i
+\fBabs\fR
+Returns the absolute value of each component.
+.TP 1i
+\fBrandom\fR
+Returns a vector of non-negative values uniformly distributed
+between [0.0, 1.0) using \fIdrand48\fR.
+The seed comes from the internal clock of the machine or may be
+set manual with the srandom function.
+.TP 1i
+\fBround\fR
+Rounds each component of the vector.
+.TP 1i
+\fBsrandom\fR
+Initializes the random number generator using \fIsrand48\fR.
+The high order 32-bits are set using the integral portion of the first
+vector component. All other components are ignored. The low order 16-bits
+are set to an arbitrary value.
+.PP
+The following functions return a single value.
+.TP 1i
+\fBadev\fR
+Returns the average deviation (defined as the sum of the absolute values
+of the differences between component and the mean, divided by the length
+of the vector).
+.TP 1i
+\fBkurtosis\fR
+Returns the degree of peakedness (fourth moment) of the vector.
+.TP 1i
+\fBlength\fR
+Returns the number of components in the vector.
+.TP 1i
+\fBmax\fR
+Returns the vector's maximum value.
+.TP 1i
+\fBmean\fR
+Returns the mean value of the vector.
+.TP 1i
+\fBmedian\fR
+Returns the median of the vector.
+.TP 1i
+\fBmin\fR
+Returns the vector's minimum value.
+.TP 1i
+\fBq1\fR
+Returns the first quartile of the vector.
+.TP 1i
+\fBq3\fR
+Returns the third quartile of the vector.
+.TP 1i
+\fBprod\fR
+Returns the product of the components.
+.TP 1i
+\fBsdev\fR
+Returns the standard deviation (defined as the square root of the variance)
+of the vector.
+.TP 1i
+\fBskew\fR
+Returns the skewness (or third moment) of the vector. This characterizes
+the degree of asymmetry of the vector about the mean.
+.TP 1i
+\fBsum\fR
+Returns the sum of the components.
+.TP 1i
+\fBvar\fR
+Returns the variance of the vector. The sum of the squared differences
+between each component and the mean is computed. The variance is
+the sum divided by the length of the vector minus 1.
+.PP
+The last set returns a vector of the same length as the argument.
+.TP 1i
+\fBnorm\fR
+Scales the values of the vector to lie in the range [0.0..1.0].
+.TP 1i
+\fBsort\fR
+Returns the vector components sorted in ascending order.
+.RE
+.TP
+\fBvector names \fR?\fIpattern\fR?
+.SH INSTANCE OPERATIONS
+You can also use the vector's Tcl command to query or modify it. The
+general form is
+.DS
+\fIvecName \fIoperation\fR \fR?\fIarg\fR?...
+.DE
+Both \fIoperation\fR and its arguments determine the exact behavior of
+the command. The operations available for vectors are listed below.
+.TP
+\fIvecName \fBappend\fR \fIitem\fR ?\fIitem\fR?...
+Appends the component values from \fIitem\fR to \fIvecName\fR.
+\fIItem\fR can be either the name of a vector or a list of numeric
+values.
+.TP
+\fIvecName \fBbinread\fR \fIchannel\fR ?\fIlength\fR? ?\fIswitches\fR?
+Reads binary values from a Tcl channel. Values are either appended
+to the end of the vector or placed at a given index (using the
+\fB\-at\fR option), overwriting existing values. Data is read until EOF
+is found on the channel or a specified number of values \fIlength\fR
+are read (note that this is not necessarily the same as the number of
+bytes). The following switches are supported:
+.RS
+.TP
+\fB\-swap\fR
+Swap bytes and words. The default endian is the host machine.
+.TP
+\fB\-at \fIindex\fR
+New values will start at vector index \fIindex\fR. This will
+overwrite any current values.
+.TP
+\fB\-format\fR \fIformat\fR
+Specifies the format of the data. \fIFormat\fR can be one of the
+following: "i1", "i2", "i4", "i8", "u1, "u2", "u4", "u8", "r4",
+"r8", or "r16". The number indicates the number of bytes
+required for each value. The letter indicates the type: "i" for signed,
+"u" for unsigned, "r" or real. The default format is "r16".
+.RE
+.TP
+\fIvecName \fBclear\fR
+Clears the element indices from the array variable associated with
+\fIvecName\fR. This doesn't affect the components of the vector. By
+default, the number of entries in the Tcl array doesn't match the
+number of components in the vector. This is because its too expensive
+to maintain decimal strings for both the index and value for each
+component. Instead, the index and value are saved only when you read
+or write an element with a new index. This command removes the index
+and value strings from the array. This is useful when the vector is
+large.
+.TP
+\fIvecName \fBdelete\fR \fIindex\fR ?\fIindex\fR?...
+Deletes the \fIindex\fRth component from the vector \fIvecName\fR.
+\fIIndex\fR is the index of the element to be deleted. This is the
+same as unsetting the array variable element \fIindex\fR. The vector
+is compacted after all the indices have been deleted.
+.TP
+\fIvecName \fBdup\fR \fIdestName\fR
+Copies \fIvecName\fR to \fIdestName\fR. \fIDestName\fR is the name of a
+destination vector. If a vector \fIdestName\fR already exists, it is
+overwritten with the components of \fIvecName\fR. Otherwise a
+new vector is created.
+.TP
+\fIvecName \fBexpr\fR \fIexpression\fR
+Computes the expression and resets the values of the vector accordingly.
+Both scalar and vector math operations are allowed. All values in
+expressions are either real numbers or names of vectors. All numbers
+are treated as one component vectors.
+.TP
+\fIvecName \fBlength\fR ?\fInewSize\fR?
+Queries or resets the number of components in \fIvecName\fR.
+\fINewSize\fR is a number specifying the new size of the vector. If
+\fInewSize\fR is smaller than the current size of \fIvecName\fR,
+\fIvecName\fR is truncated. If \fInewSize\fR is greater, the vector
+is extended and the new components are initialized to \f(CW0.0\fR. If
+no \fInewSize\fR argument is present, the current length of the vector
+is returned.
+.TP
+\fIvecName \fBmerge\fR \fIsrcName\fR ?\fIsrcName\fR?...
+Merges the named vectors into a single vector. The resulting
+vector is formed by merging the components of each source vector
+one index at a time.
+.TP
+\fIvecName \fBnotify\fR \fIkeyword\fR
+Controls how vector clients are notified of changes to the vector.
+The exact behavior is determined by \fIkeyword\fR.
+.RS
+.TP 0.75i
+\f(CWalways\fR
+Indicates that clients are to be notified immediately whenever the
+vector is updated.
+.TP
+\f(CWnever\fR
+Indicates that no clients are to be notified.
+.TP
+\f(CWwhenidle\fR
+Indicates that clients are to be notified at the next idle point
+whenever the vector is updated.
+.TP
+\f(CWnow\fR
+If any client notifications is currently pending, they are notified
+immediately.
+.TP
+\f(CWcancel\fR
+Cancels pending notifications of clients using the vector.
+.TP
+\f(CWpending\fR
+Returns \f(CW1\fR if a client notification is pending, and \f(CW0\fR otherwise.
+.RE
+.TP
+\fIvecName \fBoffset\fR ?\fIvalue\fR?
+Shifts the indices of the vector by the amount specified by \fIvalue\fR.
+\fIValue\fR is an integer number. If no \fIvalue\fR argument is
+given, the current offset is returned.
+.TP
+\fIvecName \fBpopulate\fR \fIdestName\fR ?\fIdensity\fR?
+Creates a vector \fIdestName\fR which is a superset of \fIvecName\fR.
+\fIDestName\fR will include all the components of \fIvecName\fR, in
+addition the interval between each of the original components will
+contain a \fIdensity\fR number of new components, whose values are
+evenly distributed between the original components values. This is
+useful for generating abscissas to be interpolated along a spline.
+.TP
+\fIvecName \fBrange\fR \fIfirstIndex\fR ?\fIlastIndex\fR?...
+Returns a list of numeric values representing the vector components
+between two indices. Both \fIfirstIndex\fR and \fIlastIndex\fR are
+indices representing the range of components to be returned. If
+\fIlastIndex\fR is less than \fIfirstIndex\fR, the components are
+listed in reverse order.
+.TP
+\fIvecName \fBsearch\fR \fIvalue\fR ?\fIvalue\fR?
+Searches for a value or range of values among the components of
+\fIvecName\fR. If one \fIvalue\fR argument is given, a list of
+indices of the components which equal \fIvalue\fR is returned. If a
+second \fIvalue\fR is also provided, then the indices of all
+components which lie within the range of the two values are returned.
+If no components are found, then \f(CW""\fR is returned.
+.TP
+\fIvecName \fBset\fR \fIitem\fR
+Resets the components of the vector to \fIitem\fR. \fIItem\fR can
+be either a list of numeric expressions or another vector.
+.TP
+\fIvecName \fBseq\fR \fIstart\fR ?\fIfinish\fR? ?\fIstep\fR?
+Generates a sequence of values starting with the value \fIstart\fR.
+\fIFinish\fR indicates the terminating value of the sequence.
+The vector is automatically resized to contain just the sequence.
+If three arguments are present, \fIstep\fR designates the interval.
+.sp
+With only two arguments (no \fIfinish\fR argument), the sequence will
+continue until the vector is filled. With one argument, the interval
+defaults to 1.0.
+.TP
+\fIvecName \fBsort\fR ?\fB-reverse\fR? ?\fIargName\fR?...
+Sorts the vector \fIvecName\fR in increasing order. If the
+\fB-reverse\fR flag is present, the vector is sorted in decreasing
+order. If other arguments \fIargName\fR are present, they are the
+names of vectors which will be rearranged in the same manner as
+\fIvecName\fR. Each vector must be the same length as \fIvecName\fR.
+You could use this to sort the x vector of a graph, while still
+retaining the same x,y coordinate pairs in a y vector.
+.TP
+\fIvecName \fBvariable\fR \fIvarName\fR
+Maps a Tcl variable to the vector, creating another means for
+accessing the vector. The variable \fIvarName\fR can't already
+exist. This overrides any current variable mapping the vector
+may have.
+.RE
+.SH C LANGUAGE API
+You can create, modify, and destroy vectors from C code, using
+library routines.
+You need to include the header file \f(CWblt.h\fR. It contains the
+definition of the structure \fBBlt_Vector\fR, which represents the
+vector. It appears below.
+.CS
+\fRtypedef struct {
+ double *\fIvalueArr\fR;
+ int \fInumValues\fR;
+ int \fIarraySize\fR;
+ double \fImin\fR, \fImax\fR;
+} \fBBlt_Vector\fR;
+.CE
+The field \fIvalueArr\fR points to memory holding the vector
+components. The components are stored in a double precision array,
+whose size size is represented by \fIarraySize\fR. \fINumValues\fR is
+the length of vector. The size of the array is always equal to or
+larger than the length of the vector. \fIMin\fR and \fImax\fR are
+minimum and maximum component values.
+.SH LIBRARY ROUTINES
+The following routines are available from C to manage vectors.
+Vectors are identified by the vector name.
+.PP
+\fBBlt_CreateVector\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_CreateVector\fR (\fIinterp\fR, \fIvecName\fR, \fIlength\fR, \fIvecPtrPtr\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+char *\fIvecName\fR;
+int \fIlength\fR;
+Blt_Vector **\fIvecPtrPtr\fR;
+.RE
+.CE
+.TP
+Description:
+Creates a new vector \fIvecName\fR\fR with a length of \fIlength\fR.
+\fBBlt_CreateVector\fR creates both a new Tcl command and array
+variable \fIvecName\fR. Neither a command nor variable named
+\fIvecName\fR can already exist. A pointer to the vector is
+placed into \fIvecPtrPtr\fR.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully created. If
+\fIlength\fR is negative, a Tcl variable or command \fIvecName\fR
+already exists, or memory cannot be allocated for the vector, then
+\f(CWTCL_ERROR\fR is returned and \fIinterp->result\fR will contain an
+error message.
+.RE
+.sp
+.PP
+\fBBlt_DeleteVectorByName\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_DeleteVectorByName\fR (\fIinterp\fR, \fIvecName\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+char *\fIvecName\fR;
+.RE
+.CE
+.TP 1i
+Description:
+Removes the vector \fIvecName\fR. \fIVecName\fR is the name of a vector
+which must already exist. Both the Tcl command and array variable
+\fIvecName\fR are destroyed. All clients of the vector will be notified
+immediately that the vector has been destroyed.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully deleted. If
+\fIvecName\fR is not the name a vector, then \f(CWTCL_ERROR\fR is returned
+and \fIinterp->result\fR will contain an error message.
+.RE
+.sp
+.PP
+\fBBlt_DeleteVector\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_DeleteVector\fR (\fIvecPtr\fR)
+.RS 1.25i
+Blt_Vector *\fIvecPtr\fR;
+.RE
+.CE
+.TP 1i
+Description:
+Removes the vector pointed to by \fIvecPtr\fR. \fIVecPtr\fR is a
+pointer to a vector, typically set by \fBBlt_GetVector\fR or
+\fBBlt_CreateVector\fR. Both the Tcl command and array variable of
+the vector are destroyed. All clients of the vector will be notified
+immediately that the vector has been destroyed.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully deleted. If
+\fIvecName\fR is not the name a vector, then \f(CWTCL_ERROR\fR is returned
+and \fIinterp->result\fR will contain an error message.
+.RE
+.sp
+.PP
+\fBBlt_GetVector\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_GetVector\fR (\fIinterp\fR, \fIvecName\fR, \fIvecPtrPtr\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+char *\fIvecName\fR;
+Blt_Vector **\fIvecPtrPtr\fR;
+.RE
+.CE
+.TP 1i
+Description:
+Retrieves the vector \fIvecName\fR. \fIVecName\fR is the name of a
+vector which must already exist. \fIVecPtrPtr\fR will point be set to
+the address of the vector.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully retrieved. If
+\fIvecName\fR is not the name of a vector, then \f(CWTCL_ERROR\fR is
+returned and \fIinterp->result\fR will contain an error message.
+.RE
+.sp
+.PP
+\fBBlt_ResetVector\fR
+.PP
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_ResetVector\fR (\fIvecPtr\fR, \fIdataArr\fR,
+ \fInumValues\fR, \fIarraySize\fR, \fIfreeProc\fR)
+.RS 1.25i
+Blt_Vector *\fIvecPtr\fR;
+double *\fIdataArr\fR;
+int *\fInumValues\fR;
+int *\fIarraySize\fR;
+Tcl_FreeProc *\fIfreeProc\fR;
+.RE
+.CE
+.TP
+Description:
+Resets the components of the vector pointed to by \fIvecPtr\fR.
+Calling \fBBlt_ResetVector\fR will trigger the vector to dispatch
+notifications to its clients. \fIDataArr\fR is the array of doubles
+which represents the vector data. \fINumValues\fR is the number of
+elements in the array. \fIArraySize\fR is the actual size of the array
+(the array may be bigger than the number of values stored in
+it). \fIFreeProc\fP indicates how the storage for the vector component
+array (\fIdataArr\fR) was allocated. It is used to determine how to
+reallocate memory when the vector is resized or destroyed. It must be
+\f(CWTCL_DYNAMIC\fR, \f(CWTCL_STATIC\fR, \f(CWTCL_VOLATILE\fR, or a pointer
+to a function to free the memory allocated for the vector array. If
+\fIfreeProc\fR is \f(CWTCL_VOLATILE\fR, it indicates that \fIdataArr\fR
+must be copied and saved. If \fIfreeProc\fR is \f(CWTCL_DYNAMIC\fR, it
+indicates that \fIdataArr\fR was dynamically allocated and that Tcl
+should free \fIdataArr\fR if necessary. \f(CWStatic\fR indicates that
+nothing should be done to release storage for \fIdataArr\fR.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully resized. If
+\fInewSize\fR is negative, a vector \fIvecName\fR does not exist, or
+memory cannot be allocated for the vector, then \f(CWTCL_ERROR\fR is
+returned and \fIinterp->result\fR will contain an error message.
+.RE
+.sp
+.PP
+\fBBlt_ResizeVector\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_ResizeVector\fR (\fIvecPtr\fR, \fInewSize\fR)
+.RS 1.25i
+Blt_Vector *\fIvecPtr\fR;
+int \fInewSize\fR;
+.RE
+.CE
+.TP
+Description:
+Resets the length of the vector pointed to by \fIvecPtr\fR to
+\fInewSize\fR. If \fInewSize\fR is smaller than the current size of
+the vector, it is truncated. If \fInewSize\fR is greater, the vector
+is extended and the new components are initialized to \f(CW0.0\fR.
+Calling \fBBlt_ResetVector\fR will trigger the vector to dispatch
+notifications.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully resized. If
+\fInewSize\fR is negative or memory can not be allocated for the vector,
+then \f(CWTCL_ERROR\fR is returned and \fIinterp->result\fR will contain
+an error message.
+.sp
+.PP
+\fBBlt_VectorExists\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_VectorExists\fR (\fIinterp\fR, \fIvecName\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+char *\fIvecName\fR;
+.RE
+.CE
+.TP
+Description:
+Indicates if a vector named \fIvecName\fR exists in \fIinterp\fR.
+.TP
+Results:
+Returns \f(CW1\fR if a vector \fIvecName\fR exists and \f(CW0\fR otherwise.
+.RE
+.sp
+.PP
+If your application needs to be notified when a vector changes, it can
+allocate a unique \fIclient identifier\fR for itself. Using this
+identifier, you can then register a call-back to be made whenever the
+vector is updated or destroyed. By default, the call-backs are made at
+the next idle point. This can be changed to occur at the time the
+vector is modified. An application can allocate more than one
+identifier for any vector. When the client application is done with
+the vector, it should free the identifier.
+.PP
+The call-back routine must of the following type.
+.CS
+.RS
+.sp
+typedef void (\fBBlt_VectorChangedProc\fR) (Tcl_Interp *\fIinterp\fR,
+.RS .25i
+ClientData \fIclientData\fR, Blt_VectorNotify \fInotify\fR);
+.RE
+.sp
+.RE
+.CE
+.fi
+\fIClientData\fR is passed to this routine whenever it is called. You
+can use this to pass information to the call-back. The \fInotify\fR
+argument indicates whether the vector has been updated of destroyed. It
+is an enumerated type.
+.CS
+.RS
+.sp
+typedef enum {
+ \f(CWBLT_VECTOR_NOTIFY_UPDATE\fR=1,
+ \f(CWBLT_VECTOR_NOTIFY_DESTROY\fR=2
+} \fBBlt_VectorNotify\fR;
+.sp
+.RE
+.CE
+.PP
+\fBBlt_AllocVectorId\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+Blt_VectorId \fBBlt_AllocVectorId\fR (\fIinterp\fR, \fIvecName\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+char *\fIvecName\fR;
+.RE
+.CE
+.TP
+Description:
+Allocates an client identifier for with the vector \fIvecName\fR.
+This identifier can be used to specify a call-back which is triggered
+when the vector is updated or destroyed.
+.TP
+Results:
+Returns a client identifier if successful. If \fIvecName\fR is not
+the name of a vector, then \f(CWNULL\fR is returned and
+\fIinterp->result\fR will contain an error message.
+.RE
+.sp
+.PP
+\fBBlt_GetVectorById\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+int \fBBlt_GetVector\fR (\fIinterp\fR, \fIclientId\fR, \fIvecPtrPtr\fR)
+.RS 1.25i
+Tcl_Interp *\fIinterp\fR;
+Blt_VectorId \fIclientId\fR;
+Blt_Vector **\fIvecPtrPtr\fR;
+.RE
+.CE
+.TP 1i
+Description:
+Retrieves the vector used by \fIclientId\fR. \fIClientId\fR is a valid
+vector client identifier allocated by \fBBlt_AllocVectorId\fR.
+\fIVecPtrPtr\fR will point be set to the address of the vector.
+.TP
+Results:
+Returns \f(CWTCL_OK\fR if the vector is successfully retrieved.
+.RE
+.sp
+.PP
+\fBBlt_SetVectorChangedProc\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+void \fBBlt_SetVectorChangedProc\fR (\fIclientId\fR, \fIproc\fR, \fIclientData\fR);
+.RS 1.25i
+Blt_VectorId \fIclientId\fR;
+Blt_VectorChangedProc *\fIproc\fR;
+ClientData *\fIclientData\fR;
+.RE
+.CE
+.TP
+Description:
+Specifies a call-back routine to be called whenever the vector
+associated with \fIclientId\fR is updated or deleted. \fIProc\fR is a
+pointer to call-back routine and must be of the type
+\fBBlt_VectorChangedProc\fR. \fIClientData\fR is a one-word value to
+be passed to the routine when it is invoked. If \fIproc\fR is
+\f(CWNULL\fR, then the client is not notified.
+.TP
+Results:
+The designated call-back procedure will be invoked when the vector is
+updated or destroyed.
+.RE
+.sp
+.PP
+\fBBlt_FreeVectorId\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+void \fBBlt_FreeVectorId\fR (\fIclientId\fR);
+.RS 1.25i
+Blt_VectorId \fIclientId\fR;
+.RE
+.CE
+.TP
+Description:
+Frees the client identifier. Memory allocated for the identifier
+is released. The client will no longer be notified when the
+vector is modified.
+.TP
+Results:
+The designated call-back procedure will be no longer be invoked when
+the vector is updated or destroyed.
+.RE
+.sp
+.PP
+\fBBlt_NameOfVectorId\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+char *\fBBlt_NameOfVectorId\fR (\fIclientId\fR);
+.RS 1.25i
+Blt_VectorId \fIclientId\fR;
+.RE
+.CE
+.TP
+Description:
+Retrieves the name of the vector associated with the client identifier
+\fIclientId\fR.
+.TP
+Results:
+Returns the name of the vector associated with \fIclientId\fR. If
+\fIclientId\fR is not an identifier or the vector has been destroyed,
+\f(CWNULL\fR is returned.
+.RE
+.sp
+.PP
+\fBBlt_InstallIndexProc\fR
+.RS .25i
+.TP 1i
+Synopsis:
+.CS
+void \fBBlt_InstallIndexProc\fR (\fIindexName\fR, \fIprocPtr\fR)
+.RS 1.25i
+char *\fIindexName\fR;
+Blt_VectorIndexProc *\fIprocPtr\fR;
+.RE
+.CE
+.TP
+Description:
+Registers a function to be called to retrieved the index \fIindexName\fR
+from the vector's array variable.
+.sp
+typedef double Blt_VectorIndexProc(Vector *vecPtr);
+.sp
+The function will be passed a pointer to the vector. The function must
+return a double representing the value at the index.
+.TP
+Results:
+The new index is installed into the vector.
+.RE
+.RE
+.SH C API EXAMPLE
+The following example opens a file of binary data and stores it in an
+array of doubles. The array size is computed from the size of the
+file. If the vector "data" exists, calling \fBBlt_VectorExists\fR,
+\fBBlt_GetVector\fR is called to get the pointer to the vector.
+Otherwise the routine \fBBlt_CreateVector\fR is called to create a new
+vector and returns a pointer to it. Just like the Tcl interface, both
+a new Tcl command and array variable are created when a new vector is
+created. It doesn't make any difference what the initial size of the
+vector is since it will be reset shortly. The vector is updated when
+\fBlt_ResetVector\fR is called. Blt_ResetVector makes the changes
+visible to the Tcl interface and other vector clients (such as a graph
+widget).
+.sp
+.CS
+#include <tcl.h>
+#include <blt.h>
+...
+Blt_Vector *vecPtr;
+double *newArr;
+FILE *f;
+struct stat statBuf;
+int numBytes, numValues;
+
+f = fopen("binary.dat", "r");
+fstat(fileno(f), &statBuf);
+numBytes = (int)statBuf.st_size;
+
+/* Allocate an array big enough to hold all the data */
+newArr = (double *)malloc(numBytes);
+numValues = numBytes / sizeof(double);
+fread((void *)newArr, numValues, sizeof(double), f);
+fclose(f);
+
+if (Blt_VectorExists(interp, "data")) {
+ if (Blt_GetVector(interp, "data", &vecPtr) != TCL_OK) {
+ return TCL_ERROR;
+ }
+} else {
+ if (Blt_CreateVector(interp, "data", 0, &vecPtr) != TCL_OK) {
+ return TCL_ERROR;
+ }
+}
+/*
+ * Reset the vector. Clients will be notified when Tk is idle.
+ * TCL_DYNAMIC tells the vector to free the memory allocated
+ * if it needs to reallocate or destroy the vector.
+ */
+if (Blt_ResetVector(vecPtr, newArr, numValues, numValues,
+ TCL_DYNAMIC) != TCL_OK) {
+ return TCL_ERROR;
+}
+.CE
+.SH "INCOMPATIBILITIES"
+In previous versions, if the array variable isn't global
+(i.e. local to a Tcl procedure), the vector is automatically
+destroyed when the procedure returns.
+.CS
+proc doit {} {
+ # Temporary vector x
+ vector x(10)
+ set x(9) 2.0
+ ...
+}
+.CE
+.PP
+This has changed. Variables are not automatically destroyed when
+their variable is unset. You can restore the old behavior by
+setting the "-watchunset" switch.
+.CE
+.SH KEYWORDS
+vector, graph, widget
diff --git a/src/bltGrPSOutput.C b/src/bltGrPSOutput.C
index 3b3cfb0..3bd5a66 100644
--- a/src/bltGrPSOutput.C
+++ b/src/bltGrPSOutput.C
@@ -30,14 +30,6 @@
#include <X11/Xutil.h>
#include <X11/Xatom.h>
-#define TIME_WITH_SYS_TIME 0
-#define HAVE_SYS_TIME_H 1
-#define STDC_HEADERS 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_UNISTD_H 1
#include <tkPort.h>
#include <tkInt.h>
#include <tk3d.h>
diff --git a/src/bltGrText.C b/src/bltGrText.C
index ab61c93..d1a8b5f 100644
--- a/src/bltGrText.C
+++ b/src/bltGrText.C
@@ -28,14 +28,6 @@
#include <assert.h>
#include <X11/Xutil.h>
-#define TIME_WITH_SYS_TIME 0
-#define HAVE_SYS_TIME_H 1
-#define STDC_HEADERS 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_UNISTD_H 1
#include <tkPort.h>
#include <tkInt.h>
#include <tk3d.h>
diff --git a/src/bltNsUtil.C b/src/bltNsUtil.C
index 1ed06c4..7be8363 100644
--- a/src/bltNsUtil.C
+++ b/src/bltNsUtil.C
@@ -26,14 +26,6 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#define TIME_WITH_SYS_TIME 0
-#define HAVE_SYS_TIME_H 1
-#define STDC_HEADERS 1
-#define HAVE_SYS_TYPES_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_INTTYPES_H 1
-#define HAVE_STDINT_H 1
-#define HAVE_UNISTD_H 1
#include <tclPort.h>
#include <tclInt.h>
diff --git a/tclconfig/ChangeLog b/tclconfig/ChangeLog
new file mode 100644
index 0000000..ffda2bb
--- /dev/null
+++ b/tclconfig/ChangeLog
@@ -0,0 +1,980 @@
+2013-07-04 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat,
+ Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows
+
+2013-07-02 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4
+ (thanks to Brian Griffin)
+
+2013-06-20 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found
+ in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti.
+
+2013-06-04 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Eliminate NO_VIZ macro as current
+ zlib uses HAVE_HIDDEN in stead. One more last-moment
+ fix for FreeBSD by Pietro Cerutti
+
+2013-05-19 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Fix for FreeBSD, and remove support for old
+ FreeBSD versions. Patch by Pietro Cerutti
+
+2013-03-12 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * unix/tcl.m4: Patch by Andrew Shadura, providing better support for
+ * three architectures they have in Debian.
+
+2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT
+ when building with --disable-symbols.
+
+2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke
+ CFLAGS_DEFAULT, LDFLAGS_DEFAULT
+
+2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS
+
+2012-08-07 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS
+
+2012-07-25 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl
+ build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe".
+ It turns out that the AC_TRY_COMPILE macro cannot handle that.
+
+2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace.
+ No functional change.
+
+2012-04-03 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [Bug 3511806] Compiler checks too early
+ This change allows to build the cygwin and mingw32 ports of
+ Tcl/Tk extensions to build out-of-the-box using a native or
+ cross-compiler, e.g. on Cygwin, Linux or Darwin.
+
+2011-04-02 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * install-sh: Fix issue with library stripping in install-sh
+ (backported from kevin_walzer's patch from Tcl 8.6 trunk)
+
+2011-04-05 Andreas Kupries <andreask@activestate.com>
+
+ * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when
+ tclConfig.sh was not found.
+
+2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * install-sh: Upgrade to newer install-sh and use it.
+ * tcl.m4:
+
+2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: Better building on OpenBSD.
+
+2010-12-14 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: when using gcc, don't try to determine Win64 SDK
+
+2010-12-12 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: Determine correctly a cross-compiler-windres
+
+2010-11-23 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6
+
+2010-09-16 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell)
+
+2010-09-14 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: add extra if check for .manifest file generation
+ Add notice about package name and version being built.
+
+2010-09-09 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars
+ Slightly related: defining BUILD_$1 on all platforms - not only win -
+ allows the -fvisibility feature to be used in extensions as well, at
+ least if you compile against tcl >= 8.5.
+
+2010-08-26 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: ensure safe quoting for autoheader usage
+
+2010-08-19 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles
+ easier, and add *.exp to CLEANFILES Windows default.
+ (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests
+ and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define
+ VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same
+ magic in case it is needed for extended TEA projects.
+
+2010-08-16 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Bump to TEA_VERSION 3.9 ***
+ If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change
+ TEA_INIT to use 3.9 and reconfigure (ac-2.59+).
+ BUILD_${PACKAGE_NAME} will be auto-defined on Windows for
+ correct setting of TCL_STORAGE_CLASS.
+ TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done
+ in configure.in (LIBS will be automagically populated by
+ TEA_LOAD_CONFIG).
+ TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators
+ SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is
+ still in your Makefile.in.
+
+ * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554]
+ Auto-define BUILD_$PACKAGE_NAME so users don't need to. This
+ needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS.
+ Auto-define CLEANFILES. Users can expand it.
+ (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if
+ necessary. Platforms not using this may simply not work or have
+ very funky linkers.
+ (TEA_LOAD_CONFIG): When loading config for another extension,
+ auto-add stub libraries found with TEA_ADD_LIBS. Eases
+ configure.in for modules like itk and img::*.
+ (TEA_EXPORT_CONFIG): Add standardized function for exporting a
+ ${pkg}Config.sh. See use by img::* and itcl.
+
+2010-08-12 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Bump to TEA_VERSION 3.8 ***
+ If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change
+ TEA_INIT to use 3.8 and reconfigure (ac-2.59+).
+ No other changes should be necessary.
+
+ * tcl.m4: remove more vestigial bits from removed platforms.
+ Add back SCO_SV-3.2*.
+ Remove use of DL_LIBS and DL_OBJS and related baggage - these are
+ only needed by the core to support 'load'.
+ Allow for macosx in TEA_ADD_SOURCES.
+ Correct check for found_xincludes=no in TEA_PATH_UNIX_X.
+
+2010-08-11 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: remove the following old platform configurations:
+ UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>,
+ OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*,
+ IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*,
+ BSD/OS-2.1*|BSD/OS-3*
+ (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl
+
+2010-07-05 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [Patch #1055668] removal of exported internals from
+ tclInt.h (EXTERN macro)
+
+2010-04-14 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4
+ - Fix determination of CYGPATH for CYGWIN
+ With those fixes, itcl and tdbc compile fine with CYGWIN
+
+2010-04-06 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * install-sh [Bug 2982540] configure and install* script files
+ should always have LF
+
+2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net>
+
+ * tcl.m4: Correct compiler/linker flags for threaded builds on
+ OpenBSD.
+
+2010-01-19 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: Detect CYGWIN variant: win32 or unix
+
+2010-01-03 Donal K. Fellows <dkf@users.sf.net>
+
+ * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the
+ configuration for modern FreeBSD suggested by the FreeBSD porter.
+
+2009-10-22 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS
+
+2009-04-27 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on
+ AIX with threads.
+
+2009-04-10 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): check for 64-bit TkAqua.
+
+2009-03-26 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS
+ together with SHLIB_LD definition to unbreak building on HPUX.
+
+2009-03-20 Andreas Kupries <andreask@activestate.com>
+
+ * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak
+ building on HPUX.
+
+2009-03-16 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC}
+ (found in tkConfig.sh) when trying to guess where tk.h might be
+ [Patch 1960628].
+
+2009-03-11 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at
+ configure-time [Patch 1960628]. Also fix some comment typos,
+ and an uninitialized variable bug-waiting-to-happen.
+
+2008-12-21 Jan Nijtmans <nijtmans@users.sf.net>
+
+ * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX
+ (this bug report was for Tcl, but holds for TEA as well.)
+
+2008-12-20 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: sync with tdbc tcl.m4 changes
+ (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS
+
+2008-12-02 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Bump to TEA_VERSION 3.7 ***
+
+ * tcl.m4: in private header check, check for <plat>Port.h instead
+ of Int.h to ensure all private headers are available.
+
+2008-11-04 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of
+ Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS.
+
+2008-11-04 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error
+ when tclConfig.sh cannot be found. [Bug #1997760]
+ (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for
+ finding the headers installed in the public areas, e.g. a result of
+ make install-private-headers. [Bug #1631922]
+
+2008-08-12 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): link shlib with current and compatiblity version
+ flags; look for libX11.dylib when searching for X11 libraries.
+
+2008-06-12 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc.
+
+2008-03-27 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166]
+
+2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with
+ more modern VC versions. Currently just made the linker flags more
+ flexible; more work may be needed.
+
+2007-10-26 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): add support for 64-bit X11.
+
+2007-10-23 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Tagged tea-3-branch to start TEA 4 development on HEAD ***
+
+2007-09-17 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable'
+ to build shared libraries on current NetBSDs [Bug 1749251].
+
+2007-09-15 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: replace all direct references to compiler by ${CC} to
+ enable CC overriding at configure & make time.
+ (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by
+ 'cc' compiler driver.
+
+2007-08-08 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: check Ttk dir for Tk private headers (8.5).
+ Add some comments to other bits.
+
+2007-06-25 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added.
+
+2007-06-13 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111]
+
+2007-06-06 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds.
+
+2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk>
+
+ * tcl.m4: Added quoting so that paths with spaces cause fewer
+ problems.
+
+2007-03-07 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check.
+
+2007-02-15 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct private header check to search in generic subdir
+
+2007-02-09 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Bump to TEA_VERSION 3.6 ***
+
+ * tcl.m4: correct -d to -f
+ (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058]
+
+2007-02-08 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check
+ that the dirs actually have private headers. [Bug 1631922]
+
+2007-02-04 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: add caching to -pipe check.
+
+2007-01-25 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and
+ move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to
+ avoid errors about multiple -isysroot flags from some older gcc builds.
+
+2006-01-19 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861]
+ (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when
+ present in CFLAGS to avoid discrepancies between what headers configure
+ sees during preprocessing tests and compiling tests.
+
+2006-12-19 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag
+ succeeds before enabling 64bit build.
+
+2006-12-16 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Linux): fix previous change to use makefile variable
+ LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker
+ flags in sampleextension Makefile are picked up.
+
+2006-11-26 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558]
+
+2006-08-18 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for
+ universal builds including x86_64 and for use of -mmacosx-version-min
+ instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit
+ arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor
+ TkX11 can be built for 64-bit at present.
+
+2006-03-28 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: []-quote AC_DEFUN functions.
+ (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh.
+ (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs.
+
+2006-03-07 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD,
+ as per the other *BSD variants [Bug 1334613].
+
+2006-01-25 Jeff Hobbs <jeffh@ActiveState.com>
+
+ *** Bump to TEA version 3.5 ***
+
+ * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous
+ with core tcl.m4 meaning.
+
+2006-01-24 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of
+ LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile
+ are picked up. [Bug 1403343]
+
+2006-01-23 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for
+ *Config.sh on Windows. [Bug 1407544]
+
+2006-01-23 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS
+ like in the Tk configure, as neither TkAqua nor TkX11 can be built for
+ 64bit at present (no 64bit GUI libraries).
+
+2006-01-22 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: restore system=windows on Windows.
+ Remove error if 'ar' isn't found (it may not be on Windows).
+ Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default.
+ Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at
+ configure time.
+
+2006-01-10 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL
+ where possible, consistent message quoting, sync relevant
+ tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences
+ (notably sunc removal of support for for ancient BSD's, IRIX 4,
+ RISCos and Ultrix by kennykb), Darwin improvements to
+ TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks
+ installed in arbitrary location, change TEA_PROG_* search order
+ (look in *_BIN_DIR parents before *_PREFIX).
+
+2006-01-05 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: add dkf's system config refactor
+
+2006-01-04 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: remove extraneous ' that causes bash 3.1 to choke
+
+2005-12-19 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c
+ in ${libdir}, where they are installed by default [Patch #1377407].
+
+2005-12-05 Don Porter <dgp@users.sf.net>
+
+ * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding
+ header files for uninstalled Tcl and Tk.
+
+2005-12-02 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correctly bump TEA_VERSION var to 3.4
+
+2005-12-01 Daniel Steffen <das@users.sourceforge.net>
+
+ * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset
+
+2005-11-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: *** Bump to TEA version 3.4 ***
+ Add Windows x64 build support.
+ Remove TEA_PATH_NOSPACE and handle the problem with ""s where
+ necessary - the macro relied on TCLSH_PROG which didn't work for
+ cross-compiles.
+
+2005-11-27 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to
+ support passing -isysroot in env(CFLAGS) to configure (flag can't
+ be present twice, so can't be in both CFLAGS and LDFLAGS during
+ configure), don't use -prebind when deploying on 10.4.
+ (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching.
+
+2005-10-30 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that
+ should have been for `uname -s` = "Darwin" instead; added some
+ missing quoting.
+ (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that
+ install location of tclConfig.sh/tkConfig.sh allows to determine
+ the tclsh/wish install dir via ../bin. Indeed tcl/tk can be
+ configured with arbitrary --libdir and --bindir (independent of
+ prefix) and such a configuration is in fact standard with Darwin
+ framework builds. At least now also check ${TCL_PREFIX}/bin
+ resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk
+ have been configured with arbitrary --bindir, this will still not
+ find them, for a general solution *Config.sh would need to contain
+ the values of bindir/libdir/includedir passed to configure).
+
+2005-10-07 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds.
+
+2005-10-04 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro
+ (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func
+
+2005-09-13 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: *** Update to TEA version 3.3 ***
+ define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG.
+ Make --enable-threads the default (users can --disable-threads).
+ Improve AIX ${CC}_r fix to better check existing ${CC} value.
+ Do the appropriate evals to not require the *TOP_DIR_NATIVE vars
+ be set for extensions that use private headers.
+ Make aqua check for Xlib compat headers the same as win32.
+
+2005-07-26 Mo DeJong <mdejong@users.sourceforge.net>
+
+ * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH,
+ TEA_PROG_WISH, TEA_BUILD_WISH): Remove
+ TEA_BUILD_TCLSH and TEA_BUILD_WISH because
+ of complaints that it broke the build when
+ only an installed version of Tcl was available
+ at extension build time. The TEA_PROG_TCLSH and
+ TEA_PROG_WISH macros will no longer search the
+ path at all. The build tclsh or installed
+ tclsh shell will now be found by TEA_PROG_TCLSH.
+
+2005-07-24 Mo DeJong <mdejong@users.sourceforge.net>
+
+ * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH,
+ TEA_PROG_WISH, TEA_BUILD_WISH):
+ Split confused search for tclsh on PATH and
+ build and install locations into two macros.
+ TEA_PROG_TCLSH and TEA_PROG_WISH search the
+ system PATH for an installed tclsh or wish.
+ The TEA_BUILD_TCLSH and TEA_BUILD_WISH
+ macros determine the name of tclsh or
+ wish in the Tcl or Tk build directory even
+ if tclsh or wish has not yet been built.
+ [Tcl bug 1160114]
+ [Tcl patch 1244153]
+
+2005-06-23 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to
+ TK_INCLUDES when building against TkAqua.
+
+ * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE
+
+ * tcl.m4: changes to better support framework builds of Tcl and Tk out
+ of the box: search framework install locations for *Config.sh, and if in
+ presence of a framework build, use the framework's Headers and
+ PrivateHeaders directories for public and private includes. [FR 947735]
+
+2005-06-18 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to
+ ensure we can always relocate binaries with install_name_tool.
+
+2005-06-04 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib
+ compat headers are available in tkheaders location, otherwise add xlib
+ sourcedir to TK_XINCLUDES.
+
+2005-04-25 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow
+ use with autoheader.
+ (Darwin): added configure checks for recently added linker flags
+ -single_module and -search_paths_first to allow building with older
+ tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD.
+ (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check.
+ (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4).
+
+2005-03-24 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide
+ int type only on Windows when __int64 is detected as valid.
+
+2005-03-24 Don Porter <dgp@users.sf.net>
+
+ * README.txt: Update reference to "SC_* macros" to "TEA_* macros".
+ * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG
+ and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG.
+ Corrected search path in TEA_PATH_CONFIG and added
+ AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load
+ the configuration of another package can know where they loaded
+ it from.
+
+2005-03-18 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have
+ variant LD_SEARCH_FLAGS for gcc and cc builds.
+
+ * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check.
+
+2005-03-17 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: Correct gcc build and HP-UX-11.
+
+2005-02-08 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -.
+ (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build.
+ (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed).
+
+2005-02-01 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: redo of 2005-01-27 changes to correctly handle paths
+ with spaces. Win/CE and Win/64 builds now require a prebuilt
+ tclsh to handle conversion to short pathnames. This is done in
+ the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the
+ compiler and move the necessary includes to CFLAGS.
+ (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support.
+ (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to
+ be set in the env and prevent resetting.
+ (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib
+ args to -lfoo, for use with mingw.
+ *** POTENTIAL INCOMPATABILITY ***
+ (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box.
+ Bumped TEA to 3.2.
+
+2005-01-27 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: remove cygpath calls to support msys.
+ Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003".
+ Make STLIB_LD use $LINKBIN -lib.
+
+2005-01-25 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (Darwin): fixed bug with static build linking to dynamic
+ library in /usr/lib etc instead of linking to static library earlier
+ in search path. [Tcl Bug 956908]
+ Removed obsolete references to Rhapsody.
+
+2004-12-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS
+ options, using better default -O levels. [Bug 1092952, 1091967]
+
+2004-12-29 Joe English <jenglish@users.sourceforge.net>
+
+ * tcl.m4: Do not use ${DBGX} suffix when building
+ shared libraries [patch #1081595, TIP #34]
+
+2004-09-07 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds
+
+2004-08-10 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to
+ work around subdir configures since autoconf only propagates the
+ prefix (not exec_prefix).
+
+2004-07-23 Daniel Steffen <das@users.sourceforge.net>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with
+ Tcl 8.5 HEAD config, removed core specific & obsolete settings.
+
+2004-07-22 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if
+ we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that
+ reflects 'tk windowingsystem' value.
+
+2004-07-16 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when
+ building against a threaded core.
+ (CFLAGS_WARNING): Remove -Wconversion for gcc builds
+ (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build
+ configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058]
+ Update to latest Tcl 8.5 head config settings.
+ Call this TEA version 3.1.
+
+2004-04-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with
+ AC_TRY_COMPILE for the long vs. long long check. (kenny)
+
+2004-04-26 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to
+ define TCL_WIDE_INT_IS_LONG if 'using long'.
+
+2004-03-19 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB
+
+2004-02-11 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it
+ doesn't need the eval.
+
+2004-02-10 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the
+ DIR_NATIVE vars defined when using private headers on unix.
+ Allow $... to TEA_ADD_SOURCES for constructs like
+ TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to
+ place more in the Makefile.in.
+ tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and
+ CHECK on limits.h
+
+2003-12-10 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and
+ * configure: TEA_ADD_CFLAGS to configurable parameters with
+ * configure.in: PKG_* equivs in the Makefile. This allows the
+ * tclconfig/tcl.m4: user to worry less about actual magic VAR names.
+ Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires
+ exact file names.
+
+2003-12-09 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff)
+
+2003-12-05 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * configure:
+ * configure.in:
+ * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the
+ first part of VPATH can get chopped off.
+ Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes.
+ * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub
+ generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as
+ the way the user specifies library files.
+
+2003-12-03 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * configure: Update of TEA spec to (hopefully) simplify
+ * configure.in: some aspects of TEA by making use of more
+ * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead
+ * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of
+ * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA
+ package name and version.
+ Provide a version argument to TEA_INIT - starting with 3.0.
+ Drop all use of interior shell substs that older makefiles didn't
+ like. Use PKG_* naming convention instead.
+ Move specification of source files and public headers into
+ configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will
+ be munged during ./configure into the right obj file names (no
+ $(SOURCES:.c=.obj) needed).
+ There is almost nothing that should be touched in Makefile.in now
+ for the developer. May want to add a TEA_ADD_TCL_SOURCES for the
+ RUNTIME_SOURCES that remains.
+ Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does.
+ Only specify the user requested LDFLAGS/CFLAGS in the Makefile,
+ don't mention the _OPTIMIZE/_DEBUG variants.
+
+2003-10-15 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the
+ TEA_SETUP_COMPILER macro. They are split so the check for CC
+ occurs before any use of CC. Also add AC_PROG_CPP to the compiler
+ checks.
+
+2003-10-06 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: Updated for autoconf 2.5x prereq.
+ Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks
+ in tcl.h, which also handles TCL_LL_MODIFIER* properly.
+
+2003-04-22 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct default setting of ARCH for WinCE builds.
+ Correct \ escaping for CE sed macros.
+
+2003-04-10 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: replace $(syscal) construct with older `syscall` for
+ systems where sh != bash.
+
+2003-04-09 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib
+ options for Windows/CE compilation support. Requires the
+ Microsoft eMbedded SDK and Keuchel's celib emulation layer.
+
+2003-02-18 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on
+ the link line when checking for the pthread_attr_setstacksize
+ symbol. (dejong)
+
+ * tcl.m4 (TEA_SETUP_COMPILER): added default calls to
+ TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS,
+ TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD.
+
+2003-02-14 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: correct HP-UX ia64 --enable-64bit build flags
+
+2003-01-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when
+ looking for tcl|tkConfig.sh, as this check is done before we would
+ set exec_prefix when the user does not define it.
+
+2003-01-21 Mo DeJong <mdejong@users.sourceforge.net>
+
+ * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support
+ for mingw, the previous implementation would
+ use VC++ when compiling with mingw gcc. Don't
+ pass -fPIC since gcc always compiles pic code
+ under win32. Change some hard coded cases
+ of gcc to ${CC}.
+
+2002-10-15 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to
+ TEA_MAKE_LIB because setting too early confuses other AC_* macros.
+ Correct the HP-11 SHLIB_LD_LIBS setting.
+
+ * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and
+ make it pick up the env CFLAGS at configure time.
+
+2002-10-09 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG.
+ Improved AIX 64-bit build support, allow it on AIX-4 as well.
+ Enable 64-bit HP-11 compilation with gcc.
+ Enable 64-bit IRIX64-6 cc build support.
+ Correct FreeBSD thread library linkage.
+ Add OSF1 static build support.
+ Improve SunOS-5 shared build SHLIB_LD macro.
+
+2002-07-20 Zoran Vasiljevic <zoran@archiware.com>
+
+ * tcl.m4: Added MINGW32 to list of systems checked for Windows build.
+ Also, fixes some indentation issues with "--with-XXX" options.
+
+2002-04-23 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to
+ use new threaded allocatory by default on Unix for Tcl 8.4.
+ (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+.
+
+2002-04-22 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that
+ we can use autoconf 2.5x as well as 2.13. This prevents us from
+ being able to warn against the use of cygwin gcc at configure
+ time, but allows autoconf 2.5x, which is what is shipped with most
+ newer systems.
+
+2002-04-11 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: Enabled COFF as well as CV style debug info with
+ --enable-symbols to allow Dr. Watson users to see function info.
+ More info on debugging levels can be obtained at:
+ http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp
+
+2002-04-03 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for
+ Scriptics, which is no more. TEA represents a better, independent
+ prefix that won't need changing.
+ Added preliminary mingw gcc support. [Patch #538772]
+ Added TEA_PREFIX macro that handles defaulting the prefix and
+ exec_prefix vars to those used by Tcl if none were specified.
+ Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC
+ check and several other basic AC_PROG checks needed for making
+ executables. This greatly simplifies user's configure.in files.
+ Collapsed AIX-5 defines into AIX-* with extra checks for doing the
+ ELF stuff on AIX-5-ia64.
+ Updated TEA_ENABLE_THREADS to take an optional arg to allow
+ switching it on by default (for Thread) and add sanity checking to
+ warn the user if configuring threads incompatibly.
+
+2002-03-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT.
+ Removed --enable-64bit support for AIX-4 because it wasn't correct.
+ Added -MT or -MD Windows linker switches to properly support
+ symbols-enabled builds.
+
+2002-03-28 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first
+ instead of calling it as that inlines it each time in shell code.
+ Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti.
+ Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds.
+ A few changes to support itcl (and perhaps others):
+ Added support for making your own stub libraries to SC_MAKE_LIB.
+ New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg
+ and find that ${pkg}Config.sh file. itk uses this for itcl.
+
+2002-03-27 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk
+ build dir setup.
+ Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS.
+ Added XLIBSW onto LIBS when it is defined.
+ Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS
+ instead to not rely as much on tclConfig.sh cached info.
+ Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH.
+ These move towards making TEA much more independent of *Config.sh.
+
+2002-03-19 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and
+ SHLIB_SUFFIX defines for Win.
+ (SC_PATH_X): made this only do the check on unix platforms.
+
+2002-03-12 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * README.txt: updated to reflect fewer files
+
+2002-03-06 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * config.guess (removed):
+ * config.sub (removed): removed unnecessary files
+
+ * installFile.tcl (removed):
+ * mkinstalldirs (removed): these aren't really necessary for
+ making TEA work
+
+ * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't
+ check /usr(/local)/include for includes on Windows when not using
+ gcc
+
+2002-03-05 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tcl.m4: added warnings on Windows, removed RELPATH define and
+ added TCL_LIBS to MAKE_LIB macro.
+
+ This import represents 2.0.0, or a new start at attempting to
+ make TEA much easier for C extension developers.
+
+ **** moved from tclpro project to core tcl project, ****
+ **** renamed to 'tclconfig' ****
+
+2001-03-15 Karl Lehenbauer <karl@procplace.com>
+
+ * installFile.tcl: Added updating of the modification time of
+ the target file whether we overwrote it or decided that it
+ hadn't changed. This was necessary for us to be able to
+ determine whether or not a module install touched the file.
+
+2001-03-08 Karl Lehenbauer <karl@procplace.com>
+
+ * installFile.tcl: Added support for converting new-style (1.1+)
+ Cygnus drive paths to Tcl-style.
+
+2001-01-15 <brent.welch@interwoven.com>
+
+ * tcl.m4: Added FreeBSD clause.
+
+2001-01-03 <brent.welch@interwoven.com>
+
+ * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking
+ for exec-prefix.
+
+2000-12-01 <brent.welch@interwoven.com>
+
+ * tcl.m4: Concatenated most of the Ajuba acsite.m4 file
+ so we don't need to modify the autoconf installation.
+ * config.guess:
+ * config.sub:
+ * installFile.tcl:
+ Added files from the itcl config subdirectory,
+ which should go away.
+
+2000-7-29 <welch@ajubasolutions.com>
+
+ * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within
+ TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent
+ change from $(srcdir) to $(srcdir)/..
diff --git a/tclconfig/README.txt b/tclconfig/README.txt
new file mode 100644
index 0000000..59b5a3e
--- /dev/null
+++ b/tclconfig/README.txt
@@ -0,0 +1,26 @@
+These files comprise the basic building blocks for a Tcl Extension
+Architecture (TEA) extension. For more information on TEA see:
+
+ http://www.tcl.tk/doc/tea/
+
+This package is part of the Tcl project at SourceForge, and latest
+sources should be available there:
+
+ http://tcl.sourceforge.net/
+
+This package is a freely available open source package. You can do
+virtually anything you like with it, such as modifying it, redistributing
+it, and selling it either in whole or in part.
+
+CONTENTS
+========
+The following is a short description of the files you will find in
+the sample extension.
+
+README.txt This file
+
+install-sh Program used for copying binaries and script files
+ to their install locations.
+
+tcl.m4 Collection of Tcl autoconf macros. Included by a package's
+ aclocal.m4 to define TEA_* macros.
diff --git a/tclconfig/install-sh b/tclconfig/install-sh
new file mode 100755
index 0000000..7c34c3f
--- /dev/null
+++ b/tclconfig/install-sh
@@ -0,0 +1,528 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-04-20.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# 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.
+
+nl='
+'
+IFS=" "" $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+ doit_exec=exec
+else
+ doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+ test "$posix_glob" != "?" || {
+ if (set -f) 2>/dev/null; then
+ posix_glob=
+ else
+ posix_glob=:
+ fi
+ }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -S $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *' '* | *'
+'* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) stripcmd="$stripprog $2"
+ shift;;
+
+ -t) dst_arg=$2
+ shift;;
+
+ -T) no_target_directory=true;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dst_arg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ # Prefer dirname, but fall back on a substitute if dirname fails.
+ dstdir=`
+ (dirname "$dst") 2>/dev/null ||
+ expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$dst" : 'X\(//\)[^/]' \| \
+ X"$dst" : 'X\(//\)$' \| \
+ X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+ echo X"$dst" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'
+ `
+
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writeable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ -*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ eval "$initialize_posix_glob"
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob set -f
+ set fnord $dstdir
+ shift
+ $posix_glob set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test -z "$d" && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # 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 $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+ eval "$initialize_posix_glob" &&
+ $posix_glob set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ $posix_glob set +f &&
+
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/tclconfig/tcl.m4 b/tclconfig/tcl.m4
new file mode 100644
index 0000000..8bc9c83
--- /dev/null
+++ b/tclconfig/tcl.m4
@@ -0,0 +1,4150 @@
+# tcl.m4 --
+#
+# This file provides a set of autoconf macros to help TEA-enable
+# a Tcl extension.
+#
+# Copyright (c) 1999-2000 Ajuba Solutions.
+# Copyright (c) 2002-2005 ActiveState Corporation.
+#
+# See the file "license.terms" for information on usage and redistribution
+# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
+AC_PREREQ(2.57)
+
+dnl TEA extensions pass us the version of TEA they think they
+dnl are compatible with (must be set in TEA_INIT below)
+dnl TEA_VERSION="3.9"
+
+# Possible values for key variables defined:
+#
+# TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem')
+# TEA_PLATFORM - windows unix
+#
+
+#------------------------------------------------------------------------
+# TEA_PATH_TCLCONFIG --
+#
+# Locate the tclConfig.sh file and perform a sanity check on
+# the Tcl compile flags
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-tcl=...
+#
+# Defines the following vars:
+# TCL_BIN_DIR Full path to the directory containing
+# the tclConfig.sh file
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PATH_TCLCONFIG], [
+ dnl TEA specific: Make sure we are initialized
+ AC_REQUIRE([TEA_INIT])
+ #
+ # Ok, lets find the tcl configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tcl
+ #
+
+ if test x"${no_tcl}" = x ; then
+ # we reset no_tcl in case something fails here
+ no_tcl=true
+ AC_ARG_WITH(tcl,
+ AC_HELP_STRING([--with-tcl],
+ [directory containing tcl configuration (tclConfig.sh)]),
+ with_tclconfig="${withval}")
+ AC_MSG_CHECKING([for Tcl configuration])
+ AC_CACHE_VAL(ac_cv_c_tclconfig,[
+
+ # First check to see if --with-tcl was specified.
+ if test x"${with_tclconfig}" != x ; then
+ case "${with_tclconfig}" in
+ */tclConfig.sh )
+ if test -f "${with_tclconfig}"; then
+ AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself])
+ with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`"
+ fi ;;
+ esac
+ if test -f "${with_tclconfig}/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`"
+ else
+ AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh])
+ fi
+ fi
+
+ # then check for a private Tcl installation
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ../tcl \
+ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../tcl \
+ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../../tcl \
+ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a -f "$i/win/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i/win; pwd)`"
+ break
+ fi
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i/unix; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # on Darwin, check in Framework installation locations
+ if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then
+ for i in `ls -d ~/Library/Frameworks 2>/dev/null` \
+ `ls -d /Library/Frameworks 2>/dev/null` \
+ `ls -d /Network/Library/Frameworks 2>/dev/null` \
+ `ls -d /System/Library/Frameworks 2>/dev/null` \
+ ; do
+ if test -f "$i/Tcl.framework/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # TEA specific: on Windows, check in common installation locations
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a x"${ac_cv_c_tclconfig}" = x ; then
+ for i in `ls -d C:/Tcl/lib 2>/dev/null` \
+ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \
+ ; do
+ if test -f "$i/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # check in a few common install locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in `ls -d ${libdir} 2>/dev/null` \
+ `ls -d ${exec_prefix}/lib 2>/dev/null` \
+ `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` \
+ `ls -d /usr/contrib/lib 2>/dev/null` \
+ `ls -d /usr/lib 2>/dev/null` \
+ `ls -d /usr/lib64 2>/dev/null` \
+ ; do
+ if test -f "$i/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # check in a few other private locations
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tcl \
+ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a -f "$i/win/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i/win; pwd)`"
+ break
+ fi
+ if test -f "$i/unix/tclConfig.sh" ; then
+ ac_cv_c_tclconfig="`(cd $i/unix; pwd)`"
+ break
+ fi
+ done
+ fi
+ ])
+
+ if test x"${ac_cv_c_tclconfig}" = x ; then
+ TCL_BIN_DIR="# no Tcl configs found"
+ AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh])
+ else
+ no_tcl=
+ TCL_BIN_DIR="${ac_cv_c_tclconfig}"
+ AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh])
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_PATH_TKCONFIG --
+#
+# Locate the tkConfig.sh file
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-tk=...
+#
+# Defines the following vars:
+# TK_BIN_DIR Full path to the directory containing
+# the tkConfig.sh file
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PATH_TKCONFIG], [
+ #
+ # Ok, lets find the tk configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-tk
+ #
+
+ if test x"${no_tk}" = x ; then
+ # we reset no_tk in case something fails here
+ no_tk=true
+ AC_ARG_WITH(tk,
+ AC_HELP_STRING([--with-tk],
+ [directory containing tk configuration (tkConfig.sh)]),
+ with_tkconfig="${withval}")
+ AC_MSG_CHECKING([for Tk configuration])
+ AC_CACHE_VAL(ac_cv_c_tkconfig,[
+
+ # First check to see if --with-tkconfig was specified.
+ if test x"${with_tkconfig}" != x ; then
+ case "${with_tkconfig}" in
+ */tkConfig.sh )
+ if test -f "${with_tkconfig}"; then
+ AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself])
+ with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`"
+ fi ;;
+ esac
+ if test -f "${with_tkconfig}/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`"
+ else
+ AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh])
+ fi
+ fi
+
+ # then check for a private Tk library
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ../tk \
+ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../tk \
+ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \
+ ../../../tk \
+ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a -f "$i/win/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i/win; pwd)`"
+ break
+ fi
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i/unix; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # on Darwin, check in Framework installation locations
+ if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then
+ for i in `ls -d ~/Library/Frameworks 2>/dev/null` \
+ `ls -d /Library/Frameworks 2>/dev/null` \
+ `ls -d /Network/Library/Frameworks 2>/dev/null` \
+ `ls -d /System/Library/Frameworks 2>/dev/null` \
+ ; do
+ if test -f "$i/Tk.framework/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # check in a few common install locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in `ls -d ${libdir} 2>/dev/null` \
+ `ls -d ${exec_prefix}/lib 2>/dev/null` \
+ `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` \
+ `ls -d /usr/contrib/lib 2>/dev/null` \
+ `ls -d /usr/lib 2>/dev/null` \
+ `ls -d /usr/lib64 2>/dev/null` \
+ ; do
+ if test -f "$i/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # TEA specific: on Windows, check in common installation locations
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a x"${ac_cv_c_tkconfig}" = x ; then
+ for i in `ls -d C:/Tcl/lib 2>/dev/null` \
+ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \
+ ; do
+ if test -f "$i/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i; pwd)`"
+ break
+ fi
+ done
+ fi
+
+ # check in a few other private locations
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ for i in \
+ ${srcdir}/../tk \
+ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \
+ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
+ if test "${TEA_PLATFORM}" = "windows" \
+ -a -f "$i/win/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i/win; pwd)`"
+ break
+ fi
+ if test -f "$i/unix/tkConfig.sh" ; then
+ ac_cv_c_tkconfig="`(cd $i/unix; pwd)`"
+ break
+ fi
+ done
+ fi
+ ])
+
+ if test x"${ac_cv_c_tkconfig}" = x ; then
+ TK_BIN_DIR="# no Tk configs found"
+ AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh])
+ else
+ no_tk=
+ TK_BIN_DIR="${ac_cv_c_tkconfig}"
+ AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh])
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_LOAD_TCLCONFIG --
+#
+# Load the tclConfig.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# TCL_BIN_DIR
+#
+# Results:
+#
+# Substitutes the following vars:
+# TCL_BIN_DIR
+# TCL_SRC_DIR
+# TCL_LIB_FILE
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_LOAD_TCLCONFIG], [
+ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh])
+
+ if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then
+ AC_MSG_RESULT([loading])
+ . "${TCL_BIN_DIR}/tclConfig.sh"
+ else
+ AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh])
+ fi
+
+ # eval is required to do the TCL_DBGX substitution
+ eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
+ eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
+
+ # If the TCL_BIN_DIR is the build directory (not the install directory),
+ # then set the common variable name to the value of the build variables.
+ # For example, the variable TCL_LIB_SPEC will be set to the value
+ # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
+ # instead of TCL_BUILD_LIB_SPEC since it will work with both an
+ # installed and uninstalled version of Tcl.
+ if test -f "${TCL_BIN_DIR}/Makefile" ; then
+ TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}"
+ TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}"
+ TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}"
+ elif test "`uname -s`" = "Darwin"; then
+ # If Tcl was built as a framework, attempt to use the libraries
+ # from the framework at the given location so that linking works
+ # against Tcl.framework installed in an arbitrary location.
+ case ${TCL_DEFS} in
+ *TCL_FRAMEWORK*)
+ if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then
+ for i in "`cd "${TCL_BIN_DIR}"; pwd`" \
+ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do
+ if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then
+ TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}"
+ break
+ fi
+ done
+ fi
+ if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then
+ TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}"
+ TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"
+ fi
+ ;;
+ esac
+ fi
+
+ # eval is required to do the TCL_DBGX substitution
+ eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
+ eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
+ eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
+ eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
+
+ AC_SUBST(TCL_VERSION)
+ AC_SUBST(TCL_PATCH_LEVEL)
+ AC_SUBST(TCL_BIN_DIR)
+ AC_SUBST(TCL_SRC_DIR)
+
+ AC_SUBST(TCL_LIB_FILE)
+ AC_SUBST(TCL_LIB_FLAG)
+ AC_SUBST(TCL_LIB_SPEC)
+
+ AC_SUBST(TCL_STUB_LIB_FILE)
+ AC_SUBST(TCL_STUB_LIB_FLAG)
+ AC_SUBST(TCL_STUB_LIB_SPEC)
+
+ AC_MSG_CHECKING([platform])
+ hold_cc=$CC; CC="$TCL_CC"
+ AC_TRY_COMPILE(,[
+ #ifdef _WIN32
+ #error win32
+ #endif
+ ], TEA_PLATFORM="unix",
+ TEA_PLATFORM="windows"
+ )
+ CC=$hold_cc
+ AC_MSG_RESULT($TEA_PLATFORM)
+
+ # The BUILD_$pkg is to define the correct extern storage class
+ # handling when making this package
+ AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [],
+ [Building extension source?])
+ # Do this here as we have fully defined TEA_PLATFORM now
+ if test "${TEA_PLATFORM}" = "windows" ; then
+ EXEEXT=".exe"
+ CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp"
+ fi
+
+ # TEA specific:
+ AC_SUBST(CLEANFILES)
+ AC_SUBST(TCL_LIBS)
+ AC_SUBST(TCL_DEFS)
+ AC_SUBST(TCL_EXTRA_CFLAGS)
+ AC_SUBST(TCL_LD_FLAGS)
+ AC_SUBST(TCL_SHLIB_LD_LIBS)
+])
+
+#------------------------------------------------------------------------
+# TEA_LOAD_TKCONFIG --
+#
+# Load the tkConfig.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# TK_BIN_DIR
+#
+# Results:
+#
+# Sets the following vars that should be in tkConfig.sh:
+# TK_BIN_DIR
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_LOAD_TKCONFIG], [
+ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh])
+
+ if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then
+ AC_MSG_RESULT([loading])
+ . "${TK_BIN_DIR}/tkConfig.sh"
+ else
+ AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh])
+ fi
+
+ # eval is required to do the TK_DBGX substitution
+ eval "TK_LIB_FILE=\"${TK_LIB_FILE}\""
+ eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\""
+
+ # If the TK_BIN_DIR is the build directory (not the install directory),
+ # then set the common variable name to the value of the build variables.
+ # For example, the variable TK_LIB_SPEC will be set to the value
+ # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC
+ # instead of TK_BUILD_LIB_SPEC since it will work with both an
+ # installed and uninstalled version of Tcl.
+ if test -f "${TK_BIN_DIR}/Makefile" ; then
+ TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}"
+ TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}"
+ TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}"
+ elif test "`uname -s`" = "Darwin"; then
+ # If Tk was built as a framework, attempt to use the libraries
+ # from the framework at the given location so that linking works
+ # against Tk.framework installed in an arbitrary location.
+ case ${TK_DEFS} in
+ *TK_FRAMEWORK*)
+ if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then
+ for i in "`cd "${TK_BIN_DIR}"; pwd`" \
+ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do
+ if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then
+ TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}"
+ break
+ fi
+ done
+ fi
+ if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then
+ TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}"
+ TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"
+ fi
+ ;;
+ esac
+ fi
+
+ # eval is required to do the TK_DBGX substitution
+ eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\""
+ eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\""
+ eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\""
+ eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\""
+
+ # TEA specific: Ensure windowingsystem is defined
+ if test "${TEA_PLATFORM}" = "unix" ; then
+ case ${TK_DEFS} in
+ *MAC_OSX_TK*)
+ AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?])
+ TEA_WINDOWINGSYSTEM="aqua"
+ ;;
+ *)
+ TEA_WINDOWINGSYSTEM="x11"
+ ;;
+ esac
+ elif test "${TEA_PLATFORM}" = "windows" ; then
+ TEA_WINDOWINGSYSTEM="win32"
+ fi
+
+ AC_SUBST(TK_VERSION)
+ AC_SUBST(TK_BIN_DIR)
+ AC_SUBST(TK_SRC_DIR)
+
+ AC_SUBST(TK_LIB_FILE)
+ AC_SUBST(TK_LIB_FLAG)
+ AC_SUBST(TK_LIB_SPEC)
+
+ AC_SUBST(TK_STUB_LIB_FILE)
+ AC_SUBST(TK_STUB_LIB_FLAG)
+ AC_SUBST(TK_STUB_LIB_SPEC)
+
+ # TEA specific:
+ AC_SUBST(TK_LIBS)
+ AC_SUBST(TK_XINCLUDES)
+])
+
+#------------------------------------------------------------------------
+# TEA_PROG_TCLSH
+# Determine the fully qualified path name of the tclsh executable
+# in the Tcl build directory or the tclsh installed in a bin
+# directory. This macro will correctly determine the name
+# of the tclsh executable even if tclsh has not yet been
+# built in the build directory. The tclsh found is always
+# associated with a tclConfig.sh file. This tclsh should be used
+# only for running extension test cases. It should never be
+# or generation of files (like pkgIndex.tcl) at build time.
+#
+# Arguments:
+# none
+#
+# Results:
+# Substitutes the following vars:
+# TCLSH_PROG
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PROG_TCLSH], [
+ AC_MSG_CHECKING([for tclsh])
+ if test -f "${TCL_BIN_DIR}/Makefile" ; then
+ # tclConfig.sh is in Tcl build directory
+ if test "${TEA_PLATFORM}" = "windows"; then
+ TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}"
+ else
+ TCLSH_PROG="${TCL_BIN_DIR}/tclsh"
+ fi
+ else
+ # tclConfig.sh is in install location
+ if test "${TEA_PLATFORM}" = "windows"; then
+ TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}"
+ else
+ TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}"
+ fi
+ list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \
+ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \
+ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`"
+ for i in $list ; do
+ if test -f "$i/${TCLSH_PROG}" ; then
+ REAL_TCL_BIN_DIR="`cd "$i"; pwd`/"
+ break
+ fi
+ done
+ TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}"
+ fi
+ AC_MSG_RESULT([${TCLSH_PROG}])
+ AC_SUBST(TCLSH_PROG)
+])
+
+#------------------------------------------------------------------------
+# TEA_PROG_WISH
+# Determine the fully qualified path name of the wish executable
+# in the Tk build directory or the wish installed in a bin
+# directory. This macro will correctly determine the name
+# of the wish executable even if wish has not yet been
+# built in the build directory. The wish found is always
+# associated with a tkConfig.sh file. This wish should be used
+# only for running extension test cases. It should never be
+# or generation of files (like pkgIndex.tcl) at build time.
+#
+# Arguments:
+# none
+#
+# Results:
+# Substitutes the following vars:
+# WISH_PROG
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PROG_WISH], [
+ AC_MSG_CHECKING([for wish])
+ if test -f "${TK_BIN_DIR}/Makefile" ; then
+ # tkConfig.sh is in Tk build directory
+ if test "${TEA_PLATFORM}" = "windows"; then
+ WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}"
+ else
+ WISH_PROG="${TK_BIN_DIR}/wish"
+ fi
+ else
+ # tkConfig.sh is in install location
+ if test "${TEA_PLATFORM}" = "windows"; then
+ WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}"
+ else
+ WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}"
+ fi
+ list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \
+ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \
+ `ls -d ${TK_PREFIX}/bin 2>/dev/null`"
+ for i in $list ; do
+ if test -f "$i/${WISH_PROG}" ; then
+ REAL_TK_BIN_DIR="`cd "$i"; pwd`/"
+ break
+ fi
+ done
+ WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}"
+ fi
+ AC_MSG_RESULT([${WISH_PROG}])
+ AC_SUBST(WISH_PROG)
+])
+
+#------------------------------------------------------------------------
+# TEA_ENABLE_SHARED --
+#
+# Allows the building of shared libraries
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-shared=yes|no
+#
+# Defines the following vars:
+# STATIC_BUILD Used for building import/export libraries
+# on Windows.
+#
+# Sets the following vars:
+# SHARED_BUILD Value of 1 or 0
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_ENABLE_SHARED], [
+ AC_MSG_CHECKING([how to build libraries])
+ AC_ARG_ENABLE(shared,
+ AC_HELP_STRING([--enable-shared],
+ [build and link with shared libraries (default: on)]),
+ [tcl_ok=$enableval], [tcl_ok=yes])
+
+ if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ tcl_ok=$enableval
+ else
+ tcl_ok=yes
+ fi
+
+ if test "$tcl_ok" = "yes" ; then
+ AC_MSG_RESULT([shared])
+ SHARED_BUILD=1
+ else
+ AC_MSG_RESULT([static])
+ SHARED_BUILD=0
+ AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?])
+ fi
+ AC_SUBST(SHARED_BUILD)
+])
+
+#------------------------------------------------------------------------
+# TEA_ENABLE_THREADS --
+#
+# Specify if thread support should be enabled. If "yes" is specified
+# as an arg (optional), threads are enabled by default, "no" means
+# threads are disabled. "yes" is the default.
+#
+# TCL_THREADS is checked so that if you are compiling an extension
+# against a threaded core, your extension must be compiled threaded
+# as well.
+#
+# Note that it is legal to have a thread enabled extension run in a
+# threaded or non-threaded Tcl core, but a non-threaded extension may
+# only run in a non-threaded Tcl core.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-threads
+#
+# Sets the following vars:
+# THREADS_LIBS Thread library(s)
+#
+# Defines the following vars:
+# TCL_THREADS
+# _REENTRANT
+# _THREAD_SAFE
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_ENABLE_THREADS], [
+ AC_ARG_ENABLE(threads,
+ AC_HELP_STRING([--enable-threads],
+ [build with threads]),
+ [tcl_ok=$enableval], [tcl_ok=yes])
+
+ if test "${enable_threads+set}" = set; then
+ enableval="$enable_threads"
+ tcl_ok=$enableval
+ else
+ tcl_ok=yes
+ fi
+
+ if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then
+ TCL_THREADS=1
+
+ if test "${TEA_PLATFORM}" != "windows" ; then
+ # We are always OK on Windows, so check what this platform wants:
+
+ # USE_THREAD_ALLOC tells us to try the special thread-based
+ # allocator that significantly reduces lock contention
+ AC_DEFINE(USE_THREAD_ALLOC, 1,
+ [Do we want to use the threaded memory allocator?])
+ AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?])
+ if test "`uname -s`" = "SunOS" ; then
+ AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1,
+ [Do we really want to follow the standard? Yes we do!])
+ fi
+ AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?])
+ AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
+ if test "$tcl_ok" = "no"; then
+ # Check a little harder for __pthread_mutex_init in the same
+ # library, as some systems hide it there until pthread.h is
+ # defined. We could alternatively do an AC_TRY_COMPILE with
+ # pthread.h, but that will work with libpthread really doesn't
+ # exist, like AIX 4.2. [Bug: 4359]
+ AC_CHECK_LIB(pthread, __pthread_mutex_init,
+ tcl_ok=yes, tcl_ok=no)
+ fi
+
+ if test "$tcl_ok" = "yes"; then
+ # The space is needed
+ THREADS_LIBS=" -lpthread"
+ else
+ AC_CHECK_LIB(pthreads, pthread_mutex_init,
+ tcl_ok=yes, tcl_ok=no)
+ if test "$tcl_ok" = "yes"; then
+ # The space is needed
+ THREADS_LIBS=" -lpthreads"
+ else
+ AC_CHECK_LIB(c, pthread_mutex_init,
+ tcl_ok=yes, tcl_ok=no)
+ if test "$tcl_ok" = "no"; then
+ AC_CHECK_LIB(c_r, pthread_mutex_init,
+ tcl_ok=yes, tcl_ok=no)
+ if test "$tcl_ok" = "yes"; then
+ # The space is needed
+ THREADS_LIBS=" -pthread"
+ else
+ TCL_THREADS=0
+ AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled])
+ fi
+ fi
+ fi
+ fi
+ fi
+ else
+ TCL_THREADS=0
+ fi
+ # Do checking message here to not mess up interleaved configure output
+ AC_MSG_CHECKING([for building with threads])
+ if test "${TCL_THREADS}" = 1; then
+ AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?])
+ AC_MSG_RESULT([yes (default)])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ # TCL_THREADS sanity checking. See if our request for building with
+ # threads is the same as the way Tcl was built. If not, warn the user.
+ case ${TCL_DEFS} in
+ *THREADS=1*)
+ if test "${TCL_THREADS}" = "0"; then
+ AC_MSG_WARN([
+ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl
+ that IS thread-enabled. It is recommended to use --enable-threads.])
+ fi
+ ;;
+ *)
+ if test "${TCL_THREADS}" = "1"; then
+ AC_MSG_WARN([
+ --enable-threads requested, but building against a Tcl that is NOT
+ thread-enabled. This is an OK configuration that will also run in
+ a thread-enabled core.])
+ fi
+ ;;
+ esac
+ AC_SUBST(TCL_THREADS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ENABLE_SYMBOLS --
+#
+# Specify if debugging symbols should be used.
+# Memory (TCL_MEM_DEBUG) debugging can also be enabled.
+#
+# Arguments:
+# none
+#
+# TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives
+# the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted.
+# Requires the following vars to be set in the Makefile:
+# CFLAGS_DEFAULT
+# LDFLAGS_DEFAULT
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-symbols
+#
+# Defines the following vars:
+# CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true
+# Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false
+# LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true
+# Sets to $(LDFLAGS_OPTIMIZE) if false
+# DBGX Formerly used as debug library extension;
+# always blank now.
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_ENABLE_SYMBOLS], [
+ dnl TEA specific: Make sure we are initialized
+ AC_REQUIRE([TEA_CONFIG_CFLAGS])
+ AC_MSG_CHECKING([for build with symbols])
+ AC_ARG_ENABLE(symbols,
+ AC_HELP_STRING([--enable-symbols],
+ [build with debugging symbols (default: off)]),
+ [tcl_ok=$enableval], [tcl_ok=no])
+ DBGX=""
+ if test "$tcl_ok" = "no"; then
+ CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG"
+ LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}"
+ AC_MSG_RESULT([no])
+ else
+ CFLAGS_DEFAULT="${CFLAGS_DEBUG}"
+ LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}"
+ if test "$tcl_ok" = "yes"; then
+ AC_MSG_RESULT([yes (standard debugging)])
+ fi
+ fi
+ # TEA specific:
+ if test "${TEA_PLATFORM}" != "windows" ; then
+ LDFLAGS_DEFAULT="${LDFLAGS}"
+ fi
+ AC_SUBST(CFLAGS_DEFAULT)
+ AC_SUBST(LDFLAGS_DEFAULT)
+ AC_SUBST(TCL_DBGX)
+
+ if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then
+ AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?])
+ fi
+
+ if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then
+ if test "$tcl_ok" = "all"; then
+ AC_MSG_RESULT([enabled symbols mem debugging])
+ else
+ AC_MSG_RESULT([enabled $tcl_ok debugging])
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_ENABLE_LANGINFO --
+#
+# Allows use of modern nl_langinfo check for better l10n.
+# This is only relevant for Unix.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --enable-langinfo=yes|no (default is yes)
+#
+# Defines the following vars:
+# HAVE_LANGINFO Triggers use of nl_langinfo if defined.
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_ENABLE_LANGINFO], [
+ AC_ARG_ENABLE(langinfo,
+ AC_HELP_STRING([--enable-langinfo],
+ [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]),
+ [langinfo_ok=$enableval], [langinfo_ok=yes])
+
+ HAVE_LANGINFO=0
+ if test "$langinfo_ok" = "yes"; then
+ AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no])
+ fi
+ AC_MSG_CHECKING([whether to use nl_langinfo])
+ if test "$langinfo_ok" = "yes"; then
+ AC_CACHE_VAL(tcl_cv_langinfo_h, [
+ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);],
+ [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])])
+ AC_MSG_RESULT([$tcl_cv_langinfo_h])
+ if test $tcl_cv_langinfo_h = yes; then
+ AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?])
+ fi
+ else
+ AC_MSG_RESULT([$langinfo_ok])
+ fi
+])
+
+#--------------------------------------------------------------------
+# TEA_CONFIG_SYSTEM
+#
+# Determine what the system is (some things cannot be easily checked
+# on a feature-driven basis, alas). This can usually be done via the
+# "uname" command.
+#
+# Arguments:
+# none
+#
+# Results:
+# Defines the following var:
+#
+# system - System/platform/version identification code.
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_CONFIG_SYSTEM], [
+ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [
+ # TEA specific:
+ if test "${TEA_PLATFORM}" = "windows" ; then
+ tcl_cv_sys_version=windows
+ else
+ tcl_cv_sys_version=`uname -s`-`uname -r`
+ if test "$?" -ne 0 ; then
+ AC_MSG_WARN([can't find uname command])
+ tcl_cv_sys_version=unknown
+ else
+ if test "`uname -s`" = "AIX" ; then
+ tcl_cv_sys_version=AIX-`uname -v`.`uname -r`
+ fi
+ fi
+ fi
+ ])
+ system=$tcl_cv_sys_version
+])
+
+#--------------------------------------------------------------------
+# TEA_CONFIG_CFLAGS
+#
+# Try to determine the proper flags to pass to the compiler
+# for building shared libraries and other such nonsense.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines and substitutes the following vars:
+#
+# DL_OBJS, DL_LIBS - removed for TEA, only needed by core.
+# LDFLAGS - Flags to pass to the compiler when linking object
+# files into an executable application binary such
+# as tclsh.
+# LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib",
+# that tell the run-time dynamic linker where to look
+# for shared libraries such as libtcl.so. Depends on
+# the variable LIB_RUNTIME_DIR in the Makefile. Could
+# be the same as CC_SEARCH_FLAGS if ${CC} is used to link.
+# CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib",
+# that tell the run-time dynamic linker where to look
+# for shared libraries such as libtcl.so. Depends on
+# the variable LIB_RUNTIME_DIR in the Makefile.
+# SHLIB_CFLAGS - Flags to pass to cc when compiling the components
+# of a shared library (may request position-independent
+# code, among other things).
+# SHLIB_LD - Base command to use for combining object files
+# into a shared library.
+# SHLIB_LD_LIBS - Dependent libraries for the linker to scan when
+# creating shared libraries. This symbol typically
+# goes at the end of the "ld" commands that build
+# shared libraries. The value of the symbol defaults to
+# "${LIBS}" if all of the dependent libraries should
+# be specified when creating a shared library. If
+# dependent libraries should not be specified (as on
+# SunOS 4.x, where they cause the link to fail, or in
+# general if Tcl and Tk aren't themselves shared
+# libraries), then this symbol has an empty string
+# as its value.
+# SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable
+# extensions. An empty string means we don't know how
+# to use shared libraries on this platform.
+# LIB_SUFFIX - Specifies everything that comes after the "libfoo"
+# in a static or shared library name, using the $PACKAGE_VERSION variable
+# to put the version in the right place. This is used
+# by platforms that need non-standard library names.
+# Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs
+# to have a version after the .so, and ${PACKAGE_VERSION}.a
+# on AIX, since a shared library needs to have
+# a .a extension whereas shared objects for loadable
+# extensions have a .so extension. Defaults to
+# ${PACKAGE_VERSION}${SHLIB_SUFFIX}.
+# CFLAGS_DEBUG -
+# Flags used when running the compiler in debug mode
+# CFLAGS_OPTIMIZE -
+# Flags used when running the compiler in optimize mode
+# CFLAGS - Additional CFLAGS added as necessary (usually 64-bit)
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_CONFIG_CFLAGS], [
+ dnl TEA specific: Make sure we are initialized
+ AC_REQUIRE([TEA_INIT])
+
+ # Step 0.a: Enable 64 bit support?
+
+ AC_MSG_CHECKING([if 64bit support is requested])
+ AC_ARG_ENABLE(64bit,
+ AC_HELP_STRING([--enable-64bit],
+ [enable 64bit support (default: off)]),
+ [do64bit=$enableval], [do64bit=no])
+ AC_MSG_RESULT([$do64bit])
+
+ # Step 0.b: Enable Solaris 64 bit VIS support?
+
+ AC_MSG_CHECKING([if 64bit Sparc VIS support is requested])
+ AC_ARG_ENABLE(64bit-vis,
+ AC_HELP_STRING([--enable-64bit-vis],
+ [enable 64bit Sparc VIS support (default: off)]),
+ [do64bitVIS=$enableval], [do64bitVIS=no])
+ AC_MSG_RESULT([$do64bitVIS])
+ # Force 64bit on with VIS
+ AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes])
+
+ # Step 0.c: Check if visibility support is available. Do this here so
+ # that platform specific alternatives can be used below if this fails.
+
+ AC_CACHE_CHECK([if compiler supports visibility "hidden"],
+ tcl_cv_cc_visibility_hidden, [
+ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror"
+ AC_TRY_LINK([
+ extern __attribute__((__visibility__("hidden"))) void f(void);
+ void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes,
+ tcl_cv_cc_visibility_hidden=no)
+ CFLAGS=$hold_cflags])
+ AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [
+ AC_DEFINE(MODULE_SCOPE,
+ [extern __attribute__((__visibility__("hidden")))],
+ [Compiler support for module scope symbols])
+ AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols])
+ ])
+
+ # Step 0.d: Disable -rpath support?
+
+ AC_MSG_CHECKING([if rpath support is requested])
+ AC_ARG_ENABLE(rpath,
+ AC_HELP_STRING([--disable-rpath],
+ [disable rpath support (default: on)]),
+ [doRpath=$enableval], [doRpath=yes])
+ AC_MSG_RESULT([$doRpath])
+
+ # TEA specific: Cross-compiling options for Windows/CE builds?
+
+ AS_IF([test "${TEA_PLATFORM}" = windows], [
+ AC_MSG_CHECKING([if Windows/CE build is requested])
+ AC_ARG_ENABLE(wince,
+ AC_HELP_STRING([--enable-wince],
+ [enable Win/CE support (where applicable)]),
+ [doWince=$enableval], [doWince=no])
+ AC_MSG_RESULT([$doWince])
+ ])
+
+ # Set the variable "system" to hold the name and version number
+ # for the system.
+
+ TEA_CONFIG_SYSTEM
+
+ # Require ranlib early so we can override it in special cases below.
+
+ AC_REQUIRE([AC_PROG_RANLIB])
+
+ # Set configuration options based on system name and version.
+ # This is similar to Tcl's unix/tcl.m4 except that we've added a
+ # "windows" case and removed some core-only vars.
+
+ do64bit_ok=no
+ # default to '{$LIBS}' and set to "" on per-platform necessary basis
+ SHLIB_LD_LIBS='${LIBS}'
+ # When ld needs options to work in 64-bit mode, put them in
+ # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load]
+ # is disabled by the user. [Bug 1016796]
+ LDFLAGS_ARCH=""
+ UNSHARED_LIB_SUFFIX=""
+ # TEA specific: use PACKAGE_VERSION instead of VERSION
+ TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`'
+ ECHO_VERSION='`echo ${PACKAGE_VERSION}`'
+ TCL_LIB_VERSIONS_OK=ok
+ CFLAGS_DEBUG=-g
+ AS_IF([test "$GCC" = yes], [
+ CFLAGS_OPTIMIZE=-O2
+ CFLAGS_WARNING="-Wall"
+ ], [
+ CFLAGS_OPTIMIZE=-O
+ CFLAGS_WARNING=""
+ ])
+ AC_CHECK_TOOL(AR, ar)
+ STLIB_LD='${AR} cr'
+ LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH"
+ AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"])
+ case $system in
+ # TEA specific:
+ windows)
+ # This is a 2-stage check to make sure we have the 64-bit SDK
+ # We have to know where the SDK is installed.
+ # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs
+ # MACHINE is IX86 for LINK, but this is used by the manifest,
+ # which requires x86|amd64|ia64.
+ MACHINE="X86"
+ if test "$do64bit" != "no" ; then
+ if test "x${MSSDK}x" = "xx" ; then
+ MSSDK="C:/Progra~1/Microsoft Platform SDK"
+ fi
+ MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'`
+ PATH64=""
+ case "$do64bit" in
+ amd64|x64|yes)
+ MACHINE="AMD64" ; # default to AMD64 64-bit build
+ PATH64="${MSSDK}/Bin/Win64/x86/AMD64"
+ ;;
+ ia64)
+ MACHINE="IA64"
+ PATH64="${MSSDK}/Bin/Win64"
+ ;;
+ esac
+ if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then
+ AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode])
+ AC_MSG_WARN([Ensure latest Platform SDK is installed])
+ do64bit="no"
+ else
+ AC_MSG_RESULT([ Using 64-bit $MACHINE mode])
+ do64bit_ok="yes"
+ fi
+ fi
+
+ if test "$doWince" != "no" ; then
+ if test "$do64bit" != "no" ; then
+ AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible])
+ fi
+ if test "$GCC" = "yes" ; then
+ AC_MSG_ERROR([Windows/CE and GCC builds incompatible])
+ fi
+ TEA_PATH_CELIB
+ # Set defaults for common evc4/PPC2003 setup
+ # Currently Tcl requires 300+, possibly 420+ for sockets
+ CEVERSION=420; # could be 211 300 301 400 420 ...
+ TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ...
+ ARCH=ARM; # could be ARM MIPS X86EM ...
+ PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002"
+ if test "$doWince" != "yes"; then
+ # If !yes then the user specified something
+ # Reset ARCH to allow user to skip specifying it
+ ARCH=
+ eval `echo $doWince | awk -F, '{ \
+ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \
+ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \
+ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \
+ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \
+ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \
+ }'`
+ if test "x${ARCH}" = "x" ; then
+ ARCH=$TARGETCPU;
+ fi
+ fi
+ OSVERSION=WCE$CEVERSION;
+ if test "x${WCEROOT}" = "x" ; then
+ WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0"
+ if test ! -d "${WCEROOT}" ; then
+ WCEROOT="C:/Program Files/Microsoft eMbedded Tools"
+ fi
+ fi
+ if test "x${SDKROOT}" = "x" ; then
+ SDKROOT="C:/Program Files/Windows CE Tools"
+ if test ! -d "${SDKROOT}" ; then
+ SDKROOT="C:/Windows CE Tools"
+ fi
+ fi
+ WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'`
+ SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'`
+ if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \
+ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then
+ AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]])
+ doWince="no"
+ else
+ # We could PATH_NOSPACE these, but that's not important,
+ # as long as we quote them when used.
+ CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include"
+ if test -d "${CEINCLUDE}/${TARGETCPU}" ; then
+ CEINCLUDE="${CEINCLUDE}/${TARGETCPU}"
+ fi
+ CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}"
+ fi
+ fi
+
+ if test "$GCC" != "yes" ; then
+ if test "${SHARED_BUILD}" = "0" ; then
+ runtime=-MT
+ else
+ runtime=-MD
+ fi
+
+ if test "$do64bit" != "no" ; then
+ # All this magic is necessary for the Win64 SDK RC1 - hobbs
+ CC="\"${PATH64}/cl.exe\""
+ CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\""
+ RC="\"${MSSDK}/bin/rc.exe\""
+ lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\""
+ LINKBIN="\"${PATH64}/link.exe\""
+ CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d"
+ CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}"
+ # Avoid 'unresolved external symbol __security_cookie'
+ # errors, c.f. http://support.microsoft.com/?id=894573
+ TEA_ADD_LIBS([bufferoverflowU.lib])
+ elif test "$doWince" != "no" ; then
+ CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin"
+ if test "${TARGETCPU}" = "X86"; then
+ CC="\"${CEBINROOT}/cl.exe\""
+ else
+ CC="\"${CEBINROOT}/cl${ARCH}.exe\""
+ fi
+ CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\""
+ RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\""
+ arch=`echo ${ARCH} | awk '{print tolower([$]0)}'`
+ defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS"
+ if test "${SHARED_BUILD}" = "1" ; then
+ # Static CE builds require static celib as well
+ defs="${defs} _DLL"
+ fi
+ for i in $defs ; do
+ AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i)
+ done
+ AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version])
+ AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version])
+ CFLAGS_DEBUG="-nologo -Zi -Od"
+ CFLAGS_OPTIMIZE="-nologo -Ox"
+ lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'`
+ lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo"
+ LINKBIN="\"${CEBINROOT}/link.exe\""
+ AC_SUBST(CELIB_DIR)
+ else
+ RC="rc"
+ lflags="-nologo"
+ LINKBIN="link"
+ CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d"
+ CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}"
+ fi
+ fi
+
+ if test "$GCC" = "yes"; then
+ # mingw gcc mode
+ AC_CHECK_TOOL(RC, windres)
+ CFLAGS_DEBUG="-g"
+ CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer"
+ SHLIB_LD='${CC} -shared'
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
+ LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}"
+ LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}"
+
+ AC_CACHE_CHECK(for cross-compile version of gcc,
+ ac_cv_cross,
+ AC_TRY_COMPILE([
+ #ifdef __WIN32__
+ #error cross-compiler
+ #endif
+ ], [],
+ ac_cv_cross=yes,
+ ac_cv_cross=no)
+ )
+ if test "$ac_cv_cross" = "yes"; then
+ case "$do64bit" in
+ amd64|x64|yes)
+ CC="x86_64-w64-mingw32-gcc"
+ LD="x86_64-w64-mingw32-ld"
+ AR="x86_64-w64-mingw32-ar"
+ RANLIB="x86_64-w64-mingw32-ranlib"
+ RC="x86_64-w64-mingw32-windres"
+ ;;
+ *)
+ CC="i686-w64-mingw32-gcc"
+ LD="i686-w64-mingw32-ld"
+ AR="i686-w64-mingw32-ar"
+ RANLIB="i686-w64-mingw32-ranlib"
+ RC="i686-w64-mingw32-windres"
+ ;;
+ esac
+ fi
+
+ else
+ SHLIB_LD="${LINKBIN} -dll ${lflags}"
+ # link -lib only works when -lib is the first arg
+ STLIB_LD="${LINKBIN} -lib ${lflags}"
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib'
+ PATHTYPE=-w
+ # For information on what debugtype is most useful, see:
+ # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp
+ # and also
+ # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx
+ # This essentially turns it all on.
+ LDFLAGS_DEBUG="-debug -debugtype:cv"
+ LDFLAGS_OPTIMIZE="-release"
+ if test "$doWince" != "no" ; then
+ LDFLAGS_CONSOLE="-link ${lflags}"
+ LDFLAGS_WINDOW=${LDFLAGS_CONSOLE}
+ else
+ LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
+ LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
+ fi
+ fi
+
+ SHLIB_SUFFIX=".dll"
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll'
+
+ TCL_LIB_VERSIONS_OK=nodots
+ ;;
+ AIX-*)
+ AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [
+ # AIX requires the _r compiler when gcc isn't being used
+ case "${CC}" in
+ *_r|*_r\ *)
+ # ok ...
+ ;;
+ *)
+ # Make sure only first arg gets _r
+ CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'`
+ ;;
+ esac
+ AC_MSG_RESULT([Using $CC for compiling with threads])
+ ])
+ LIBS="$LIBS -lc"
+ SHLIB_CFLAGS=""
+ SHLIB_SUFFIX=".so"
+
+ LD_LIBRARY_PATH_VAR="LIBPATH"
+
+ # Check to enable 64-bit flags for compiler/linker
+ AS_IF([test "$do64bit" = yes], [
+ AS_IF([test "$GCC" = yes], [
+ AC_MSG_WARN([64bit mode not supported with GCC on $system])
+ ], [
+ do64bit_ok=yes
+ CFLAGS="$CFLAGS -q64"
+ LDFLAGS_ARCH="-q64"
+ RANLIB="${RANLIB} -X64"
+ AR="${AR} -X64"
+ SHLIB_LD_FLAGS="-b64"
+ ])
+ ])
+
+ AS_IF([test "`uname -m`" = ia64], [
+ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC
+ SHLIB_LD="/usr/ccs/bin/ld -G -z text"
+ AS_IF([test "$GCC" = yes], [
+ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ ], [
+ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
+ ])
+ LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
+ ], [
+ AS_IF([test "$GCC" = yes], [
+ SHLIB_LD='${CC} -shared -Wl,-bexpall'
+ ], [
+ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry"
+ LDFLAGS="$LDFLAGS -brtl"
+ ])
+ SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}"
+ CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ ])
+ ;;
+ BeOS*)
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD='${CC} -nostart'
+ SHLIB_SUFFIX=".so"
+
+ #-----------------------------------------------------------
+ # Check for inet_ntoa in -lbind, for BeOS (which also needs
+ # -lsocket, even if the network functions are in -lnet which
+ # is always linked to, for compatibility.
+ #-----------------------------------------------------------
+ AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"])
+ ;;
+ BSD/OS-4.*)
+ SHLIB_CFLAGS="-export-dynamic -fPIC"
+ SHLIB_LD='${CC} -shared'
+ SHLIB_SUFFIX=".so"
+ LDFLAGS="$LDFLAGS -export-dynamic"
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ CYGWIN_*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD='${CC} -shared'
+ SHLIB_SUFFIX=".dll"
+ EXEEXT=".exe"
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ Haiku*)
+ LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_SUFFIX=".so"
+ SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}'
+ AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"])
+ ;;
+ HP-UX-*.11.*)
+ # Use updated header definitions where possible
+ AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?])
+ # TEA specific: Needed by Tcl, but not most extensions
+ #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?])
+ #LIBS="$LIBS -lxnet" # Use the XOPEN network library
+
+ AS_IF([test "`uname -m`" = ia64], [
+ SHLIB_SUFFIX=".so"
+ # Use newer C++ library for C++ extensions
+ #if test "$GCC" != "yes" ; then
+ # CPPFLAGS="-AA"
+ #fi
+ ], [
+ SHLIB_SUFFIX=".sl"
+ ])
+ AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
+ AS_IF([test "$tcl_ok" = yes], [
+ LDFLAGS="$LDFLAGS -Wl,-E"
+ CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
+ LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.'
+ LD_LIBRARY_PATH_VAR="SHLIB_PATH"
+ ])
+ AS_IF([test "$GCC" = yes], [
+ SHLIB_LD='${CC} -shared'
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ ], [
+ CFLAGS="$CFLAGS -z"
+ # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc
+ #CFLAGS="$CFLAGS +DAportable"
+ SHLIB_CFLAGS="+z"
+ SHLIB_LD="ld -b"
+ ])
+
+ # Check to enable 64-bit flags for compiler/linker
+ AS_IF([test "$do64bit" = "yes"], [
+ AS_IF([test "$GCC" = yes], [
+ case `${CC} -dumpmachine` in
+ hppa64*)
+ # 64-bit gcc in use. Fix flags for GNU ld.
+ do64bit_ok=yes
+ SHLIB_LD='${CC} -shared'
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ ;;
+ *)
+ AC_MSG_WARN([64bit mode not supported with GCC on $system])
+ ;;
+ esac
+ ], [
+ do64bit_ok=yes
+ CFLAGS="$CFLAGS +DD64"
+ LDFLAGS_ARCH="+DD64"
+ ])
+ ]) ;;
+ IRIX-6.*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="ld -n32 -shared -rdata_shared"
+ SHLIB_SUFFIX=".so"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'])
+ AS_IF([test "$GCC" = yes], [
+ CFLAGS="$CFLAGS -mabi=n32"
+ LDFLAGS="$LDFLAGS -mabi=n32"
+ ], [
+ case $system in
+ IRIX-6.3)
+ # Use to build 6.2 compatible binaries on 6.3.
+ CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS"
+ ;;
+ *)
+ CFLAGS="$CFLAGS -n32"
+ ;;
+ esac
+ LDFLAGS="$LDFLAGS -n32"
+ ])
+ ;;
+ IRIX64-6.*)
+ SHLIB_CFLAGS=""
+ SHLIB_LD="ld -n32 -shared -rdata_shared"
+ SHLIB_SUFFIX=".so"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'])
+
+ # Check to enable 64-bit flags for compiler/linker
+
+ AS_IF([test "$do64bit" = yes], [
+ AS_IF([test "$GCC" = yes], [
+ AC_MSG_WARN([64bit mode not supported by gcc])
+ ], [
+ do64bit_ok=yes
+ SHLIB_LD="ld -64 -shared -rdata_shared"
+ CFLAGS="$CFLAGS -64"
+ LDFLAGS_ARCH="-64"
+ ])
+ ])
+ ;;
+ Linux*|GNU*|NetBSD-Debian)
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_SUFFIX=".so"
+
+ # TEA specific:
+ CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer"
+
+ # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
+ SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}'
+ LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"])
+ AS_IF([test $do64bit = yes], [
+ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [
+ hold_cflags=$CFLAGS
+ CFLAGS="$CFLAGS -m64"
+ AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no)
+ CFLAGS=$hold_cflags])
+ AS_IF([test $tcl_cv_cc_m64 = yes], [
+ CFLAGS="$CFLAGS -m64"
+ do64bit_ok=yes
+ ])
+ ])
+
+ # The combo of gcc + glibc has a bug related to inlining of
+ # functions like strtod(). The -fno-builtin flag should address
+ # this problem but it does not work. The -fno-inline flag is kind
+ # of overkill but it works. Disable inlining only when one of the
+ # files in compat/*.c is being linked in.
+
+ AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"])
+ ;;
+ Lynx*)
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_SUFFIX=".so"
+ CFLAGS_OPTIMIZE=-02
+ SHLIB_LD='${CC} -shared'
+ LD_FLAGS="-Wl,--export-dynamic"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ ;;
+ OpenBSD-*)
+ arch=`arch -s`
+ case "$arch" in
+ vax)
+ SHLIB_SUFFIX=""
+ SHARED_LIB_SUFFIX=""
+ LDFLAGS=""
+ ;;
+ *)
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}'
+ SHLIB_SUFFIX=".so"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}'
+ LDFLAGS="-Wl,-export-dynamic"
+ ;;
+ esac
+ case "$arch" in
+ vax)
+ CFLAGS_OPTIMIZE="-O1"
+ ;;
+ *)
+ CFLAGS_OPTIMIZE="-O2"
+ ;;
+ esac
+ AS_IF([test "${TCL_THREADS}" = "1"], [
+ # On OpenBSD: Compile with -pthread
+ # Don't link with -lpthread
+ LIBS=`echo $LIBS | sed s/-lpthread//`
+ CFLAGS="$CFLAGS -pthread"
+ ])
+ # OpenBSD doesn't do version numbers with dots.
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
+ TCL_LIB_VERSIONS_OK=nodots
+ ;;
+ NetBSD-*)
+ # NetBSD has ELF and can use 'cc -shared' to build shared libs
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}'
+ SHLIB_SUFFIX=".so"
+ LDFLAGS="$LDFLAGS -export-dynamic"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ AS_IF([test "${TCL_THREADS}" = "1"], [
+ # The -pthread needs to go in the CFLAGS, not LIBS
+ LIBS=`echo $LIBS | sed s/-pthread//`
+ CFLAGS="$CFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ])
+ ;;
+ FreeBSD-*)
+ # This configuration from FreeBSD Ports.
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD="${CC} -shared"
+ TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]"
+ SHLIB_SUFFIX=".so"
+ LDFLAGS=""
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'])
+ AS_IF([test "${TCL_THREADS}" = "1"], [
+ # The -pthread needs to go in the LDFLAGS, not LIBS
+ LIBS=`echo $LIBS | sed s/-pthread//`
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ LDFLAGS="$LDFLAGS $PTHREAD_LIBS"])
+ # Version numbers are dot-stripped by system policy.
+ TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .`
+ UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
+ SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1'
+ TCL_LIB_VERSIONS_OK=nodots
+ ;;
+ Darwin-*)
+ CFLAGS_OPTIMIZE="-Os"
+ SHLIB_CFLAGS="-fno-common"
+ # To avoid discrepancies between what headers configure sees during
+ # preprocessing tests and compiling tests, move any -isysroot and
+ # -mmacosx-version-min flags from CFLAGS to CPPFLAGS:
+ CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \
+ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \
+ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`"
+ CFLAGS="`echo " ${CFLAGS}" | \
+ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \
+ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`"
+ AS_IF([test $do64bit = yes], [
+ case `arch` in
+ ppc)
+ AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag],
+ tcl_cv_cc_arch_ppc64, [
+ hold_cflags=$CFLAGS
+ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5"
+ AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes,
+ tcl_cv_cc_arch_ppc64=no)
+ CFLAGS=$hold_cflags])
+ AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [
+ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5"
+ do64bit_ok=yes
+ ]);;
+ i386)
+ AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag],
+ tcl_cv_cc_arch_x86_64, [
+ hold_cflags=$CFLAGS
+ CFLAGS="$CFLAGS -arch x86_64"
+ AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes,
+ tcl_cv_cc_arch_x86_64=no)
+ CFLAGS=$hold_cflags])
+ AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [
+ CFLAGS="$CFLAGS -arch x86_64"
+ do64bit_ok=yes
+ ]);;
+ *)
+ AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);;
+ esac
+ ], [
+ # Check for combined 32-bit and 64-bit fat build
+ AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \
+ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [
+ fat_32_64=yes])
+ ])
+ # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
+ SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}'
+ AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [
+ hold_ldflags=$LDFLAGS
+ LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module"
+ AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no)
+ LDFLAGS=$hold_ldflags])
+ AS_IF([test $tcl_cv_ld_single_module = yes], [
+ SHLIB_LD="${SHLIB_LD} -Wl,-single_module"
+ ])
+ # TEA specific: link shlib with current and compatibility version flags
+ vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d`
+ SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}"
+ SHLIB_SUFFIX=".dylib"
+ # Don't use -prebind when building for Mac OS X 10.4 or later only:
+ AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \
+ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [
+ LDFLAGS="$LDFLAGS -prebind"])
+ LDFLAGS="$LDFLAGS -headerpad_max_install_names"
+ AC_CACHE_CHECK([if ld accepts -search_paths_first flag],
+ tcl_cv_ld_search_paths_first, [
+ hold_ldflags=$LDFLAGS
+ LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+ AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes,
+ tcl_cv_ld_search_paths_first=no)
+ LDFLAGS=$hold_ldflags])
+ AS_IF([test $tcl_cv_ld_search_paths_first = yes], [
+ LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
+ ])
+ AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [
+ AC_DEFINE(MODULE_SCOPE, [__private_extern__],
+ [Compiler support for module scope symbols])
+ tcl_cv_cc_visibility_hidden=yes
+ ])
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH"
+ # TEA specific: for combined 32 & 64 bit fat builds of Tk
+ # extensions, verify that 64-bit build is possible.
+ AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [
+ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [
+ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [
+ for v in CFLAGS CPPFLAGS LDFLAGS; do
+ eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"'
+ done
+ CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include"
+ LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11"
+ AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();],
+ tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no)
+ for v in CFLAGS CPPFLAGS LDFLAGS; do
+ eval $v'="$hold_'$v'"'
+ done])
+ ])
+ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [
+ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [
+ for v in CFLAGS CPPFLAGS LDFLAGS; do
+ eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"'
+ done
+ CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}"
+ LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}"
+ AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);],
+ tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no)
+ for v in CFLAGS CPPFLAGS LDFLAGS; do
+ eval $v'="$hold_'$v'"'
+ done])
+ ])
+ # remove 64-bit arch flags from CFLAGS et al. if configuration
+ # does not support 64-bit.
+ AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [
+ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags])
+ for v in CFLAGS CPPFLAGS LDFLAGS; do
+ eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"'
+ done])
+ ])
+ ;;
+ OS/390-*)
+ CFLAGS_OPTIMIZE="" # Optimizer is buggy
+ AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h
+ [Should OS/390 do the right thing with sockets?])
+ ;;
+ OSF1-V*)
+ # Digital OSF/1
+ SHLIB_CFLAGS=""
+ AS_IF([test "$SHARED_BUILD" = 1], [
+ SHLIB_LD='ld -shared -expect_unresolved "*"'
+ ], [
+ SHLIB_LD='ld -non_shared -expect_unresolved "*"'
+ ])
+ SHLIB_SUFFIX=".so"
+ AS_IF([test $doRpath = yes], [
+ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'])
+ AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [
+ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"])
+ # see pthread_intro(3) for pthread support on osf1, k.furukawa
+ AS_IF([test "${TCL_THREADS}" = 1], [
+ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
+ CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
+ LIBS=`echo $LIBS | sed s/-lpthreads//`
+ AS_IF([test "$GCC" = yes], [
+ LIBS="$LIBS -lpthread -lmach -lexc"
+ ], [
+ CFLAGS="$CFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ])
+ ])
+ ;;
+ QNX-6*)
+ # QNX RTP
+ # This may work for all QNX, but it was only reported for v6.
+ SHLIB_CFLAGS="-fPIC"
+ SHLIB_LD="ld -Bshareable -x"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ SCO_SV-3.2*)
+ AS_IF([test "$GCC" = yes], [
+ SHLIB_CFLAGS="-fPIC -melf"
+ LDFLAGS="$LDFLAGS -melf -Wl,-Bexport"
+ ], [
+ SHLIB_CFLAGS="-Kpic -belf"
+ LDFLAGS="$LDFLAGS -belf -Wl,-Bexport"
+ ])
+ SHLIB_LD="ld -G"
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ SunOS-5.[[0-6]])
+ # Careful to not let 5.10+ fall into this case
+
+ # Note: If _REENTRANT isn't defined, then Solaris
+ # won't define thread-safe library routines.
+
+ AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?])
+ AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1,
+ [Do we really want to follow the standard? Yes we do!])
+
+ SHLIB_CFLAGS="-KPIC"
+ SHLIB_SUFFIX=".so"
+ AS_IF([test "$GCC" = yes], [
+ SHLIB_LD='${CC} -shared'
+ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ ], [
+ SHLIB_LD="/usr/ccs/bin/ld -G -z text"
+ CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ ])
+ ;;
+ SunOS-5*)
+ # Note: If _REENTRANT isn't defined, then Solaris
+ # won't define thread-safe library routines.
+
+ AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?])
+ AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1,
+ [Do we really want to follow the standard? Yes we do!])
+
+ SHLIB_CFLAGS="-KPIC"
+
+ # Check to enable 64-bit flags for compiler/linker
+ AS_IF([test "$do64bit" = yes], [
+ arch=`isainfo`
+ AS_IF([test "$arch" = "sparcv9 sparc"], [
+ AS_IF([test "$GCC" = yes], [
+ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [
+ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system])
+ ], [
+ do64bit_ok=yes
+ CFLAGS="$CFLAGS -m64 -mcpu=v9"
+ LDFLAGS="$LDFLAGS -m64 -mcpu=v9"
+ SHLIB_CFLAGS="-fPIC"
+ ])
+ ], [
+ do64bit_ok=yes
+ AS_IF([test "$do64bitVIS" = yes], [
+ CFLAGS="$CFLAGS -xarch=v9a"
+ LDFLAGS_ARCH="-xarch=v9a"
+ ], [
+ CFLAGS="$CFLAGS -xarch=v9"
+ LDFLAGS_ARCH="-xarch=v9"
+ ])
+ # Solaris 64 uses this as well
+ #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64"
+ ])
+ ], [AS_IF([test "$arch" = "amd64 i386"], [
+ AS_IF([test "$GCC" = yes], [
+ case $system in
+ SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*)
+ do64bit_ok=yes
+ CFLAGS="$CFLAGS -m64"
+ LDFLAGS="$LDFLAGS -m64";;
+ *)
+ AC_MSG_WARN([64bit mode not supported with GCC on $system]);;
+ esac
+ ], [
+ do64bit_ok=yes
+ case $system in
+ SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*)
+ CFLAGS="$CFLAGS -m64"
+ LDFLAGS="$LDFLAGS -m64";;
+ *)
+ CFLAGS="$CFLAGS -xarch=amd64"
+ LDFLAGS="$LDFLAGS -xarch=amd64";;
+ esac
+ ])
+ ], [AC_MSG_WARN([64bit mode not supported for $arch])])])
+ ])
+
+ SHLIB_SUFFIX=".so"
+ AS_IF([test "$GCC" = yes], [
+ SHLIB_LD='${CC} -shared'
+ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
+ AS_IF([test "$do64bit_ok" = yes], [
+ AS_IF([test "$arch" = "sparcv9 sparc"], [
+ # We need to specify -static-libgcc or we need to
+ # add the path to the sparv9 libgcc.
+ # JH: static-libgcc is necessary for core Tcl, but may
+ # not be necessary for extensions.
+ SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc"
+ # for finding sparcv9 libgcc, get the regular libgcc
+ # path, remove so name and append 'sparcv9'
+ #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..."
+ #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"
+ ], [AS_IF([test "$arch" = "amd64 i386"], [
+ # JH: static-libgcc is necessary for core Tcl, but may
+ # not be necessary for extensions.
+ SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"
+ ])])
+ ])
+ ], [
+ case $system in
+ SunOS-5.[[1-9]][[0-9]]*)
+ # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
+ SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';;
+ *)
+ SHLIB_LD='/usr/ccs/bin/ld -G -z text';;
+ esac
+ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
+ LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
+ ])
+ ;;
+ UNIX_SV* | UnixWare-5*)
+ SHLIB_CFLAGS="-KPIC"
+ SHLIB_LD='${CC} -G'
+ SHLIB_LD_LIBS=""
+ SHLIB_SUFFIX=".so"
+ # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
+ # that don't grok the -Bexport option. Test that it does.
+ AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [
+ hold_ldflags=$LDFLAGS
+ LDFLAGS="$LDFLAGS -Wl,-Bexport"
+ AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no)
+ LDFLAGS=$hold_ldflags])
+ AS_IF([test $tcl_cv_ld_Bexport = yes], [
+ LDFLAGS="$LDFLAGS -Wl,-Bexport"
+ ])
+ CC_SEARCH_FLAGS=""
+ LD_SEARCH_FLAGS=""
+ ;;
+ esac
+
+ AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [
+ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform])
+ ])
+
+dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so
+dnl # until the end of configure, as configure's compile and link tests use
+dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's
+dnl # preprocessing tests use only CPPFLAGS.
+ AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""])
+
+ # Add in the arch flags late to ensure it wasn't removed.
+ # Not necessary in TEA, but this is aligned with core
+ LDFLAGS="$LDFLAGS $LDFLAGS_ARCH"
+
+ # If we're running gcc, then change the C flags for compiling shared
+ # libraries to the right flags for gcc, instead of those for the
+ # standard manufacturer compiler.
+
+ AS_IF([test "$GCC" = yes], [
+ case $system in
+ AIX-*) ;;
+ BSD/OS*) ;;
+ CYGWIN_*|MINGW32_*) ;;
+ IRIX*) ;;
+ NetBSD-*|FreeBSD-*|OpenBSD-*) ;;
+ Darwin-*) ;;
+ SCO_SV-3.2*) ;;
+ windows) ;;
+ *) SHLIB_CFLAGS="-fPIC" ;;
+ esac])
+
+ AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [
+ AC_DEFINE(MODULE_SCOPE, [extern],
+ [No Compiler support for module scope symbols])
+ ])
+
+ AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [
+ # TEA specific: use PACKAGE_VERSION instead of VERSION
+ SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}'])
+ AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [
+ # TEA specific: use PACKAGE_VERSION instead of VERSION
+ UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a'])
+
+ if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then
+ AC_CACHE_CHECK(for SEH support in compiler,
+ tcl_cv_seh,
+ AC_TRY_RUN([
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+ int main(int argc, char** argv) {
+ int a, b = 0;
+ __try {
+ a = 666 / b;
+ }
+ __except (EXCEPTION_EXECUTE_HANDLER) {
+ return 0;
+ }
+ return 1;
+ }
+ ],
+ tcl_cv_seh=yes,
+ tcl_cv_seh=no,
+ tcl_cv_seh=no)
+ )
+ if test "$tcl_cv_seh" = "no" ; then
+ AC_DEFINE(HAVE_NO_SEH, 1,
+ [Defined when mingw does not support SEH])
+ fi
+
+ #
+ # Check to see if the excpt.h include file provided contains the
+ # definition for EXCEPTION_DISPOSITION; if not, which is the case
+ # with Cygwin's version as of 2002-04-10, define it to be int,
+ # sufficient for getting the current code to work.
+ #
+ AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files,
+ tcl_cv_eh_disposition,
+ AC_TRY_COMPILE([
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# undef WIN32_LEAN_AND_MEAN
+ ],[
+ EXCEPTION_DISPOSITION x;
+ ],
+ tcl_cv_eh_disposition=yes,
+ tcl_cv_eh_disposition=no)
+ )
+ if test "$tcl_cv_eh_disposition" = "no" ; then
+ AC_DEFINE(EXCEPTION_DISPOSITION, int,
+ [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION])
+ fi
+
+ # Check to see if winnt.h defines CHAR, SHORT, and LONG
+ # even if VOID has already been #defined. The win32api
+ # used by mingw and cygwin is known to do this.
+
+ AC_CACHE_CHECK(for winnt.h that ignores VOID define,
+ tcl_cv_winnt_ignore_void,
+ AC_TRY_COMPILE([
+#define VOID void
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+ ], [
+ CHAR c;
+ SHORT s;
+ LONG l;
+ ],
+ tcl_cv_winnt_ignore_void=yes,
+ tcl_cv_winnt_ignore_void=no)
+ )
+ if test "$tcl_cv_winnt_ignore_void" = "yes" ; then
+ AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1,
+ [Defined when cygwin/mingw ignores VOID define in winnt.h])
+ fi
+ fi
+
+ # See if the compiler supports casting to a union type.
+ # This is used to stop gcc from printing a compiler
+ # warning when initializing a union member.
+
+ AC_CACHE_CHECK(for cast to union support,
+ tcl_cv_cast_to_union,
+ AC_TRY_COMPILE([],
+ [
+ union foo { int i; double d; };
+ union foo f = (union foo) (int) 0;
+ ],
+ tcl_cv_cast_to_union=yes,
+ tcl_cv_cast_to_union=no)
+ )
+ if test "$tcl_cv_cast_to_union" = "yes"; then
+ AC_DEFINE(HAVE_CAST_TO_UNION, 1,
+ [Defined when compiler supports casting to union type.])
+ fi
+
+ AC_SUBST(CFLAGS_DEBUG)
+ AC_SUBST(CFLAGS_OPTIMIZE)
+ AC_SUBST(CFLAGS_WARNING)
+
+ AC_SUBST(STLIB_LD)
+ AC_SUBST(SHLIB_LD)
+
+ AC_SUBST(SHLIB_LD_LIBS)
+ AC_SUBST(SHLIB_CFLAGS)
+
+ AC_SUBST(LD_LIBRARY_PATH_VAR)
+
+ # These must be called after we do the basic CFLAGS checks and
+ # verify any possible 64-bit or similar switches are necessary
+ TEA_TCL_EARLY_FLAGS
+ TEA_TCL_64BIT_FLAGS
+])
+
+#--------------------------------------------------------------------
+# TEA_SERIAL_PORT
+#
+# Determine which interface to use to talk to the serial port.
+# Note that #include lines must begin in leftmost column for
+# some compilers to recognize them as preprocessor directives,
+# and some build environments have stdin not pointing at a
+# pseudo-terminal (usually /dev/null instead.)
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines only one of the following vars:
+# HAVE_SYS_MODEM_H
+# USE_TERMIOS
+# USE_TERMIO
+# USE_SGTTY
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_SERIAL_PORT], [
+ AC_CHECK_HEADERS(sys/modem.h)
+ AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [
+ AC_TRY_RUN([
+#include <termios.h>
+
+int main() {
+ struct termios t;
+ if (tcgetattr(0, &t) == 0) {
+ cfsetospeed(&t, 0);
+ t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
+ if test $tcl_cv_api_serial = no ; then
+ AC_TRY_RUN([
+#include <termio.h>
+
+int main() {
+ struct termio t;
+ if (ioctl(0, TCGETA, &t) == 0) {
+ t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+}], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
+ fi
+ if test $tcl_cv_api_serial = no ; then
+ AC_TRY_RUN([
+#include <sgtty.h>
+
+int main() {
+ struct sgttyb t;
+ if (ioctl(0, TIOCGETP, &t) == 0) {
+ t.sg_ospeed = 0;
+ t.sg_flags |= ODDP | EVENP | RAW;
+ return 0;
+ }
+ return 1;
+}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
+ fi
+ if test $tcl_cv_api_serial = no ; then
+ AC_TRY_RUN([
+#include <termios.h>
+#include <errno.h>
+
+int main() {
+ struct termios t;
+ if (tcgetattr(0, &t) == 0
+ || errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
+ cfsetospeed(&t, 0);
+ t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
+ fi
+ if test $tcl_cv_api_serial = no; then
+ AC_TRY_RUN([
+#include <termio.h>
+#include <errno.h>
+
+int main() {
+ struct termio t;
+ if (ioctl(0, TCGETA, &t) == 0
+ || errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
+ t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
+ return 0;
+ }
+ return 1;
+ }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
+ fi
+ if test $tcl_cv_api_serial = no; then
+ AC_TRY_RUN([
+#include <sgtty.h>
+#include <errno.h>
+
+int main() {
+ struct sgttyb t;
+ if (ioctl(0, TIOCGETP, &t) == 0
+ || errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
+ t.sg_ospeed = 0;
+ t.sg_flags |= ODDP | EVENP | RAW;
+ return 0;
+ }
+ return 1;
+}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none)
+ fi])
+ case $tcl_cv_api_serial in
+ termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);;
+ termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);;
+ sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);;
+ esac
+])
+
+#--------------------------------------------------------------------
+# TEA_MISSING_POSIX_HEADERS
+#
+# Supply substitutes for missing POSIX header files. Special
+# notes:
+# - stdlib.h doesn't define strtol, strtoul, or
+# strtod in some versions of SunOS
+# - some versions of string.h don't declare procedures such
+# as strstr
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# NO_DIRENT_H
+# NO_ERRNO_H
+# NO_VALUES_H
+# HAVE_LIMITS_H or NO_LIMITS_H
+# NO_STDLIB_H
+# NO_STRING_H
+# NO_SYS_WAIT_H
+# NO_DLFCN_H
+# HAVE_SYS_PARAM_H
+#
+# HAVE_STRING_H ?
+#
+# tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and
+# CHECK on limits.h
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [
+ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [
+ AC_TRY_LINK([#include <sys/types.h>
+#include <dirent.h>], [
+#ifndef _POSIX_SOURCE
+# ifdef __Lynx__
+ /*
+ * Generate compilation error to make the test fail: Lynx headers
+ * are only valid if really in the POSIX environment.
+ */
+
+ missing_procedure();
+# endif
+#endif
+DIR *d;
+struct dirent *entryPtr;
+char *p;
+d = opendir("foobar");
+entryPtr = readdir(d);
+p = entryPtr->d_name;
+closedir(d);
+], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)])
+
+ if test $tcl_cv_dirent_h = no; then
+ AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?])
+ fi
+
+ # TEA specific:
+ AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])])
+ AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])])
+ AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])])
+ AC_CHECK_HEADER(limits.h,
+ [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])],
+ [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])])
+ AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
+ AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
+ if test $tcl_ok = 0; then
+ AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?])
+ fi
+ AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
+ AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
+ AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)
+
+ # See also memmove check below for a place where NO_STRING_H can be
+ # set and why.
+
+ if test $tcl_ok = 0; then
+ AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?])
+ fi
+
+ AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])])
+ AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])])
+
+ # OS/390 lacks sys/param.h (and doesn't need it, by chance).
+ AC_HAVE_HEADERS(sys/param.h)
+])
+
+#--------------------------------------------------------------------
+# TEA_PATH_X
+#
+# Locate the X11 header files and the X11 library archive. Try
+# the ac_path_x macro first, but if it doesn't find the X stuff
+# (e.g. because there's no xmkmf program) then check through
+# a list of possible directories. Under some conditions the
+# autoconf macro will return an include directory that contains
+# no include files, so double-check its result just to be safe.
+#
+# This should be called after TEA_CONFIG_CFLAGS as setting the
+# LIBS line can confuse some configure macro magic.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Sets the following vars:
+# XINCLUDES
+# XLIBSW
+# PKG_LIBS (appends to)
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_PATH_X], [
+ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then
+ TEA_PATH_UNIX_X
+ fi
+])
+
+AC_DEFUN([TEA_PATH_UNIX_X], [
+ AC_PATH_X
+ not_really_there=""
+ if test "$no_x" = ""; then
+ if test "$x_includes" = ""; then
+ AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes")
+ else
+ if test ! -r $x_includes/X11/Xlib.h; then
+ not_really_there="yes"
+ fi
+ fi
+ fi
+ if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then
+ AC_MSG_CHECKING([for X11 header files])
+ found_xincludes="no"
+ AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no")
+ if test "$found_xincludes" = "no"; then
+ dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include"
+ for i in $dirs ; do
+ if test -r $i/X11/Xlib.h; then
+ AC_MSG_RESULT([$i])
+ XINCLUDES=" -I$i"
+ found_xincludes="yes"
+ break
+ fi
+ done
+ fi
+ else
+ if test "$x_includes" != ""; then
+ XINCLUDES="-I$x_includes"
+ found_xincludes="yes"
+ fi
+ fi
+ if test "$found_xincludes" = "no"; then
+ AC_MSG_RESULT([couldn't find any!])
+ fi
+
+ if test "$no_x" = yes; then
+ AC_MSG_CHECKING([for X11 libraries])
+ XLIBSW=nope
+ dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib"
+ for i in $dirs ; do
+ if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then
+ AC_MSG_RESULT([$i])
+ XLIBSW="-L$i -lX11"
+ x_libraries="$i"
+ break
+ fi
+ done
+ else
+ if test "$x_libraries" = ""; then
+ XLIBSW=-lX11
+ else
+ XLIBSW="-L$x_libraries -lX11"
+ fi
+ fi
+ if test "$XLIBSW" = nope ; then
+ AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow)
+ fi
+ if test "$XLIBSW" = nope ; then
+ AC_MSG_RESULT([could not find any! Using -lX11.])
+ XLIBSW=-lX11
+ fi
+ # TEA specific:
+ if test x"${XLIBSW}" != x ; then
+ PKG_LIBS="${PKG_LIBS} ${XLIBSW}"
+ fi
+])
+
+#--------------------------------------------------------------------
+# TEA_BLOCKING_STYLE
+#
+# The statements below check for systems where POSIX-style
+# non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented.
+# On these systems (mostly older ones), use the old BSD-style
+# FIONBIO approach instead.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# HAVE_SYS_IOCTL_H
+# HAVE_SYS_FILIO_H
+# USE_FIONBIO
+# O_NONBLOCK
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_BLOCKING_STYLE], [
+ AC_CHECK_HEADERS(sys/ioctl.h)
+ AC_CHECK_HEADERS(sys/filio.h)
+ TEA_CONFIG_SYSTEM
+ AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O])
+ case $system in
+ OSF*)
+ AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?])
+ AC_MSG_RESULT([FIONBIO])
+ ;;
+ *)
+ AC_MSG_RESULT([O_NONBLOCK])
+ ;;
+ esac
+])
+
+#--------------------------------------------------------------------
+# TEA_TIME_HANDLER
+#
+# Checks how the system deals with time.h, what time structures
+# are used on the system, and what fields the structures have.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines some of the following vars:
+# USE_DELTA_FOR_TZ
+# HAVE_TM_GMTOFF
+# HAVE_TM_TZADJ
+# HAVE_TIMEZONE_VAR
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_TIME_HANDLER], [
+ AC_CHECK_HEADERS(sys/time.h)
+ AC_HEADER_TIME
+ AC_STRUCT_TIMEZONE
+
+ AC_CHECK_FUNCS(gmtime_r localtime_r)
+
+ AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [
+ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;],
+ tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)])
+ if test $tcl_cv_member_tm_tzadj = yes ; then
+ AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?])
+ fi
+
+ AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [
+ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;],
+ tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)])
+ if test $tcl_cv_member_tm_gmtoff = yes ; then
+ AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?])
+ fi
+
+ #
+ # Its important to include time.h in this check, as some systems
+ # (like convex) have timezone functions, etc.
+ #
+ AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [
+ AC_TRY_COMPILE([#include <time.h>],
+ [extern long timezone;
+ timezone += 1;
+ exit (0);],
+ tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)])
+ if test $tcl_cv_timezone_long = yes ; then
+ AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?])
+ else
+ #
+ # On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
+ #
+ AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [
+ AC_TRY_COMPILE([#include <time.h>],
+ [extern time_t timezone;
+ timezone += 1;
+ exit (0);],
+ tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)])
+ if test $tcl_cv_timezone_time = yes ; then
+ AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?])
+ fi
+ fi
+])
+
+#--------------------------------------------------------------------
+# TEA_BUGGY_STRTOD
+#
+# Under Solaris 2.4, strtod returns the wrong value for the
+# terminating character under some conditions. Check for this
+# and if the problem exists use a substitute procedure
+# "fixstrtod" (provided by Tcl) that corrects the error.
+# Also, on Compaq's Tru64 Unix 5.0,
+# strtod(" ") returns 0.0 instead of a failure to convert.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Might defines some of the following vars:
+# strtod (=fixstrtod)
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_BUGGY_STRTOD], [
+ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0)
+ if test "$tcl_strtod" = 1; then
+ AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[
+ AC_TRY_RUN([
+ extern double strtod();
+ int main() {
+ char *infString="Inf", *nanString="NaN", *spaceString=" ";
+ char *term;
+ double value;
+ value = strtod(infString, &term);
+ if ((term != infString) && (term[-1] == 0)) {
+ exit(1);
+ }
+ value = strtod(nanString, &term);
+ if ((term != nanString) && (term[-1] == 0)) {
+ exit(1);
+ }
+ value = strtod(spaceString, &term);
+ if (term == (spaceString+1)) {
+ exit(1);
+ }
+ exit(0);
+ }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy,
+ tcl_cv_strtod_buggy=buggy)])
+ if test "$tcl_cv_strtod_buggy" = buggy; then
+ AC_LIBOBJ([fixstrtod])
+ USE_COMPAT=1
+ AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?])
+ fi
+ fi
+])
+
+#--------------------------------------------------------------------
+# TEA_TCL_LINK_LIBS
+#
+# Search for the libraries needed to link the Tcl shell.
+# Things like the math library (-lm) and socket stuff (-lsocket vs.
+# -lnsl) are dealt with here.
+#
+# Arguments:
+# Requires the following vars to be set in the Makefile:
+# DL_LIBS (not in TEA, only needed in core)
+# LIBS
+# MATH_LIBS
+#
+# Results:
+#
+# Substitutes the following vars:
+# TCL_LIBS
+# MATH_LIBS
+#
+# Might append to the following vars:
+# LIBS
+#
+# Might define the following vars:
+# HAVE_NET_ERRNO_H
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_TCL_LINK_LIBS], [
+ #--------------------------------------------------------------------
+ # On a few very rare systems, all of the libm.a stuff is
+ # already in libc.a. Set compiler flags accordingly.
+ # Also, Linux requires the "ieee" library for math to work
+ # right (and it must appear before "-lm").
+ #--------------------------------------------------------------------
+
+ AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
+ AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])
+
+ #--------------------------------------------------------------------
+ # Interactive UNIX requires -linet instead of -lsocket, plus it
+ # needs net/errno.h to define the socket-related error codes.
+ #--------------------------------------------------------------------
+
+ AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
+ AC_CHECK_HEADER(net/errno.h, [
+ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])])
+
+ #--------------------------------------------------------------------
+ # Check for the existence of the -lsocket and -lnsl libraries.
+ # The order here is important, so that they end up in the right
+ # order in the command line generated by make. Here are some
+ # special considerations:
+ # 1. Use "connect" and "accept" to check for -lsocket, and
+ # "gethostbyname" to check for -lnsl.
+ # 2. Use each function name only once: can't redo a check because
+ # autoconf caches the results of the last check and won't redo it.
+ # 3. Use -lnsl and -lsocket only if they supply procedures that
+ # aren't already present in the normal libraries. This is because
+ # IRIX 5.2 has libraries, but they aren't needed and they're
+ # bogus: they goof up name resolution if used.
+ # 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
+ # To get around this problem, check for both libraries together
+ # if -lsocket doesn't work by itself.
+ #--------------------------------------------------------------------
+
+ tcl_checkBoth=0
+ AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
+ if test "$tcl_checkSocket" = 1; then
+ AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt,
+ LIBS="$LIBS -lsocket", tcl_checkBoth=1)])
+ fi
+ if test "$tcl_checkBoth" = 1; then
+ tk_oldLibs=$LIBS
+ LIBS="$LIBS -lsocket -lnsl"
+ AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
+ fi
+ AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname,
+ [LIBS="$LIBS -lnsl"])])
+
+ # TEA specific: Don't perform the eval of the libraries here because
+ # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS
+
+ TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
+ AC_SUBST(TCL_LIBS)
+ AC_SUBST(MATH_LIBS)
+])
+
+#--------------------------------------------------------------------
+# TEA_TCL_EARLY_FLAGS
+#
+# Check for what flags are needed to be passed so the correct OS
+# features are available.
+#
+# Arguments:
+# None
+#
+# Results:
+#
+# Might define the following vars:
+# _ISOC99_SOURCE
+# _LARGEFILE64_SOURCE
+# _LARGEFILE_SOURCE64
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_TCL_EARLY_FLAG],[
+ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]),
+ AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no,
+ AC_TRY_COMPILE([[#define ]$1[ 1
+]$2], $3,
+ [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes,
+ [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no)))
+ if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then
+ AC_DEFINE($1, 1, [Add the ]$1[ flag when building])
+ tcl_flags="$tcl_flags $1"
+ fi
+])
+
+AC_DEFUN([TEA_TCL_EARLY_FLAGS],[
+ AC_MSG_CHECKING([for required early compiler flags])
+ tcl_flags=""
+ TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>],
+ [char *p = (char *)strtoll; char *q = (char *)strtoull;])
+ TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>],
+ [struct stat64 buf; int i = stat64("/", &buf);])
+ TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>],
+ [char *p = (char *)open64;])
+ if test "x${tcl_flags}" = "x" ; then
+ AC_MSG_RESULT([none])
+ else
+ AC_MSG_RESULT([${tcl_flags}])
+ fi
+])
+
+#--------------------------------------------------------------------
+# TEA_TCL_64BIT_FLAGS
+#
+# Check for what is defined in the way of 64-bit features.
+#
+# Arguments:
+# None
+#
+# Results:
+#
+# Might define the following vars:
+# TCL_WIDE_INT_IS_LONG
+# TCL_WIDE_INT_TYPE
+# HAVE_STRUCT_DIRENT64
+# HAVE_STRUCT_STAT64
+# HAVE_TYPE_OFF64_T
+#--------------------------------------------------------------------
+
+AC_DEFUN([TEA_TCL_64BIT_FLAGS], [
+ AC_MSG_CHECKING([for 64-bit integer type])
+ AC_CACHE_VAL(tcl_cv_type_64bit,[
+ tcl_cv_type_64bit=none
+ # See if the compiler knows natively about __int64
+ AC_TRY_COMPILE(,[__int64 value = (__int64) 0;],
+ tcl_type_64bit=__int64, tcl_type_64bit="long long")
+ # See if we should use long anyway Note that we substitute in the
+ # type that is our current guess for a 64-bit type inside this check
+ # program, so it should be modified only carefully...
+ AC_TRY_COMPILE(,[switch (0) {
+ case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ;
+ }],tcl_cv_type_64bit=${tcl_type_64bit})])
+ if test "${tcl_cv_type_64bit}" = none ; then
+ AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?])
+ AC_MSG_RESULT([using long])
+ elif test "${tcl_cv_type_64bit}" = "__int64" \
+ -a "${TEA_PLATFORM}" = "windows" ; then
+ # TEA specific: We actually want to use the default tcl.h checks in
+ # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER*
+ AC_MSG_RESULT([using Tcl header defaults])
+ else
+ AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit},
+ [What type should be used to define wide integers?])
+ AC_MSG_RESULT([${tcl_cv_type_64bit}])
+
+ # Now check for auxiliary declarations
+ AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[
+ AC_TRY_COMPILE([#include <sys/types.h>
+#include <dirent.h>],[struct dirent64 p;],
+ tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)])
+ if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then
+ AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?])
+ fi
+
+ AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[
+ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p;
+],
+ tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)])
+ if test "x${tcl_cv_struct_stat64}" = "xyes" ; then
+ AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?])
+ fi
+
+ AC_CHECK_FUNCS(open64 lseek64)
+ AC_MSG_CHECKING([for off64_t])
+ AC_CACHE_VAL(tcl_cv_type_off64_t,[
+ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset;
+],
+ tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)])
+ dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the
+ dnl functions lseek64 and open64 are defined.
+ if test "x${tcl_cv_type_off64_t}" = "xyes" && \
+ test "x${ac_cv_func_lseek64}" = "xyes" && \
+ test "x${ac_cv_func_open64}" = "xyes" ; then
+ AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?])
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+ fi
+])
+
+##
+## Here ends the standard Tcl configuration bits and starts the
+## TEA specific functions
+##
+
+#------------------------------------------------------------------------
+# TEA_INIT --
+#
+# Init various Tcl Extension Architecture (TEA) variables.
+# This should be the first called TEA_* macro.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Defines and substs the following vars:
+# CYGPATH
+# EXEEXT
+# Defines only:
+# TEA_VERSION
+# TEA_INITED
+# TEA_PLATFORM (windows or unix)
+#
+# "cygpath" is used on windows to generate native path names for include
+# files. These variables should only be used with the compiler and linker
+# since they generate native path names.
+#
+# EXEEXT
+# Select the executable extension based on the host type. This
+# is a lightweight replacement for AC_EXEEXT that doesn't require
+# a compiler.
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_INIT], [
+ # TEA extensions pass this us the version of TEA they think they
+ # are compatible with.
+ TEA_VERSION="3.9"
+
+ AC_MSG_CHECKING([for correct TEA configuration])
+ if test x"${PACKAGE_NAME}" = x ; then
+ AC_MSG_ERROR([
+The PACKAGE_NAME variable must be defined by your TEA configure.in])
+ fi
+ if test x"$1" = x ; then
+ AC_MSG_ERROR([
+TEA version not specified.])
+ elif test "$1" != "${TEA_VERSION}" ; then
+ AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"])
+ else
+ AC_MSG_RESULT([ok (TEA ${TEA_VERSION})])
+ fi
+
+ # If the user did not set CFLAGS, set it now to keep macros
+ # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2".
+ if test "${CFLAGS+set}" != "set" ; then
+ CFLAGS=""
+ fi
+
+ case "`uname -s`" in
+ *win32*|*WIN32*|*MINGW32_*)
+ AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo)
+ EXEEXT=".exe"
+ TEA_PLATFORM="windows"
+ ;;
+ *CYGWIN_*)
+ CYGPATH=echo
+ EXEEXT=".exe"
+ # TEA_PLATFORM is determined later in LOAD_TCLCONFIG
+ ;;
+ *)
+ CYGPATH=echo
+ # Maybe we are cross-compiling....
+ case ${host_alias} in
+ *mingw32*)
+ EXEEXT=".exe"
+ TEA_PLATFORM="windows"
+ ;;
+ *)
+ EXEEXT=""
+ TEA_PLATFORM="unix"
+ ;;
+ esac
+ ;;
+ esac
+
+ # Check if exec_prefix is set. If not use fall back to prefix.
+ # Note when adjusted, so that TEA_PREFIX can correct for this.
+ # This is needed for recursive configures, since autoconf propagates
+ # $prefix, but not $exec_prefix (doh!).
+ if test x$exec_prefix = xNONE ; then
+ exec_prefix_default=yes
+ exec_prefix=$prefix
+ fi
+
+ AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}])
+
+ AC_SUBST(EXEEXT)
+ AC_SUBST(CYGPATH)
+
+ # This package name must be replaced statically for AC_SUBST to work
+ AC_SUBST(PKG_LIB_FILE)
+ # Substitute STUB_LIB_FILE in case package creates a stub library too.
+ AC_SUBST(PKG_STUB_LIB_FILE)
+
+ # We AC_SUBST these here to ensure they are subst'ed,
+ # in case the user doesn't call TEA_ADD_...
+ AC_SUBST(PKG_STUB_SOURCES)
+ AC_SUBST(PKG_STUB_OBJECTS)
+ AC_SUBST(PKG_TCL_SOURCES)
+ AC_SUBST(PKG_HEADERS)
+ AC_SUBST(PKG_INCLUDES)
+ AC_SUBST(PKG_LIBS)
+ AC_SUBST(PKG_CFLAGS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_SOURCES --
+#
+# Specify one or more source files. Users should check for
+# the right platform before adding to their list.
+# It is not important to specify the directory, as long as it is
+# in the generic, win or unix subdirectory of $(srcdir).
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_SOURCES
+# PKG_OBJECTS
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_SOURCES], [
+ vars="$@"
+ for i in $vars; do
+ case $i in
+ [\$]*)
+ # allow $-var names
+ PKG_SOURCES="$PKG_SOURCES $i"
+ PKG_OBJECTS="$PKG_OBJECTS $i"
+ ;;
+ *)
+ # check for existence - allows for generic/win/unix VPATH
+ # To add more dirs here (like 'src'), you have to update VPATH
+ # in Makefile.in as well
+ if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \
+ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \
+ -a ! -f "${srcdir}/macosx/$i" \
+ ; then
+ AC_MSG_ERROR([could not find source file '$i'])
+ fi
+ PKG_SOURCES="$PKG_SOURCES $i"
+ # this assumes it is in a VPATH dir
+ i=`basename $i`
+ # handle user calling this before or after TEA_SETUP_COMPILER
+ if test x"${OBJEXT}" != x ; then
+ j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}"
+ else
+ j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}"
+ fi
+ PKG_OBJECTS="$PKG_OBJECTS $j"
+ ;;
+ esac
+ done
+ AC_SUBST(PKG_SOURCES)
+ AC_SUBST(PKG_OBJECTS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_STUB_SOURCES --
+#
+# Specify one or more source files. Users should check for
+# the right platform before adding to their list.
+# It is not important to specify the directory, as long as it is
+# in the generic, win or unix subdirectory of $(srcdir).
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_STUB_SOURCES
+# PKG_STUB_OBJECTS
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_STUB_SOURCES], [
+ vars="$@"
+ for i in $vars; do
+ # check for existence - allows for generic/win/unix VPATH
+ if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \
+ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \
+ -a ! -f "${srcdir}/macosx/$i" \
+ ; then
+ AC_MSG_ERROR([could not find stub source file '$i'])
+ fi
+ PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i"
+ # this assumes it is in a VPATH dir
+ i=`basename $i`
+ # handle user calling this before or after TEA_SETUP_COMPILER
+ if test x"${OBJEXT}" != x ; then
+ j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}"
+ else
+ j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}"
+ fi
+ PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j"
+ done
+ AC_SUBST(PKG_STUB_SOURCES)
+ AC_SUBST(PKG_STUB_OBJECTS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_TCL_SOURCES --
+#
+# Specify one or more Tcl source files. These should be platform
+# independent runtime files.
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_TCL_SOURCES
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_TCL_SOURCES], [
+ vars="$@"
+ for i in $vars; do
+ # check for existence, be strict because it is installed
+ if test ! -f "${srcdir}/$i" ; then
+ AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i'])
+ fi
+ PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i"
+ done
+ AC_SUBST(PKG_TCL_SOURCES)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_HEADERS --
+#
+# Specify one or more source headers. Users should check for
+# the right platform before adding to their list.
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_HEADERS
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_HEADERS], [
+ vars="$@"
+ for i in $vars; do
+ # check for existence, be strict because it is installed
+ if test ! -f "${srcdir}/$i" ; then
+ AC_MSG_ERROR([could not find header file '${srcdir}/$i'])
+ fi
+ PKG_HEADERS="$PKG_HEADERS $i"
+ done
+ AC_SUBST(PKG_HEADERS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_INCLUDES --
+#
+# Specify one or more include dirs. Users should check for
+# the right platform before adding to their list.
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_INCLUDES
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_INCLUDES], [
+ vars="$@"
+ for i in $vars; do
+ PKG_INCLUDES="$PKG_INCLUDES $i"
+ done
+ AC_SUBST(PKG_INCLUDES)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_LIBS --
+#
+# Specify one or more libraries. Users should check for
+# the right platform before adding to their list. For Windows,
+# libraries provided in "foo.lib" format will be converted to
+# "-lfoo" when using GCC (mingw).
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_LIBS
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_LIBS], [
+ vars="$@"
+ for i in $vars; do
+ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then
+ # Convert foo.lib to -lfoo for GCC. No-op if not *.lib
+ i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'`
+ fi
+ PKG_LIBS="$PKG_LIBS $i"
+ done
+ AC_SUBST(PKG_LIBS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_CFLAGS --
+#
+# Specify one or more CFLAGS. Users should check for
+# the right platform before adding to their list.
+#
+# Arguments:
+# one or more file names
+#
+# Results:
+#
+# Defines and substs the following vars:
+# PKG_CFLAGS
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_CFLAGS], [
+ PKG_CFLAGS="$PKG_CFLAGS $@"
+ AC_SUBST(PKG_CFLAGS)
+])
+
+#------------------------------------------------------------------------
+# TEA_ADD_CLEANFILES --
+#
+# Specify one or more CLEANFILES.
+#
+# Arguments:
+# one or more file names to clean target
+#
+# Results:
+#
+# Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_ADD_CLEANFILES], [
+ CLEANFILES="$CLEANFILES $@"
+])
+
+#------------------------------------------------------------------------
+# TEA_PREFIX --
+#
+# Handle the --prefix=... option by defaulting to what Tcl gave
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# If --prefix or --exec-prefix was not specified, $prefix and
+# $exec_prefix will be set to the values given to Tcl when it was
+# configured.
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_PREFIX], [
+ if test "${prefix}" = "NONE"; then
+ prefix_default=yes
+ if test x"${TCL_PREFIX}" != x; then
+ AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}])
+ prefix=${TCL_PREFIX}
+ else
+ AC_MSG_NOTICE([--prefix defaulting to /usr/local])
+ prefix=/usr/local
+ fi
+ fi
+ if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \
+ -o x"${exec_prefix_default}" = x"yes" ; then
+ if test x"${TCL_EXEC_PREFIX}" != x; then
+ AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}])
+ exec_prefix=${TCL_EXEC_PREFIX}
+ else
+ AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}])
+ exec_prefix=$prefix
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_SETUP_COMPILER_CC --
+#
+# Do compiler checks the way we want. This is just a replacement
+# for AC_PROG_CC in TEA configure.in files to make them cleaner.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Sets up CC var and other standard bits we need to make executables.
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_SETUP_COMPILER_CC], [
+ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE)
+ # in this macro, they need to go into TEA_SETUP_COMPILER instead.
+
+ AC_PROG_CC
+ AC_PROG_CPP
+
+ INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c"
+ AC_SUBST(INSTALL)
+
+ #--------------------------------------------------------------------
+ # Checks to see if the make program sets the $MAKE variable.
+ #--------------------------------------------------------------------
+
+ AC_PROG_MAKE_SET
+
+ #--------------------------------------------------------------------
+ # Find ranlib
+ #--------------------------------------------------------------------
+
+ AC_CHECK_TOOL(RANLIB, ranlib)
+
+ #--------------------------------------------------------------------
+ # Determines the correct binary file extension (.o, .obj, .exe etc.)
+ #--------------------------------------------------------------------
+
+ AC_OBJEXT
+ AC_EXEEXT
+])
+
+#------------------------------------------------------------------------
+# TEA_SETUP_COMPILER --
+#
+# Do compiler checks that use the compiler. This must go after
+# TEA_SETUP_COMPILER_CC, which does the actual compiler check.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Sets up CC var and other standard bits we need to make executables.
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_SETUP_COMPILER], [
+ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here.
+ AC_REQUIRE([TEA_SETUP_COMPILER_CC])
+
+ #------------------------------------------------------------------------
+ # If we're using GCC, see if the compiler understands -pipe. If so, use it.
+ # It makes compiling go faster. (This is only a performance feature.)
+ #------------------------------------------------------------------------
+
+ if test -z "$no_pipe" -a -n "$GCC"; then
+ AC_CACHE_CHECK([if the compiler understands -pipe],
+ tcl_cv_cc_pipe, [
+ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe"
+ AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no)
+ CFLAGS=$hold_cflags])
+ if test $tcl_cv_cc_pipe = yes; then
+ CFLAGS="$CFLAGS -pipe"
+ fi
+ fi
+
+ #--------------------------------------------------------------------
+ # Common compiler flag setup
+ #--------------------------------------------------------------------
+
+ AC_C_BIGENDIAN
+ if test "${TEA_PLATFORM}" = "unix" ; then
+ TEA_TCL_LINK_LIBS
+ TEA_MISSING_POSIX_HEADERS
+ # Let the user call this, because if it triggers, they will
+ # need a compat/strtod.c that is correct. Users can also
+ # use Tcl_GetDouble(FromObj) instead.
+ #TEA_BUGGY_STRTOD
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_MAKE_LIB --
+#
+# Generate a line that can be used to build a shared/unshared library
+# in a platform independent manner.
+#
+# Arguments:
+# none
+#
+# Requires:
+#
+# Results:
+#
+# Defines the following vars:
+# CFLAGS - Done late here to note disturb other AC macros
+# MAKE_LIB - Command to execute to build the Tcl library;
+# differs depending on whether or not Tcl is being
+# compiled as a shared library.
+# MAKE_SHARED_LIB Makefile rule for building a shared library
+# MAKE_STATIC_LIB Makefile rule for building a static library
+# MAKE_STUB_LIB Makefile rule for building a stub library
+# VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL
+# VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_MAKE_LIB], [
+ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then
+ MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)"
+ MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)"
+ AC_EGREP_CPP([manifest needed], [
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+print("manifest needed")
+#endif
+ ], [
+ # Could do a CHECK_PROG for mt, but should always be with MSVC8+
+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi"
+ VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi"
+ MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}"
+ TEA_ADD_CLEANFILES([*.manifest])
+ ])
+ MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)"
+ else
+ MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)"
+ MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}"
+ MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)"
+ fi
+
+ if test "${SHARED_BUILD}" = "1" ; then
+ MAKE_LIB="${MAKE_SHARED_LIB} "
+ else
+ MAKE_LIB="${MAKE_STATIC_LIB} "
+ fi
+
+ #--------------------------------------------------------------------
+ # Shared libraries and static libraries have different names.
+ # Use the double eval to make sure any variables in the suffix is
+ # substituted. (@@@ Might not be necessary anymore)
+ #--------------------------------------------------------------------
+
+ if test "${TEA_PLATFORM}" = "windows" ; then
+ if test "${SHARED_BUILD}" = "1" ; then
+ # We force the unresolved linking of symbols that are really in
+ # the private libraries of Tcl and Tk.
+ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\""
+ if test x"${TK_BIN_DIR}" != x ; then
+ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\""
+ fi
+ eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}"
+ else
+ eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}"
+ fi
+ # Some packages build their own stubs libraries
+ eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}"
+ if test "$GCC" = "yes"; then
+ PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE}
+ fi
+ # These aren't needed on Windows (either MSVC or gcc)
+ RANLIB=:
+ RANLIB_STUB=:
+ else
+ RANLIB_STUB="${RANLIB}"
+ if test "${SHARED_BUILD}" = "1" ; then
+ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}"
+ if test x"${TK_BIN_DIR}" != x ; then
+ SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}"
+ fi
+ eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}"
+ RANLIB=:
+ else
+ eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}"
+ fi
+ # Some packages build their own stubs libraries
+ eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}"
+ fi
+
+ # These are escaped so that only CFLAGS is picked up at configure time.
+ # The other values will be substituted at make time.
+ CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}"
+ if test "${SHARED_BUILD}" = "1" ; then
+ CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}"
+ fi
+
+ AC_SUBST(MAKE_LIB)
+ AC_SUBST(MAKE_SHARED_LIB)
+ AC_SUBST(MAKE_STATIC_LIB)
+ AC_SUBST(MAKE_STUB_LIB)
+ AC_SUBST(RANLIB_STUB)
+ AC_SUBST(VC_MANIFEST_EMBED_DLL)
+ AC_SUBST(VC_MANIFEST_EMBED_EXE)
+])
+
+#------------------------------------------------------------------------
+# TEA_LIB_SPEC --
+#
+# Compute the name of an existing object library located in libdir
+# from the given base name and produce the appropriate linker flags.
+#
+# Arguments:
+# basename The base name of the library without version
+# numbers, extensions, or "lib" prefixes.
+# extra_dir Extra directory in which to search for the
+# library. This location is used first, then
+# $prefix/$exec-prefix, then some defaults.
+#
+# Requires:
+# TEA_INIT and TEA_PREFIX must be called first.
+#
+# Results:
+#
+# Defines the following vars:
+# ${basename}_LIB_NAME The computed library name.
+# ${basename}_LIB_SPEC The computed linker flags.
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_LIB_SPEC], [
+ AC_MSG_CHECKING([for $1 library])
+
+ # Look in exec-prefix for the library (defined by TEA_PREFIX).
+
+ tea_lib_name_dir="${exec_prefix}/lib"
+
+ # Or in a user-specified location.
+
+ if test x"$2" != x ; then
+ tea_extra_lib_dir=$2
+ else
+ tea_extra_lib_dir=NONE
+ fi
+
+ for i in \
+ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \
+ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \
+ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do
+ if test -f "$i" ; then
+ tea_lib_name_dir=`dirname $i`
+ $1_LIB_NAME=`basename $i`
+ $1_LIB_PATH_NAME=$i
+ break
+ fi
+ done
+
+ if test "${TEA_PLATFORM}" = "windows"; then
+ $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\"
+ else
+ # Strip off the leading "lib" and trailing ".a" or ".so"
+
+ tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'`
+ $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}"
+ fi
+
+ if test "x${$1_LIB_NAME}" = x ; then
+ AC_MSG_ERROR([not found])
+ else
+ AC_MSG_RESULT([${$1_LIB_SPEC}])
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_PRIVATE_TCL_HEADERS --
+#
+# Locate the private Tcl include files
+#
+# Arguments:
+#
+# Requires:
+# TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has
+# already been called.
+#
+# Results:
+#
+# Substitutes the following vars:
+# TCL_TOP_DIR_NATIVE
+# TCL_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [
+ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh}
+ AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS])
+ AC_MSG_CHECKING([for Tcl private include files])
+
+ TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}`
+ TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\"
+
+ # Check to see if tcl<Plat>Port.h isn't already with the public headers
+ # Don't look for tclInt.h because that resides with tcl.h in the core
+ # sources, but the <plat>Port headers are in a different directory
+ if test "${TEA_PLATFORM}" = "windows" -a \
+ -f "${ac_cv_c_tclh}/tclWinPort.h"; then
+ result="private headers found with public headers"
+ elif test "${TEA_PLATFORM}" = "unix" -a \
+ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then
+ result="private headers found with public headers"
+ else
+ TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\"
+ if test "${TEA_PLATFORM}" = "windows"; then
+ TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\"
+ else
+ TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\"
+ fi
+ # Overwrite the previous TCL_INCLUDES as this should capture both
+ # public and private headers in the same set.
+ # We want to ensure these are substituted so as not to require
+ # any *_NATIVE vars be defined in the Makefile
+ TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}"
+ if test "`uname -s`" = "Darwin"; then
+ # If Tcl was built as a framework, attempt to use
+ # the framework's Headers and PrivateHeaders directories
+ case ${TCL_DEFS} in
+ *TCL_FRAMEWORK*)
+ if test -d "${TCL_BIN_DIR}/Headers" -a \
+ -d "${TCL_BIN_DIR}/PrivateHeaders"; then
+ TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}"
+ else
+ TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`"
+ fi
+ ;;
+ esac
+ result="Using ${TCL_INCLUDES}"
+ else
+ if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then
+ AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}])
+ fi
+ result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}"
+ fi
+ fi
+
+ AC_SUBST(TCL_TOP_DIR_NATIVE)
+
+ AC_SUBST(TCL_INCLUDES)
+ AC_MSG_RESULT([${result}])
+])
+
+#------------------------------------------------------------------------
+# TEA_PUBLIC_TCL_HEADERS --
+#
+# Locate the installed public Tcl header files
+#
+# Arguments:
+# None.
+#
+# Requires:
+# CYGPATH must be set
+#
+# Results:
+#
+# Adds a --with-tclinclude switch to configure.
+# Result is cached.
+#
+# Substitutes the following vars:
+# TCL_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [
+ AC_MSG_CHECKING([for Tcl public headers])
+
+ AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval})
+
+ AC_CACHE_VAL(ac_cv_c_tclh, [
+ # Use the value from --with-tclinclude, if it was given
+
+ if test x"${with_tclinclude}" != x ; then
+ if test -f "${with_tclinclude}/tcl.h" ; then
+ ac_cv_c_tclh=${with_tclinclude}
+ else
+ AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h])
+ fi
+ else
+ list=""
+ if test "`uname -s`" = "Darwin"; then
+ # If Tcl was built as a framework, attempt to use
+ # the framework's Headers directory
+ case ${TCL_DEFS} in
+ *TCL_FRAMEWORK*)
+ list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`"
+ ;;
+ esac
+ fi
+
+ # Look in the source dir only if Tcl is not installed,
+ # and in that situation, look there before installed locations.
+ if test -f "${TCL_BIN_DIR}/Makefile" ; then
+ list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`"
+ fi
+
+ # Check order: pkg --prefix location, Tcl's --prefix location,
+ # relative to directory of tclConfig.sh.
+
+ eval "temp_includedir=${includedir}"
+ list="$list \
+ `ls -d ${temp_includedir} 2>/dev/null` \
+ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \
+ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`"
+ if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then
+ list="$list /usr/local/include /usr/include"
+ if test x"${TCL_INCLUDE_SPEC}" != x ; then
+ d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'`
+ list="$list `ls -d ${d} 2>/dev/null`"
+ fi
+ fi
+ for i in $list ; do
+ if test -f "$i/tcl.h" ; then
+ ac_cv_c_tclh=$i
+ break
+ fi
+ done
+ fi
+ ])
+
+ # Print a message based on how we determined the include path
+
+ if test x"${ac_cv_c_tclh}" = x ; then
+ AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude])
+ else
+ AC_MSG_RESULT([${ac_cv_c_tclh}])
+ fi
+
+ # Convert to a native path and substitute into the output files.
+
+ INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}`
+
+ TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
+
+ AC_SUBST(TCL_INCLUDES)
+])
+
+#------------------------------------------------------------------------
+# TEA_PRIVATE_TK_HEADERS --
+#
+# Locate the private Tk include files
+#
+# Arguments:
+#
+# Requires:
+# TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has
+# already been called.
+#
+# Results:
+#
+# Substitutes the following vars:
+# TK_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [
+ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh}
+ AC_REQUIRE([TEA_PUBLIC_TK_HEADERS])
+ AC_MSG_CHECKING([for Tk private include files])
+
+ TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}`
+ TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\"
+
+ # Check to see if tk<Plat>Port.h isn't already with the public headers
+ # Don't look for tkInt.h because that resides with tk.h in the core
+ # sources, but the <plat>Port headers are in a different directory
+ if test "${TEA_PLATFORM}" = "windows" -a \
+ -f "${ac_cv_c_tkh}/tkWinPort.h"; then
+ result="private headers found with public headers"
+ elif test "${TEA_PLATFORM}" = "unix" -a \
+ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then
+ result="private headers found with public headers"
+ else
+ TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\"
+ TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\"
+ if test "${TEA_PLATFORM}" = "windows"; then
+ TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\"
+ else
+ TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\"
+ fi
+ # Overwrite the previous TK_INCLUDES as this should capture both
+ # public and private headers in the same set.
+ # We want to ensure these are substituted so as not to require
+ # any *_NATIVE vars be defined in the Makefile
+ TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}"
+ # Detect and add ttk subdir
+ if test -d "${TK_SRC_DIR}/generic/ttk"; then
+ TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\""
+ fi
+ if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then
+ TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\""
+ fi
+ if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then
+ TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\""
+ fi
+ if test "`uname -s`" = "Darwin"; then
+ # If Tk was built as a framework, attempt to use
+ # the framework's Headers and PrivateHeaders directories
+ case ${TK_DEFS} in
+ *TK_FRAMEWORK*)
+ if test -d "${TK_BIN_DIR}/Headers" -a \
+ -d "${TK_BIN_DIR}/PrivateHeaders"; then
+ TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}"
+ else
+ TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`"
+ fi
+ ;;
+ esac
+ result="Using ${TK_INCLUDES}"
+ else
+ if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then
+ AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}])
+ fi
+ result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}"
+ fi
+ fi
+
+ AC_SUBST(TK_TOP_DIR_NATIVE)
+ AC_SUBST(TK_XLIB_DIR_NATIVE)
+
+ AC_SUBST(TK_INCLUDES)
+ AC_MSG_RESULT([${result}])
+])
+
+#------------------------------------------------------------------------
+# TEA_PUBLIC_TK_HEADERS --
+#
+# Locate the installed public Tk header files
+#
+# Arguments:
+# None.
+#
+# Requires:
+# CYGPATH must be set
+#
+# Results:
+#
+# Adds a --with-tkinclude switch to configure.
+# Result is cached.
+#
+# Substitutes the following vars:
+# TK_INCLUDES
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [
+ AC_MSG_CHECKING([for Tk public headers])
+
+ AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval})
+
+ AC_CACHE_VAL(ac_cv_c_tkh, [
+ # Use the value from --with-tkinclude, if it was given
+
+ if test x"${with_tkinclude}" != x ; then
+ if test -f "${with_tkinclude}/tk.h" ; then
+ ac_cv_c_tkh=${with_tkinclude}
+ else
+ AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h])
+ fi
+ else
+ list=""
+ if test "`uname -s`" = "Darwin"; then
+ # If Tk was built as a framework, attempt to use
+ # the framework's Headers directory.
+ case ${TK_DEFS} in
+ *TK_FRAMEWORK*)
+ list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`"
+ ;;
+ esac
+ fi
+
+ # Look in the source dir only if Tk is not installed,
+ # and in that situation, look there before installed locations.
+ if test -f "${TK_BIN_DIR}/Makefile" ; then
+ list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`"
+ fi
+
+ # Check order: pkg --prefix location, Tk's --prefix location,
+ # relative to directory of tkConfig.sh, Tcl's --prefix location,
+ # relative to directory of tclConfig.sh.
+
+ eval "temp_includedir=${includedir}"
+ list="$list \
+ `ls -d ${temp_includedir} 2>/dev/null` \
+ `ls -d ${TK_PREFIX}/include 2>/dev/null` \
+ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \
+ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \
+ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`"
+ if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then
+ list="$list /usr/local/include /usr/include"
+ if test x"${TK_INCLUDE_SPEC}" != x ; then
+ d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'`
+ list="$list `ls -d ${d} 2>/dev/null`"
+ fi
+ fi
+ for i in $list ; do
+ if test -f "$i/tk.h" ; then
+ ac_cv_c_tkh=$i
+ break
+ fi
+ done
+ fi
+ ])
+
+ # Print a message based on how we determined the include path
+
+ if test x"${ac_cv_c_tkh}" = x ; then
+ AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude])
+ else
+ AC_MSG_RESULT([${ac_cv_c_tkh}])
+ fi
+
+ # Convert to a native path and substitute into the output files.
+
+ INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}`
+
+ TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
+
+ AC_SUBST(TK_INCLUDES)
+
+ if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then
+ # On Windows and Aqua, we need the X compat headers
+ AC_MSG_CHECKING([for X11 header files])
+ if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then
+ INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`"
+ TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
+ AC_SUBST(TK_XINCLUDES)
+ fi
+ AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}])
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_PATH_CONFIG --
+#
+# Locate the ${1}Config.sh file and perform a sanity check on
+# the ${1} compile flags. These are used by packages like
+# [incr Tk] that load *Config.sh files from more than Tcl and Tk.
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-$1=...
+#
+# Defines the following vars:
+# $1_BIN_DIR Full path to the directory containing
+# the $1Config.sh file
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PATH_CONFIG], [
+ #
+ # Ok, lets find the $1 configuration
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-$1
+ #
+
+ if test x"${no_$1}" = x ; then
+ # we reset no_$1 in case something fails here
+ no_$1=true
+ AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval})
+ AC_MSG_CHECKING([for $1 configuration])
+ AC_CACHE_VAL(ac_cv_c_$1config,[
+
+ # First check to see if --with-$1 was specified.
+ if test x"${with_$1config}" != x ; then
+ case ${with_$1config} in
+ */$1Config.sh )
+ if test -f ${with_$1config}; then
+ AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself])
+ with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'`
+ fi;;
+ esac
+ if test -f "${with_$1config}/$1Config.sh" ; then
+ ac_cv_c_$1config=`(cd ${with_$1config}; pwd)`
+ else
+ AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh])
+ fi
+ fi
+
+ # then check for a private $1 installation
+ if test x"${ac_cv_c_$1config}" = x ; then
+ for i in \
+ ../$1 \
+ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \
+ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \
+ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \
+ ../../$1 \
+ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \
+ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \
+ ../../../$1 \
+ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \
+ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \
+ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \
+ ${srcdir}/../$1 \
+ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \
+ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \
+ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \
+ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \
+ ; do
+ if test -f "$i/$1Config.sh" ; then
+ ac_cv_c_$1config=`(cd $i; pwd)`
+ break
+ fi
+ if test -f "$i/unix/$1Config.sh" ; then
+ ac_cv_c_$1config=`(cd $i/unix; pwd)`
+ break
+ fi
+ done
+ fi
+
+ # check in a few common install locations
+ if test x"${ac_cv_c_$1config}" = x ; then
+ for i in `ls -d ${libdir} 2>/dev/null` \
+ `ls -d ${exec_prefix}/lib 2>/dev/null` \
+ `ls -d ${prefix}/lib 2>/dev/null` \
+ `ls -d /usr/local/lib 2>/dev/null` \
+ `ls -d /usr/contrib/lib 2>/dev/null` \
+ `ls -d /usr/lib 2>/dev/null` \
+ `ls -d /usr/lib64 2>/dev/null` \
+ ; do
+ if test -f "$i/$1Config.sh" ; then
+ ac_cv_c_$1config=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+ ])
+
+ if test x"${ac_cv_c_$1config}" = x ; then
+ $1_BIN_DIR="# no $1 configs found"
+ AC_MSG_WARN([Cannot find $1 configuration definitions])
+ exit 0
+ else
+ no_$1=
+ $1_BIN_DIR=${ac_cv_c_$1config}
+ AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh])
+ fi
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_LOAD_CONFIG --
+#
+# Load the $1Config.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# $1_BIN_DIR
+#
+# Results:
+#
+# Substitutes the following vars:
+# $1_SRC_DIR
+# $1_LIB_FILE
+# $1_LIB_SPEC
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_LOAD_CONFIG], [
+ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh])
+
+ if test -f "${$1_BIN_DIR}/$1Config.sh" ; then
+ AC_MSG_RESULT([loading])
+ . "${$1_BIN_DIR}/$1Config.sh"
+ else
+ AC_MSG_RESULT([file not found])
+ fi
+
+ #
+ # If the $1_BIN_DIR is the build directory (not the install directory),
+ # then set the common variable name to the value of the build variables.
+ # For example, the variable $1_LIB_SPEC will be set to the value
+ # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC
+ # instead of $1_BUILD_LIB_SPEC since it will work with both an
+ # installed and uninstalled version of Tcl.
+ #
+
+ if test -f "${$1_BIN_DIR}/Makefile" ; then
+ AC_MSG_WARN([Found Makefile - using build library specs for $1])
+ $1_LIB_SPEC=${$1_BUILD_LIB_SPEC}
+ $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC}
+ $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH}
+ $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC}
+ $1_LIBRARY_PATH=${$1_LIBRARY_PATH}
+ fi
+
+ AC_SUBST($1_VERSION)
+ AC_SUBST($1_BIN_DIR)
+ AC_SUBST($1_SRC_DIR)
+
+ AC_SUBST($1_LIB_FILE)
+ AC_SUBST($1_LIB_SPEC)
+
+ AC_SUBST($1_STUB_LIB_FILE)
+ AC_SUBST($1_STUB_LIB_SPEC)
+ AC_SUBST($1_STUB_LIB_PATH)
+
+ # Allow the caller to prevent this auto-check by specifying any 2nd arg
+ AS_IF([test "x$2" = x], [
+ # Check both upper and lower-case variants
+ # If a dev wanted non-stubs libs, this function could take an option
+ # to not use _STUB in the paths below
+ AS_IF([test "x${$1_STUB_LIB_SPEC}" = x],
+ [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)],
+ [TEA_LOAD_CONFIG_LIB($1_STUB)])
+ ])
+])
+
+#------------------------------------------------------------------------
+# TEA_LOAD_CONFIG_LIB --
+#
+# Helper function to load correct library from another extension's
+# ${PACKAGE}Config.sh.
+#
+# Results:
+# Adds to LIBS the appropriate extension library
+#------------------------------------------------------------------------
+AC_DEFUN([TEA_LOAD_CONFIG_LIB], [
+ AC_MSG_CHECKING([For $1 library for LIBS])
+ # This simplifies the use of stub libraries by automatically adding
+ # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS,
+ # but this is called before CONFIG_CFLAGS. More importantly, this adds
+ # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD.
+ if test "x${$1_LIB_SPEC}" != "x" ; then
+ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then
+ TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"])
+ AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}])
+ else
+ TEA_ADD_LIBS([${$1_LIB_SPEC}])
+ AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}])
+ fi
+ else
+ AC_MSG_RESULT([file not found])
+ fi
+])
+
+#------------------------------------------------------------------------
+# TEA_EXPORT_CONFIG --
+#
+# Define the data to insert into the ${PACKAGE}Config.sh file
+#
+# Arguments:
+#
+# Requires the following vars to be set:
+# $1
+#
+# Results:
+# Substitutes the following vars:
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_EXPORT_CONFIG], [
+ #--------------------------------------------------------------------
+ # These are for $1Config.sh
+ #--------------------------------------------------------------------
+
+ # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib)
+ eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}"
+ if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then
+ eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}"
+ eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}"
+ else
+ eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}"
+ eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}"
+ fi
+ $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}"
+ $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}"
+ $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}"
+ $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}"
+ $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}"
+ $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}"
+
+ AC_SUBST($1_BUILD_LIB_SPEC)
+ AC_SUBST($1_LIB_SPEC)
+ AC_SUBST($1_BUILD_STUB_LIB_SPEC)
+ AC_SUBST($1_STUB_LIB_SPEC)
+ AC_SUBST($1_BUILD_STUB_LIB_PATH)
+ AC_SUBST($1_STUB_LIB_PATH)
+
+ AC_SUBST(MAJOR_VERSION)
+ AC_SUBST(MINOR_VERSION)
+ AC_SUBST(PATCHLEVEL)
+])
+
+
+#------------------------------------------------------------------------
+# TEA_PATH_CELIB --
+#
+# Locate Keuchel's celib emulation layer for targeting Win/CE
+#
+# Arguments:
+# none
+#
+# Results:
+#
+# Adds the following arguments to configure:
+# --with-celib=...
+#
+# Defines the following vars:
+# CELIB_DIR Full path to the directory containing
+# the include and platform lib files
+#------------------------------------------------------------------------
+
+AC_DEFUN([TEA_PATH_CELIB], [
+ # First, look for one uninstalled.
+ # the alternative search directory is invoked by --with-celib
+
+ if test x"${no_celib}" = x ; then
+ # we reset no_celib in case something fails here
+ no_celib=true
+ AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval})
+ AC_MSG_CHECKING([for Windows/CE celib directory])
+ AC_CACHE_VAL(ac_cv_c_celibconfig,[
+ # First check to see if --with-celibconfig was specified.
+ if test x"${with_celibconfig}" != x ; then
+ if test -d "${with_celibconfig}/inc" ; then
+ ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)`
+ else
+ AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory])
+ fi
+ fi
+
+ # then check for a celib library
+ if test x"${ac_cv_c_celibconfig}" = x ; then
+ for i in \
+ ../celib-palm-3.0 \
+ ../celib \
+ ../../celib-palm-3.0 \
+ ../../celib \
+ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \
+ ${srcdir}/../celib-palm-3.0 \
+ ${srcdir}/../celib \
+ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \
+ ; do
+ if test -d "$i/inc" ; then
+ ac_cv_c_celibconfig=`(cd $i; pwd)`
+ break
+ fi
+ done
+ fi
+ ])
+ if test x"${ac_cv_c_celibconfig}" = x ; then
+ AC_MSG_ERROR([Cannot find celib support library directory])
+ else
+ no_celib=
+ CELIB_DIR=${ac_cv_c_celibconfig}
+ CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'`
+ AC_MSG_RESULT([found $CELIB_DIR])
+ fi
+ fi
+])
+
+
+# Local Variables:
+# mode: autoconf
+# End: