From 7af8e87f810229a38dc4c66d34cb0f68b4fd58f4 Mon Sep 17 00:00:00 2001 From: Pat Thoyts Date: Mon, 6 Sep 2010 21:35:15 +0100 Subject: [PATCH 1/1] version 3.00 Signed-off-by: Pat Thoyts --- AUTHORS | 5 + COPYING | 11 + ChangeLog | 81 + Makefile.in | 427 ++ README | 68 + README-msqltcl | 118 + aclocal.m4 | 9 + configure | 9233 ++++++++++++++++++++++++++++++++++++++++++ configure.in | 253 ++ doc/man.tcl | 20 + doc/mysqltcl.html | 850 ++++ doc/mysqltcl.man | 709 ++++ doc/mysqltcl.n | 732 ++++ generic/Makefile.org | 14 + generic/mysqltcl.c | 2562 ++++++++++++ tclconfig/install-sh | 119 + tclconfig/tcl.m4 | 3356 +++++++++++++++ tests/binarytest.tcl | 111 + tests/edv.jpg.bin | Bin 0 -> 29141 bytes tests/libload.tcl | 8 + tests/regression.tcl | 33 + tests/test.sql | 23 + tests/test.tcl | 427 ++ tests/test2.tcl | 26 + tests/test41.tcl | 275 ++ 25 files changed, 19470 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.in create mode 100644 README create mode 100644 README-msqltcl create mode 100644 aclocal.m4 create mode 100755 configure create mode 100755 configure.in create mode 100644 doc/man.tcl create mode 100644 doc/mysqltcl.html create mode 100644 doc/mysqltcl.man create mode 100644 doc/mysqltcl.n create mode 100644 generic/Makefile.org create mode 100644 generic/mysqltcl.c create mode 100755 tclconfig/install-sh create mode 100644 tclconfig/tcl.m4 create mode 100755 tests/binarytest.tcl create mode 100644 tests/edv.jpg.bin create mode 100644 tests/libload.tcl create mode 100755 tests/regression.tcl create mode 100644 tests/test.sql create mode 100755 tests/test.tcl create mode 100755 tests/test2.tcl create mode 100644 tests/test41.tcl diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a319815 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +Hakan Soderlund - primary Author of msql interface +Gregory Gulik - mysqltcl 1.50 +Tobias Ritzau (tobri@ida.liu.se) Version 1.53 and 2.0 +Paolo Brutti (Paolo.Brutti@tlsoft.it) Tcl8 Object support. +Artur Trzewik (mail@xdobry.de) UNI-Char Support, new internal design (no 15 connection limitation) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d2e5aee --- /dev/null +++ b/COPYING @@ -0,0 +1,11 @@ +Information for american jusitice/law maniacs +- do not eat this code +- the program do not makes wonder +- ... + +Artur Trzewik - not care +Please ask another authors. + +Some other old historical license notes can be fond in +READMY-msqltcl , mysqltcl.c and mysqltcl.n + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..07ea312 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,81 @@ +Release 3.00 +-- all comands are defined in ::mysql namespace +-- commands are renamed after pattern mysqlconnect mysql::connect +-- needs mysql 4.1 or higher +-- mysqlnext was renamed to mysql::fetch +-- new commands in mysql namespace: autocommit, commit, rollback, nextresult, moreresult, warningcoumt, isnull, newnull, setserveroption, shutdown +-- new connection options: -multistatement, -multiresult, -localfiles, -foundrows, -interactive +-- special null handling. The DB null is returned as new special Tcl type +-- man pages defined with tcllib doctools +Release 2.51 +-- new command mysqlreceive that use mysql_use_result and do not cache result on client machine +Release 2.50 +-- bug in handle managment by subinterpreters was removed be refactoring +Release 2.41 +-- Remove email from Tobias Rizau on his desire (not more up to date) +-- conditional compiling dependent on mysql version causing ignore mysql 3.23.49 bug +-- small source refactoring for hide same compiler warnings +-- remove typos and out of date information from README file +Release 2.40 +-- mysqltcl is now thread safe. The hashtable is hold separated for each thread +Release 2.31 +-- bug in mysqlescape $handle $string fixed (Thanks to Olav Vitters) +Release 2.30 +-- new connection options -ssl -odbc -noschema -compress +-- mysqlescape can take also handle as argument to use mysql_real_escape_string and respect character setting +-- new command mysqlbaseinfo -connectparameters | -clientversion that return all suported connect parameters or version of client C-API library +-- new command mysqlping for checking and refresh of connection +-- new command mysqlchangeuser for change user and database +Release 2.20 +-- mysqlconnect was extended with option -encoding. Similar behavior to fconfigure. (initial patch written by Alexander Schoepe) The Version is not full compatible with oldier version. The differences are be reading date from mysql. Now the date are converted from External to Utf. See documentation for more information. +Release 2.14 +-- configuration has new future for static linking with mysqlclient library +Release 2.12 +-- refactoring (options for GetIndexFromObject are defined localy like in Tcl-core) +-- removing unused variables +-- some casts to avoid warnings messages +-- bug in reading options from my.cnf was removed (It have not work earlier) +-- use Tcl_Preserve and Tcl_Release instead of internal reference count +Release 2.11 +-- memory leak removed +Release 2.1 +-- new commands mysqlquerry mysqlendquerry +-- refactoring +Release 2.0rc14 +-- using mysql_option to read option group mysqltcl from my.cnf file + +Release 2.0 +-- unlimitet number of connections +-- Support of UNI-coded strings (All Stings are converted + to external representation before sending to database) +-- thread safe ready (no tested, need to use Tcl_LockMutex by using global + variables not implementet yet) +-- Rewritten all the commands using the Tcl_Obj interface +-- The handles are full-featured Tcl objects, so that they're not converted + anymore to and from strings every time a command is called +-- Improved argument checking +-- Mysqltcl is now a Tcl package, loadable with 'package require' +-- Added mysqlescape, for support to binary data. +-- Mysqlstate has a syntax in accord with other commands (handle first) + *** POTENTIAL INCOMPATIBILITY *** +-- Added -db -port -socket options to mysqlconnect. +-- Mysqlconnect needs -host to specify the optional hostname + *** POTENTIAL INCOMPATIBILITY *** +-- Added -list and -flatlist options to mysqlselect +-- Mysqlstatus(code) is set to mysql error code on server error +-- Mysql 3.22 is needed +-- Removed unneeded mysql field from MysqlTclHandle struct + +Release 1.53 +-- Added all(?) MySQL types to the mysqlcol command (however, it would + recommend using the "SHOW COLUMNS..." command instead +-- Updated the documentation. Changed som mysql back to msql... + +Release 1.52 +-- Support for dynamic libraries +-- Added possibility to set user and password at connection time +-- Changed all msql to mysql in the man-page + +Release 1.51 +-- Support for Tcl/Tk 8.0 all older support was removed +-- The files were restructured and the makefile rewritten diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..99cc7e7 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,427 @@ +# 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 ActiveState SRL. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. +# +# RCS: @(#) $Id: Makefile.in,v 1.41 2002/07/12 00:12:19 hobbs Exp $ + +#======================================================================== +# Edit the following few lines when writing a new extension +#======================================================================== + +#======================================================================== +# Enumerate the names of the source files included in this package. +# This will be used when a dist target is added to the Makefile. +# EXTRA_SOURCES will be replaced by WIN_SOURCES or UNIX_SOURCES, as is +# appropriate for your platform. It is not important to specify the +# directory, as long as it is the $(srcdir) or in the generic, win or +# unix subdirectory. +#======================================================================== + +mysqltcl_SOURCES = mysqltcl.c + +WIN_SOURCES = +UNIX_SOURCES = + +#======================================================================== +# Identify the object files. This replaces .c with .$(OBJEXT) for all +# the named source files. These objects are created and linked into the +# final library. In these do not correspond directly to the source files +# above, you will need to enumerate the object files here. +# Normally we would use $(OBJEXT), but certain make executables won't do +# the extra macro in a macro conversion properly. +# +# "sample_LIB_FILE" refers to the library (dynamic or static as per +# configuration options) composed of the named objects. +#======================================================================== + +mysqltcl_OBJECTS = $(mysqltcl_SOURCES:.c=.@OBJEXT@) +mysqltcl_LIB_FILE = @mysqltcl_LIB_FILE@ + +#======================================================================== +# RUNTIME_SOURCES identifies Tcl runtime files that are associated with +# this package that need to be installed, if any. +#======================================================================== + +#RUNTIME_SOURCES = + +#======================================================================== +# This is a list of header files to be installed +#======================================================================== + +#GENERIC_HDRS = $(srcdir)/generic/mysqltcl.h + +#======================================================================== +# Add additional lines to handle any additional AC_SUBST cases that +# have been added to the configure script. +#======================================================================== + +#SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ + +#======================================================================== +# Nothing of the variables below this line need to be changed. Please +# check the TARGETS section below to make sure the make targets are +# correct. +#======================================================================== + +#======================================================================== +# The variable "$(PACKAGE)_LIB_FILE" is the parameterized name of the +# library that we are building. +#======================================================================== + +lib_BINARIES = $($(PACKAGE)_LIB_FILE) +BINARIES = $(lib_BINARIES) + +SHELL = @SHELL@ + +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +datadir = @datadir@ +mandir = @mandir@ +includedir = @includedir@ + +DESTDIR = + +PKG_DIR = $(PACKAGE)-$(VERSION) +pkgdatadir = $(datadir)/$(PKG_DIR) +pkglibdir = $(libdir)/$(PKG_DIR) +pkgincludedir = $(includedir)/$(PKG_DIR) + +top_builddir = . + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ +CC = @CC@ +CFLAGS_DEBUG = @CFLAGS_DEBUG@ +CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ +CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@ +CLEANFILES = @CLEANFILES@ +EXEEXT = @EXEEXT@ +LDFLAGS_DEBUG = @LDFLAGS_DEBUG@ +LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ +LDFLAGS_OPTIMIZE = @LDFLAGS_OPTIMIZE@ +MAKE_LIB = @MAKE_LIB@ +MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ +MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ +OBJEXT = @OBJEXT@ +RANLIB = @RANLIB@ +SHLIB_CFLAGS = @SHLIB_CFLAGS@ +SHLIB_LD = @SHLIB_LD@ +SHLIB_LDFLAGS = @SHLIB_LDFLAGS@ +SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ @MYSQL_LIBS@ +STLIB_LD = @STLIB_LD@ +TCL_DEFS = @TCL_DEFS@ +TCL_BIN_DIR = @TCL_BIN_DIR@ +TCL_SRC_DIR = @TCL_SRC_DIR@ +# This is necessary for packages that use private Tcl headers +#TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@ +# Not used, but retained for reference of what libs Tcl required +TCL_LIBS = @TCL_LIBS@ @MYSQL_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) +TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \ + LD_LIBRARY_PATH="$(EXTRA_PATH):$(LD_LIBRARY_PATH)" \ + LIBPATH="$(EXTRA_PATH):${LIBPATH}" \ + SHLIB_PATH="$(EXTRA_PATH):${SHLIB_PATH}" \ + PATH="$(EXTRA_PATH):$(PATH)" \ + TCLLIBPATH="$(top_builddir)" +TCLSH_PROG = @TCLSH_PROG@ +TCLSH = $(TCLSH_ENV) $(TCLSH_PROG) +SHARED_BUILD = @SHARED_BUILD@ + +INCLUDES = @TCL_INCLUDES@ @MYSQL_INCLUDES@ + +EXTRA_CFLAGS = $(MEM_DEBUG_FLAGS) @EXTRA_CFLAGS@ + +DEFS = $(TCL_DEFS) @DEFS@ $(EXTRA_CFLAGS) + +CONFIG_CLEAN_FILES = Makefile + +CPPFLAGS = @CPPFLAGS@ +LIBS = @LIBS@ +AR = ar +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) + +#======================================================================== +# Start of user-definable TARGETS section +#======================================================================== + +#======================================================================== +# TEA TARGETS. Please note that the "libraries:" target refers to platform +# independent files, and the "binaries:" target inclues 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) pkgIndex.tcl + +libraries: + +doc: + @echo "user manual doc is as nroff (man) file mysqltcl.n" + +install: all install-binaries install-libraries install-doc + +install-binaries: binaries install-lib-binaries install-bin-binaries + if test "x$(SHARED_BUILD)" = "x1"; then \ + $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ + fi + +#======================================================================== +# This rule installs platform-independent files, such as header files. +#======================================================================== + +install-libraries: libraries + @mkdir -p $(DESTDIR)$(includedir) + @echo "Installing header files in $(DESTDIR)$(includedir)" + @for i in $(GENERIC_HDRS) ; do \ + echo "Installing $$i" ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(includedir) ; \ + done; + +#======================================================================== +# Install documentation. Unix manpages should go in the $(mandir) +# directory. +#======================================================================== + +install-doc: doc + @mkdir -p $(DESTDIR)$(mandir)/mann + @echo "Installing documentation in $(DESTDIR)$(mandir)" + @for i in $(srcdir)/doc/*.n; do \ + echo "Installing $$i"; \ + rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ + done + +test: binaries libraries + $(TCLSH) `@CYGPATH@ $(srcdir)/tests/test.tcl` $(TESTFLAGS) + +shell: binaries libraries + @$(TCLSH) $(SCRIPT) + +gdb: + $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) + +depend: + +#======================================================================== +# $($(PACKAGE)_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 $($(PACKAGE)_OBJECTS) objects are created and linked into the final +# library. In most cases these object files will correspond to the +# source files above. +#======================================================================== + +$($(PACKAGE)_LIB_FILE): $($(PACKAGE)_OBJECTS) + -rm -f $($(PACKAGE)_LIB_FILE) + ${MAKE_LIB} + $(RANLIB) $($(PACKAGE)_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 = generic + +.c.$(OBJEXT): + $(COMPILE) -c `@CYGPATH@ $<` -o $@ + +#======================================================================== +# Create the pkgIndex.tcl file. +# It is usually easiest to let Tcl do this for you with pkg_mkIndex, but +# you may find that you need to customize the package. If so, either +# modify the -hand version, or create a pkgIndex.tcl.in file and have +# the configure script output the pkgIndex.tcl by editing configure.in. +#======================================================================== + +pkgIndex.tcl: + ( echo pkg_mkIndex . $($(PACKAGE)_LIB_FILE) \; exit; ) | $(TCLSH) + +pkgIndex.tcl-hand: + (echo 'package ifneeded $(PACKAGE) $(VERSION) \ + [list load [file join $$dir $($(PACKAGE)_LIB_FILE)]]'\ + ) > pkgIndex.tcl + +#======================================================================== +# 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 = gtar 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 + mkdir -p $(DIST_DIR) + cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/COPYING \ + $(srcdir)/AUTHORS \ + $(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 + + mkdir $(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 \ + mkdir $(DIST_DIR)/$$p; \ + cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ + rm $(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: + @mkdir -p $(DESTDIR)$(pkglibdir) + @list='$(lib_BINARIES)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \ + echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ + $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ + 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='$(RUNTIME_SOURCES)'; for p in $$list; do \ + if test -f $(srcdir)/library/$$p; then \ + echo " Install $$p $(DESTDIR)$(pkglibdir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/library/$$p $(DESTDIR)$(pkglibdir)/$$p; \ + fi; \ + done + +#======================================================================== +# 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: + @mkdir -p $(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 + +.SUFFIXES: .c .$(OBJEXT) + +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='$(RUNTIME_SOURCES)'; for p in $$list; do \ + 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/README b/README new file mode 100644 index 0000000..4393923 --- /dev/null +++ b/README @@ -0,0 +1,68 @@ +Tcl/Tk 8.0 interface to MySQL +============================= + +This is a rewrite of a patched version of Hakan Soderlund's +msqltcl-1.50. I removed all support for older versions of Tcl. If you +are going to use older versions of Tcl, the patch (for msqltcl) found +at http://www.tcx.se will do the job for you. + +The interface can be used as tcl package that is dynamically linked +shared library. + +For copyright and licensing information, look in the README-msqltcl +file. The same condition holds, but don't forget to mention me ;) + +Compilation +=========== +The system has been compiled on +- SunOS 5.5.1 sparc +- SunOS 5.6 sparc +- Linux 2.0.32 i586 + +The settings for these systems are all in the Makefile. Take a look at +the paths at the beginning, and adjust them for your system. The code +is written in "close-to-ansi-c", so it should be straight forward to +compile the static version. It could however be troublesome to compile +the dynamic library, because of the anti-standard of shared +libraries... :( Some experiments with the flags and paths might just +do the trick! + +Set the SHARED variable to compile the shared library. The PLATFORM +variable should be set to something similar to +`uname -prs | sed 's/ /-/g'` for your system. If there are no preset +configuration for your system, it is time to do some testing ;) + +Please report any successful compilations under new configurations +to me, so that I can rewrite the makefile. + +New features +============ +The package is already full of nice features. I added the possibility +to set user and password at connection time and support for all(?) +MySQL types in mysqlcol. However, I would recommend using the "SHOW +COLUMNS..." command for new code. The port can (as always) be set +using an environment variable (see MySQL documentation.) + + +Use and abuse this software as much as you want as long as you follow +the license agreement in the README-msqltcl file. + +Tobias Ritzau + +VERSION 2.0 + +Version 2.0 supports all Tcl8.0 features, uni-code strings and is +faster than old versions. +Compilation and Installation is made by using +./configure scripts based on TEA +It was internal redesigned to support unlimited connection number and +is multi thread safe + +New mysqltcl Homepage + +http://www.xdobry.de/mysqltcl + +Contact: +Mail to both: +Tobias Ritzau configure script support +Artur Trzewik code support diff --git a/README-msqltcl b/README-msqltcl new file mode 100644 index 0000000..1c78892 --- /dev/null +++ b/README-msqltcl @@ -0,0 +1,118 @@ + +Msqltcl -- Tcl interface to the Mini SQL (mSQL) database server + by David J. Hughes + +Author: Hakan Soderstrom, hs@soderstrom.se +Affiliation: Soderstrom Programvaruverkstad AB, Bandhagsvagen 51, + S-122 42 Enskede, Sweden + +------------------------------------------- +Copyright (c) 1994, 1995 Hakan Soderstrom and Tom Poindexter +Additional details at end of this file. +------------------------------------------- + + +VERSIONS, PORTS + +This is release 1.50 of msqltcl. It has been tested with Tcl 7.3, +Tk 3.6p1, TclX 7.3a-p2; Tcl 7.4b2, Tk 4.0b2, TclX 7.4a-b2, mSQL 1.0.6 +under SunOS 4.1.3. Successful ports to several other platforms have +been reported. I would expect msqltcl to run wherever Tcl/Tk and mSQL +succeed. + + +WHAT IS MSQLTCL? + +Msqltcl is an extension to the Tool Command Language (Tcl) that +provides high-level access to a Mini SQL (mSQL) database server. Mini +SQL (mSQL) is a freely available, lightweight database engine. + +Msqltcl features: + -- supports multiple connections to one or more database servers, + -- supports all Mini-SQL statements, + -- returns SELECT query results either as Tcl lists, or iterates + a script over the resulting rows, + -- accesses information about databases, tables, columns. + +The package also contains a useful Mini-Monitor (mmon) written in +Tcl/Tk. It requires TclX and is currently limited to pre-4.0 Tk. + + +ACKNOWLEDGEMENTS + +Obviously msqltcl is just a small addition to a much greater work done +by John Ousterhout (Tcl/Tk) and David J. Hughes (mSQL). + +Msqltcl is derived from work by Tom Poindexter (tpoindex@nyx.cs.du.edu) +whose Sybtcl and Oratcl are useful patterns for Tcl database extensions. + + +DOCUMENTATION + +Yes, a decent man page. + + +REQUIREMENTS + +You must have Tcl/Tk and Mini SQL. + +** Tcl/Tk by John Ousterhout is available from numerous FTP sites. For +one-stop retrieval, look in ftp.aud.alcatel.com:/tcl. You will find +the Tcl/Tk distribution in /tcl/ftp.cs.berkeley.edu, extensions (one +of which is msqltcl) in /tcl/extensions. You may want to get the file +/tcl/MIRRORS to discover a mirror site near you. + +The Tcl/Tk Book is "Tcl and the Tk Toolkit" by John K. Ousterhout, +Addison-Wesley 1994, ISBN 0-201-63337-X. + +** Mini SQL (mSQL) is a freely available, lightweight database engine +developed by David J. Hughes, Bond University, Australia. The source +code can be obtained by FTP from Bond.edu.au:/pub/Minerva/msql. + +There is an mSQL mailing list. Join it by sending a message to +msql-list-request@Bond.edu.au. + + +INSTALLATION + +See the file INSTALL. + + +BUG REPORTS + +Although I have made a conscientious effort to provide zero-defect +software and documentation, this release of msqltcl may still contain +blunders of varying magnitudes. + +Comments, suggestions, bug reports (maybe even encouragement!) should be +mailed to me at the E-mail address above. Please include some +information about your environment (platform, OS version, Tcl/Tk +version, mSQL version, msqltcl version). Please include enough +information for me to be able to reproduce any suspect behaviour. If you +have a solution to a problem, please include a patch. + +I can't guarantee that I will fix your bug, but I'll do my best. + + +COPYRIGHT & LICENSE + +Copyright (c) 1994, 1995 Hakan Soderstrom, Enskede, Sweden +and Tom Poindexter, Denver, Colorado + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice and this permission notice +appear in all copies of the software and related documentation. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD +AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY +OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +$Revision: 1.1.1.1 $ diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 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 new file mode 100755 index 0000000..e896fa8 --- /dev/null +++ b/configure @@ -0,0 +1,9233 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="generic/mysqltcl.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CONFIGDIR PACKAGE VERSION mysqltcl_LIB_FILE CYGPATH EXEEXT TCL_VERSION TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_LIBS TCL_DEFS TCL_EXTRA_CFLAGS TCL_LD_FLAGS TCL_SHLIB_LD_LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA SET_MAKE RANLIB ac_ct_RANLIB CPP EGREP LIBOBJS TCL_INCLUDES CLEANFILES EXTRA_SOURCES TCL_THREADS SHARED_BUILD AR DL_LIBS CFLAGS_DEBUG CFLAGS_OPTIMIZE CFLAGS_WARNING EXTRA_CFLAGS STLIB_LD SHLIB_LD SHLIB_CFLAGS SHLIB_LDFLAGS SHLIB_LD_LIBS LDFLAGS_DEBUG LDFLAGS_OPTIMIZE TCL_DBGX CFLAGS_DEFAULT LDFLAGS_DEFAULT MAKE_LIB MAKE_SHARED_LIB MAKE_STATIC_LIB MAKE_STUB_LIB LIBMYSQL MYSQL_INCLUDES MYSQL_LIBS MYSQL_LIB_DIR TCLSH_PROG LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-threads build with threads + --enable-shared build and link with shared libraries --enable-shared + --enable-64bit enable 64bit support (where applicable) + --enable-64bit-vis enable 64bit Sparc VIS support + --enable-wince enable Win/CE support (where applicable) + --disable-load disallow dynamic loading and "load" command + --enable-symbols build with debugging symbols --disable-symbols + --enable-mysqlstatic link static with libmysqlclient.a + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-tcl directory containing tcl configuration (tclConfig.sh) + --with-tclinclude directory containing the public Tcl header files + --with-celib=DIR use Windows/CE support library from DIR + --with-mysql-include=DIR Mysql includes are in DIR + --with-mysql-lib=DIR Mysql libraries are in DIR + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in tclconfig $srcdir/tclconfig; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in tclconfig $srcdir/tclconfig" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in tclconfig $srcdir/tclconfig" >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +CONFIGDIR=${srcdir}/tclconfig + + +#---------------------------------------------------------------------- +# __CHANGE__ +# Set your package name and version numbers here. The NODOT_VERSION is +# required for constructing the library name on systems that don't like +# dots in library names (Windows). The VERSION variable is used on the +# other systems. +#---------------------------------------------------------------------- + +PACKAGE=mysqltcl + +MAJOR_VERSION=3 +MINOR_VERSION=0 +PATCHLEVEL=0 + +VERSION=${MAJOR_VERSION}.${MINOR_VERSION}${PATCHLEVEL} +NODOT_VERSION=${MAJOR_VERSION}${MINOR_VERSION} + + + +# This package name must be replaced statically for AC_SUBST to work + +# Substitute stub_LIB_FILE if your package creates a stub library too. +#AC_SUBST(samplestub_LIB_FILE) + +#-------------------------------------------------------------------- +# We put this here so that you can compile with -DVERSION="1.2" to +# encode the package version directly into the source files. +#-------------------------------------------------------------------- + +eval cat >>confdefs.h <<_ACEOF +#define VERSION "${VERSION}" +_ACEOF + + +#-------------------------------------------------------------------- +# Call TEA_INIT as the first TEA_ macro to set up initial vars. +# This will define a ${TEA_PLATFORM} variable == "unix" or "windows". +#-------------------------------------------------------------------- + + + echo "$as_me:$LINENO: checking for correct TEA configuration" >&5 +echo $ECHO_N "checking for correct TEA configuration... $ECHO_C" >&6 + if test x"${PACKAGE}" = x ; then + { { echo "$as_me:$LINENO: error: +The PACKAGE variable must be defined by your TEA configure.in" >&5 +echo "$as_me: error: +The PACKAGE variable must be defined by your TEA configure.in" >&2;} + { (exit 1); exit 1; }; } + fi + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + TEA_INITED=ok + case "`uname -s`" in + *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) + # Extract the first word of "cygpath", so it can be a program name with args. +set dummy cygpath; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CYGPATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CYGPATH"; then + ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CYGPATH="cygpath -w" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" +fi +fi +CYGPATH=$ac_cv_prog_CYGPATH +if test -n "$CYGPATH"; then + echo "$as_me:$LINENO: result: $CYGPATH" >&5 +echo "${ECHO_T}$CYGPATH" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + EXEEXT=".exe" + TEA_PLATFORM="windows" + ;; + *) + CYGPATH=echo + EXEEXT="" + TEA_PLATFORM="unix" + ;; + esac + + # Check if exec_prefix is set. If not use fall back to prefix + if test x$exec_prefix = xNONE ; then exec_prefix=$prefix ; fi + + + + + +#-------------------------------------------------------------------- +# Load the tclConfig.sh file +#-------------------------------------------------------------------- + + + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + { { echo "$as_me:$LINENO: error: Must call TEA INIT before PATH_TCLCONFIG" >&5 +echo "$as_me: error: Must call TEA INIT before PATH_TCLCONFIG" >&2;} + { (exit 1); exit 1; }; } + fi + # + # 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 + +# Check whether --with-tcl or --without-tcl was given. +if test "${with_tcl+set}" = set; then + withval="$with_tcl" + with_tclconfig=${withval} +fi; + echo "$as_me:$LINENO: checking for Tcl configuration" >&5 +echo $ECHO_N "checking for Tcl configuration... $ECHO_C" >&6 + if test "${ac_cv_c_tclconfig+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + # First check to see if --with-tcl was specified. + if test x"${with_tclconfig}" != x ; then + if test -f "${with_tclconfig}/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` + else + { { echo "$as_me:$LINENO: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&5 +echo "$as_me: error: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&2;} + { (exit 1); exit 1; }; } + 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]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; 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 ${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` \ + ; 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]* 2>/dev/null` ; do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; pwd)` + break + fi + done + fi + +fi + + + if test x"${ac_cv_c_tclconfig}" = x ; then + TCL_BIN_DIR="# no Tcl configs found" + { echo "$as_me:$LINENO: WARNING: \"Cannot find Tcl configuration definitions\"" >&5 +echo "$as_me: WARNING: \"Cannot find Tcl configuration definitions\"" >&2;} + exit 0 + else + no_tcl= + TCL_BIN_DIR=${ac_cv_c_tclconfig} + echo "$as_me:$LINENO: result: found $TCL_BIN_DIR/tclConfig.sh" >&5 +echo "${ECHO_T}found $TCL_BIN_DIR/tclConfig.sh" >&6 + fi + fi + + + echo "$as_me:$LINENO: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5 +echo $ECHO_N "checking for existence of $TCL_BIN_DIR/tclConfig.sh... $ECHO_C" >&6 + + if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then + echo "$as_me:$LINENO: result: loading" >&5 +echo "${ECHO_T}loading" >&6 + . $TCL_BIN_DIR/tclConfig.sh + else + echo "$as_me:$LINENO: result: file not found" >&5 +echo "${ECHO_T}file not found" >&6 + fi + + # + # 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} + fi + + # + # eval is required to do the TCL_DBGX substitution + # + + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" + eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" + + + + + + + + + + + + + + #AC_SUBST(TCL_DBGX) + + + + + + #AC_SUBST(TCL_BUILD_LIB_SPEC) + #AC_SUBST(TCL_BUILD_STUB_LIB_SPEC) + + +#-------------------------------------------------------------------- +# Load the tkConfig.sh file if necessary (Tk extension) +#-------------------------------------------------------------------- + +#TEA_PATH_TKCONFIG +#TEA_LOAD_TKCONFIG + +#----------------------------------------------------------------------- +# Handle the --prefix=... option by defaulting to what Tcl gave. +# Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. +#----------------------------------------------------------------------- + + + # Should be AC_MSG_NOTICE, but that requires autoconf 2.50 + if test "${prefix}" = "NONE"; then + prefix_default=yes + if test x"${TCL_PREFIX}" != x; then + { echo "$as_me:$LINENO: WARNING: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 +echo "$as_me: WARNING: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&2;} + prefix=${TCL_PREFIX} + else + prefix=/usr/local + fi + fi + if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" ; then + if test x"${TCL_EXEC_PREFIX}" != x; then + { echo "$as_me:$LINENO: WARNING: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 +echo "$as_me: WARNING: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&2;} + exec_prefix=${TCL_EXEC_PREFIX} + else + exec_prefix=$prefix + fi + fi + + +#----------------------------------------------------------------------- +# Standard compiler checks. +# This sets up CC by using the CC env var, or looks for gcc otherwise. +# This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create +# the basic setup necessary to compile executables. +#----------------------------------------------------------------------- + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + # If the user did not set CFLAGS, set it now to keep + # the AC_PROG_CC macro from adding "-g -O2". + if test "${CFLAGS+set}" != "set" ; then + CFLAGS="" + fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + #------------------------------------------------------------------------ + # 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 + echo "$as_me:$LINENO: checking if the compiler understands -pipe" >&5 +echo $ECHO_N "checking if the compiler understands -pipe... $ECHO_C" >&6 + OLDCC="$CC" + CC="$CC -pipe" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CC="$OLDCC" + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + + #-------------------------------------------------------------------- + # Checks to see if the make program sets the $MAKE variable. + #-------------------------------------------------------------------- + + echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + + #-------------------------------------------------------------------- + # Find ranlib + #-------------------------------------------------------------------- + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + + #-------------------------------------------------------------------- + # Determines the correct binary file extension (.o, .obj, .exe etc.) + #-------------------------------------------------------------------- + + + + + #-------------------------------------------------------------------- + # Common compiler flag setup + #-------------------------------------------------------------------- + + + echo "$as_me:$LINENO: checking for required early compiler flags" >&5 +echo $ECHO_N "checking for required early compiler flags... $ECHO_C" >&6 + tcl_flags="" + + if test "${tcl_cv_flag__isoc99_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *)strtoll; char *q = (char *)strtoull; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_flag__isoc99_source=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _ISOC99_SOURCE 1 +#include +int +main () +{ +char *p = (char *)strtoll; char *q = (char *)strtoull; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_flag__isoc99_source=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_flag__isoc99_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then + cat >>confdefs.h <<\_ACEOF +#define _ISOC99_SOURCE 1 +_ACEOF + + tcl_flags="$tcl_flags _ISOC99_SOURCE" + fi + + + if test "${tcl_cv_flag__largefile64_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +struct stat64 buf; int i = stat64("/", &buf); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_flag__largefile64_source=no +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define _LARGEFILE64_SOURCE 1 +#include +int +main () +{ +struct stat64 buf; int i = stat64("/", &buf); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_flag__largefile64_source=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_flag__largefile64_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then + cat >>confdefs.h <<\_ACEOF +#define _LARGEFILE64_SOURCE 1 +_ACEOF + + tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" + fi + + if test "x${tcl_flags}" = "x" ; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 + else + echo "$as_me:$LINENO: result: ${tcl_flags}" >&5 +echo "${ECHO_T}${tcl_flags}" >&6 + fi + + + echo "$as_me:$LINENO: checking for 64-bit integer type" >&5 +echo $ECHO_N "checking for 64-bit integer type... $ECHO_C" >&6 + if test "${tcl_cv_type_64bit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +__int64 value = (__int64) 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_type_64bit=__int64 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_type_64bit=none + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + int main() {exit(!(sizeof(long long) > sizeof(long)));} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_type_64bit="long long" +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "${tcl_cv_type_64bit}" = none ; then + echo "$as_me:$LINENO: result: using long" >&5 +echo "${ECHO_T}using long" >&6 + else + cat >>confdefs.h <<_ACEOF +#define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} +_ACEOF + + echo "$as_me:$LINENO: result: ${tcl_cv_type_64bit}" >&5 +echo "${ECHO_T}${tcl_cv_type_64bit}" >&6 + + # Now check for auxiliary declarations + echo "$as_me:$LINENO: checking for struct dirent64" >&5 +echo $ECHO_N "checking for struct dirent64... $ECHO_C" >&6 + if test "${tcl_cv_struct_dirent64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +struct dirent64 p; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_struct_dirent64=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_struct_dirent64=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_DIRENT64 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${tcl_cv_struct_dirent64}" >&5 +echo "${ECHO_T}${tcl_cv_struct_dirent64}" >&6 + + echo "$as_me:$LINENO: checking for struct stat64" >&5 +echo $ECHO_N "checking for struct stat64... $ECHO_C" >&6 + if test "${tcl_cv_struct_stat64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +struct stat64 p; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_struct_stat64=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_struct_stat64=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_struct_stat64}" = "xyes" ; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_STRUCT_STAT64 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${tcl_cv_struct_stat64}" >&5 +echo "${ECHO_T}${tcl_cv_struct_stat64}" >&6 + + echo "$as_me:$LINENO: checking for off64_t" >&5 +echo $ECHO_N "checking for off64_t... $ECHO_C" >&6 + if test "${tcl_cv_type_off64_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +off64_t offset; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_cv_type_off64_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_cv_type_off64_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + + if test "x${tcl_cv_type_off64_t}" = "xyes" ; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_TYPE_OFF64_T 1 +_ACEOF + + fi + echo "$as_me:$LINENO: result: ${tcl_cv_type_off64_t}" >&5 +echo "${ECHO_T}${tcl_cv_type_off64_t}" >&6 + fi + + #TEA_C_BIGENDIAN + if test "${TEA_PLATFORM}" = "unix" ; then + + echo "$as_me:$LINENO: checking dirent.h" >&5 +echo $ECHO_N "checking dirent.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + +#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); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_ok=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_ok=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + + if test $tcl_ok = no; then + cat >>confdefs.h <<\_ACEOF +#define NO_DIRENT_H 1 +_ACEOF + + fi + + echo "$as_me:$LINENO: result: $tcl_ok" >&5 +echo "${ECHO_T}$tcl_ok" >&6 + if test "${ac_cv_header_errno_h+set}" = set; then + echo "$as_me:$LINENO: checking for errno.h" >&5 +echo $ECHO_N "checking for errno.h... $ECHO_C" >&6 +if test "${ac_cv_header_errno_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_errno_h" >&5 +echo "${ECHO_T}$ac_cv_header_errno_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking errno.h usability" >&5 +echo $ECHO_N "checking errno.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking errno.h presence" >&5 +echo $ECHO_N "checking errno.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: errno.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: errno.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: errno.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: errno.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: errno.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: errno.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: errno.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: errno.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: errno.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: errno.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for errno.h" >&5 +echo $ECHO_N "checking for errno.h... $ECHO_C" >&6 +if test "${ac_cv_header_errno_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_errno_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_errno_h" >&5 +echo "${ECHO_T}$ac_cv_header_errno_h" >&6 + +fi +if test $ac_cv_header_errno_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_ERRNO_H 1 +_ACEOF + +fi + + + if test "${ac_cv_header_float_h+set}" = set; then + echo "$as_me:$LINENO: checking for float.h" >&5 +echo $ECHO_N "checking for float.h... $ECHO_C" >&6 +if test "${ac_cv_header_float_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 +echo "${ECHO_T}$ac_cv_header_float_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking float.h usability" >&5 +echo $ECHO_N "checking float.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking float.h presence" >&5 +echo $ECHO_N "checking float.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: float.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: float.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: float.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: float.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: float.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: float.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: float.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: float.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for float.h" >&5 +echo $ECHO_N "checking for float.h... $ECHO_C" >&6 +if test "${ac_cv_header_float_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_float_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_float_h" >&5 +echo "${ECHO_T}$ac_cv_header_float_h" >&6 + +fi +if test $ac_cv_header_float_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_FLOAT_H 1 +_ACEOF + +fi + + + if test "${ac_cv_header_values_h+set}" = set; then + echo "$as_me:$LINENO: checking for values.h" >&5 +echo $ECHO_N "checking for values.h... $ECHO_C" >&6 +if test "${ac_cv_header_values_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_values_h" >&5 +echo "${ECHO_T}$ac_cv_header_values_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking values.h usability" >&5 +echo $ECHO_N "checking values.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking values.h presence" >&5 +echo $ECHO_N "checking values.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: values.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: values.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: values.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: values.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: values.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: values.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: values.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: values.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: values.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: values.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for values.h" >&5 +echo $ECHO_N "checking for values.h... $ECHO_C" >&6 +if test "${ac_cv_header_values_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_values_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_values_h" >&5 +echo "${ECHO_T}$ac_cv_header_values_h" >&6 + +fi +if test $ac_cv_header_values_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_VALUES_H 1 +_ACEOF + +fi + + + if test "${ac_cv_header_limits_h+set}" = set; then + echo "$as_me:$LINENO: checking for limits.h" >&5 +echo $ECHO_N "checking for limits.h... $ECHO_C" >&6 +if test "${ac_cv_header_limits_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_limits_h" >&5 +echo "${ECHO_T}$ac_cv_header_limits_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking limits.h usability" >&5 +echo $ECHO_N "checking limits.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking limits.h presence" >&5 +echo $ECHO_N "checking limits.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: limits.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: limits.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: limits.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: limits.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: limits.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: limits.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: limits.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: limits.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: limits.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: limits.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for limits.h" >&5 +echo $ECHO_N "checking for limits.h... $ECHO_C" >&6 +if test "${ac_cv_header_limits_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_limits_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_limits_h" >&5 +echo "${ECHO_T}$ac_cv_header_limits_h" >&6 + +fi +if test $ac_cv_header_limits_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_LIMITS_H 1 +_ACEOF + +fi + + + if test "${ac_cv_header_stdlib_h+set}" = set; then + echo "$as_me:$LINENO: checking for stdlib.h" >&5 +echo $ECHO_N "checking for stdlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_stdlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdlib_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking stdlib.h usability" >&5 +echo $ECHO_N "checking stdlib.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking stdlib.h presence" >&5 +echo $ECHO_N "checking stdlib.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: stdlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: stdlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: stdlib.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: stdlib.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: stdlib.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: stdlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: stdlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: stdlib.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for stdlib.h" >&5 +echo $ECHO_N "checking for stdlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_stdlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_stdlib_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdlib_h" >&6 + +fi +if test $ac_cv_header_stdlib_h = yes; then + tcl_ok=1 +else + tcl_ok=0 +fi + + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "strtol" >/dev/null 2>&1; then + : +else + tcl_ok=0 +fi +rm -f conftest* + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "strtoul" >/dev/null 2>&1; then + : +else + tcl_ok=0 +fi +rm -f conftest* + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "strtod" >/dev/null 2>&1; then + : +else + tcl_ok=0 +fi +rm -f conftest* + + if test $tcl_ok = 0; then + cat >>confdefs.h <<\_ACEOF +#define NO_STDLIB_H 1 +_ACEOF + + fi + if test "${ac_cv_header_string_h+set}" = set; then + echo "$as_me:$LINENO: checking for string.h" >&5 +echo $ECHO_N "checking for string.h... $ECHO_C" >&6 +if test "${ac_cv_header_string_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_string_h" >&5 +echo "${ECHO_T}$ac_cv_header_string_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking string.h usability" >&5 +echo $ECHO_N "checking string.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking string.h presence" >&5 +echo $ECHO_N "checking string.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: string.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: string.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: string.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: string.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: string.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: string.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: string.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: string.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: string.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: string.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for string.h" >&5 +echo $ECHO_N "checking for string.h... $ECHO_C" >&6 +if test "${ac_cv_header_string_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_string_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_string_h" >&5 +echo "${ECHO_T}$ac_cv_header_string_h" >&6 + +fi +if test $ac_cv_header_string_h = yes; then + tcl_ok=1 +else + tcl_ok=0 +fi + + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "strstr" >/dev/null 2>&1; then + : +else + tcl_ok=0 +fi +rm -f conftest* + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "strerror" >/dev/null 2>&1; then + : +else + tcl_ok=0 +fi +rm -f conftest* + + + # See also memmove check below for a place where NO_STRING_H can be + # set and why. + + if test $tcl_ok = 0; then + cat >>confdefs.h <<\_ACEOF +#define NO_STRING_H 1 +_ACEOF + + fi + + if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo "$as_me:$LINENO: checking for sys/wait.h" >&5 +echo $ECHO_N "checking for sys/wait.h... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking sys/wait.h usability" >&5 +echo $ECHO_N "checking sys/wait.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking sys/wait.h presence" >&5 +echo $ECHO_N "checking sys/wait.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: sys/wait.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: sys/wait.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/wait.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: sys/wait.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: sys/wait.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: sys/wait.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/wait.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: sys/wait.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: sys/wait.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: sys/wait.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for sys/wait.h" >&5 +echo $ECHO_N "checking for sys/wait.h... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_sys_wait_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 + +fi +if test $ac_cv_header_sys_wait_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_SYS_WAIT_H 1 +_ACEOF + +fi + + + if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dlfcn.h usability" >&5 +echo $ECHO_N "checking dlfcn.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dlfcn.h presence" >&5 +echo $ECHO_N "checking dlfcn.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dlfcn.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dlfcn.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dlfcn_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 + +fi +if test $ac_cv_header_dlfcn_h = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define NO_DLFCN_H 1 +_ACEOF + +fi + + + + # OS/390 lacks sys/param.h (and doesn't need it, by chance). + + + +for ac_header in unistd.h sys/param.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + echo "$as_me:$LINENO: checking for strtod" >&5 +echo $ECHO_N "checking for strtod... $ECHO_C" >&6 +if test "${ac_cv_func_strtod+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char strtod (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strtod (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strtod) || defined (__stub___strtod) +choke me +#else +char (*f) () = strtod; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != strtod; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strtod=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_strtod=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strtod" >&5 +echo "${ECHO_T}$ac_cv_func_strtod" >&6 +if test $ac_cv_func_strtod = yes; then + tcl_strtod=1 +else + tcl_strtod=0 +fi + + if test "$tcl_strtod" = 1; then + echo "$as_me:$LINENO: checking for Solaris2.4/Tru64 strtod bugs" >&5 +echo $ECHO_N "checking for Solaris2.4/Tru64 strtod bugs... $ECHO_C" >&6 + if test "$cross_compiling" = yes; then + tcl_ok=0 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + extern double strtod(); + int main() + { + char *string = "NaN", *spaceString = " "; + char *term; + double value; + value = strtod(string, &term); + if ((term != string) && (term[-1] == 0)) { + exit(1); + } + value = strtod(spaceString, &term); + if (term == (spaceString+1)) { + exit(1); + } + exit(0); + } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_ok=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +tcl_ok=0 +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test "$tcl_ok" = 1; then + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + else + echo "$as_me:$LINENO: result: buggy" >&5 +echo "${ECHO_T}buggy" >&6 + LIBOBJS="$LIBOBJS fixstrtod.$ac_objext" + cat >>confdefs.h <<\_ACEOF +#define strtod fixstrtod +_ACEOF + + fi + fi + + fi + + +#-------------------------------------------------------------------- +# __CHANGE__ +# Choose which headers you need. Extension authors should try very +# hard to only rely on the Tcl public header files. Internal headers +# contain private data structures and are subject to change without +# notice. +# This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG +#-------------------------------------------------------------------- + + + echo "$as_me:$LINENO: checking for Tcl public headers" >&5 +echo $ECHO_N "checking for Tcl public headers... $ECHO_C" >&6 + + +# Check whether --with-tclinclude or --without-tclinclude was given. +if test "${with_tclinclude+set}" = set; then + withval="$with_tclinclude" + with_tclinclude=${withval} +fi; + + if test "${ac_cv_c_tclh+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + # 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 + { { echo "$as_me:$LINENO: error: ${with_tclinclude} directory does not contain tcl.h" >&5 +echo "$as_me: error: ${with_tclinclude} directory does not contain tcl.h" >&2;} + { (exit 1); exit 1; }; } + fi + else + # Check order: pkg --prefix location, Tcl's --prefix location, + # directory of tclConfig.sh, and Tcl source directory. + # Looking in the source dir is not ideal, but OK. + + eval "temp_includedir=${includedir}" + 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` \ + `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + fi + for i in $list ; do + if test -f "$i/tcl.h" ; then + ac_cv_c_tclh=$i + break + fi + done + fi + +fi + + + # Print a message based on how we determined the include path + + if test x"${ac_cv_c_tclh}" = x ; then + { { echo "$as_me:$LINENO: error: tcl.h not found. Please specify its location with --with-tclinclude" >&5 +echo "$as_me: error: tcl.h not found. Please specify its location with --with-tclinclude" >&2;} + { (exit 1); exit 1; }; } + else + echo "$as_me:$LINENO: result: ${ac_cv_c_tclh}" >&5 +echo "${ECHO_T}${ac_cv_c_tclh}" >&6 + 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}\" + + + +#TEA_PRIVATE_TCL_HEADERS + +#TEA_PUBLIC_TK_HEADERS +#TEA_PRIVATE_TK_HEADERS + +#-------------------------------------------------------------------- +# __CHANGE__ +# A few miscellaneous platform-specific items: +# +# Define a special symbol for Windows (BUILD_sample in this case) so +# that we create the export library with the dll. See sha1.h on how +# to use this. +# +# Windows creates a few extra files that need to be cleaned up. +# You can add more files to clean if your extension creates any extra +# files. +# +# Define any extra compiler flags in the PACKAGE_CFLAGS variable. +# These will be appended to the current set of compiler flags for +# your system. +#-------------------------------------------------------------------- + +if test "${TEA_PLATFORM}" = "windows" ; then + cat >>confdefs.h <<\_ACEOF +#define BUILD_sample 1 +_ACEOF + + CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" + EXTRA_SOURCES='$(WIN_SOURCES)' +else + CLEANFILES="pkgIndex.tcl" + EXTRA_SOURCES='$(UNIX_SOURCES)' +fi + + + +#-------------------------------------------------------------------- +# Check whether --enable-threads or --disable-threads was given. +#-------------------------------------------------------------------- + + + # Check whether --enable-threads or --disable-threads was given. +if test "${enable_threads+set}" = set; then + enableval="$enable_threads" + tcl_ok=$enableval +else + tcl_ok= +fi; + + if test "$tcl_ok" = "yes"; then + TCL_THREADS=1 + + if test "${TEA_PLATFORM}" != "windows" ; then + # We are always OK on Windows, so check what this platform wants. + cat >>confdefs.h <<\_ACEOF +#define USE_THREAD_ALLOC 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _REENTRANT 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _THREAD_SAFE 1 +_ACEOF + + echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthread" >&5 +echo $ECHO_N "checking for pthread_mutex_init in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_mutex_init (); +int +main () +{ +pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthread_pthread_mutex_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread_pthread_mutex_init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_mutex_init" >&6 +if test $ac_cv_lib_pthread_pthread_mutex_init = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + 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] + echo "$as_me:$LINENO: checking for __pthread_mutex_init in -lpthread" >&5 +echo $ECHO_N "checking for __pthread_mutex_init in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread___pthread_mutex_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char __pthread_mutex_init (); +int +main () +{ +__pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthread___pthread_mutex_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread___pthread_mutex_init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread___pthread_mutex_init" >&6 +if test $ac_cv_lib_pthread___pthread_mutex_init = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + fi + + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthread" + else + echo "$as_me:$LINENO: checking for pthread_mutex_init in -lpthreads" >&5 +echo $ECHO_N "checking for pthread_mutex_init in -lpthreads... $ECHO_C" >&6 +if test "${ac_cv_lib_pthreads_pthread_mutex_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthreads $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_mutex_init (); +int +main () +{ +pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthreads_pthread_mutex_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthreads_pthread_mutex_init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 +echo "${ECHO_T}$ac_cv_lib_pthreads_pthread_mutex_init" >&6 +if test $ac_cv_lib_pthreads_pthread_mutex_init = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -lpthreads" + else + echo "$as_me:$LINENO: checking for pthread_mutex_init in -lc" >&5 +echo $ECHO_N "checking for pthread_mutex_init in -lc... $ECHO_C" >&6 +if test "${ac_cv_lib_c_pthread_mutex_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_mutex_init (); +int +main () +{ +pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_c_pthread_mutex_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_c_pthread_mutex_init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_c_pthread_mutex_init" >&5 +echo "${ECHO_T}$ac_cv_lib_c_pthread_mutex_init" >&6 +if test $ac_cv_lib_c_pthread_mutex_init = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + if test "$tcl_ok" = "no"; then + echo "$as_me:$LINENO: checking for pthread_mutex_init in -lc_r" >&5 +echo $ECHO_N "checking for pthread_mutex_init in -lc_r... $ECHO_C" >&6 +if test "${ac_cv_lib_c_r_pthread_mutex_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc_r $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_mutex_init (); +int +main () +{ +pthread_mutex_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_c_r_pthread_mutex_init=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_c_r_pthread_mutex_init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 +echo "${ECHO_T}$ac_cv_lib_c_r_pthread_mutex_init" >&6 +if test $ac_cv_lib_c_r_pthread_mutex_init = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + if test "$tcl_ok" = "yes"; then + # The space is needed + THREADS_LIBS=" -pthread" + else + TCL_THREADS=0 + { echo "$as_me:$LINENO: WARNING: \"Don t know how to find pthread lib on your system - thread support disabled\"" >&5 +echo "$as_me: WARNING: \"Don t know how to find pthread lib on your system - thread support disabled\"" >&2;} + fi + fi + fi + fi + + # Does the pthread-implementation provide + # 'pthread_attr_setstacksize' ? + + ac_saved_libs=$LIBS + LIBS="$LIBS $THREADS_LIBS" + +for ac_func in pthread_attr_setstacksize +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + LIBS=$ac_saved_libs + +for ac_func in readdir_r +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + fi + else + TCL_THREADS=0 + fi + # Do checking message here to not mess up interleaved configure output + echo "$as_me:$LINENO: checking for building with threads" >&5 +echo $ECHO_N "checking for building with threads... $ECHO_C" >&6 + if test "${TCL_THREADS}" = "1"; then + cat >>confdefs.h <<\_ACEOF +#define TCL_THREADS 1 +_ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no (default)" >&5 +echo "${ECHO_T}no (default)" >&6 + 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 + { echo "$as_me:$LINENO: WARNING: + Building ${PACKAGE} without threads enabled, but building against a Tcl + that IS thread-enabled." >&5 +echo "$as_me: WARNING: + Building ${PACKAGE} without threads enabled, but building against a Tcl + that IS thread-enabled." >&2;} + fi + ;; + *) + if test "${TCL_THREADS}" = "1"; then + { echo "$as_me:$LINENO: WARNING: + --enable-threads requested, but attempting building against a Tcl + that is NOT thread-enabled." >&5 +echo "$as_me: WARNING: + --enable-threads requested, but attempting building against a Tcl + that is NOT thread-enabled." >&2;} + fi + ;; + esac + + + +#-------------------------------------------------------------------- +# The statement below defines a collection of symbols related to +# building as a shared library instead of a static library. +#-------------------------------------------------------------------- + + + echo "$as_me:$LINENO: checking how to build libraries" >&5 +echo $ECHO_N "checking how to build libraries... $ECHO_C" >&6 + # Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + tcl_ok=$enableval +else + tcl_ok=yes +fi; + + if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + tcl_ok=$enableval + else + tcl_ok=yes + fi + + if test "$tcl_ok" = "yes" ; then + echo "$as_me:$LINENO: result: shared" >&5 +echo "${ECHO_T}shared" >&6 + SHARED_BUILD=1 + else + echo "$as_me:$LINENO: result: static" >&5 +echo "${ECHO_T}static" >&6 + SHARED_BUILD=0 + cat >>confdefs.h <<\_ACEOF +#define STATIC_BUILD 1 +_ACEOF + + fi + + + +#-------------------------------------------------------------------- +# This macro figures out what flags to use with the compiler/linker +# when building shared/static debug/optimized objects. This information +# can be taken from the tclConfig.sh file, but this figures it all out. +#-------------------------------------------------------------------- + + + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + { { echo "$as_me:$LINENO: error: Must call TEA INIT before CONFIG_CFLAGS" >&5 +echo "$as_me: error: Must call TEA INIT before CONFIG_CFLAGS" >&2;} + { (exit 1); exit 1; }; } + fi + + # Step 0: Enable 64 bit support? + + echo "$as_me:$LINENO: checking if 64bit support is enabled" >&5 +echo $ECHO_N "checking if 64bit support is enabled... $ECHO_C" >&6 + # Check whether --enable-64bit or --disable-64bit was given. +if test "${enable_64bit+set}" = set; then + enableval="$enable_64bit" + do64bit=$enableval +else + do64bit=no +fi; + echo "$as_me:$LINENO: result: $do64bit" >&5 +echo "${ECHO_T}$do64bit" >&6 + + # Step 0.b: Enable Solaris 64 bit VIS support? + + echo "$as_me:$LINENO: checking if 64bit Sparc VIS support is requested" >&5 +echo $ECHO_N "checking if 64bit Sparc VIS support is requested... $ECHO_C" >&6 + # Check whether --enable-64bit-vis or --disable-64bit-vis was given. +if test "${enable_64bit_vis+set}" = set; then + enableval="$enable_64bit_vis" + do64bitVIS=$enableval +else + do64bitVIS=no +fi; + echo "$as_me:$LINENO: result: $do64bitVIS" >&5 +echo "${ECHO_T}$do64bitVIS" >&6 + + if test "$do64bitVIS" = "yes"; then + # Force 64bit on with VIS + do64bit=yes + fi + + # Step 0.c: Cross-compiling options for Windows/CE builds? + + if test "${TEA_PLATFORM}" = "windows" ; then + echo "$as_me:$LINENO: checking if Windows/CE build is requested" >&5 +echo $ECHO_N "checking if Windows/CE build is requested... $ECHO_C" >&6 + # Check whether --enable-wince or --disable-wince was given. +if test "${enable_wince+set}" = set; then + enableval="$enable_wince" + doWince=$enableval +else + doWince=no +fi; + echo "$as_me:$LINENO: result: $doWince" >&5 +echo "${ECHO_T}$doWince" >&6 + fi + + # Step 1: set the variable "system" to hold the name and version number + # for the system. This can usually be done via the "uname" command, but + # there are a few systems, like Next, where this doesn't work. + + echo "$as_me:$LINENO: checking system version (for dynamic loading)" >&5 +echo $ECHO_N "checking system version (for dynamic loading)... $ECHO_C" >&6 + if test -f /usr/lib/NextStep/software_version; then + system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + echo "$as_me:$LINENO: result: unknown (can't find uname command)" >&5 +echo "${ECHO_T}unknown (can't find uname command)" >&6 + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird + # results, and the version is kept in special file). + + if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then + system=MP-RAS-`awk '{print }' /etc/.relid'` + fi + if test "`uname -s`" = "AIX" ; then + system=AIX-`uname -v`.`uname -r` + fi + if test "${TEA_PLATFORM}" = "windows" ; then + system=windows + fi + echo "$as_me:$LINENO: result: $system" >&5 +echo "${ECHO_T}$system" >&6 + fi + fi + + # Step 2: check for existence of -ldl library. This is needed because + # Linux can use either -ldl or -ldld for dynamic loading. + + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + have_dl=yes +else + have_dl=no +fi + + + # Step 3: set configuration options based on system name and version. + + do64bit_ok=no + EXTRA_CFLAGS="" + TCL_EXPORT_FILE_SUFFIX="" + UNSHARED_LIB_SUFFIX="" + TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`' + ECHO_VERSION='`echo ${VERSION}`' + TCL_LIB_VERSIONS_OK=ok + CFLAGS_DEBUG=-g + CFLAGS_OPTIMIZE=-O + if test "$GCC" = "yes" ; then + CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int" + else + CFLAGS_WARNING="" + fi + TCL_NEEDS_EXP_FILE=0 + TCL_BUILD_EXP_FILE="" + TCL_EXP_FILE="" + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STLIB_LD='${AR} cr' + case $system in + 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. + if test "$do64bit" = "yes" ; then + if test "x${MSSDK}x" = "xx" ; then + MSSDK="C:/Progra~1/Microsoft SDK" + fi + # In order to work in the tortured autoconf environment, + # we need to ensure that this path has no spaces + MSSDK=`cygpath -w -s "$MSSDK" | sed -e 's!\\\!/!g'` + if test ! -d "${MSSDK}/bin/win64" ; then + { echo "$as_me:$LINENO: WARNING: \"could not find 64-bit SDK to enable 64bit mode\"" >&5 +echo "$as_me: WARNING: \"could not find 64-bit SDK to enable 64bit mode\"" >&2;} + do64bit="no" + else + do64bit_ok="yes" + fi + fi + + if test "$doWince" != "no" ; then + if test "$do64bit" = "yes" ; then + { { echo "$as_me:$LINENO: error: Windows/CE and 64-bit builds incompatible" >&5 +echo "$as_me: error: Windows/CE and 64-bit builds incompatible" >&2;} + { (exit 1); exit 1; }; } + fi + if test "$GCC" = "yes" ; then + { { echo "$as_me:$LINENO: error: Windows/CE and GCC builds incompatible" >&5 +echo "$as_me: error: Windows/CE and GCC builds incompatible" >&2;} + { (exit 1); exit 1; }; } + fi + + # 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 + +# Check whether --with-celib or --without-celib was given. +if test "${with_celib+set}" = set; then + withval="$with_celib" + with_celibconfig=${withval} +fi; + echo "$as_me:$LINENO: checking for Windows/CE celib directory" >&5 +echo $ECHO_N "checking for Windows/CE celib directory... $ECHO_C" >&6 + if test "${ac_cv_c_celibconfig+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + # 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 + { { echo "$as_me:$LINENO: error: ${with_celibconfig} directory doesn't contain inc directory" >&5 +echo "$as_me: error: ${with_celibconfig} directory doesn't contain inc directory" >&2;} + { (exit 1); exit 1; }; } + 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 + +fi + + if test x"${ac_cv_c_celibconfig}" = x ; then + CELIB_DIR="# no Celib configs found" + { { echo "$as_me:$LINENO: error: Cannot find celib support library directory" >&5 +echo "$as_me: error: Cannot find celib support library directory" >&2;} + { (exit 1); exit 1; }; } + else + no_celib= + CELIB_DIR=${ac_cv_c_celibconfig} + echo "$as_me:$LINENO: result: found $CELIB_DIR" >&5 +echo "${ECHO_T}found $CELIB_DIR" >&6 + fi + fi + + # set defaults + # Currently Tcl requires 300+ + CEVERSION=300; # could be 211 300 301 ... + TARGETCPU=ARM; # could be ARM MIPS SH3 X86 ... + ARCH=$TARGETCPU; # could be ARM MIPS SH3 X86 X86EM ... + PLATFORM="Pocket PC 2002" + if test "$doWince" = "yes"; then + doWince="300,ARM,ARM,Pocket PC 2002" + fi + eval `echo $doWince | awk -F "," '{ \ + if (length($1)) { printf "CEVERSION=%s\n", $1 }; \ + if (length($2)) { printf "TARGETCPU=%s\n", toupper($2) }; \ + if (length($3)) { printf "ARCH=%s\n", toupper($3) } \ + else { printf "ARCH=$TARGETCPU" }; \ + if (length($4)) { printf "PLATFORM=%s\n", $4 }; \ + }'` + OSVERSION=WCE$CEVERSION; + if test "x${WCEROOT}" = "x" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded Tools" + fi + if test "x${SDKROOT}" = "x" ; then + SDKROOT="C:/Windows CE Tools" + fi + # In order to work in the tortured autoconf environment, + # we need to ensure that this path has no spaces + WCEROOT=`cygpath -w -s "$WCEROOT" | sed -e 's!\\!/!g'` + SDKROOT=`cygpath -w -s "$SDKROOT" | sed -e 's!\\!/!g'` + CELIB_DIR=`cygpath -w -s "$CELIB_DIR" | sed -e 's!\\!/!g'` + if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}" \ + -o ! -e "${WCEROOT}/EVC/${OSVERSION}/bin/cl${TARGETCPU}.exe"; then + { { echo "$as_me:$LINENO: error: could not find PocketPC SDK or target compiler to enable WinCE mode" >&5 +echo "$as_me: error: could not find PocketPC SDK or target compiler to enable WinCE mode" >&2;} + { (exit 1); exit 1; }; } + doWince="no" + else + CEINCLUDE=`cygpath -w -s "${SDKROOT}/${OSVERSION}/${PLATFORM}/include" | sed -e 's!\\!/!g'` + CELIBPATH=`cygpath -w -s "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" | sed -e 's!\\!/!g'` + fi + fi + + if test "$GCC" != "yes" ; then + if test "${SHARED_BUILD}" = "0" ; then + runtime=-MT + else + runtime=-MD + fi + + if test "$do64bit" = "yes" ; then + # All this magic is necessary for the Win64 SDK RC1 - hobbs + export CC="${MSSDK}/Bin/Win64/cl.exe \ + -I${MSSDK}/Include/prerelease \ + -I${MSSDK}/Include/Win64/crt \ + -I${MSSDK}/Include" + export RC="${MSSDK}/bin/rc.exe" + export lflags="-MACHINE:IA64 -LIBPATH:${MSSDK}/Lib/IA64 \ + -LIBPATH:${MSSDK}/Lib/Prerelease/IA64" + export STLIB_LD="${MSSDK}/bin/win64/lib.exe -nologo ${lflags}" + export LINKBIN="${MSSDK}/bin/win64/link.exe ${lflags}" + CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -Gs -W2 ${runtime}" + elif test "$doWince" != "no" ; then + if test "${TARGETCPU}" = "X86"; then + CC="${WCEROOT}/EVC/${OSVERSION}/bin/cl.exe -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + else + CC="${WCEROOT}/EVC/${OSVERSION}/bin/cl${TARGETCPU}.exe -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + fi + RC="${WCEROOT}/Common/EVC/bin/rc.exe" + cpulower=`echo ${TARGETCPU} | awk '{print tolower($0)}'` + defs="${TARGETCPU} _${TARGETCPU}_ ${cpulower} _${cpulower}_ POCKET_SIZE PALM_SIZE _MT _DLL _WINDOWS" + for i in $defs ; do + cat >>confdefs.h <<_ACEOF +#define $i 1 +_ACEOF + + done + cat >>confdefs.h <<_ACEOF +#define _WIN32_WCE $CEVERSION +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define UNDER_CE $CEVERSION +_ACEOF + + CFLAGS_DEBUG="-nologo -Zi -Od" + CFLAGS_OPTIMIZE="-nologo -Ox" + lflags="-MACHINE:${TARGETCPU} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,3.00" + STLIB_LD="${WCEROOT}/EVC/${OSVERSION}/bin/lib.exe -nologo ${lflags}" + LINKBIN="${WCEROOT}/EVC/${OSVERSION}/bin/link.exe ${lflags}" + else + RC="rc" + STLIB_LD="lib -nologo" + LINKBIN="link -link50compat" + CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD -W2 ${runtime}" + fi + fi + + if test "$GCC" = "yes"; then + # mingw gcc mode + RC="windres" + CFLAGS_DEBUG="-g" + CFLAGS_OPTIMIZE="-O2" + SHLIB_LD="$CC -shared" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" + LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" + else + SHLIB_LD="${LINKBIN} -dll -nologo" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.lib' + EXTRA_CFLAGS="-YX" + PATHTYPE=-w + # For information on what debugtype is most useful, see: + # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp + # This essentially turns it all on. + LDFLAGS_DEBUG="-debug:full -debugtype:both -warn:2" + 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_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dll" + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.dll' + + TCL_LIB_VERSIONS_OK=nodots + # Bogus to avoid getting this turned off + DL_OBJS="tclLoadNone.obj" + ;; + AIX-*) + if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then + # AIX requires the _r compiler when gcc isn't being used + if test "${CC}" != "cc_r" ; then + CC=${CC}_r + fi + echo "$as_me:$LINENO: result: Using $CC for compiling with threads" >&5 +echo "${ECHO_T}Using $CC for compiling with threads" >&6 + fi + LIBS="$LIBS -lc" + SHLIB_CFLAGS="" + SHLIB_SUFFIX=".so" + SHLIB_LD_LIBS='${LIBS}' + if test "`uname -m`" = "ia64" ; then + # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + # AIX-5 has dl* in libc.so + DL_LIBS="" + if test "$GCC" = "yes" ; then + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' + fi + else + SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" + DL_LIBS="-ldl" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + TCL_NEEDS_EXP_FILE=1 + TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp' + fi + DL_OBJS="tclLoadDl.o" + LDFLAGS="" + + # AIX v<=4.1 has some different flags than 4.2+ + if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then + LIBOBJS="$LIBOBJS tclLoadAix.$ac_objext" + DL_LIBS="-lld" + fi + + # On AIX <=v4 systems, libbsd.a has to be linked in to support + # non-blocking file IO. This library has to be linked in after + # the MATH_LIBS or it breaks the pow() function. The way to + # insure proper sequencing, is to add it to the tail of MATH_LIBS. + # This library also supplies gettimeofday. + # + # AIX does not have a timezone field in struct tm. When the AIX + # bsd library is used, the timezone global and the gettimeofday + # methods are to be avoided for timezone deduction instead, we + # deduce the timezone by comparing the localtime result on a + # known GMT value. + + echo "$as_me:$LINENO: checking for gettimeofday in -lbsd" >&5 +echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (); +int +main () +{ +gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gettimeofday=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6 +if test $ac_cv_lib_bsd_gettimeofday = yes; then + libbsd=yes +else + libbsd=no +fi + + if test $libbsd = yes; then + MATH_LIBS="$MATH_LIBS -lbsd" + cat >>confdefs.h <<\_ACEOF +#define USE_DELTA_FOR_TZ 1 +_ACEOF + + fi + + # Check to enable 64-bit flags for compiler/linker on AIX 4+ + if test "$do64bit" = "yes" -a "`uname -v`" -gt "3" ; then + if test "$GCC" = "yes" ; then + { echo "$as_me:$LINENO: WARNING: \"64bit mode not supported with GCC on $system\"" >&5 +echo "$as_me: WARNING: \"64bit mode not supported with GCC on $system\"" >&2;} + else + do64bit_ok=yes + EXTRA_CFLAGS="-q64" + LDFLAGS="-q64" + RANLIB="${RANLIB} -X64" + AR="${AR} -X64" + SHLIB_LDFLAGS="-b64" + fi + fi + ;; + BSD/OS-2.1*|BSD/OS-3*) + SHLIB_CFLAGS="" + SHLIB_LD="shlicc -r" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + BSD/OS-4.*) + SHLIB_CFLAGS="-export-dynamic -fPIC" + SHLIB_LD="cc -shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-export-dynamic" + LD_SEARCH_FLAGS="" + ;; + dgux*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + HP-UX-*.11.*) + # Use updated header definitions where possible + cat >>confdefs.h <<\_ACEOF +#define _XOPEN_SOURCE_EXTENDED 1 +_ACEOF + + + SHLIB_SUFFIX=".sl" + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + if test "$tcl_ok" = yes; then + SHLIB_CFLAGS="+z" + SHLIB_LD="ld -b" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadShl.o" + DL_LIBS="-ldld" + LDFLAGS="-Wl,-E" + LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + fi + + # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc + #EXTRA_CFLAGS="+DAportable" + + # Check to enable 64-bit flags for compiler/linker + if test "$do64bit" = "yes" ; then + if test "$GCC" = "yes" ; then + hpux_arch=`${CC} -dumpmachine` + case $hpux_arch in + hppa64*) + # 64-bit gcc in use. Fix flags for GNU ld. + do64bit_ok=yes + SHLIB_LD="${CC} -shared" + SHLIB_LD_LIBS="" + LD_SEARCH_FLAGS='' + ;; + *) + { echo "$as_me:$LINENO: WARNING: \"64bit mode not supported with GCC on $system\"" >&5 +echo "$as_me: WARNING: \"64bit mode not supported with GCC on $system\"" >&2;} + ;; + esac + else + do64bit_ok=yes + if test "`uname -m`" = "ia64" ; then + EXTRA_CFLAGS="+DD64" + LDFLAGS="+DD64 $LDFLAGS" + else + EXTRA_CFLAGS="+DA2.0W" + LDFLAGS="+DA2.0W $LDFLAGS" + fi + fi + fi + ;; + HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) + SHLIB_SUFFIX=".sl" + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + tcl_ok=yes +else + tcl_ok=no +fi + + if test "$tcl_ok" = yes; then + SHLIB_CFLAGS="+z" + SHLIB_LD="ld -b" + SHLIB_LD_LIBS="" + DL_OBJS="tclLoadShl.o" + DL_LIBS="-ldld" + LDFLAGS="-Wl,-E" + LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + fi + ;; + IRIX-4.*) + SHLIB_CFLAGS="-G 0" + SHLIB_SUFFIX=".a" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a' + ;; + IRIX-5.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + EXTRA_CFLAGS="" + LDFLAGS="" + ;; + IRIX-6.*|IRIX64-6.5*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + EXTRA_CFLAGS="-mabi=n32" + LDFLAGS="-mabi=n32" + else + case $system in + IRIX-6.3) + # Use to build 6.2 compatible binaries on 6.3. + EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS" + ;; + *) + EXTRA_CFLAGS="-n32" + ;; + esac + LDFLAGS="-n32" + fi + ;; + IRIX64-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + + # Check to enable 64-bit flags for compiler/linker + + if test "$do64bit" = "yes" ; then + if test "$GCC" = "yes" ; then + { echo "$as_me:$LINENO: WARNING: 64bit mode not supported by gcc" >&5 +echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} + else + do64bit_ok=yes + SHLIB_LD="ld -64 -shared -rdata_shared" + EXTRA_CFLAGS="-64" + LDFLAGS="-64" + fi + fi + ;; + Linux*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings + # when you inline the string and math operations. Turn this off to + # get rid of the warnings. + + CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES" + + if test "$have_dl" = yes; then + SHLIB_LD="${CC} -shared" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-rdynamic" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + else + if test "${ac_cv_header_dld_h+set}" = set; then + echo "$as_me:$LINENO: checking for dld.h" >&5 +echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 +if test "${ac_cv_header_dld_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 +echo "${ECHO_T}$ac_cv_header_dld_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dld.h usability" >&5 +echo $ECHO_N "checking dld.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dld.h presence" >&5 +echo $ECHO_N "checking dld.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: dld.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dld.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dld.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dld.h" >&5 +echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 +if test "${ac_cv_header_dld_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dld_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 +echo "${ECHO_T}$ac_cv_header_dld_h" >&6 + +fi +if test $ac_cv_header_dld_h = yes; then + + SHLIB_LD="ld -shared" + DL_OBJS="tclLoadDld.o" + DL_LIBS="-ldld" + LDFLAGS="" + LD_SEARCH_FLAGS="" +fi + + + fi + if test "`uname -m`" = "alpha" ; then + EXTRA_CFLAGS="-mieee" + fi + + # 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. + if test x"${LIBOBJS}" != x ; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -fno-inline" + fi + + ;; + GNU*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + if test "$have_dl" = yes; then + SHLIB_LD="${CC} -shared" + DL_OBJS="" + DL_LIBS="-ldl" + LDFLAGS="-rdynamic" + LD_SEARCH_FLAGS="" + else + if test "${ac_cv_header_dld_h+set}" = set; then + echo "$as_me:$LINENO: checking for dld.h" >&5 +echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 +if test "${ac_cv_header_dld_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 +echo "${ECHO_T}$ac_cv_header_dld_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dld.h usability" >&5 +echo $ECHO_N "checking dld.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dld.h presence" >&5 +echo $ECHO_N "checking dld.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dld.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: dld.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dld.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dld.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dld.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dld.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dld.h" >&5 +echo $ECHO_N "checking for dld.h... $ECHO_C" >&6 +if test "${ac_cv_header_dld_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dld_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dld_h" >&5 +echo "${ECHO_T}$ac_cv_header_dld_h" >&6 + +fi +if test $ac_cv_header_dld_h = yes; then + + SHLIB_LD="ld -shared" + DL_OBJS="" + DL_LIBS="-ldld" + LDFLAGS="" + LD_SEARCH_FLAGS="" +fi + + + fi + if test "`uname -m`" = "alpha" ; then + EXTRA_CFLAGS="-mieee" + fi + ;; + MP-RAS-02*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + MP-RAS-*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-Wl,-Bexport" + LD_SEARCH_FLAGS="" + ;; + NetBSD-*|FreeBSD-[1-2].*|OpenBSD-*) + # Not available on all versions: check for include file. + if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dlfcn.h usability" >&5 +echo $ECHO_N "checking dlfcn.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dlfcn.h presence" >&5 +echo $ECHO_N "checking dlfcn.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dlfcn.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dlfcn.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dlfcn_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 + +fi +if test $ac_cv_header_dlfcn_h = yes; then + + # NetBSD/SPARC needs -fPIC, -fpic will not do. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="ld -Bshareable -x" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + echo "$as_me:$LINENO: checking for ELF" >&5 +echo $ECHO_N "checking for ELF... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef __ELF__ + yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so' +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0' + +fi +rm -f conftest* + + +else + + SHLIB_CFLAGS="" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".a" + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + +fi + + + + # FreeBSD doesn't handle version numbers with dots. + + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + FreeBSD-*) + # FreeBSD 3.* and greater have ELF. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="ld -Bshareable -x" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="-export-dynamic" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + if test "${TCL_THREADS}" = "1" ; then + # The -pthread needs to go in the CFLAGS, not LIBS + LIBS=`echo $LIBS | sed s/-pthread//` + EXTRA_CFLAGS="-pthread" + LDFLAGS="$LDFLAGS -pthread" + fi + case $system in + FreeBSD-3.*) + # FreeBSD-3 doesn't handle version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so' + TCL_LIB_VERSIONS_OK=nodots + ;; + esac + ;; + Rhapsody-*|Darwin-*) + SHLIB_CFLAGS="-fno-common" + SHLIB_LD="cc -dynamiclib \${LDFLAGS}" + TCL_SHLIB_LD_EXTRAS="-compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE} -prebind -seg1addr 0xa000000" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dylib" + DL_OBJS="tclLoadDyld.o" + DL_LIBS="" + LDFLAGS="-prebind" + LD_SEARCH_FLAGS="" + CFLAGS_OPTIMIZE="-O3" + EXTRA_CFLAGS="-arch ppc -pipe" + ;; + NEXTSTEP-*) + SHLIB_CFLAGS="" + SHLIB_LD="cc -nostdlib -r" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadNext.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OS/390-*) + CFLAGS_OPTIMIZE="" # Optimizer is buggy + cat >>confdefs.h <<\_ACEOF +#define _OE_SOCKETS 1 +_ACEOF + # needed in sys/socket.h + ;; + OSF1-1.0|OSF1-1.1|OSF1-1.2) + # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 + SHLIB_CFLAGS="" + # Hack: make package name same as library name + SHLIB_LD='ld -R -export :' + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadOSF.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OSF1-1.*) + # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 + SHLIB_CFLAGS="-fPIC" + if test "$SHARED_BUILD" = "1" ; then + SHLIB_LD="ld -shared" + else + SHLIB_LD="ld -non_shared" + fi + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OSF1-V*) + # Digital OSF/1 + SHLIB_CFLAGS="" + if test "$SHARED_BUILD" = "1" ; then + SHLIB_LD='ld -shared -expect_unresolved "*"' + else + SHLIB_LD='ld -non_shared -expect_unresolved "*"' + fi + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" != "yes" ; then + EXTRA_CFLAGS="-DHAVE_TZSET -std1" + fi + # see pthread_intro(3) for pthread support on osf1, k.furukawa + if test "${TCL_THREADS}" = "1" ; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" + EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" + LIBS=`echo $LIBS | sed s/-lpthreads//` + if test "$GCC" = "yes" ; then + LIBS="$LIBS -lpthread -lmach -lexc" + else + EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread" + LDFLAGS="-pthread" + fi + fi + + ;; + 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" + DL_OBJS="tclLoadDl.o" + # dlopen is in -lc on QNX + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + RISCos-*) + SHLIB_CFLAGS="-G 0" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".a" + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + ;; + SCO_SV-3.2*) + # Note, dlopen is available only on SCO 3.2.5 and greater. However, + # this test works, since "uname -s" was non-standard in 3.2.4 and + # below. + if test "$GCC" = "yes" ; then + SHLIB_CFLAGS="-fPIC -melf" + LDFLAGS="-melf -Wl,-Bexport" + else + SHLIB_CFLAGS="-Kpic -belf" + LDFLAGS="-belf -Wl,-Bexport" + fi + SHLIB_LD="ld -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS="" + ;; + SINIX*5.4*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + SunOS-4*) + SHLIB_CFLAGS="-PIC" + SHLIB_LD="ld" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + + # SunOS can't handle version numbers with dots in them in library + # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it + # requires an extra version number at the end of .so file names. + # So, the library has to have a name like libtcl75.so.1.0 + + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0' + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + SunOS-5.[0-6]*) + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + cat >>confdefs.h <<\_ACEOF +#define _REENTRANT 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + + SHLIB_CFLAGS="-KPIC" + + # Note: need the LIBS below, otherwise Tk won't find Tcl's + # symbols when dynamically loaded into tclsh. + + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + if test "$GCC" = "yes" ; then + SHLIB_LD="$CC -shared" + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + fi + ;; + SunOS-5*) + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + cat >>confdefs.h <<\_ACEOF +#define _REENTRANT 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + + SHLIB_CFLAGS="-KPIC" + LDFLAGS="" + + # Check to enable 64-bit flags for compiler/linker + if test "$do64bit" = "yes" ; then + arch=`isainfo` + if test "$arch" = "sparcv9 sparc" ; then + if test "$GCC" = "yes" ; then + { echo "$as_me:$LINENO: WARNING: \"64bit mode not supported with GCC on $system\"" >&5 +echo "$as_me: WARNING: \"64bit mode not supported with GCC on $system\"" >&2;} + else + do64bit_ok=yes + if test "$do64bitVIS" = "yes" ; then + EXTRA_CFLAGS="-xarch=v9a" + LDFLAGS="-xarch=v9a" + else + EXTRA_CFLAGS="-xarch=v9" + LDFLAGS="-xarch=v9" + fi + fi + else + { echo "$as_me:$LINENO: WARNING: \"64bit mode only supported sparcv9 system\"" >&5 +echo "$as_me: WARNING: \"64bit mode only supported sparcv9 system\"" >&2;} + fi + fi + + # Note: need the LIBS below, otherwise Tk won't find Tcl's + # symbols when dynamically loaded into tclsh. + + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + if test "$GCC" = "yes" ; then + SHLIB_LD="$CC -shared" + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + fi + ;; + ULTRIX-4.*) + SHLIB_CFLAGS="-G 0" + SHLIB_SUFFIX=".a" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + if test "$GCC" != "yes" ; then + EXTRA_CFLAGS="-DHAVE_TZSET -std1" + fi + ;; + UNIX_SV* | UnixWare-5*) + SHLIB_CFLAGS="-KPIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers + # that don't grok the -Bexport option. Test that it does. + hold_ldflags=$LDFLAGS + echo "$as_me:$LINENO: checking for ld accepts -Bexport flag" >&5 +echo $ECHO_N "checking for ld accepts -Bexport flag... $ECHO_C" >&6 + LDFLAGS="${LDFLAGS} -Wl,-Bexport" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + found=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +found=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$hold_ldflags + echo "$as_me:$LINENO: result: $found" >&5 +echo "${ECHO_T}$found" >&6 + if test $found = yes; then + LDFLAGS="-Wl,-Bexport" + else + LDFLAGS="" + fi + LD_SEARCH_FLAGS="" + ;; + esac + + if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then + { echo "$as_me:$LINENO: WARNING: \"64bit support being disabled -- don\'t know magic for this platform\"" >&5 +echo "$as_me: WARNING: \"64bit support being disabled -- don\'t know magic for this platform\"" >&2;} + fi + + # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic + # Loading for Tcl -- What Became of It?". Proc. 2nd Tcl/Tk Workshop, + # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need + # to determine which of several header files defines the a.out file + # format (a.out.h, sys/exec.h, or sys/exec_aout.h). At present, we + # support only a file format that is more or less version-7-compatible. + # In particular, + # - a.out files must begin with `struct exec'. + # - the N_TXTOFF on the `struct exec' must compute the seek address + # of the text segment + # - The `struct exec' must contain a_magic, a_text, a_data, a_bss + # and a_entry fields. + # The following compilation should succeed if and only if either sys/exec.h + # or a.out.h is usable for the purpose. + # + # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the + # `struct exec' includes a second header that contains information that + # duplicates the v7 fields that are needed. + + if test "x$DL_OBJS" = "xtclLoadAout.o" ; then + echo "$as_me:$LINENO: checking sys/exec.h" >&5 +echo $ECHO_N "checking sys/exec.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_magic == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_ok=usable +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_ok=unusable +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $tcl_ok" >&5 +echo "${ECHO_T}$tcl_ok" >&6 + if test $tcl_ok = usable; then + cat >>confdefs.h <<\_ACEOF +#define USE_SYS_EXEC_H 1 +_ACEOF + + else + echo "$as_me:$LINENO: checking a.out.h" >&5 +echo $ECHO_N "checking a.out.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_magic == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_ok=usable +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_ok=unusable +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $tcl_ok" >&5 +echo "${ECHO_T}$tcl_ok" >&6 + if test $tcl_ok = usable; then + cat >>confdefs.h <<\_ACEOF +#define USE_A_OUT_H 1 +_ACEOF + + else + echo "$as_me:$LINENO: checking sys/exec_aout.h" >&5 +echo $ECHO_N "checking sys/exec_aout.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_midmag == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + tcl_ok=usable +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +tcl_ok=unusable +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $tcl_ok" >&5 +echo "${ECHO_T}$tcl_ok" >&6 + if test $tcl_ok = usable; then + cat >>confdefs.h <<\_ACEOF +#define USE_SYS_EXEC_AOUT_H 1 +_ACEOF + + else + DL_OBJS="" + fi + fi + fi + fi + + # Step 5: disable dynamic loading if requested via a command-line switch. + + # Check whether --enable-load or --disable-load was given. +if test "${enable_load+set}" = set; then + enableval="$enable_load" + tcl_ok=$enableval +else + tcl_ok=yes +fi; + if test "$tcl_ok" = "no"; then + DL_OBJS="" + fi + + if test "x$DL_OBJS" != "x" ; then + BUILD_DLTEST="\$(DLTEST_TARGETS)" + else + echo "Can't figure out how to do dynamic loading or shared libraries" + echo "on this system." + SHLIB_CFLAGS="" + SHLIB_LD="" + SHLIB_SUFFIX="" + DL_OBJS="tclLoadNone.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + BUILD_DLTEST="" + fi + + # 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. + + if test "$DL_OBJS" != "tclLoadNone.o" ; then + if test "$GCC" = "yes" ; then + case $system in + AIX-*) + ;; + BSD/OS*) + ;; + IRIX*) + ;; + NetBSD-*|FreeBSD-*|OpenBSD-*) + ;; + Rhapsody-*|Darwin-*) + ;; + RISCos-*) + ;; + SCO_SV-3.2*) + ;; + ULTRIX-4.*) + ;; + windows) + ;; + *) + SHLIB_CFLAGS="-fPIC" + ;; + esac + fi + fi + + if test "$SHARED_LIB_SUFFIX" = "" ; then + SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}' + fi + if test "$UNSHARED_LIB_SUFFIX" = "" ; then + UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a' + fi + + + + + + + + SHLIB_LDFLAGS='$(LDFLAGS_DEFAULT)' + + + + + + + + + +#-------------------------------------------------------------------- +# Set the default compiler switches based on the --enable-symbols option. +#-------------------------------------------------------------------- + + + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + { { echo "$as_me:$LINENO: error: Must call TEA INIT before ENABLE_SYMBOLS" >&5 +echo "$as_me: error: Must call TEA INIT before ENABLE_SYMBOLS" >&2;} + { (exit 1); exit 1; }; } + fi + + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_dbgx=d + else + tcl_dbgx=g + fi + + echo "$as_me:$LINENO: checking for build with symbols" >&5 +echo $ECHO_N "checking for build with symbols... $ECHO_C" >&6 + # Check whether --enable-symbols or --disable-symbols was given. +if test "${enable_symbols+set}" = set; then + enableval="$enable_symbols" + tcl_ok=$enableval +else + tcl_ok=no +fi; + if test "$tcl_ok" = "no"; then + CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)' + LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)' + DBGX="" + TCL_DBGX="" + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + CFLAGS_DEFAULT='$(CFLAGS_DEBUG)' + LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)' + DBGX=${tcl_dbgx} + TCL_DBGX=${tcl_dbgx} + if test "$tcl_ok" = "yes"; then + echo "$as_me:$LINENO: result: yes (standard debugging)" >&5 +echo "${ECHO_T}yes (standard debugging)" >&6 + fi + fi + + + + + + if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then + cat >>confdefs.h <<\_ACEOF +#define TCL_MEM_DEBUG 1 +_ACEOF + + fi + + if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then + if test "$tcl_ok" = "all"; then + echo "$as_me:$LINENO: result: enabled symbols mem debugging" >&5 +echo "${ECHO_T}enabled symbols mem debugging" >&6 + else + echo "$as_me:$LINENO: result: enabled $tcl_ok debugging" >&5 +echo "${ECHO_T}enabled $tcl_ok debugging" >&6 + fi + fi + + +#-------------------------------------------------------------------- +# Everyone should be linking against the Tcl stub library. If you +# can't for some reason, remove this definition. If you aren't using +# stubs, you also need to modify the SHLIB_LD_LIBS setting below to +# link against the non-stubbed Tcl library. Add Tk too if necessary. +#-------------------------------------------------------------------- + +cat >>confdefs.h <<\_ACEOF +#define USE_TCL_STUBS 1 +_ACEOF + +#AC_DEFINE(USE_TK_STUBS) + +#-------------------------------------------------------------------- +# This macro generates a line to use when building a library. It +# depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, +# and TEA_LOAD_TCLCONFIG macros above. +#-------------------------------------------------------------------- + + + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then + MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(\$(PACKAGE)_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS} \$(LDFLAGS) -out:\$@ \$(\$(PACKAGE)_OBJECTS)" + MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(\$(PACKAGE)stub_OBJECTS)" + else + MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(\$(PACKAGE)_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(\$(PACKAGE)_OBJECTS) \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS}" + MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(\$(PACKAGE)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 the ${DBGX} in the suffix is + # substituted. + #-------------------------------------------------------------------- + + 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 "${PACKAGE}_LIB_FILE=${PACKAGE}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "${PACKAGE}_LIB_FILE=${PACKAGE}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build there own stubs libraries + eval eval "${PACKAGE}stub_LIB_FILE=${PACKAGE}stub${UNSHARED_LIB_SUFFIX}" + else + 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 "${PACKAGE}_LIB_FILE=lib${PACKAGE}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "${PACKAGE}_LIB_FILE=lib${PACKAGE}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build there own stubs libraries + eval eval "${PACKAGE}stub_LIB_FILE=lib${PACKAGE}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 + + + + + + + +#-------------------------------------------------------------------- +# __CHANGE__ +# Add platform libs to LIBS or SHLIB_LD_LIBS as necessary. +#-------------------------------------------------------------------- + +#LIBS="${LIBS} -lsuperfly" +LIBMYSQL="" + +# Check whether --with-mysql-include or --without-mysql-include was given. +if test "${with_mysql_include+set}" = set; then + withval="$with_mysql_include" + MYSQL_INC_DIR=$withval +else + MYSQL_INC_DIR="/usr/include/mysql" +fi; + +# Check whether --with-mysql-lib or --without-mysql-lib was given. +if test "${with_mysql_lib+set}" = set; then + withval="$with_mysql_lib" + MYSQL_LIB_DIR=$withval +else + MYSQL_LIB_DIR="/usr/lib/mysql" +fi; +MYSQL_INCLUDES="-I$MYSQL_INC_DIR" + + +# Check whether --enable-mysqlstatic or --disable-mysqlstatic was given. +if test "${enable_mysqlstatic+set}" = set; then + enableval="$enable_mysqlstatic" + tcl_ok=$enableval +else + tcl_ok=$1 +fi; + +if test "$tcl_ok" = "yes"; then + LIBS="${LIBS} ${MYSQL_LIB_DIR}/libmysqlclient.a -lz -lcrypt -lnsl -lm" +else + if test ! -f $MSQL_LIB_DIR/libmysqlclient${SHLIB_SUFFIX} -a -f /usr/lib/libmysqlclient${SHLIB_SUFFIX}; then + MYSQL_LIB_DIR=/usr/lib + fi + MYSQL_LIBS="-L$MYSQL_LIB_DIR -lmysqlclient" + if test ! "$MYSQL_LIB_DIR" = ""; then + LIBMYSQL="libmysqclient${SHLIB_SUFFIX}" + fi +fi + + + + + + +echo "$as_me:$LINENO: checking for mysql header" >&5 +echo $ECHO_N "checking for mysql header... $ECHO_C" >&6 +if test ! -f ${MYSQL_INC_DIR}/mysql.h ; then + { { echo "$as_me:$LINENO: error: Cannot find mysql.h in $MYSQL_INC_DIR use -with-mysql-include=?" >&5 +echo "$as_me: error: Cannot find mysql.h in $MYSQL_INC_DIR use -with-mysql-include=?" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +echo "$as_me:$LINENO: checking for libmysqlclient lib" >&5 +echo $ECHO_N "checking for libmysqlclient lib... $ECHO_C" >&6 +if test "$tcl_ok" = "yes"; then + if test ! -f ${MYSQL_LIB_DIR}/libmysqlclient.a ; then + { { echo "$as_me:$LINENO: error: Cannot find libmysqlclient.a in $MYSQL_LIB_DIR use -with-mysql-lib=?" >&5 +echo "$as_me: error: Cannot find libmysqlclient.a in $MYSQL_LIB_DIR use -with-mysql-lib=?" >&2;} + { (exit 1); exit 1; }; } + fi +else + if test ! -f ${MYSQL_LIB_DIR}/libmysqlclient${SHLIB_SUFFIX} ; then + { { echo "$as_me:$LINENO: error: Cannot find libmysqlclient${SHLIB_SUFFIX} in $MYSQL_LIB_DIR use -with-mysql-lib=?" >&5 +echo "$as_me: error: Cannot find libmysqlclient${SHLIB_SUFFIX} in $MYSQL_LIB_DIR use -with-mysql-lib=?" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + +#-------------------------------------------------------------------- +# Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl +# file during the install process. Don't run the TCLSH_PROG through +# ${CYGPATH} because it's being used directly by make. +# Require that we use a tclsh shell version 8.2 or later since earlier +# versions have bugs in the pkg_mkIndex routine. +# Add WISH as well if this is a Tk extension. +#-------------------------------------------------------------------- + + + echo "$as_me:$LINENO: checking for tclsh" >&5 +echo $ECHO_N "checking for tclsh... $ECHO_C" >&6 + + if test "${ac_cv_path_tclsh+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "x${CELIB_DIR}" != "x" ; then + # If CELIB_DIR is defined, assume Windows/CE target is requested + # which means target tclsh cannot be run (cross-compile) + search_path=`echo ${PATH} | sed -e 's/:/ /g'` + else + search_path=`echo ${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${exec_prefix}/bin:${prefix}/bin:${PATH} | sed -e 's/:/ /g'` + fi + for dir in $search_path ; do + for j in `ls -r $dir/tclsh[8-9]*${EXEEXT} 2> /dev/null` \ + `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do + if test x"$ac_cv_path_tclsh" = x ; then + if test -f "$j" ; then + ac_cv_path_tclsh=$j + break + fi + fi + done + done + +fi + + + if test -f "$ac_cv_path_tclsh" ; then + TCLSH_PROG=$ac_cv_path_tclsh + echo "$as_me:$LINENO: result: $TCLSH_PROG" >&5 +echo "${ECHO_T}$TCLSH_PROG" >&6 + else + { { echo "$as_me:$LINENO: error: No tclsh found in PATH: $search_path" >&5 +echo "$as_me: error: No tclsh found in PATH: $search_path" >&2;} + { (exit 1); exit 1; }; } + fi + + +#TEA_PROG_WISH + +#-------------------------------------------------------------------- +# Finally, substitute all of the various values into the Makefile. +# You may alternatively have a special pkgIndex.tcl.in or other files +# which require substituting th AC variables in. Include these here. +#-------------------------------------------------------------------- + + ac_config_files="$ac_config_files Makefile" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CONFIGDIR@,$CONFIGDIR,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@mysqltcl_LIB_FILE@,$mysqltcl_LIB_FILE,;t t +s,@CYGPATH@,$CYGPATH,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@TCL_VERSION@,$TCL_VERSION,;t t +s,@TCL_BIN_DIR@,$TCL_BIN_DIR,;t t +s,@TCL_SRC_DIR@,$TCL_SRC_DIR,;t t +s,@TCL_LIB_FILE@,$TCL_LIB_FILE,;t t +s,@TCL_LIB_FLAG@,$TCL_LIB_FLAG,;t t +s,@TCL_LIB_SPEC@,$TCL_LIB_SPEC,;t t +s,@TCL_STUB_LIB_FILE@,$TCL_STUB_LIB_FILE,;t t +s,@TCL_STUB_LIB_FLAG@,$TCL_STUB_LIB_FLAG,;t t +s,@TCL_STUB_LIB_SPEC@,$TCL_STUB_LIB_SPEC,;t t +s,@TCL_LIBS@,$TCL_LIBS,;t t +s,@TCL_DEFS@,$TCL_DEFS,;t t +s,@TCL_EXTRA_CFLAGS@,$TCL_EXTRA_CFLAGS,;t t +s,@TCL_LD_FLAGS@,$TCL_LD_FLAGS,;t t +s,@TCL_SHLIB_LD_LIBS@,$TCL_SHLIB_LD_LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@TCL_INCLUDES@,$TCL_INCLUDES,;t t +s,@CLEANFILES@,$CLEANFILES,;t t +s,@EXTRA_SOURCES@,$EXTRA_SOURCES,;t t +s,@TCL_THREADS@,$TCL_THREADS,;t t +s,@SHARED_BUILD@,$SHARED_BUILD,;t t +s,@AR@,$AR,;t t +s,@DL_LIBS@,$DL_LIBS,;t t +s,@CFLAGS_DEBUG@,$CFLAGS_DEBUG,;t t +s,@CFLAGS_OPTIMIZE@,$CFLAGS_OPTIMIZE,;t t +s,@CFLAGS_WARNING@,$CFLAGS_WARNING,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@STLIB_LD@,$STLIB_LD,;t t +s,@SHLIB_LD@,$SHLIB_LD,;t t +s,@SHLIB_CFLAGS@,$SHLIB_CFLAGS,;t t +s,@SHLIB_LDFLAGS@,$SHLIB_LDFLAGS,;t t +s,@SHLIB_LD_LIBS@,$SHLIB_LD_LIBS,;t t +s,@LDFLAGS_DEBUG@,$LDFLAGS_DEBUG,;t t +s,@LDFLAGS_OPTIMIZE@,$LDFLAGS_OPTIMIZE,;t t +s,@TCL_DBGX@,$TCL_DBGX,;t t +s,@CFLAGS_DEFAULT@,$CFLAGS_DEFAULT,;t t +s,@LDFLAGS_DEFAULT@,$LDFLAGS_DEFAULT,;t t +s,@MAKE_LIB@,$MAKE_LIB,;t t +s,@MAKE_SHARED_LIB@,$MAKE_SHARED_LIB,;t t +s,@MAKE_STATIC_LIB@,$MAKE_STATIC_LIB,;t t +s,@MAKE_STUB_LIB@,$MAKE_STUB_LIB,;t t +s,@LIBMYSQL@,$LIBMYSQL,;t t +s,@MYSQL_INCLUDES@,$MYSQL_INCLUDES,;t t +s,@MYSQL_LIBS@,$MYSQL_LIBS,;t t +s,@MYSQL_LIB_DIR@,$MYSQL_LIB_DIR,;t t +s,@TCLSH_PROG@,$TCLSH_PROG,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/configure.in b/configure.in new file mode 100755 index 0000000..418208a --- /dev/null +++ b/configure.in @@ -0,0 +1,253 @@ +#!/bin/bash -norc +dnl This file is an input file used by the GNU "autoconf" program to +dnl generate the file "configure", which is run during Tcl installation +dnl to configure the system for the local environment. +# +# RCS: @(#) $Id: configure.in,v 1.33 2002/10/15 18:43:39 hobbs Exp $ + +#----------------------------------------------------------------------- +# Sample configure.in for Tcl Extensions. The only places you should +# need to modify this file are marked by the string __CHANGE__ +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# __CHANGE__ +# This very first macro is used to verify that the configure script can +# find the sources. The argument to AC_INIT should be a unique filename +# for this package, and can be a relative path, such as: +# +# AC_INIT(generic/tcl.h) +#----------------------------------------------------------------------- + +AC_INIT(generic/mysqltcl.c) + +AC_CONFIG_AUX_DIR(tclconfig) +CONFIGDIR=${srcdir}/tclconfig +AC_SUBST(CONFIGDIR) + +#---------------------------------------------------------------------- +# __CHANGE__ +# Set your package name and version numbers here. The NODOT_VERSION is +# required for constructing the library name on systems that don't like +# dots in library names (Windows). The VERSION variable is used on the +# other systems. +#---------------------------------------------------------------------- + +PACKAGE=mysqltcl + +MAJOR_VERSION=3 +MINOR_VERSION=0 +PATCHLEVEL=0 + +VERSION=${MAJOR_VERSION}.${MINOR_VERSION}${PATCHLEVEL} +NODOT_VERSION=${MAJOR_VERSION}${MINOR_VERSION} + +AC_SUBST(PACKAGE) +AC_SUBST(VERSION) +# This package name must be replaced statically for AC_SUBST to work +AC_SUBST(mysqltcl_LIB_FILE) +# Substitute stub_LIB_FILE if your package creates a stub library too. +#AC_SUBST(samplestub_LIB_FILE) + +#-------------------------------------------------------------------- +# We put this here so that you can compile with -DVERSION="1.2" to +# encode the package version directly into the source files. +#-------------------------------------------------------------------- + +eval AC_DEFINE_UNQUOTED(VERSION, "${VERSION}") + +#-------------------------------------------------------------------- +# Call TEA_INIT as the first TEA_ macro to set up initial vars. +# This will define a ${TEA_PLATFORM} variable == "unix" or "windows". +#-------------------------------------------------------------------- + +TEA_INIT + +#-------------------------------------------------------------------- +# Load the tclConfig.sh file +#-------------------------------------------------------------------- + +TEA_PATH_TCLCONFIG +TEA_LOAD_TCLCONFIG + +#-------------------------------------------------------------------- +# Load the tkConfig.sh file if necessary (Tk extension) +#-------------------------------------------------------------------- + +#TEA_PATH_TKCONFIG +#TEA_LOAD_TKCONFIG + +#----------------------------------------------------------------------- +# Handle the --prefix=... option by defaulting to what Tcl gave. +# Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. +#----------------------------------------------------------------------- + +TEA_PREFIX + +#----------------------------------------------------------------------- +# Standard compiler checks. +# This sets up CC by using the CC env var, or looks for gcc otherwise. +# This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create +# the basic setup necessary to compile executables. +#----------------------------------------------------------------------- + +TEA_SETUP_COMPILER + +#-------------------------------------------------------------------- +# __CHANGE__ +# Choose which headers you need. Extension authors should try very +# hard to only rely on the Tcl public header files. Internal headers +# contain private data structures and are subject to change without +# notice. +# This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG +#-------------------------------------------------------------------- + +TEA_PUBLIC_TCL_HEADERS +#TEA_PRIVATE_TCL_HEADERS + +#TEA_PUBLIC_TK_HEADERS +#TEA_PRIVATE_TK_HEADERS + +#-------------------------------------------------------------------- +# __CHANGE__ +# A few miscellaneous platform-specific items: +# +# Define a special symbol for Windows (BUILD_sample in this case) so +# that we create the export library with the dll. See sha1.h on how +# to use this. +# +# Windows creates a few extra files that need to be cleaned up. +# You can add more files to clean if your extension creates any extra +# files. +# +# Define any extra compiler flags in the PACKAGE_CFLAGS variable. +# These will be appended to the current set of compiler flags for +# your system. +#-------------------------------------------------------------------- + +if test "${TEA_PLATFORM}" = "windows" ; then + AC_DEFINE(BUILD_sample) + CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch" + EXTRA_SOURCES='$(WIN_SOURCES)' +else + CLEANFILES="pkgIndex.tcl" + EXTRA_SOURCES='$(UNIX_SOURCES)' +fi +AC_SUBST(CLEANFILES) +AC_SUBST(EXTRA_SOURCES) + +#-------------------------------------------------------------------- +# Check whether --enable-threads or --disable-threads was given. +#-------------------------------------------------------------------- + +TEA_ENABLE_THREADS + +#-------------------------------------------------------------------- +# The statement below defines a collection of symbols related to +# building as a shared library instead of a static library. +#-------------------------------------------------------------------- + +TEA_ENABLE_SHARED + +#-------------------------------------------------------------------- +# This macro figures out what flags to use with the compiler/linker +# when building shared/static debug/optimized objects. This information +# can be taken from the tclConfig.sh file, but this figures it all out. +#-------------------------------------------------------------------- + +TEA_CONFIG_CFLAGS + +#-------------------------------------------------------------------- +# Set the default compiler switches based on the --enable-symbols option. +#-------------------------------------------------------------------- + +TEA_ENABLE_SYMBOLS + +#-------------------------------------------------------------------- +# Everyone should be linking against the Tcl stub library. If you +# can't for some reason, remove this definition. If you aren't using +# stubs, you also need to modify the SHLIB_LD_LIBS setting below to +# link against the non-stubbed Tcl library. Add Tk too if necessary. +#-------------------------------------------------------------------- + +AC_DEFINE(USE_TCL_STUBS) +#AC_DEFINE(USE_TK_STUBS) + +#-------------------------------------------------------------------- +# This macro generates a line to use when building a library. It +# depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, +# and TEA_LOAD_TCLCONFIG macros above. +#-------------------------------------------------------------------- + +TEA_MAKE_LIB + +#-------------------------------------------------------------------- +# __CHANGE__ +# Add platform libs to LIBS or SHLIB_LD_LIBS as necessary. +#-------------------------------------------------------------------- + +#LIBS="${LIBS} -lsuperfly" +LIBMYSQL="" +AC_ARG_WITH(mysql-include,[ --with-mysql-include=DIR Mysql includes are in DIR], + MYSQL_INC_DIR=$withval, MYSQL_INC_DIR="/usr/include/mysql") +AC_ARG_WITH(mysql-lib,[ --with-mysql-lib=DIR Mysql libraries are in DIR], + MYSQL_LIB_DIR=$withval, MYSQL_LIB_DIR="/usr/lib/mysql") +MYSQL_INCLUDES="-I$MYSQL_INC_DIR" + + +AC_ARG_ENABLE(mysqlstatic, [ --enable-mysqlstatic link static with libmysqlclient.a], [tcl_ok=$enableval], [tcl_ok=$1]) + +if test "$tcl_ok" = "yes"; then + LIBS="${LIBS} ${MYSQL_LIB_DIR}/libmysqlclient.a -lz -lcrypt -lnsl -lm" +else + if test ! -f $MSQL_LIB_DIR/libmysqlclient${SHLIB_SUFFIX} -a -f /usr/lib/libmysqlclient${SHLIB_SUFFIX}; then + MYSQL_LIB_DIR=/usr/lib + fi + MYSQL_LIBS="-L$MYSQL_LIB_DIR -lmysqlclient" + if test ! "$MYSQL_LIB_DIR" = ""; then + LIBMYSQL="libmysqclient${SHLIB_SUFFIX}" + fi +fi + + +AC_SUBST(LIBMYSQL) +AC_SUBST(MYSQL_INCLUDES) +AC_SUBST(MYSQL_LIBS) +AC_SUBST(MYSQL_LIB_DIR) +AC_MSG_CHECKING([for mysql header]) +if test ! -f ${MYSQL_INC_DIR}/mysql.h ; then + AC_MSG_ERROR(Cannot find mysql.h in $MYSQL_INC_DIR use -with-mysql-include=?) +fi +AC_MSG_RESULT([yes]) +AC_MSG_CHECKING([for libmysqlclient lib]) +if test "$tcl_ok" = "yes"; then + if test ! -f ${MYSQL_LIB_DIR}/libmysqlclient.a ; then + AC_MSG_ERROR(Cannot find libmysqlclient.a in $MYSQL_LIB_DIR use -with-mysql-lib=?) + fi +else + if test ! -f ${MYSQL_LIB_DIR}/libmysqlclient${SHLIB_SUFFIX} ; then + AC_MSG_ERROR(Cannot find libmysqlclient${SHLIB_SUFFIX} in $MYSQL_LIB_DIR use -with-mysql-lib=?) + fi +fi +AC_MSG_RESULT([yes]) + + +#-------------------------------------------------------------------- +# Find tclsh so that we can run pkg_mkIndex to generate the pkgIndex.tcl +# file during the install process. Don't run the TCLSH_PROG through +# ${CYGPATH} because it's being used directly by make. +# Require that we use a tclsh shell version 8.2 or later since earlier +# versions have bugs in the pkg_mkIndex routine. +# Add WISH as well if this is a Tk extension. +#-------------------------------------------------------------------- + +TEA_PROG_TCLSH +#TEA_PROG_WISH + +#-------------------------------------------------------------------- +# Finally, substitute all of the various values into the Makefile. +# You may alternatively have a special pkgIndex.tcl.in or other files +# which require substituting th AC variables in. Include these here. +#-------------------------------------------------------------------- + +AC_OUTPUT([Makefile]) diff --git a/doc/man.tcl b/doc/man.tcl new file mode 100644 index 0000000..0217e85 --- /dev/null +++ b/doc/man.tcl @@ -0,0 +1,20 @@ +# script for produce html and ngroff from tcl man page +# see doctools from tcllib + +package require doctools + +::doctools::new dl -file mysqltcl.man -format html +set file [open mysqltcl.html w] +set filein [open mysqltcl.man] +puts $file [dl format [read $filein]] +close $filein +close $file + +::doctools::new dl2 -file mysqltcl.man -format nroff +set file [open mysqltcl.n w] +set filein [open mysqltcl.man] +puts $file [dl2 format [read $filein]] +close $filein +close $file + + diff --git a/doc/mysqltcl.html b/doc/mysqltcl.html new file mode 100644 index 0000000..380e3fb --- /dev/null +++ b/doc/mysqltcl.html @@ -0,0 +1,850 @@ + + +mysqltcl - + + + + + +

mysqltcl(n) 3.0 ""

+

NAME

+

+

mysqltcl - MySQL server access commands for Tcl + + + + + + +

TABLE OF CONTENTS

+

    TABLE OF CONTENTS
+    SYNOPSIS
+    DESCRIPTION
+    MYSQLTCL COMMANDS
+    STATUS INFORMATION
+    Backward compatibility
+    BUGS & POSSIBLE MISFEATURES
+    AUTHORS
+

SYNOPSIS

+

+package require Tcl 8.4
+package require mysqltcl 3.0
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
::mysql::connect ?option value...?
::mysql::use handle database
::mysql::sel handle sql-statement ?-list|-flatlist?
::mysql::fetch handle
::mysql::exec handle sql-statement
::mysql::query handle sql-select-statement
::mysql::endquery query-handle
::mysql::map handle binding-list script
::mysql::receive handle sql-statment binding-list script
::mysql::seek handle row-index
::mysql::col handle table-name option
::mysql::col handle table-name optionkist
::mysql::col handle ?option...?
::mysql::info handle option
::mysql::baseinfo option
::mysql::ping handle
::mysql::changeuser user password ?database?
::mysql::result handle option
::mysql::state handle ?-numeric?
::mysql::close ?handle?
::mysql::insertid handle
::mysql::escape ?handle? string
::mysql::autocommit handle boolean
::mysql::commit handle
::mysql::rollback handle
::mysql::nextresult handle
::mysql::moreresult handle
::mysql::warningcount handle
::mysql::isnull value
::mysql::newnull
::mysql::setserveroption handle option
::mysql::shutdown handle
+

DESCRIPTION

+

+MySQLTcl is a collection of Tcl commands and a Tcl global array that +provide access to MySQL database servers. +

+MySQLTcl is nothing more than a patched version of a patched version +of Hakan Soderstrom's patch of Tom Poindexter's Sybtcl. +

+Mysqltcl is binary Tcl library (extension) written in C language that use direkt +official MySQL C-API. Almost all Tcl commands correspond to MySQL C-API functions. +For detail documentation see official MySQL C-API manual. + +

MYSQLTCL COMMANDS

+

+ +

+ +
::mysql::connect ?option value...?
+ + +Connect to a MySQL server. +A handle is returned which should be used in other mysqltcl +commands using this connection. +::mysql::connect raises a Tcl error if the connection fails. +::mysql::connect read first the options from my.cnf file group mysqltcl. +See MySQL documentation chapter "options files". +Possible connection options are: + +

+
+ +
-host hostname
+The host on which the server is located. The local host is used by default. + +

+
-user user
+The user whose name is used for the connection. +The current Unix user-name is used by default. + +

+
-password password
+The password that must be used for the connection. +If it is not present, the connection is possible only for users with +no password on the server. + +

+
-db db
+If this option is present, db is used as current database, with no need +for a call to mysql::use. + +

+
-port port
+The port number for the TCP/IP connection, if it's different from the default. + +

+
-socket socket
+The socket or named pipe for the connection. + +

+
-encoding encodingname
+The option works similar to -encoding option in fconfigure. It support also +special encoding name binary. By option -binary no converting will be done be reading or writing to/from MySQL. +If option is not set the system encoding (see utf-8) is used. +Please test all input and outputs with another program to check that all +is the way you expect it. If option binary is not used the system procedures +Tcl_ExternalToUtfDString (writing) and Tcl_ExternalToUtf (reading) will be used +by option binary the function Tcl_GetByteArrayFromObj and Tcl_NewByteArrayObj are used. +If you want to manipulate binary date use -encoding binary. By handling textes set your +special encoding that you want to use in your database. Consider what another system access the +database and what encoding they expect. It can useful +to use -encoding utf-8. That is standard encoding in some linux distributions and newer systems. + +

+
-ssl boolean
+Switch to SSL after handshake. Default is false + +

+
-compress boolean
+Use compression protocol. Default is false + +

+
-odbc boolean
+The client is an ODBC client. This changes mysqld to be more ODBC-friendly. Default is false + +

+
-noschema boolean
+Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs. This changes mysqld to be more ODBC-friendly. Default is false + +

+
-multistatement boolean
+Tell the server that the client may send multiple-row-queries (separated by `;'). +If this flag is not set, multiple-row-queries are disabled. Default is false. + +

+
-multiresult boolean
+Tell the server that the client can handle multiple-result sets from multi-queries or stored procedures. +This is automatically set if CLIENT_MULTI_STATEMENTS is set. + +

+
-localfiles boolean
+Enable LOAD DATA LOCAL handling. Default is false. + +

+
-foundrows boolean
+Return the number of found (matched) rows, not the number of affected rows. +Default is false. + +

+
-interactive boolean
+Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. +The client's session wait_timeout variable will be set to the value of the session interactive_timeout variable. +Default is false. + +
+ +
::mysql::use handle database
+ + +Associate a connected handle with a particular database. +handle must be a valid handle previously obtained from ::mysql::connect. +mysql::use raises a Tcl error if the handle is not valid or +if the database name specified could not be used. +

+Consider you can use mysqltcl without to specify the database, in this case +you must use explizit schema notation to specify the table in sql. +

 
+::mysql::sel $handle {select * from uni.student}
+

+with option connection -noschema you can prohibit such syntax. + +

+
::mysql::sel handle sql-statement ?-list|-flatlist?
+ + +Send sql-statement to the server. +

+If sql-statement is a SELECT statement and no -list or +-flatlist option is specified, the command returns the +number of rows returned as the result of the query. +The rows can be obtained by the ::mysql::fetch and/or the +::mysql::map commands. +The resulting rows are called the pending result. +

+If sql-statement is a SELECT statement and -list or -flatlist +is specified, the command returns the full list of rows returned as +the result of the query in one of two possible formats: + +

+
+ +
-list
+generates a list of lists, in which each element is a row of the result. + +

+
-flatlist
+generates the concatenation of all rows in a single list, which +is useful for scanning with a single foreach. + +
+ +Example: + +

 
+% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -list
+{1 Joe} {2 Phil} {3 John}
+% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -flatlist
+{1 Joe 2 Phil 3 John}
+

+ +Note that both list syntaxes are faster than something like\fB + +

 
+% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS"
+% ::mysql::map $db {id name} {lappend result $id $name}
+% set $result
+{1 Joe 2 Phil 3 John}
+

+ +If sql-statement is a valid MySQL statement, but not a SELECT +statement, the command returns -1 after executing the statement, or an empty +string if -list or -flatlist is specified. +There is no pending result in this case. +

+In any case ::mysql::sel implicitly cancels any previous result still +pending for the handle. + +

+
::mysql::fetch handle
+ + +Returns the next row from result set as Tcl list. +mysql::fetch raises a Tcl error if there is no pending result for handle. +mysql::fetch was former named mysqlnext. + +

+
::mysql::exec handle sql-statement
+ + +Send sql-statement, a MySQL non-SELECT statement, to the server. +The handle must be in use (through ::mysql::connect and ::mysql::use). +

+::mysql::exec implicitly cancels any previous result pending for the handle. +

+If sql-statement is a valid MySQL SELECT statement, the statement +is executed, but the result is discarded. +No Tcl error is generated. +This amounts to a (potentially costly) no-op. +Use the ::mysql::sel command for SELECT statements. +

+::mysql::exec return the number of affected rows (DELETE, UPDATE) +

+ +

+
::mysql::query handle sql-select-statement
+ + +Send sql-select-statement to the server. +

+mysql::query allow to send multiple nested queries on one handle (without need to build +new handle or caching results). +mysql::query return a query handle that can be used as handle in commands as (mysql::fetch, +::mysql::map, mysql::seek, mysql::col, mysql::result). +After result proceeding all query must be +freed with ::mysql::endquery query-hanlde command. +

+Example: +

 
+set query1 [::mysql::query \$db {SELECT ID, NAME FROM FRIENDS}\]
+while {[set row [::mysql::fetch \$query1]]!=""} {
+    set id [lindex \$row 0]
+    set query2 [::mysql::query \$db "SELECT ADDRESS FROM ADDRESS WHERE FRIENDID=$ID"]
+    ::mysql::map \$query2 address { puts "address = $address" }
+    ::mysql::endquery \$query2
+}
+::mysql::endquery $query1
+

+In most cases one should use sql-joins and avoid nested queries. +SQL-sever can optimize such queries. +But in some applications (GUI-Forms) where the results are used long time the inner +query is not known before. + +

+
::mysql::endquery query-handle
+ + +free result memory after ::mysql::query command. +You must invoke ::mysql::endquery after each mysqlquery to not cause memory leaks. See mysqlquery command. +

+Using ::mysql::endquery on db-handle will free also memory (pending result) after ::mysql::sel command. +

+ + +

+
::mysql::map handle binding-list script
+ + +Iterate a script over the rows of the pending result. +::mysql::map may consume all rows or only some of the rows of the pending +result. +Any remaining rows may be obtained by further ::mysql::fetch or ::mysql::map +commands. +

+handle must be a handle with a pending result from a previous +::mysql::sel command. +binding-list must be a list of one or more variable names. +script must be a Tcl script. +It may be empty, but usually it contains one or more commands. +

+::mysql::map processes one row at a time from the pending result. +For each row the column values are bound to the variables in the +binding list, then the script is executed. +Binding is strictly positional. +The first variable in the binding list is bound to the first column of +the row, and so on. +The variables are created in the current context (if they do not +already exist). +A variable name begining with a hyphen is not bound; it serves as a +placeholder in the binding list. +If there are more columns than variables the extra columns are +ignored. +

+The ::mysql::map command is similar to an ordinary foreach. +A foreach iterates over the elements of a list, ::mysql::map +iterates over the rows of a pending result. +In both cases iteration is affected by break and continue +Tcl commands. +The binding list variables retain their last values after the command +has completed. +

+A simple example follows. +Assume $db is a handle in use.\fB +

 
+::mysql::sel \$db {
+    select lname, fname, area, phone from friends order by lname, fname
+}
+::mysql::map \$db {ln fn - phone} {
+   if {\$phone == {}} continue
+   puts [format "%16s %-8s %s" \$ln \$fn \$phone]
+}
+

+The ::mysql::sel command gets and sorts all rows from table \fIfriends]. +The ::mysql::map command is used to format and print the result in a way +suitable for a phone list. +For demonstration purposes one of the columns (area) is not used. +The script begins by skipping over rows which have no phone number. +The second command in the script formats and prints values from the row. +

+::mysql::map raises a Tcl error if there is no pending result for +handle, or if binding-list contains more variables than +there are columns in the pending result. +

+ +

+
::mysql::receive handle sql-statment binding-list script
+ + +This command works the same way as the command mysqtclmap but +it do not need leading ::mysql::sel command. +The main difference is internal using of MySQL client library. +This command use mysql_use_result from C-API that do not +store result on client but try to receive the rows directly +from server. +There is also no client cache. +This command can be faster as using of ::mysql::sel and by +very big resultset will not overload client machine. +The scipt should process the result immadiatly because +it can block table (or tables) for another clients. +If performance matter please test all alternatives separatly. +You must consider two aspects: memory consumption and performance. + +

+
::mysql::seek handle row-index
+ + +Moves the current position among the rows in the pending result. +This may cause ::mysql::fetch and ::mysql::map to re-read rows, or to +skip over rows. +

+Row index 0 is the position just before the first row in the pending result; +row index 1 is the position just before the second row, and so +on. +You may specify a negative row index. +Row index -1 is the position just before the last row; +row index -2 is the position just before the second last row, +and so on. +An out-of-bounds row index will cause ::mysql::seek to set the new current +position either just before the first row (if the index is too negative), +or just after the last row (if the index exceeds the number of rows). +This is not an error condition. +

+::mysql::seek returns the number of rows that can be read sequentially from +the new current position. +::mysql::seek raises a Tcl error if there is no pending result for handle. +

+Portability note: The functionality of ::mysql::seek is frequently +absent in other Tcl extensions for SQL. +That is because MySQL C-API client library ofers own result set caching functionality +that lacks another SQL-APIs. +That increase the performance because all rows are received at once and the query does +not block the server for another clienst , on the other +hand you works on the cached data can use a lot of memory and are up to date only in the moment +of query but not fetch. +

+ +

+
::mysql::col handle table-name option
+ +
::mysql::col handle table-name optionkist
+ +
::mysql::col handle ?option...?
+ + +Return information about the columns of a table. +handle must be in use. +table-name must be the name of a table; it may be a table name +or -current if there is a pending result. +One or more options control what information to return. +Each option must be one of the following keywords. +

+
+ +
name
Return the name of a column. + +

+
type
+Return the type of a column; one of the strings decimal, +tiny, short, long, float, double, +null, timestamp, long long, int24, date, +time, date time, year, new date, enum, +set, tiny blob, medium blob, long blob, +blob, var string, or string. +Note that a column of type char will return tiny, while they are +represented equally. + +

+
length
Return the length of a column in bytes. + +

+
table
Return the name of the table in which this column occurs. + +

+
non_null
Return the string "1" if the column is non-null; otherwise "0". + +

+
prim_key
Return the string "1" if the column is part of the primary key; +otherwise "0". + +

+
numeric
Return the string "1" if the column is numeric; otherwise "0". + +

+
decimals
Return the string "1" if the column is non-null; otherwise "0". +
+ +The three forms of this command generate their result in a +particular way. +

+
    +
  1. +If a single option is present the result is a simple list of +values; one for each column. +

    +
  2. +If the options are given in the form of an option list the +result is a list of lists. +Each sublist corresponds to a column and contains the information +specified by the options. +

    +
  3. +If several options are given, but not in a list, the result is also +a list of lists. +In this case each sublist corresponds to an option and contains one +value for each column. +
+ +The following is a sample interactive session containing all forms of +the ::mysql::col command and their results. +The last command uses the -current option. +It could alternatively specify the table name explicitly.\fB +

 
+%::mysql::col $db friends name
+name lname area phone
+% ::mysql::col $db friends {name type length}
+{fname char 12} {lname char 20} {area char 5} {phone char 12}
+% ::mysql::sel $db {select * from friends}
+% ::mysql::col $db -current name type length
+{fname lname area phone} {char char char char} {12 20 5 12}]
+

+ +

+
::mysql::info handle option
+ + +Return various database information depending on the option. +The option must be one of the following keywords. + +

+
+
info
+Return a String with information about last operation. +"Records: 3 Duplicates: 0 Warnings: 0" by INSERT or +"Rows matched: 40 Changed: 40 Warnings: 0" by UPDATE statements +(read the manual for mysql_info in MySQL C API documentation) + +

+
databases
+Return a list of all database names known to the server. +The handle must be connected. + +

+
dbname
+Return the name of the database with which the handle is associated. +The handle must be in use. + +

+
dbname?
+Return the name of the database with which the handle is associated; +an empty string if the handle is connected, but not in use. + +

+
host
+Return the name of the host to which the handle is connected. +The handle must be connected. + +

+
host
+Return the name of the host to which the handle is connected; an empty +string if the handle is not valid. + +

+
tables
+Return a list of all table names in the database with which the handle +is associated. +The handle must be in use. +
+ +
::mysql::baseinfo option
+ + +return information information that do not need handle. +

+
+ +
connectparameters
+return all supported connecting options + +

+
clientversion
+return the version of underlying MYSQL C-API library +
+ +
::mysql::ping handle
+ + +Checks whether the connection to the server is working. If it has gone down, an automatic reconnection is attempted. +

+This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and reconnect if necessary. +

+Return True if server is alive + +

+
::mysql::changeuser user password ?database?
+ + +Changes the user and causes the database specified by database to become the default (current) database on the connection specified by MySQL. In subsequent queries, this database is the default for table references that do not include an explicit database specifier. +

+::mysql::changeuser fails unless the connected user can be authenticated or if he doesn't have permission to use the database. In this case the user and database are not changed +

+if database parameter may be set were is no default database. +

+Cause Error if operation is not succesed + +

+
::mysql::result handle option
+ + +Return information about the pending result. +Note that a result is pending until canceled by a ::mysql::exec command, +even if no rows remain to be read. +Option must be one of the following keywords. + +

+
+ +
cols
+Return the number of columns in the pending result. +There must be a pending result. + +

+
cols
+Return the number of columns in the pending result; an empty string if +no result is pending. + +

+
current
+Return the current position in the pending result; a non-negative integer. +This value can be used as row-index in the ::mysql::seek command. +An error is raised if there is no pending result. + +

+
current?
+As above, but returns an empty string if there is no pending result. + +

+
rows
+Return the number of rows that can be read sequentially from the +current position in the pending result. +There must be a pending result. + +

+
rows
+Return the number of rows that can be read sequentially from the +current position in the pending result; an empty string if no result +is pending. +

+[::mysql::result \$db current] + [::mysql::result \$db rows] +always equals the total number of rows in the pending result. +
+ +
::mysql::state handle ?-numeric?
+ + +Return the state of a handle as a string or in numeric form. +There is no requirement on handle; it may be any string. +The return value is one of the following strings, or the corresponding +numeric value if -numeric is specified. +The states form a progression where each state builds on the previous. +

+
+ +
NOT_A_HANDLE (0)
+The string supplied for handle is not a mysqltcl handle at all. + +

+
UNCONNECTED (1)
+The string supplied for handle is one of the possible mysqltcl +handles, but it is not valid to any server. + +

+
CONNECTED (2)
+The handle is connected to a server, but not associated with a database. + +

+
IN_USE (3)
+The handle is connected and associated with a database, but there is +no pending result. + +

+
RESULT_PENDING (4)
+The handle is connected, associated with a database, and there is a +pending result. +
+ +
::mysql::close ?handle?
+ + +Closes the server connection associated with handle, causing it +to go back to the unconnected state. +Closes all connections if handle is omitted. +Returns an empty string. +::mysql::close raises a Tcl error if a handle is specified which is not +valid. + +

+
::mysql::insertid handle
+ + +Returns the auto increment id of the last INSERT statement. + +

+
::mysql::escape ?handle? string
+ + +Returns the content of string, with all special characters escaped, +so that it is suitable for use in an SQL statement. This is simpler (faster) +than using a general regexp or string map. +If handle is specified C-API function mysql_real_escape_string is used. +This is the recommended usage because in this case current character set is respected. + +

+
::mysql::autocommit handle boolean
+ +Sets autocommit mode on if mode is 1, off if mode is 0. + +

+
::mysql::commit handle
+ +Commits the current transaction. + +

+
::mysql::rollback handle
+ +Rollback the current transaction. + +

+
::mysql::nextresult handle
+ +If more query results exist, mysql::nextresult() reads the next query results and returns the status back to application. +returns -1 if no result or number of rows in the result set. + +

+
::mysql::moreresult handle
+ +Returns true if more results exist from the currently executed query, and the application must call mysql::result to fetch the results. + +

+
::mysql::warningcount handle
+ +Returns the number of warnings generated during execution of the previous SQL statement. + + +

+
::mysql::isnull value
+ +Null handling is known problem by Tcl to DB interfaces. +Mysql varchar type known 2 valid values NULL and empty string. +There is no way to difference it in core Tcl because of it strong string based +philosophy. +Mysql has new internal Tcl type for null that string representation is stored +in global array mysqltcl(nullvalue) and as default empty string. +mysql::isnull can be used for safe check for null value. +Warning mysql::isnull works only reliable if there are no type conversation on +returned rows. +Consider row is always Tcl list even when there are only on column in the row. +

 
+set row [::mysql::next \$handle]
+if {[mysql::isnull [lindex \$row 1]]} {
+   puts "2. column of $row is null"
+}
+if {[mysql::isnull \$row]} {
+   puts "this does not work, because of type conversation list to string"
+}
+

+ +

+
::mysql::newnull
+ +create new null object. It can be used to simulate returned row contents. + +

+
::mysql::setserveroption handle option
+ +there are only 2 options now: -multi_statment_on and -multi_statment_off + +

+
::mysql::shutdown handle
+ +Asks the database server to shut down. The connected user must have SHUTDOWN privileges. + +
+ +

STATUS INFORMATION

+

+Mysqltcl creates and maintains a Tcl global array to provide status +information. +Its name is mysqlstatus. +.P +Mysqlstatus elements: +

+
code
+ +A numeric conflict code set after every mysqltcl command. +Zero means no conflict; non-zero means some kind of conflict. +All conflicts also generate a Tcl error. +

+All MySQL server conflicts set mysqlstatus(code) to the numeric +code of the MySQL error. +

+Any other conflict sets mysqlstatus(code) to -1. + +

+
command
+The last failing mysqltcl command. +Not updated for successful commands. + +

+
message
+Message string for the last conflict detected. +The same string is returned as the result of the failing mysqltcl +command. +Not updated for successful commands. + +

+
nullvalue
+The string to use in query results to represent the SQL null value. +The empty string is used initially. +You may set it to another value. +
+ +

Backward compatibility

+

+Up from version 3.0 all mysql commands are declared in ::mysql namespace. +All names for example mysqlconnect are also aviable but deprecated. +All old commands have the name pattern mysql{name} and the most of them are now mysql::{name}. +The exception is mysqlnext, which was renamed to mysql::fetch. + +

BUGS & POSSIBLE MISFEATURES

+

+ +Deleting any of the mysqltcl commands closes all connections. + +

AUTHORS

+

+ +

    +
  • +Tobias Ritzau +

    +
  • +Paolo Brutti +

    +
  • +Artur Trzewik (mail@xdobry.de) - active maintainer +
+ +MySQLTcl is derived from a patch of msql by Hakan Soderstrom, Soderstrom Programvaruverkstad, +S-12242 Enskede, Sweden. +msql is derived from Sybtcl by Tom Poindexter. +There are many contributors and bug reporter that are not mentioned. +If you have contributed to mysqltcl and wants to be on the list contact Artur Trzewik. + + diff --git a/doc/mysqltcl.man b/doc/mysqltcl.man new file mode 100644 index 0000000..bca7c6e --- /dev/null +++ b/doc/mysqltcl.man @@ -0,0 +1,709 @@ +[comment {-*- tcl -*- mysqltcl manpage}] +[manpage_begin mysqltcl n 3.0] +[comment { +Copyright (c) 1994, 1995 Hakan Soderstrom and Tom Poindexter +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice and this permission notice +appear in all copies of the software and related documentation. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD +AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL +DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY +OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +$Id: mysqltcl.n,v 1.1.1.1 2002/02/15 18:21:17 artur Exp $ + +Updates by Tobias Ritzau 1998-03-18 +Replaced all mysql by mysql +Updated the mysqlconnect documentation + +1998-07-06 +Changed some mysql back to msql +Updaated the name and introduction +Updated the mysqlcol documentation + +Copyright (c) 1998 Tobias Ritzau + +Updates by Artur Trzewik 2002-11-31 +for mysqltcl2.1 (mysql::query mysq::endquery) + +Updates by Artur Trzewik 2002-11-31 +for mysqltcl3.0 +}] + +[titledesc {MySQL server access commands for Tcl}] + +[require Tcl 8.4] +[require mysqltcl 3.0] +[description] +MySQLTcl is a collection of Tcl commands and a Tcl global array that +provide access to MySQL database servers. +[para] +MySQLTcl is nothing more than a patched version of a patched version +of Hakan Soderstrom's patch of Tom Poindexter's Sybtcl. +[para] +Mysqltcl is binary Tcl library (extension) written in C language that use direkt +official MySQL C-API. Almost all Tcl commands correspond to MySQL C-API functions. +For detail documentation see official MySQL C-API manual. + +[section {MYSQLTCL COMMANDS}] + +[list_begin definitions] + +[call [cmd ::mysql::connect] [opt [arg "option value"]...]] + +Connect to a MySQL server. +A handle is returned which should be used in other mysqltcl +commands using this connection. +::mysql::connect raises a Tcl error if the connection fails. +::mysql::connect read first the options from my.cnf file group mysqltcl. +See MySQL documentation chapter "options files". +Possible connection options are: + +[list_begin opt] + +[opt_def -host [arg hostname]] +The host on which the server is located. The local host is used by default. + +[opt_def -user [arg user]] +The user whose name is used for the connection. +The current Unix user-name is used by default. + +[opt_def -password [arg password]] +The password that must be used for the connection. +If it is not present, the connection is possible only for users with +no password on the server. + +[opt_def -db [arg db]] +If this option is present, [arg db] is used as current database, with no need +for a call to [emph mysql::use]. + +[opt_def -port [arg port]] +The port number for the TCP/IP connection, if it's different from the default. + +[opt_def -socket [arg socket]] +The socket or named pipe for the connection. + +[opt_def -encoding [arg encodingname]] +The option works similar to -encoding option in fconfigure. It support also +special encoding name binary. By option -binary no converting will be done be reading or writing to/from MySQL. +If option is not set the system encoding (see [encoding system]) is used. +Please test all input and outputs with another program to check that all +is the way you expect it. If option binary is not used the system procedures +Tcl_ExternalToUtfDString (writing) and Tcl_ExternalToUtf (reading) will be used +by option binary the function Tcl_GetByteArrayFromObj and Tcl_NewByteArrayObj are used. +If you want to manipulate binary date use -encoding binary. By handling textes set your +special encoding that you want to use in your database. Consider what another system access the +database and what encoding they expect. It can useful +to use -encoding utf-8. That is standard encoding in some linux distributions and newer systems. + +[opt_def -ssl [arg boolean]] +Switch to SSL after handshake. Default is false + +[opt_def -compress [arg boolean]] +Use compression protocol. Default is false + +[opt_def -odbc [arg boolean]] +The client is an ODBC client. This changes mysqld to be more ODBC-friendly. Default is false + +[opt_def -noschema [arg boolean]] +Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs. This changes mysqld to be more ODBC-friendly. Default is false + +[opt_def -multistatement [arg boolean]] +Tell the server that the client may send multiple-row-queries (separated by `;'). +If this flag is not set, multiple-row-queries are disabled. Default is false. + +[opt_def -multiresult [arg boolean]] +Tell the server that the client can handle multiple-result sets from multi-queries or stored procedures. +This is automatically set if CLIENT_MULTI_STATEMENTS is set. + +[opt_def -localfiles [arg boolean]] +Enable LOAD DATA LOCAL handling. Default is false. + +[opt_def -foundrows [arg boolean]] +Return the number of found (matched) rows, not the number of affected rows. +Default is false. + +[opt_def -interactive [arg boolean]] +Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. +The client's session wait_timeout variable will be set to the value of the session interactive_timeout variable. +Default is false. + +[list_end] + +[call [cmd ::mysql::use] [arg handle] [arg database]] + +Associate a connected handle with a particular database. +[arg handle] must be a valid handle previously obtained from ::mysql::connect. +mysql::use raises a Tcl error if the handle is not valid or +if the database name specified could not be used. +[nl] +Consider you can use mysqltcl without to specify the database, in this case +you must use explizit schema notation to specify the table in sql. +[example_begin] +::mysql::sel $handle {select * from uni.student} +[example_end] +with option connection [arg -noschema] you can prohibit such syntax. + +[call [cmd ::mysql::sel] [arg handle] [arg sql-statement] [opt [arg -list|-flatlist]]] + +Send [arg sql-statement] to the server. +[nl] +If [arg sql-statement] is a SELECT statement and no [arg -list] or +[arg -flatlist] option is specified, the command returns the +number of rows returned as the result of the query. +The rows can be obtained by the [arg ::mysql::fetch] and/or the +[arg ::mysql::map] commands. +The resulting rows are called the [term "pending result"]. +[nl] +If [arg sql-statement] is a SELECT statement and [arg -list] or [arg -flatlist] +is specified, the command returns the full list of rows returned as +the result of the query in one of two possible formats: + +[list_begin opt] + +[opt_def -list] +generates a list of lists, in which each element is a row of the result. + +[opt_def -flatlist] +generates the concatenation of all rows in a single list, which +is useful for scanning with a single [emph foreach]. + +[list_end] + +Example: + +[example_begin] +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -list +{1 Joe} {2 Phil} {3 John} +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -flatlist +{1 Joe 2 Phil 3 John} +[example_end] + +Note that both list syntaxes are faster than something like\fB + +[example_begin] +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" +% ::mysql::map $db {id name} {lappend result $id $name} +% set $result +{1 Joe 2 Phil 3 John} +[example_end] + +If [arg sql-statement] is a valid MySQL statement, but not a SELECT +statement, the command returns -1 after executing the statement, or an empty +string if [arg -list] or [arg -flatlist] is specified. +There is no pending result in this case. +[nl] +In any case ::mysql::sel implicitly cancels any previous result still +pending for the handle. + +[call [cmd ::mysql::fetch] [arg handle]] + +Returns the next row from result set as Tcl list. +mysql::fetch raises a Tcl error if there is no pending result for [arg handle]. +mysql::fetch was former named mysqlnext. + +[call [cmd ::mysql::exec] [arg handle] [arg sql-statement]] + +Send [arg sql-statement], a MySQL non-SELECT statement, to the server. +The [arg handle] must be in use (through ::mysql::connect and ::mysql::use). +[nl] +::mysql::exec implicitly cancels any previous result pending for the handle. +[nl] +If [arg sql-statement] is a valid MySQL SELECT statement, the statement +is executed, but the result is discarded. +No Tcl error is generated. +This amounts to a (potentially costly) no-op. +Use the ::mysql::sel command for SELECT statements. +[nl] +::mysql::exec return the number of affected rows (DELETE, UPDATE) +[nl] + +[call [cmd ::mysql::query] [arg handle] [arg sql-select-statement]] + +Send [arg sql-select-statement] to the server. +[nl] +[arg mysql::query] allow to send multiple nested queries on one handle (without need to build +new handle or caching results). +mysql::query return a query handle that can be used as handle in commands as (mysql::fetch, +::mysql::map, mysql::seek, mysql::col, mysql::result). +After result proceeding all query must be +freed with [emph "::mysql::endquery query-hanlde"] command. +[nl] +Example: +[example_begin] +set query1 [lb]::mysql::query \$db {SELECT ID, NAME FROM FRIENDS}\[rb] +while {[lb]set row [lb]::mysql::fetch \$query1[rb][rb]!=""} { + set id [lb]lindex \$row 0[rb] + set query2 [lb]::mysql::query \$db "SELECT ADDRESS FROM ADDRESS WHERE FRIENDID=$ID"[rb] + ::mysql::map \$query2 address { puts "address = $address" } + ::mysql::endquery \$query2 +} +::mysql::endquery $query1 +[example_end] +In most cases one should use sql-joins and avoid nested queries. +SQL-sever can optimize such queries. +But in some applications (GUI-Forms) where the results are used long time the inner +query is not known before. + +[call [cmd ::mysql::endquery] [arg query-handle]] + +free result memory after [arg ::mysql::query] command. +You must invoke ::mysql::endquery after each mysqlquery to not cause memory leaks. See mysqlquery command. +[nl] +Using [arg ::mysql::endquery] on db-handle will free also memory (pending result) after [arg ::mysql::sel] command. +[nl] + + +[call [cmd ::mysql::map] [arg handle] [arg binding-list] [arg script]] + +Iterate a script over the rows of the pending result. +::mysql::map may consume all rows or only some of the rows of the pending +result. +Any remaining rows may be obtained by further ::mysql::fetch or ::mysql::map +commands. +[nl] +[arg handle] must be a handle with a pending result from a previous +::mysql::sel command. +[arg binding-list] must be a list of one or more variable names. +[arg script] must be a Tcl script. +It may be empty, but usually it contains one or more commands. +[nl] +::mysql::map processes one row at a time from the pending result. +For each row the column values are bound to the variables in the +binding list, then the script is executed. +Binding is strictly positional. +The first variable in the binding list is bound to the first column of +the row, and so on. +The variables are created in the current context (if they do not +already exist). +A variable name begining with a hyphen is not bound; it serves as a +placeholder in the binding list. +If there are more columns than variables the extra columns are +ignored. +[nl] +The ::mysql::map command is similar to an ordinary [emph foreach]. +A [emph foreach] iterates over the elements of a list, ::mysql::map +iterates over the rows of a pending result. +In both cases iteration is affected by [emph break] and [emph continue] +Tcl commands. +The binding list variables retain their last values after the command +has completed. +[nl] +A simple example follows. +Assume $db is a handle in use.\fB +[example_begin] +::mysql::sel \$db { + select lname, fname, area, phone from friends order by lname, fname +} +::mysql::map \$db {ln fn - phone} { + if {\$phone == {}} continue + puts [lb]format "%16s %-8s %s" \$ln \$fn \$phone[rb] +} +[example_end] +The ::mysql::sel command gets and sorts all rows from table \fIfriends]. +The ::mysql::map command is used to format and print the result in a way +suitable for a phone list. +For demonstration purposes one of the columns (area) is not used. +The script begins by skipping over rows which have no phone number. +The second command in the script formats and prints values from the row. +[nl] +::mysql::map raises a Tcl error if there is no pending result for +[arg handle], or if [arg binding-list] contains more variables than +there are columns in the pending result. +[nl] + +[call [cmd ::mysql::receive] [arg handle] [arg sql-statment] [arg binding-list] [arg script]] + +This command works the same way as the command mysqtclmap but +it do not need leading ::mysql::sel command. +The main difference is internal using of MySQL client library. +This command use mysql_use_result from C-API that do not +store result on client but try to receive the rows directly +from server. +There is also no client cache. +This command can be faster as using of ::mysql::sel and by +very big resultset will not overload client machine. +The scipt should process the result immadiatly because +it can block table (or tables) for another clients. +If performance matter please test all alternatives separatly. +You must consider two aspects: memory consumption and performance. + +[call [cmd ::mysql::seek] [arg handle] [arg row-index]] + +Moves the current position among the rows in the pending result. +This may cause [term ::mysql::fetch] and [term ::mysql::map] to re-read rows, or to +skip over rows. +[nl] +Row index 0 is the position just before the first row in the pending result; +row index 1 is the position just before the second row, and so +on. +You may specify a negative row index. +Row index -1 is the position just before the last row; +row index -2 is the position just before the second last row, +and so on. +An out-of-bounds row index will cause ::mysql::seek to set the new current +position either just before the first row (if the index is too negative), +or just after the last row (if the index exceeds the number of rows). +This is not an error condition. +[nl] +::mysql::seek returns the number of rows that can be read sequentially from +the new current position. +::mysql::seek raises a Tcl error if there is no pending result for [arg handle]. +[nl] +Portability note: The functionality of [arg ::mysql::seek] is frequently +absent in other Tcl extensions for SQL. +That is because MySQL C-API client library ofers own result set caching functionality +that lacks another SQL-APIs. +That increase the performance because all rows are received at once and the query does +not block the server for another clienst , on the other +hand you works on the cached data can use a lot of memory and are up to date only in the moment +of query but not fetch. +[nl] + +[call [cmd ::mysql::col] [arg handle] [arg table-name] [arg option]] +[call [cmd ::mysql::col] [arg handle] [arg table-name] [arg optionkist]] +[call [cmd ::mysql::col] [arg handle] [opt [arg option]...]] + +Return information about the columns of a table. +[arg handle] must be in use. +[arg table-name] must be the name of a table; it may be a table name +or [arg -current] if there is a pending result. +One or more options control what information to return. +Each option must be one of the following keywords. +[list_begin opt] + +[opt_def name] Return the name of a column. + +[opt_def type] +Return the type of a column; one of the strings [emph decimal], +[emph tiny], [emph short], [emph long], [emph float], [emph double], +[emph null], [emph timestamp], [emph "long long"], [emph int24], [emph date], +[emph time], [emph "date time"], [emph year], [emph "new date"], [emph enum], +[emph set], [emph "tiny blob"], [emph "medium blob"], [emph "long blob"], +[emph blob], [emph "var string"], or [emph string]. +Note that a column of type [emph char] will return tiny, while they are +represented equally. + +[opt_def length] Return the length of a column in bytes. + +[opt_def table] Return the name of the table in which this column occurs. + +[opt_def non_null] Return the string "1" if the column is non-null; otherwise "0". + +[opt_def prim_key] Return the string "1" if the column is part of the primary key; +otherwise "0". + +[opt_def numeric] Return the string "1" if the column is numeric; otherwise "0". + +[opt_def decimals] Return the string "1" if the column is non-null; otherwise "0". +[list_end] + +The three forms of this command generate their result in a +particular way. +[list_begin enum] +[enum] +If a single option is present the result is a simple list of +values; one for each column. +[enum] +If the options are given in the form of an option list the +result is a list of lists. +Each sublist corresponds to a column and contains the information +specified by the options. +[enum] +If several options are given, but not in a list, the result is also +a list of lists. +In this case each sublist corresponds to an option and contains one +value for each column. +[list_end] + +The following is a sample interactive session containing all forms of +the ::mysql::col command and their results. +The last command uses the [emph -current] option. +It could alternatively specify the table name explicitly.\fB +[example_begin] +%::mysql::col $db friends name +name lname area phone +% ::mysql::col $db friends {name type length} +{fname char 12} {lname char 20} {area char 5} {phone char 12} +% ::mysql::sel $db {select * from friends} +% ::mysql::col $db -current name type length +{fname lname area phone} {char char char char} {12 20 5 12}] +[example_end] + +[call [cmd ::mysql::info] [arg handle] [arg option]] + +Return various database information depending on the [arg option]. +The option must be one of the following keywords. + +[list_begin opt] +[opt_def info] +Return a String with information about last operation. +"Records: 3 Duplicates: 0 Warnings: 0" by INSERT or +"Rows matched: 40 Changed: 40 Warnings: 0" by UPDATE statements +(read the manual for mysql_info in MySQL C API documentation) + +[opt_def databases] +Return a list of all database names known to the server. +The handle must be connected. + +[opt_def dbname] +Return the name of the database with which the handle is associated. +The handle must be in use. + +[opt_def dbname?] +Return the name of the database with which the handle is associated; +an empty string if the handle is connected, but not in use. + +[opt_def host] +Return the name of the host to which the handle is connected. +The handle must be connected. + +[opt_def host] +Return the name of the host to which the handle is connected; an empty +string if the handle is not valid. + +[opt_def tables] +Return a list of all table names in the database with which the handle +is associated. +The handle must be in use. +[list_end] + +[call [cmd ::mysql::baseinfo] [arg option]] + +return information information that do not need handle. +[list_begin opt] + +[opt_def connectparameters] +return all supported connecting options + +[opt_def clientversion] +return the version of underlying MYSQL C-API library +[list_end] + +[call [cmd ::mysql::ping] [arg handle]] + +Checks whether the connection to the server is working. If it has gone down, an automatic reconnection is attempted. +[nl] +This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and reconnect if necessary. +[nl] +Return True if server is alive + +[call [cmd ::mysql::changeuser] [arg user] [arg password] [opt [arg database]]] + +Changes the user and causes the database specified by database to become the default (current) database on the connection specified by MySQL. In subsequent queries, this database is the default for table references that do not include an explicit database specifier. +[nl] +::mysql::changeuser fails unless the connected user can be authenticated or if he doesn't have permission to use the database. In this case the user and database are not changed +[nl] +if database parameter may be set were is no default database. +[nl] +Cause Error if operation is not succesed + +[call [cmd ::mysql::result] [arg handle] [arg option]] + +Return information about the pending result. +Note that a result is pending until canceled by a ::mysql::exec command, +even if no rows remain to be read. +[arg Option] must be one of the following keywords. + +[list_begin opt] + +[opt_def cols] +Return the number of columns in the pending result. +There must be a pending result. + +[opt_def cols] +Return the number of columns in the pending result; an empty string if +no result is pending. + +[opt_def current] +Return the current position in the pending result; a non-negative integer. +This value can be used as [arg row-index] in the ::mysql::seek command. +An error is raised if there is no pending result. + +[opt_def current?] +As above, but returns an empty string if there is no pending result. + +[opt_def rows] +Return the number of rows that can be read sequentially from the +current position in the pending result. +There must be a pending result. + +[opt_def rows] +Return the number of rows that can be read sequentially from the +current position in the pending result; an empty string if no result +is pending. +[nl] +[lb]::mysql::result \$db current[rb] + [lb]::mysql::result \$db rows[rb] +always equals the total number of rows in the pending result. +[list_end] + +[call [cmd ::mysql::state] [arg handle] [opt [arg -numeric]]] + +Return the state of a handle as a string or in numeric form. +There is no requirement on [arg handle]; it may be any string. +The return value is one of the following strings, or the corresponding +numeric value if [arg -numeric] is specified. +The states form a progression where each state builds on the previous. +[list_begin opt] + +[opt_def "NOT_A_HANDLE (0)"] +The string supplied for [arg handle] is not a mysqltcl handle at all. + +[opt_def "UNCONNECTED (1)"] +The string supplied for [arg handle] is one of the possible mysqltcl +handles, but it is not valid to any server. + +[opt_def "CONNECTED (2)"] +The handle is connected to a server, but not associated with a database. + +[opt_def "IN_USE (3)"] +The handle is connected and associated with a database, but there is +no pending result. + +[opt_def "RESULT_PENDING (4)"] +The handle is connected, associated with a database, and there is a +pending result. +[list_end] + +[call [cmd ::mysql::close] [opt [arg handle]]] + +Closes the server connection associated with [arg handle], causing it +to go back to the unconnected state. +Closes all connections if [arg handle] is omitted. +Returns an empty string. +::mysql::close raises a Tcl error if a handle is specified which is not +valid. + +[call [cmd ::mysql::insertid] [arg handle]] + +Returns the auto increment id of the last INSERT statement. + +[call [cmd ::mysql::escape] [opt [arg handle]] [arg string]] + +Returns the content of [arg string], with all special characters escaped, +so that it is suitable for use in an SQL statement. This is simpler (faster) +than using a general [emph regexp] or string map. +If handle is specified C-API function mysql_real_escape_string is used. +This is the recommended usage because in this case current character set is respected. + +[call [cmd ::mysql::autocommit] [arg handle] [arg boolean]] +Sets autocommit mode on if mode is 1, off if mode is 0. + +[call [cmd ::mysql::commit] [arg handle]] +Commits the current transaction. + +[call [cmd ::mysql::rollback] [arg handle]] +Rollback the current transaction. + +[call [cmd ::mysql::nextresult] [arg handle]] +If more query results exist, mysql::nextresult() reads the next query results and returns the status back to application. +returns -1 if no result or number of rows in the result set. + +[call [cmd ::mysql::moreresult] [arg handle]] +Returns true if more results exist from the currently executed query, and the application must call mysql::result to fetch the results. + +[call [cmd ::mysql::warningcount] [arg handle]] +Returns the number of warnings generated during execution of the previous SQL statement. + + +[call [cmd ::mysql::isnull] [arg value]] +Null handling is known problem by Tcl to DB interfaces. +Mysql varchar type known 2 valid values NULL and empty string. +There is no way to difference it in core Tcl because of it strong string based +philosophy. +Mysql has new internal Tcl type for null that string representation is stored +in global array mysqltcl(nullvalue) and as default empty string. +mysql::isnull can be used for safe check for null value. +Warning mysql::isnull works only reliable if there are no type conversation on +returned rows. +Consider row is always Tcl list even when there are only one column in the row. +[example_begin] +set row [lb]::mysql::next \$handle[rb] +if {[lb]mysql::isnull [lb]lindex \$row 1[rb]]} { + puts "2. column of $row is null" +} +if {[lb]mysql::isnull \$row[rb]} { + puts "this does not work, because of type conversation list to string" +} +[example_end] + +[call [cmd ::mysql::newnull]] +create new null object. It can be used to simulate returned row contents. + +[call [cmd ::mysql::setserveroption] [arg handle] [arg option]] +there are only 2 options now: -multi_statment_on and -multi_statment_off + +[call [cmd ::mysql::shutdown] [arg handle]] +Asks the database server to shut down. The connected user must have SHUTDOWN privileges. + +[list_end] + +[section "STATUS INFORMATION"] +Mysqltcl creates and maintains a Tcl global array to provide status +information. +Its name is [emph mysqlstatus]. +.P +Mysqlstatus elements: +[list_begin definitions] +[lst_item code] + +A numeric conflict code set after every mysqltcl command. +Zero means no conflict; non-zero means some kind of conflict. +All conflicts also generate a Tcl error. +[nl] +All MySQL server conflicts set mysqlstatus(code) to the numeric +code of the MySQL error. +[nl] +Any other conflict sets mysqlstatus(code) to -1. + +[lst_item command] +The last failing mysqltcl command. +Not updated for successful commands. + +[lst_item message] +Message string for the last conflict detected. +The same string is returned as the result of the failing mysqltcl +command. +Not updated for successful commands. + +[lst_item nullvalue] +The string to use in query results to represent the SQL null value. +The empty string is used initially. +You may set it to another value. +[list_end] + +[section "Backward compatibility"] +Up from version 3.0 all mysql commands are declared in ::mysql namespace. +All names for example mysqlconnect are also aviable but deprecated. +All old commands have the name pattern mysql{name} and the most of them are now mysql::{name}. +The exception is mysqlnext, which was renamed to mysql::fetch. + +[section "BUGS & POSSIBLE MISFEATURES"] + +Deleting any of the mysqltcl commands closes all connections. + +[section AUTHORS] + +[list_begin bullet] +[bullet] +Tobias Ritzau +[bullet] +Paolo Brutti +[bullet] +Artur Trzewik (mail@xdobry.de) - active maintainer +[list_end] + +MySQLTcl is derived from a patch of msql by Hakan Soderstrom, Soderstrom Programvaruverkstad, +S-12242 Enskede, Sweden. +msql is derived from Sybtcl by Tom Poindexter. +There are many contributors and bug reporter that are not mentioned. +If you have contributed to mysqltcl and wants to be on the list contact Artur Trzewik. +[manpage_end] diff --git a/doc/mysqltcl.n b/doc/mysqltcl.n new file mode 100644 index 0000000..b4d8b9e --- /dev/null +++ b/doc/mysqltcl.n @@ -0,0 +1,732 @@ +'\" +'\" Generated from file 'mysqltcl.man' by tcllib/doctools with format 'nroff' +'\" +'\" -*- tcl -*- mysqltcl manpage +.so man.macros +.TH "mysqltcl" n 3.0 "" +.BS +.SH "NAME" +mysqltcl \- MySQL server access commands for Tcl +'\" +'\" Copyright (c) 1994, 1995 Hakan Soderstrom and Tom Poindexter +'\" Permission to use, copy, modify, distribute, and sell this software +'\" and its documentation for any purpose is hereby granted without fee, +'\" provided that the above copyright notice and this permission notice +'\" appear in all copies of the software and related documentation. +'\" +'\" THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +'\" EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +'\" WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +'\" +'\" IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD +'\" AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL +'\" DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +'\" OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY +'\" OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN +'\" CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +'\" +'\" $Id: mysqltcl.n,v 1.1.1.1 2002/02/15 18:21:17 artur Exp $ +'\" +'\" Updates by Tobias Ritzau 1998-03-18 +'\" Replaced all mysql by mysql +'\" Updated the mysqlconnect documentation +'\" +'\" 1998-07-06 +'\" Changed some mysql back to msql +'\" Updaated the name and introduction +'\" Updated the mysqlcol documentation +'\" +'\" Copyright (c) 1998 Tobias Ritzau +'\" +'\" Updates by Artur Trzewik 2002-11-31 +'\" for mysqltcl2.1 (mysql::query mysq::endquery) +'\" +'\" Updates by Artur Trzewik 2002-11-31 +'\" for mysqltcl3.0 +'\" +.SH "SYNOPSIS" +package require \fBTcl 8.4\fR +.sp +package require \fBmysqltcl 3.0\fR +.sp +\fB::mysql::connect\fR ?\fIoption value\fR...? +.sp +\fB::mysql::use\fR \fIhandle\fR \fIdatabase\fR +.sp +\fB::mysql::sel\fR \fIhandle\fR \fIsql-statement\fR ?\fI-list|-flatlist\fR? +.sp +\fB::mysql::fetch\fR \fIhandle\fR +.sp +\fB::mysql::exec\fR \fIhandle\fR \fIsql-statement\fR +.sp +\fB::mysql::query\fR \fIhandle\fR \fIsql-select-statement\fR +.sp +\fB::mysql::endquery\fR \fIquery-handle\fR +.sp +\fB::mysql::map\fR \fIhandle\fR \fIbinding-list\fR \fIscript\fR +.sp +\fB::mysql::receive\fR \fIhandle\fR \fIsql-statment\fR \fIbinding-list\fR \fIscript\fR +.sp +\fB::mysql::seek\fR \fIhandle\fR \fIrow-index\fR +.sp +\fB::mysql::col\fR \fIhandle\fR \fItable-name\fR \fIoption\fR +.sp +\fB::mysql::col\fR \fIhandle\fR \fItable-name\fR \fIoptionkist\fR +.sp +\fB::mysql::col\fR \fIhandle\fR ?\fIoption\fR...? +.sp +\fB::mysql::info\fR \fIhandle\fR \fIoption\fR +.sp +\fB::mysql::baseinfo\fR \fIoption\fR +.sp +\fB::mysql::ping\fR \fIhandle\fR +.sp +\fB::mysql::changeuser\fR \fIuser\fR \fIpassword\fR ?\fIdatabase\fR? +.sp +\fB::mysql::result\fR \fIhandle\fR \fIoption\fR +.sp +\fB::mysql::state\fR \fIhandle\fR ?\fI-numeric\fR? +.sp +\fB::mysql::close\fR ?\fIhandle\fR? +.sp +\fB::mysql::insertid\fR \fIhandle\fR +.sp +\fB::mysql::escape\fR ?\fIhandle\fR? \fIstring\fR +.sp +\fB::mysql::autocommit\fR \fIhandle\fR \fIboolean\fR +.sp +\fB::mysql::commit\fR \fIhandle\fR +.sp +\fB::mysql::rollback\fR \fIhandle\fR +.sp +\fB::mysql::nextresult\fR \fIhandle\fR +.sp +\fB::mysql::moreresult\fR \fIhandle\fR +.sp +\fB::mysql::warningcount\fR \fIhandle\fR +.sp +\fB::mysql::isnull\fR \fIvalue\fR +.sp +\fB::mysql::newnull\fR +.sp +\fB::mysql::setserveroption\fR \fIhandle\fR \fIoption\fR +.sp +\fB::mysql::shutdown\fR \fIhandle\fR +.sp +.BE +.SH "DESCRIPTION" +MySQLTcl is a collection of Tcl commands and a Tcl global array that +provide access to MySQL database servers. +.PP +MySQLTcl is nothing more than a patched version of a patched version +of Hakan Soderstrom's patch of Tom Poindexter's Sybtcl. +.PP +Mysqltcl is binary Tcl library (extension) written in C language that use direkt +official MySQL C-API. Almost all Tcl commands correspond to MySQL C-API functions. +For detail documentation see official MySQL C-API manual. +.SH "MYSQLTCL COMMANDS" +.TP +\fB::mysql::connect\fR ?\fIoption value\fR...? +Connect to a MySQL server. +A handle is returned which should be used in other mysqltcl +commands using this connection. +::mysql::connect raises a Tcl error if the connection fails. +::mysql::connect read first the options from my.cnf file group mysqltcl. +See MySQL documentation chapter "options files". +Possible connection options are: +.RS +.TP +\fB-host\fR \fIhostname\fR +The host on which the server is located. The local host is used by default. +.TP +\fB-user\fR \fIuser\fR +The user whose name is used for the connection. +The current Unix user-name is used by default. +.TP +\fB-password\fR \fIpassword\fR +The password that must be used for the connection. +If it is not present, the connection is possible only for users with +no password on the server. +.TP +\fB-db\fR \fIdb\fR +If this option is present, \fIdb\fR is used as current database, with no need +for a call to \fImysql::use\fR. +.TP +\fB-port\fR \fIport\fR +The port number for the TCP/IP connection, if it's different from the default. +.TP +\fB-socket\fR \fIsocket\fR +The socket or named pipe for the connection. +.TP +\fB-encoding\fR \fIencodingname\fR +The option works similar to -encoding option in fconfigure. It support also +special encoding name binary. By option -binary no converting will be done be reading or writing to/from MySQL. +If option is not set the system encoding (see utf-8) is used. +Please test all input and outputs with another program to check that all +is the way you expect it. If option binary is not used the system procedures +Tcl_ExternalToUtfDString (writing) and Tcl_ExternalToUtf (reading) will be used +by option binary the function Tcl_GetByteArrayFromObj and Tcl_NewByteArrayObj are used. +If you want to manipulate binary date use -encoding binary. By handling textes set your +special encoding that you want to use in your database. Consider what another system access the +database and what encoding they expect. It can useful +to use -encoding utf-8. That is standard encoding in some linux distributions and newer systems. +.TP +\fB-ssl\fR \fIboolean\fR +Switch to SSL after handshake. Default is false +.TP +\fB-compress\fR \fIboolean\fR +Use compression protocol. Default is false +.TP +\fB-odbc\fR \fIboolean\fR +The client is an ODBC client. This changes mysqld to be more ODBC-friendly. Default is false +.TP +\fB-noschema\fR \fIboolean\fR +Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs. This changes mysqld to be more ODBC-friendly. Default is false +.TP +\fB-multistatement\fR \fIboolean\fR +Tell the server that the client may send multiple-row-queries (separated by `;'). +If this flag is not set, multiple-row-queries are disabled. Default is false. +.TP +\fB-multiresult\fR \fIboolean\fR +Tell the server that the client can handle multiple-result sets from multi-queries or stored procedures. +This is automatically set if CLIENT_MULTI_STATEMENTS is set. +.TP +\fB-localfiles\fR \fIboolean\fR +Enable LOAD DATA LOCAL handling. Default is false. +.TP +\fB-foundrows\fR \fIboolean\fR +Return the number of found (matched) rows, not the number of affected rows. +Default is false. +.TP +\fB-interactive\fR \fIboolean\fR +Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection. +The client's session wait_timeout variable will be set to the value of the session interactive_timeout variable. +Default is false. +.RE +.TP +\fB::mysql::use\fR \fIhandle\fR \fIdatabase\fR +Associate a connected handle with a particular database. +\fIhandle\fR must be a valid handle previously obtained from ::mysql::connect. +mysql::use raises a Tcl error if the handle is not valid or +if the database name specified could not be used. +.sp +Consider you can use mysqltcl without to specify the database, in this case +you must use explizit schema notation to specify the table in sql. +.nf +::mysql::sel $handle {select * from uni.student} +.fi +with option connection \fI-noschema\fR you can prohibit such syntax. +.TP +\fB::mysql::sel\fR \fIhandle\fR \fIsql-statement\fR ?\fI-list|-flatlist\fR? +Send \fIsql-statement\fR to the server. +.sp +If \fIsql-statement\fR is a SELECT statement and no \fI-list\fR or +\fI-flatlist\fR option is specified, the command returns the +number of rows returned as the result of the query. +The rows can be obtained by the \fI::mysql::fetch\fR and/or the +\fI::mysql::map\fR commands. +The resulting rows are called the \fIpending result\fR. +.sp +If \fIsql-statement\fR is a SELECT statement and \fI-list\fR or \fI-flatlist\fR +is specified, the command returns the full list of rows returned as +the result of the query in one of two possible formats: +.RS +.TP +\fB-list\fR +generates a list of lists, in which each element is a row of the result. +.TP +\fB-flatlist\fR +generates the concatenation of all rows in a single list, which +is useful for scanning with a single \fIforeach\fR. +.RE +Example: +.nf +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -list +{1 Joe} {2 Phil} {3 John} +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -flatlist +{1 Joe 2 Phil 3 John} +.fi +Note that both list syntaxes are faster than something like\\fB +.nf +% ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" +% ::mysql::map $db {id name} {lappend result $id $name} +% set $result +{1 Joe 2 Phil 3 John} +.fi +If \fIsql-statement\fR is a valid MySQL statement, but not a SELECT +statement, the command returns -1 after executing the statement, or an empty +string if \fI-list\fR or \fI-flatlist\fR is specified. +There is no pending result in this case. +.sp +In any case ::mysql::sel implicitly cancels any previous result still +pending for the handle. +.TP +\fB::mysql::fetch\fR \fIhandle\fR +Returns the next row from result set as Tcl list. +mysql::fetch raises a Tcl error if there is no pending result for \fIhandle\fR. +mysql::fetch was former named mysqlnext. +.TP +\fB::mysql::exec\fR \fIhandle\fR \fIsql-statement\fR +Send \fIsql-statement\fR, a MySQL non-SELECT statement, to the server. +The \fIhandle\fR must be in use (through ::mysql::connect and ::mysql::use). +.sp +::mysql::exec implicitly cancels any previous result pending for the handle. +.sp +If \fIsql-statement\fR is a valid MySQL SELECT statement, the statement +is executed, but the result is discarded. +No Tcl error is generated. +This amounts to a (potentially costly) no-op. +Use the ::mysql::sel command for SELECT statements. +.sp +::mysql::exec return the number of affected rows (DELETE, UPDATE) +.sp +.TP +\fB::mysql::query\fR \fIhandle\fR \fIsql-select-statement\fR +Send \fIsql-select-statement\fR to the server. +.sp +\fImysql::query\fR allow to send multiple nested queries on one handle (without need to build +new handle or caching results). +mysql::query return a query handle that can be used as handle in commands as (mysql::fetch, +::mysql::map, mysql::seek, mysql::col, mysql::result). +After result proceeding all query must be +freed with \fI::mysql::endquery query-hanlde\fR command. +.sp +Example: +.nf +set query1 [::mysql::query \\$db {SELECT ID, NAME FROM FRIENDS}\\] +while {[set row [::mysql::fetch \\$query1]]!=""} { + set id [lindex \\$row 0] + set query2 [::mysql::query \\$db "SELECT ADDRESS FROM ADDRESS WHERE FRIENDID=$ID"] + ::mysql::map \\$query2 address { puts "address = $address" } + ::mysql::endquery \\$query2 +} +::mysql::endquery $query1 +.fi +In most cases one should use sql-joins and avoid nested queries. +SQL-sever can optimize such queries. +But in some applications (GUI-Forms) where the results are used long time the inner +query is not known before. +.TP +\fB::mysql::endquery\fR \fIquery-handle\fR +free result memory after \fI::mysql::query\fR command. +You must invoke ::mysql::endquery after each mysqlquery to not cause memory leaks. See mysqlquery command. +.sp +Using \fI::mysql::endquery\fR on db-handle will free also memory (pending result) after \fI::mysql::sel\fR command. +.sp +.TP +\fB::mysql::map\fR \fIhandle\fR \fIbinding-list\fR \fIscript\fR +Iterate a script over the rows of the pending result. +::mysql::map may consume all rows or only some of the rows of the pending +result. +Any remaining rows may be obtained by further ::mysql::fetch or ::mysql::map +commands. +.sp +\fIhandle\fR must be a handle with a pending result from a previous +::mysql::sel command. +\fIbinding-list\fR must be a list of one or more variable names. +\fIscript\fR must be a Tcl script. +It may be empty, but usually it contains one or more commands. +.sp +::mysql::map processes one row at a time from the pending result. +For each row the column values are bound to the variables in the +binding list, then the script is executed. +Binding is strictly positional. +The first variable in the binding list is bound to the first column of +the row, and so on. +The variables are created in the current context (if they do not +already exist). +A variable name begining with a hyphen is not bound; it serves as a +placeholder in the binding list. +If there are more columns than variables the extra columns are +ignored. +.sp +The ::mysql::map command is similar to an ordinary \fIforeach\fR. +A \fIforeach\fR iterates over the elements of a list, ::mysql::map +iterates over the rows of a pending result. +In both cases iteration is affected by \fIbreak\fR and \fIcontinue\fR +Tcl commands. +The binding list variables retain their last values after the command +has completed. +.sp +A simple example follows. +Assume $db is a handle in use.\\fB +.nf +::mysql::sel \\$db { + select lname, fname, area, phone from friends order by lname, fname +} +::mysql::map \\$db {ln fn - phone} { + if {\\$phone == {}} continue + puts [format "%16s %-8s %s" \\$ln \\$fn \\$phone] +} +.fi +The ::mysql::sel command gets and sorts all rows from table \\fIfriends]. +The ::mysql::map command is used to format and print the result in a way +suitable for a phone list. +For demonstration purposes one of the columns (area) is not used. +The script begins by skipping over rows which have no phone number. +The second command in the script formats and prints values from the row. +.sp +::mysql::map raises a Tcl error if there is no pending result for +\fIhandle\fR, or if \fIbinding-list\fR contains more variables than +there are columns in the pending result. +.sp +.TP +\fB::mysql::receive\fR \fIhandle\fR \fIsql-statment\fR \fIbinding-list\fR \fIscript\fR +This command works the same way as the command mysqtclmap but +it do not need leading ::mysql::sel command. +The main difference is internal using of MySQL client library. +This command use mysql_use_result from C-API that do not +store result on client but try to receive the rows directly +from server. +There is also no client cache. +This command can be faster as using of ::mysql::sel and by +very big resultset will not overload client machine. +The scipt should process the result immadiatly because +it can block table (or tables) for another clients. +If performance matter please test all alternatives separatly. +You must consider two aspects: memory consumption and performance. +.TP +\fB::mysql::seek\fR \fIhandle\fR \fIrow-index\fR +Moves the current position among the rows in the pending result. +This may cause \fI::mysql::fetch\fR and \fI::mysql::map\fR to re-read rows, or to +skip over rows. +.sp +Row index 0 is the position just before the first row in the pending result; +row index 1 is the position just before the second row, and so +on. +You may specify a negative row index. +Row index -1 is the position just before the last row; +row index -2 is the position just before the second last row, +and so on. +An out-of-bounds row index will cause ::mysql::seek to set the new current +position either just before the first row (if the index is too negative), +or just after the last row (if the index exceeds the number of rows). +This is not an error condition. +.sp +::mysql::seek returns the number of rows that can be read sequentially from +the new current position. +::mysql::seek raises a Tcl error if there is no pending result for \fIhandle\fR. +.sp +Portability note: The functionality of \fI::mysql::seek\fR is frequently +absent in other Tcl extensions for SQL. +That is because MySQL C-API client library ofers own result set caching functionality +that lacks another SQL-APIs. +That increase the performance because all rows are received at once and the query does +not block the server for another clienst , on the other +hand you works on the cached data can use a lot of memory and are up to date only in the moment +of query but not fetch. +.sp +.TP +\fB::mysql::col\fR \fIhandle\fR \fItable-name\fR \fIoption\fR +.TP +\fB::mysql::col\fR \fIhandle\fR \fItable-name\fR \fIoptionkist\fR +.TP +\fB::mysql::col\fR \fIhandle\fR ?\fIoption\fR...? +Return information about the columns of a table. +\fIhandle\fR must be in use. +\fItable-name\fR must be the name of a table; it may be a table name +or \fI-current\fR if there is a pending result. +One or more options control what information to return. +Each option must be one of the following keywords. +.RS +.TP +\fBname\fR Return the name of a column. +.TP +\fBtype\fR +Return the type of a column; one of the strings \fIdecimal\fR, +\fItiny\fR, \fIshort\fR, \fIlong\fR, \fIfloat\fR, \fIdouble\fR, +\fInull\fR, \fItimestamp\fR, \fIlong long\fR, \fIint24\fR, \fIdate\fR, +\fItime\fR, \fIdate time\fR, \fIyear\fR, \fInew date\fR, \fIenum\fR, +\fIset\fR, \fItiny blob\fR, \fImedium blob\fR, \fIlong blob\fR, +\fIblob\fR, \fIvar string\fR, or \fIstring\fR. +Note that a column of type \fIchar\fR will return tiny, while they are +represented equally. +.TP +\fBlength\fR Return the length of a column in bytes. +.TP +\fBtable\fR Return the name of the table in which this column occurs. +.TP +\fBnon_null\fR Return the string "1" if the column is non-null; otherwise "0". +.TP +\fBprim_key\fR Return the string "1" if the column is part of the primary key; +otherwise "0". +.TP +\fBnumeric\fR Return the string "1" if the column is numeric; otherwise "0". +.TP +\fBdecimals\fR Return the string "1" if the column is non-null; otherwise "0". +.RE +The three forms of this command generate their result in a +particular way. +.RS +.IP [1] +If a single option is present the result is a simple list of +values; one for each column. +.IP [2] +If the options are given in the form of an option list the +result is a list of lists. +Each sublist corresponds to a column and contains the information +specified by the options. +.IP [3] +If several options are given, but not in a list, the result is also +a list of lists. +In this case each sublist corresponds to an option and contains one +value for each column. +.RE +The following is a sample interactive session containing all forms of +the ::mysql::col command and their results. +The last command uses the \fI-current\fR option. +It could alternatively specify the table name explicitly.\\fB +.nf +%::mysql::col $db friends name +name lname area phone +% ::mysql::col $db friends {name type length} +{fname char 12} {lname char 20} {area char 5} {phone char 12} +% ::mysql::sel $db {select * from friends} +% ::mysql::col $db -current name type length +{fname lname area phone} {char char char char} {12 20 5 12}] +.fi +.TP +\fB::mysql::info\fR \fIhandle\fR \fIoption\fR +Return various database information depending on the \fIoption\fR. +The option must be one of the following keywords. +.RS +.TP +\fBinfo\fR +Return a String with information about last operation. +"Records: 3 Duplicates: 0 Warnings: 0" by INSERT or +"Rows matched: 40 Changed: 40 Warnings: 0" by UPDATE statements +(read the manual for mysql_info in MySQL C API documentation) +.TP +\fBdatabases\fR +Return a list of all database names known to the server. +The handle must be connected. +.TP +\fBdbname\fR +Return the name of the database with which the handle is associated. +The handle must be in use. +.TP +\fBdbname?\fR +Return the name of the database with which the handle is associated; +an empty string if the handle is connected, but not in use. +.TP +\fBhost\fR +Return the name of the host to which the handle is connected. +The handle must be connected. +.TP +\fBhost\fR +Return the name of the host to which the handle is connected; an empty +string if the handle is not valid. +.TP +\fBtables\fR +Return a list of all table names in the database with which the handle +is associated. +The handle must be in use. +.RE +.TP +\fB::mysql::baseinfo\fR \fIoption\fR +return information information that do not need handle. +.RS +.TP +\fBconnectparameters\fR +return all supported connecting options +.TP +\fBclientversion\fR +return the version of underlying MYSQL C-API library +.RE +.TP +\fB::mysql::ping\fR \fIhandle\fR +Checks whether the connection to the server is working. If it has gone down, an automatic reconnection is attempted. +.sp +This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and reconnect if necessary. +.sp +Return True if server is alive +.TP +\fB::mysql::changeuser\fR \fIuser\fR \fIpassword\fR ?\fIdatabase\fR? +Changes the user and causes the database specified by database to become the default (current) database on the connection specified by MySQL. In subsequent queries, this database is the default for table references that do not include an explicit database specifier. +.sp +::mysql::changeuser fails unless the connected user can be authenticated or if he doesn't have permission to use the database. In this case the user and database are not changed +.sp +if database parameter may be set were is no default database. +.sp +Cause Error if operation is not succesed +.TP +\fB::mysql::result\fR \fIhandle\fR \fIoption\fR +Return information about the pending result. +Note that a result is pending until canceled by a ::mysql::exec command, +even if no rows remain to be read. +\fIOption\fR must be one of the following keywords. +.RS +.TP +\fBcols\fR +Return the number of columns in the pending result. +There must be a pending result. +.TP +\fBcols\fR +Return the number of columns in the pending result; an empty string if +no result is pending. +.TP +\fBcurrent\fR +Return the current position in the pending result; a non-negative integer. +This value can be used as \fIrow-index\fR in the ::mysql::seek command. +An error is raised if there is no pending result. +.TP +\fBcurrent?\fR +As above, but returns an empty string if there is no pending result. +.TP +\fBrows\fR +Return the number of rows that can be read sequentially from the +current position in the pending result. +There must be a pending result. +.TP +\fBrows\fR +Return the number of rows that can be read sequentially from the +current position in the pending result; an empty string if no result +is pending. +.sp +[::mysql::result \\$db current] + [::mysql::result \\$db rows] +always equals the total number of rows in the pending result. +.RE +.TP +\fB::mysql::state\fR \fIhandle\fR ?\fI-numeric\fR? +Return the state of a handle as a string or in numeric form. +There is no requirement on \fIhandle\fR; it may be any string. +The return value is one of the following strings, or the corresponding +numeric value if \fI-numeric\fR is specified. +The states form a progression where each state builds on the previous. +.RS +.TP +\fBNOT_A_HANDLE (0)\fR +The string supplied for \fIhandle\fR is not a mysqltcl handle at all. +.TP +\fBUNCONNECTED (1)\fR +The string supplied for \fIhandle\fR is one of the possible mysqltcl +handles, but it is not valid to any server. +.TP +\fBCONNECTED (2)\fR +The handle is connected to a server, but not associated with a database. +.TP +\fBIN_USE (3)\fR +The handle is connected and associated with a database, but there is +no pending result. +.TP +\fBRESULT_PENDING (4)\fR +The handle is connected, associated with a database, and there is a +pending result. +.RE +.TP +\fB::mysql::close\fR ?\fIhandle\fR? +Closes the server connection associated with \fIhandle\fR, causing it +to go back to the unconnected state. +Closes all connections if \fIhandle\fR is omitted. +Returns an empty string. +::mysql::close raises a Tcl error if a handle is specified which is not +valid. +.TP +\fB::mysql::insertid\fR \fIhandle\fR +Returns the auto increment id of the last INSERT statement. +.TP +\fB::mysql::escape\fR ?\fIhandle\fR? \fIstring\fR +Returns the content of \fIstring\fR, with all special characters escaped, +so that it is suitable for use in an SQL statement. This is simpler (faster) +than using a general \fIregexp\fR or string map. +If handle is specified C-API function mysql_real_escape_string is used. +This is the recommended usage because in this case current character set is respected. +.TP +\fB::mysql::autocommit\fR \fIhandle\fR \fIboolean\fR +Sets autocommit mode on if mode is 1, off if mode is 0. +.TP +\fB::mysql::commit\fR \fIhandle\fR +Commits the current transaction. +.TP +\fB::mysql::rollback\fR \fIhandle\fR +Rollback the current transaction. +.TP +\fB::mysql::nextresult\fR \fIhandle\fR +If more query results exist, mysql::nextresult() reads the next query results and returns the status back to application. +returns -1 if no result or number of rows in the result set. +.TP +\fB::mysql::moreresult\fR \fIhandle\fR +Returns true if more results exist from the currently executed query, and the application must call mysql::result to fetch the results. +.TP +\fB::mysql::warningcount\fR \fIhandle\fR +Returns the number of warnings generated during execution of the previous SQL statement. +.TP +\fB::mysql::isnull\fR \fIvalue\fR +Null handling is known problem by Tcl to DB interfaces. +Mysql varchar type known 2 valid values NULL and empty string. +There is no way to difference it in core Tcl because of it strong string based +philosophy. +Mysql has new internal Tcl type for null that string representation is stored +in global array mysqltcl(nullvalue) and as default empty string. +mysql::isnull can be used for safe check for null value. +Warning mysql::isnull works only reliable if there are no type conversation on +returned rows. +Consider row is always Tcl list even when there are only on column in the row. +.nf +set row [::mysql::next \\$handle] +if {[mysql::isnull [lindex \\$row 1]]} { + puts "2. column of $row is null" +} +if {[mysql::isnull \\$row]} { + puts "this does not work, because of type conversation list to string" +} +.fi +.TP +\fB::mysql::newnull\fR +create new null object. It can be used to simulate returned row contents. +.TP +\fB::mysql::setserveroption\fR \fIhandle\fR \fIoption\fR +there are only 2 options now: -multi_statment_on and -multi_statment_off +.TP +\fB::mysql::shutdown\fR \fIhandle\fR +Asks the database server to shut down. The connected user must have SHUTDOWN privileges. +.SH "STATUS INFORMATION" +Mysqltcl creates and maintains a Tcl global array to provide status +information. +Its name is \fImysqlstatus\fR. +.P +Mysqlstatus elements: +.TP +code +A numeric conflict code set after every mysqltcl command. +Zero means no conflict; non-zero means some kind of conflict. +All conflicts also generate a Tcl error. +.sp +All MySQL server conflicts set mysqlstatus(code) to the numeric +code of the MySQL error. +.sp +Any other conflict sets mysqlstatus(code) to -1. +.TP +command +The last failing mysqltcl command. +Not updated for successful commands. +.TP +message +Message string for the last conflict detected. +The same string is returned as the result of the failing mysqltcl +command. +Not updated for successful commands. +.TP +nullvalue +The string to use in query results to represent the SQL null value. +The empty string is used initially. +You may set it to another value. +.SH "Backward compatibility" +Up from version 3.0 all mysql commands are declared in ::mysql namespace. +All names for example mysqlconnect are also aviable but deprecated. +All old commands have the name pattern mysql{name} and the most of them are now mysql::{name}. +The exception is mysqlnext, which was renamed to mysql::fetch. +.SH "BUGS & POSSIBLE MISFEATURES" +Deleting any of the mysqltcl commands closes all connections. +.SH "AUTHORS" +.IP \(bu +Tobias Ritzau +.IP \(bu +Paolo Brutti +.IP \(bu +Artur Trzewik (mail@xdobry.de) - active maintainer +MySQLTcl is derived from a patch of msql by Hakan Soderstrom, Soderstrom Programvaruverkstad, +S-12242 Enskede, Sweden. +msql is derived from Sybtcl by Tom Poindexter. +There are many contributors and bug reporter that are not mentioned. +If you have contributed to mysqltcl and wants to be on the list contact Artur Trzewik. diff --git a/generic/Makefile.org b/generic/Makefile.org new file mode 100644 index 0000000..8e2f72e --- /dev/null +++ b/generic/Makefile.org @@ -0,0 +1,14 @@ +# Please Edit the 2 lines below +# end set correct paths +# paths to -> tcl.h mysql.h +INCLUDE=-I/usr/include -I/usr/include/mysql +# path to .> libmysqclient.so +LIBS=-L/usr/lib/mysql + +ALL:libmysqltcl.so + +mysqltcl.o:mysqltcl.c + gcc -c -Wall -DVERSION=\"0.21\" mysqltcl.c ${INCLUDE} + +libmysqltcl.so:mysqltcl.o + gcc -fPIC -shared -o $@ $< ${LIBS} -lmysqlclient diff --git a/generic/mysqltcl.c b/generic/mysqltcl.c new file mode 100644 index 0000000..dbeb777 --- /dev/null +++ b/generic/mysqltcl.c @@ -0,0 +1,2562 @@ +/* + * $Eid: mysqltcl.c,v 1.2 2002/02/15 18:52:08 artur Exp $ + * + * MYSQL interface to Tcl + * + * Hakan Soderstrom, hs@soderstrom.se + * + */ + +/* + * Copyright (c) 1994, 1995 Hakan Soderstrom and Tom Poindexter + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice and this permission notice + * appear in all copies of the software and related documentation. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL HAKAN SODERSTROM OR SODERSTROM PROGRAMVARUVERKSTAD + * AB BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL + * DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY + * OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN + * CONNECTON WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + Modified after version 2.0 by Artur Trzewik + see http://www.xdobry.de/mysqltcl + Patch for encoding option by Alexander Schoepe (version2.20) +*/ + +#ifdef _WINDOWS + #include + #define PACKAGE "mysqltcl" + #define VERSION "3.00" +#endif + +#include +#include + +#include +#include +#include +#include + +#define MYSQL_SMALL_SIZE TCL_RESULT_SIZE /* Smaller buffer size. */ +#define MYSQL_NAME_LEN 80 /* Max. database name length. */ +/* #define PREPARED_STATEMENT */ + +enum MysqlHandleType {HT_CONNECTION=1,HT_QUERY=2,HT_STATEMENT=3}; + +typedef struct MysqlTclHandle { + MYSQL * connection; /* Connection handle, if connected; NULL otherwise. */ + char database[MYSQL_NAME_LEN]; /* Db name, if selected; NULL otherwise. */ + MYSQL_RES* result; /* Stored result, if any; NULL otherwise. */ + int res_count; /* Count of unfetched rows in result. */ + int col_count; /* Column count in result, if any. */ + int number; /* handle id */ + enum MysqlHandleType type; /* handle type */ + Tcl_Encoding encoding; /* encoding for connection */ +#ifdef PREPARED_STATEMENT + MYSQL_STMT *statement; /* used only by prepared statements*/ + MYSQL_BIND *bindParam; + MYSQL_BIND *bindResult; + MYSQL_RES *resultMetadata; + MYSQL_RES *paramMetadata; +#endif +} MysqlTclHandle; + +typedef struct MysqltclState { + Tcl_HashTable hash; + int handleNum; + char *MysqlNullvalue; + // Tcl_Obj *nullObjPtr; +} MysqltclState; + +static char *MysqlHandlePrefix = "mysql"; +/* Prefix string used to identify handles. + * The following must be strlen(MysqlHandlePrefix). + */ +#define MYSQL_HPREFIX_LEN 5 + +/* Array for status info, and its elements. */ +#define MYSQL_STATUS_ARR "mysqlstatus" + +#define MYSQL_STATUS_CODE "code" +#define MYSQL_STATUS_CMD "command" +#define MYSQL_STATUS_MSG "message" +#define MYSQL_STATUS_NULLV "nullvalue" + +/* C variable corresponding to mysqlstatus(nullvalue) */ +#define MYSQL_NULLV_INIT "" + +/* Check Level for mysql_prologue */ +enum CONNLEVEL {CL_PLAIN,CL_CONN,CL_DB,CL_RES}; + +/* Prototypes for all functions. */ + +static int Mysqltcl_Use(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Escape(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Sel(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Fetch(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Seek(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Map(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Exec(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Close(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Info(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Result(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Col(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_State(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_InsertId(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Query(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int Mysqltcl_Receive(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int MysqlHandleSet _ANSI_ARGS_((Tcl_Interp *interp,Tcl_Obj *objPtr)); +static void MysqlHandleFree _ANSI_ARGS_((Tcl_Obj *objPtr)); +static int MysqlNullSet _ANSI_ARGS_((Tcl_Interp *interp,Tcl_Obj *objPtr)); +static Tcl_Obj *Mysqltcl_NewNullObj(MysqltclState *mysqltclState); +static void UpdateStringOfNull _ANSI_ARGS_((Tcl_Obj *objPtr)); + +/* handle object type + * This section defince funtions for Handling new Tcl_Obj type */ + +Tcl_ObjType mysqlHandleType = { + "mysqlhandle", + MysqlHandleFree, + (Tcl_DupInternalRepProc *) NULL, + NULL, + MysqlHandleSet +}; +Tcl_ObjType mysqlNullType = { + "mysqlnull", + (Tcl_FreeInternalRepProc *) NULL, + (Tcl_DupInternalRepProc *) NULL, + UpdateStringOfNull, + MysqlNullSet +}; + + +static MysqltclState *getMysqltclState(Tcl_Interp *interp) { + Tcl_CmdInfo cmdInfo; + if (Tcl_GetCommandInfo(interp,"mysqlconnect",&cmdInfo)==0) { + return NULL; + } + return (MysqltclState *)cmdInfo.objClientData; +} + +static int MysqlHandleSet(Tcl_Interp *interp, register Tcl_Obj *objPtr) +{ + Tcl_ObjType *oldTypePtr = objPtr->typePtr; + char *string; + MysqlTclHandle *handle; + Tcl_HashEntry *entryPtr; + MysqltclState *statePtr; + + string = Tcl_GetStringFromObj(objPtr, NULL); + statePtr = getMysqltclState(interp); + if (statePtr==NULL) return TCL_ERROR; + + entryPtr = Tcl_FindHashEntry(&statePtr->hash,string); + if (entryPtr == NULL) { + + handle=0; + } else { + handle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + } + if (!handle) { + if (interp != NULL) + return TCL_ERROR; + } + if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) { + oldTypePtr->freeIntRepProc(objPtr); + } + + objPtr->internalRep.otherValuePtr = (MysqlTclHandle *) handle; + objPtr->typePtr = &mysqlHandleType; + Tcl_Preserve((char *)handle); + return TCL_OK; +} +static int MysqlNullSet(Tcl_Interp *interp, Tcl_Obj *objPtr) +{ + Tcl_ObjType *oldTypePtr = objPtr->typePtr; + Tcl_HashEntry *entryPtr; + + if ((oldTypePtr != NULL) && (oldTypePtr->freeIntRepProc != NULL)) { + oldTypePtr->freeIntRepProc(objPtr); + } + objPtr->typePtr = &mysqlNullType; + return TCL_OK; +} +static void UpdateStringOfNull(Tcl_Obj *objPtr) { + int valueLen; + MysqltclState *state = (MysqltclState *)objPtr->internalRep.otherValuePtr; + + valueLen = strlen(state->MysqlNullvalue); + objPtr->bytes = Tcl_Alloc(valueLen+1); + strcpy(objPtr->bytes,state->MysqlNullvalue); + objPtr->length = valueLen; +} +static void MysqlHandleFree(Tcl_Obj *obj) +{ + MysqlTclHandle *handle = (MysqlTclHandle *)obj->internalRep.otherValuePtr; + Tcl_Release((char *)handle); +} + +static int GetHandleFromObj(Tcl_Interp *interp,Tcl_Obj *objPtr,MysqlTclHandle **handlePtr) +{ + if (Tcl_ConvertToType(interp, objPtr, &mysqlHandleType) != TCL_OK) + return TCL_ERROR; + *handlePtr = (MysqlTclHandle *)objPtr->internalRep.otherValuePtr; + return TCL_OK; +} + +static Tcl_Obj *Tcl_NewHandleObj(MysqltclState *statePtr,MysqlTclHandle *handle) +{ + register Tcl_Obj *objPtr; + char buffer[MYSQL_HPREFIX_LEN+TCL_DOUBLE_SPACE+1]; + register int len; + Tcl_HashEntry *entryPtr; + int newflag; + + objPtr=Tcl_NewObj(); + /* the string for "query" can not be longer as MysqlHandlePrefix see buf variable */ + len=sprintf(buffer, "%s%d", (handle->type==HT_QUERY) ? "query" : MysqlHandlePrefix,handle->number); + objPtr->bytes = Tcl_Alloc((unsigned) len + 1); + strcpy(objPtr->bytes, buffer); + objPtr->length = len; + + entryPtr=Tcl_CreateHashEntry(&statePtr->hash,buffer,&newflag); + Tcl_SetHashValue(entryPtr,handle); + + objPtr->internalRep.otherValuePtr = handle; + objPtr->typePtr = &mysqlHandleType; + + Tcl_Preserve((char *)handle); + + return objPtr; +} + + + + +/* CONFLICT HANDLING + * + * Every command begins by calling 'mysql_prologue'. + * This function resets mysqlstatus(code) to zero; the other array elements + * retain their previous values. + * The function also saves objc/objv in global variables. + * After this the command processing proper begins. + * + * If there is a conflict, the message is taken from one of the following + * sources, + * -- this code (mysql_prim_confl), + * -- the database server (mysql_server_confl), + * A complete message is put together from the above plus the name of the + * command where the conflict was detected. + * The complete message is returned as the Tcl result and is also stored in + * mysqlstatus(message). + * mysqlstatus(code) is set to "-1" for a primitive conflict or to mysql_errno + * for a server conflict + * In addition, the whole command where the conflict was detected is put + * together from the saved objc/objv and is copied into mysqlstatus(command). + */ + +/* + *----------------------------------------------------------- + * set_statusArr + * Help procedure to set Tcl global array with mysqltcl internal + * informations + */ + +static void set_statusArr(Tcl_Interp *interp,char *elem_name,Tcl_Obj *tobj) +{ + Tcl_SetVar2Ex (interp,MYSQL_STATUS_ARR,elem_name,tobj,TCL_GLOBAL_ONLY); +} + +/* + *---------------------------------------------------------------------- + * clear_msg + * + * Clears all error and message elements in the global array variable. + * + */ + +static void +clear_msg(Tcl_Interp *interp) +{ + set_statusArr(interp,MYSQL_STATUS_CODE,Tcl_NewIntObj(0)); + set_statusArr(interp,MYSQL_STATUS_CMD,Tcl_NewObj()); + set_statusArr(interp,MYSQL_STATUS_MSG,Tcl_NewObj()); +} + +/* + *---------------------------------------------------------------------- + * mysql_reassemble + * Reassembles the current command from the saved objv; copies it into + * mysqlstatus(command). + */ + +static void mysql_reassemble(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[]) +{ + set_statusArr(interp,MYSQL_STATUS_CMD,Tcl_NewListObj(objc, objv)); +} + + +/* + + + + + *---------------------------------------------------------------------- + * mysql_prim_confl + * Conflict handling after a primitive conflict. + * + */ + +static int mysql_prim_confl(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],char *msg) +{ + set_statusArr(interp,MYSQL_STATUS_CODE,Tcl_NewIntObj(-1)); + + Tcl_ResetResult(interp) ; + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + Tcl_GetString(objv[0]), ": ", msg, (char*)NULL); + + set_statusArr(interp,MYSQL_STATUS_MSG,Tcl_GetObjResult(interp)); + + mysql_reassemble(interp,objc,objv) ; + return TCL_ERROR ; +} + + +/* + *---------------------------------------------------------------------- + * mysql_server_confl + * Conflict handling after an mySQL conflict. + * If error it set error message and return TCL_ERROR + * If no error occurs it returns TCL_OK + */ + +static int mysql_server_confl(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],MYSQL * connection) +{ + const char* mysql_errorMsg; + if (mysql_errno(connection)) { + mysql_errorMsg = mysql_error(connection); + + set_statusArr(interp,MYSQL_STATUS_CODE,Tcl_NewIntObj(mysql_errno(connection))); + + + Tcl_ResetResult(interp) ; + Tcl_AppendStringsToObj(Tcl_GetObjResult(interp), + Tcl_GetString(objv[0]), "/db server: ", + (mysql_errorMsg == NULL) ? "" : mysql_errorMsg, + (char*)NULL) ; + + set_statusArr(interp,MYSQL_STATUS_MSG,Tcl_GetObjResult(interp)); + + mysql_reassemble(interp,objc,objv); + return TCL_ERROR; + } else { + return TCL_OK; + } +} + +static MysqlTclHandle *get_handle(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],int check_level) +{ + MysqlTclHandle *handle; + if (GetHandleFromObj(interp, objv[1], &handle) != TCL_OK) { + mysql_prim_confl(interp,objc,objv,"not mysqltcl handle") ; + return NULL; + } + if (check_level==CL_PLAIN) return handle; + if (handle->connection == 0) { + mysql_prim_confl(interp,objc,objv,"handle already closed (dangling pointer)") ; + return NULL; + } + if (check_level==CL_CONN) return handle; + if (check_level!=CL_RES) { + if (handle->database[0] == '\0') { + mysql_prim_confl(interp,objc,objv,"no current database") ; + return NULL; + } + if (check_level==CL_DB) return handle; + } + if (handle->result == NULL) { + mysql_prim_confl(interp,objc,objv,"no result pending") ; + return NULL; + } + return handle; +} + +/*---------------------------------------------------------------------- + + * mysql_QueryTclObj + * This to method control how tcl data is transfered to mysql and + * how data is imported into tcl from mysql + * Return value : Zero on success, Non-zero if an error occurred. + */ +static int mysql_QueryTclObj(MysqlTclHandle *handle,Tcl_Obj *obj) +{ + char *query; + int result,queryLen; + + Tcl_DString queryDS; + + query=Tcl_GetStringFromObj(obj, &queryLen); + + + if (handle->encoding==NULL) { + query = (char *) Tcl_GetByteArrayFromObj(obj, &queryLen); + result = mysql_real_query(handle->connection,query,queryLen); + } else { + Tcl_UtfToExternalDString(handle->encoding, query, -1, &queryDS); + queryLen = Tcl_DStringLength(&queryDS); + result = mysql_real_query(handle->connection,Tcl_DStringValue(&queryDS),queryLen); + Tcl_DStringFree(&queryDS); + } + return result; +} +static Tcl_Obj *getRowCellAsObject(MysqltclState *mysqltclState,MysqlTclHandle *handle,MYSQL_ROW row,int length) +{ + Tcl_Obj *obj; + Tcl_DString ds; + + if (*row) { + if (handle->encoding!=NULL) { + Tcl_ExternalToUtfDString(handle->encoding, *row, length, &ds); + obj = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); + Tcl_DStringFree(&ds); + } else { + obj = Tcl_NewByteArrayObj((unsigned char *)*row,length); + } + } else { + obj = Mysqltcl_NewNullObj(mysqltclState); + } + return obj; +} + +static MysqlTclHandle *createMysqlHandle(MysqltclState *statePtr) +{ + MysqlTclHandle *handle; + handle=(MysqlTclHandle *)Tcl_Alloc(sizeof(MysqlTclHandle)); + memset(handle,0,sizeof(MysqlTclHandle)); + if (handle == 0) { + panic("no memory for handle"); + return handle; + } + handle->type = HT_CONNECTION; + + /* MT-safe, because every thread in tcl has own interpreter */ + handle->number=statePtr->handleNum++; + return handle; +} + +static MysqlTclHandle *createHandleFrom(MysqltclState *statePtr,MysqlTclHandle *handle,enum MysqlHandleType handleType) +{ + int number; + MysqlTclHandle *qhandle; + qhandle = createMysqlHandle(statePtr); + /* do not overwrite the number */ + number = qhandle->number; + if (!qhandle) return qhandle; + memcpy(qhandle,handle,sizeof(MysqlTclHandle)); + qhandle->type=handleType; + qhandle->number=number; + return qhandle; +} +static void closeHandle(MysqlTclHandle *handle) +{ + if (handle->result != NULL) { + mysql_free_result(handle->result); + handle->result = NULL; + } + if (handle->type==HT_CONNECTION) { + mysql_close(handle->connection); + } +#ifdef PREPARED_STATEMENT + if (handle->type==HT_STATEMENT) { + if (handle->statement!=NULL) + mysql_stmt_close(handle->statement); + if (handle->bindResult!=NULL) + Tcl_Free((char *)handle->bindResult); + if (handle->bindParam!=NULL) + Tcl_Free((char *)handle->bindParam); + if (handle->resultMetadata!=NULL) + mysql_free_result(handle->resultMetadata); + if (handle->paramMetadata!=NULL) + mysql_free_result(handle->paramMetadata); + } +#endif + handle->connection = (MYSQL *)NULL; + if (handle->encoding!=NULL && handle->type==HT_CONNECTION) + { + Tcl_FreeEncoding(handle->encoding); + handle->encoding = NULL; + } + Tcl_EventuallyFree((char *)handle,TCL_DYNAMIC); +} + +/* + *---------------------------------------------------------------------- + * mysql_prologue + * + * Does most of standard command prologue; required for all commands + * having conflict handling. + * 'req_min_args' must be the minimum number of arguments for the command, + * including the command word. + * 'req_max_args' must be the maximum number of arguments for the command, + * including the command word. + * 'usage_msg' must be a usage message, leaving out the command name. + * Checks the handle assumed to be present in objv[1] if 'check' is not NULL. + * RETURNS: Handle index or -1 on failure. + * SIDE EFFECT: Sets the Tcl result on failure. + */ + +static MysqlTclHandle *mysql_prologue(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],int req_min_args,int req_max_args,int check_level,char *usage_msg) +{ + /* Check number of args. */ + if (objc < req_min_args || objc > req_max_args) { + Tcl_WrongNumArgs(interp, 1, objv, usage_msg); + return NULL; + } + + /* Reset mysqlstatus(code). */ + set_statusArr(interp,MYSQL_STATUS_CODE,Tcl_NewIntObj(0)); + + /* Check the handle. + * The function is assumed to set the status array on conflict. + */ + return (get_handle(interp,objc,objv,check_level)); +} + +/* + *---------------------------------------------------------------------- + * mysql_colinfo + * + * Given an MYSQL_FIELD struct and a string keyword appends a piece of + * column info (one item) to the Tcl result. + * ASSUMES 'fld' is non-null. + * RETURNS 0 on success, 1 otherwise. + * SIDE EFFECT: Sets the result and status on failure. + */ + +static Tcl_Obj *mysql_colinfo(Tcl_Interp *interp,int objc,Tcl_Obj *CONST objv[],MYSQL_FIELD* fld,Tcl_Obj * keyw) +{ + char buf[MYSQL_SMALL_SIZE]; + int idx ; + + static CONST char* MysqlColkey[] = + { + "table", "name", "type", "length", "prim_key", "non_null", "numeric", "decimals", NULL + }; + enum coloptions { + MYSQL_COL_TABLE_K, MYSQL_COL_NAME_K, MYSQL_COL_TYPE_K, MYSQL_COL_LENGTH_K, + MYSQL_COL_PRIMKEY_K, MYSQL_COL_NONNULL_K, MYSQL_COL_NUMERIC_K, MYSQL_COL_DECIMALS_K}; + + if (Tcl_GetIndexFromObj(interp, keyw, MysqlColkey, "option", + TCL_EXACT, &idx) != TCL_OK) + return NULL; + + switch (idx) + { + case MYSQL_COL_TABLE_K: + return Tcl_NewStringObj(fld->table, -1) ; + case MYSQL_COL_NAME_K: + return Tcl_NewStringObj(fld->name, -1) ; + case MYSQL_COL_TYPE_K: + switch (fld->type) + { + + case FIELD_TYPE_DECIMAL: + return Tcl_NewStringObj("decimal", -1); + case FIELD_TYPE_TINY: + return Tcl_NewStringObj("tiny", -1); + case FIELD_TYPE_SHORT: + return Tcl_NewStringObj("short", -1); + case FIELD_TYPE_LONG: + return Tcl_NewStringObj("long", -1) ; + case FIELD_TYPE_FLOAT: + return Tcl_NewStringObj("float", -1); + case FIELD_TYPE_DOUBLE: + return Tcl_NewStringObj("double", -1); + case FIELD_TYPE_NULL: + return Tcl_NewStringObj("null", -1); + case FIELD_TYPE_TIMESTAMP: + return Tcl_NewStringObj("timestamp", -1); + case FIELD_TYPE_LONGLONG: + return Tcl_NewStringObj("long long", -1); + case FIELD_TYPE_INT24: + return Tcl_NewStringObj("int24", -1); + case FIELD_TYPE_DATE: + return Tcl_NewStringObj("date", -1); + case FIELD_TYPE_TIME: + return Tcl_NewStringObj("time", -1); + case FIELD_TYPE_DATETIME: + return Tcl_NewStringObj("date time", -1); + case FIELD_TYPE_YEAR: + return Tcl_NewStringObj("year", -1); + case FIELD_TYPE_NEWDATE: + return Tcl_NewStringObj("new date", -1); + case FIELD_TYPE_ENUM: + return Tcl_NewStringObj("enum", -1); + case FIELD_TYPE_SET: + return Tcl_NewStringObj("set", -1); + case FIELD_TYPE_TINY_BLOB: + return Tcl_NewStringObj("tiny blob", -1); + + case FIELD_TYPE_MEDIUM_BLOB: + return Tcl_NewStringObj("medium blob", -1); + case FIELD_TYPE_LONG_BLOB: + return Tcl_NewStringObj("long blob", -1); + case FIELD_TYPE_BLOB: + return Tcl_NewStringObj("blob", -1); + case FIELD_TYPE_VAR_STRING: + return Tcl_NewStringObj("var string", -1); + case FIELD_TYPE_STRING: + return Tcl_NewStringObj("string", -1); + default: + if (strlen(fld->name)name); + } else { + sprintf(buf, "column has unknown datatype"); + } + mysql_prim_confl(interp,objc,objv,buf); + return NULL ; + } + break ; + case MYSQL_COL_LENGTH_K: + return Tcl_NewIntObj(fld->length) ; + case MYSQL_COL_PRIMKEY_K: + return Tcl_NewBooleanObj(IS_PRI_KEY(fld->flags)); + case MYSQL_COL_NONNULL_K: + return Tcl_NewBooleanObj(IS_NOT_NULL(fld->flags)); + case MYSQL_COL_NUMERIC_K: + return Tcl_NewBooleanObj(IS_NUM(fld->type)); + case MYSQL_COL_DECIMALS_K: + return IS_NUM(fld->type)? Tcl_NewIntObj(fld->decimals): Tcl_NewIntObj(-1); + default: /* should never happen */ + mysql_prim_confl(interp,objc,objv,"weirdness in mysql_colinfo"); + return NULL ; + } +} + +/* + * Mysqltcl_CloseAll + * Close all connections. + */ + +static void Mysqltcl_CloseAll(ClientData clientData) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + Tcl_HashSearch search; + MysqlTclHandle *handle; + Tcl_HashEntry *entryPtr; + int wasdeleted=0; + + for (entryPtr=Tcl_FirstHashEntry(&statePtr->hash,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + wasdeleted=1; + handle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + + if (handle->connection == 0) continue; + closeHandle(handle); + } + if (wasdeleted) { + Tcl_DeleteHashTable(&statePtr->hash); + Tcl_InitHashTable(&statePtr->hash, TCL_STRING_KEYS); + } +} +/* + * Invoked from Interpreter by removing mysqltcl command + + * Warnign: This procedure can be called only once + */ +static void Mysqltcl_Kill(ClientData clientData) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + Tcl_HashEntry *entryPtr; + MysqlTclHandle *handle; + Tcl_HashSearch search; + + for (entryPtr=Tcl_FirstHashEntry(&statePtr->hash,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + handle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + if (handle->connection == 0) continue; + closeHandle(handle); + } + Tcl_Free(statePtr->MysqlNullvalue); + Tcl_Free((char *)statePtr); +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Connect + * Implements the mysqlconnect command: + * usage: mysqlconnect ?option value ...? + * + * Results: + * handle - a character string of newly open handle + * TCL_OK - connect successful + * TCL_ERROR - connect not successful - error message returned + */ + +static CONST char* MysqlConnectOpt[] = + { + "-host", "-user", "-password", "-db", "-port", "-socket","-encoding", + "-ssl", "-compress", "-noschema","-odbc","-multistatement","-multiresult", + "-localfiles","-ignorespace","-foundrows","-interactive", + NULL + }; + +static int Mysqltcl_Connect(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + int i, idx; + char *hostname = NULL; + char *user = NULL; + char *password = NULL; + char *db = NULL; + int port = 0, flags = 0, booleanflag; + char *socket = NULL; + char *encodingname = NULL; + MysqlTclHandle *handle; + const char *groupname = "mysqltcl"; + + + enum connectoption { + MYSQL_CONNHOST_OPT, MYSQL_CONNUSER_OPT, MYSQL_CONNPASSWORD_OPT, + MYSQL_CONNDB_OPT, MYSQL_CONNPORT_OPT, MYSQL_CONNSOCKET_OPT, MYSQL_CONNENCODING_OPT, + MYSQL_CONNSSL_OPT, MYSQL_CONNCOMPRESS_OPT, MYSQL_CONNNOSCHEMA_OPT, MYSQL_CONNODBC_OPT, + MYSQL_MULTISTATEMENT_OPT,MYSQL_MULTIRESULT_OPT,MYSQL_LOCALFILES_OPT,MYSQL_IGNORESPACE_OPT, + MYSQL_FOUNDROWS_OPT,MYSQL_INTERACTIVE_OPT + }; + + if (!(objc & 1) || + objc>(sizeof(MysqlConnectOpt)/sizeof(MysqlConnectOpt[0]-1)*2+1)) { + Tcl_WrongNumArgs(interp, 1, objv, "[-user xxx] [-db mysql] [-port 3306] [-host localhost] [-socket sock] [-password pass] [-encoding encoding] [-ssl boolean] [-compress boolean] [-odbc boolean] [-noschema boolean]" + ); + return TCL_ERROR; + } + + for (i = 1; i < objc; i++) { + if (Tcl_GetIndexFromObj(interp, objv[i], MysqlConnectOpt, "option", + 0, &idx) != TCL_OK) + return TCL_ERROR; + + switch (idx) { + case MYSQL_CONNHOST_OPT: + hostname = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNUSER_OPT: + user = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNPASSWORD_OPT: + password = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNDB_OPT: + db = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNPORT_OPT: + if (Tcl_GetIntFromObj(interp, objv[++i], &port) != TCL_OK) + return TCL_ERROR; + break; + case MYSQL_CONNSOCKET_OPT: + socket = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNENCODING_OPT: + encodingname = Tcl_GetStringFromObj(objv[++i],NULL); + break; + case MYSQL_CONNSSL_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_SSL; + break; + case MYSQL_CONNCOMPRESS_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_COMPRESS; + break; + case MYSQL_CONNNOSCHEMA_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_NO_SCHEMA; + break; + case MYSQL_CONNODBC_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_ODBC; + break; + case MYSQL_MULTISTATEMENT_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_MULTI_STATEMENTS; + break; + case MYSQL_MULTIRESULT_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_MULTI_RESULTS; + break; + + case MYSQL_LOCALFILES_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_LOCAL_FILES; + break; + case MYSQL_IGNORESPACE_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_IGNORE_SPACE; + break; + case MYSQL_FOUNDROWS_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_FOUND_ROWS; + break; + case MYSQL_INTERACTIVE_OPT: + if (Tcl_GetBooleanFromObj(interp,objv[++i],&booleanflag) != TCL_OK ) + return TCL_ERROR; + if (booleanflag) + flags |= CLIENT_INTERACTIVE; + break; + default: + return mysql_prim_confl(interp,objc,objv,"Weirdness in options"); + } + } + + handle = createMysqlHandle(statePtr); + + if (handle == 0) { + panic("no memory for handle"); + return TCL_ERROR; + + } + + handle->connection = mysql_init(NULL); + + /* the function below caused in version pre 3.23.50 segmentation fault */ +#if (MYSQL_VERSION_ID>=32350) + mysql_options(handle->connection,MYSQL_READ_DEFAULT_GROUP,groupname); +#endif + + if (!mysql_real_connect(handle->connection, hostname, user, + password, db, port, socket, flags)) { + mysql_server_confl(interp,objc,objv,handle->connection); + closeHandle(handle); + return TCL_ERROR; + } + + if (db) { + strncpy(handle->database, db, MYSQL_NAME_LEN) ; + handle->database[MYSQL_NAME_LEN - 1] = '\0' ; + } + + if (encodingname==NULL || (encodingname!=NULL && strcmp(encodingname, "binary") != 0)) { + if (encodingname==NULL) + encodingname = (char *)Tcl_GetEncodingName(NULL); + handle->encoding = Tcl_GetEncoding(interp, encodingname); + if (handle->encoding == NULL) + return TCL_ERROR; + } + + Tcl_SetObjResult(interp, Tcl_NewHandleObj(statePtr,handle)); + + return TCL_OK; + +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Use + * Implements the mysqluse command: + + * usage: mysqluse handle dbname + * + * results: + * Sets current database to dbname. + */ + +static int Mysqltcl_Use(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int len; + char *db; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle dbname")) == 0) + return TCL_ERROR; + + db=Tcl_GetStringFromObj(objv[2], &len); + if (len >= MYSQL_NAME_LEN) + return mysql_prim_confl(interp,objc,objv,"database name too long") ; + if (mysql_select_db(handle->connection, db) < 0) + return mysql_server_confl(interp,objc,objv,handle->connection) ; + + strcpy(handle->database, db) ; + return TCL_OK; +} + + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Escape + * Implements the mysqlescape command: + * usage: mysqlescape string + * + * results: + * Escaped string for use in queries. + */ + +static int Mysqltcl_Escape(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int len; + char *inString, *outString; + MysqlTclHandle *handle; + + if (objc <2 || objc>3) { + Tcl_WrongNumArgs(interp, 1, objv, "?handle? string"); + return TCL_ERROR; + } + if (objc==2) { + inString=Tcl_GetStringFromObj(objv[1], &len); + outString=Tcl_Alloc((len<<1) + 1); + len=mysql_escape_string(outString, inString, len); + Tcl_SetStringObj(Tcl_GetObjResult(interp), outString, len); + Tcl_Free(outString); + } else { + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle string")) == 0) + return TCL_ERROR; + inString=Tcl_GetStringFromObj(objv[2], &len); + outString=Tcl_Alloc((len<<1) + 1); + len=mysql_real_escape_string(handle->connection, outString, inString, len); + Tcl_SetStringObj(Tcl_GetObjResult(interp), outString, len); + Tcl_Free(outString); + } + return TCL_OK; +} + + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Sel + * Implements the mysqlsel command: + * usage: mysqlsel handle sel-query ?-list|-flatlist? + * + * results: + * + * SIDE EFFECT: Flushes any pending result, even in case of conflict. + * Stores new results. + */ + +static int Mysqltcl_Sel(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + Tcl_Obj *res, *resList; + MYSQL_ROW row; + MysqlTclHandle *handle; + unsigned long *lengths; + + static CONST char* selOptions[] = {"-list", "-flatlist", NULL}; + /* Warning !! no option number */ + int i,selOption=2,colCount; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 4, CL_CONN, + "handle sel-query ?-list|-flatlist?")) == 0) + return TCL_ERROR; + + + if (objc==4) { + if (Tcl_GetIndexFromObj(interp, objv[3], selOptions, "option", + TCL_EXACT, &selOption) != TCL_OK) + return TCL_ERROR; + } + + /* Flush any previous result. */ + if (handle->result != NULL) { + mysql_free_result(handle->result) ; + handle->result = NULL ; + } + + if (mysql_QueryTclObj(handle,objv[2])) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + if (selOption<2) { + /* If imadiatly result than do not store result in mysql client library cache */ + handle->result = mysql_use_result(handle->connection); + } else { + handle->result = mysql_store_result(handle->connection); + } + + if (handle->result == NULL) { + if (selOption==2) Tcl_SetObjResult(interp, Tcl_NewIntObj(-1)); + } else { + colCount = handle->col_count = mysql_num_fields(handle->result); + res = Tcl_GetObjResult(interp); + handle->res_count = 0; + switch (selOption) { + case 0: /* -list */ + while ((row = mysql_fetch_row(handle->result)) != NULL) { + resList = Tcl_NewListObj(0, NULL); + lengths = mysql_fetch_lengths(handle->result); + for (i=0; i< colCount; i++, row++) { + Tcl_ListObjAppendElement(interp, resList,getRowCellAsObject(statePtr,handle,row,lengths[i])); + } + Tcl_ListObjAppendElement(interp, res, resList); + } + break; + case 1: /* -flatlist */ + while ((row = mysql_fetch_row(handle->result)) != NULL) { + lengths = mysql_fetch_lengths(handle->result); + for (i=0; i< colCount; i++, row++) { + Tcl_ListObjAppendElement(interp, res,getRowCellAsObject(statePtr,handle,row,lengths[i])); + } + } + break; + case 2: /* No option */ + handle->res_count = mysql_num_rows(handle->result); + Tcl_SetIntObj(res, handle->res_count); + break; + } + } + return TCL_OK; +} +/* + * Mysqltcl_Query + * Works as mysqltclsel but return an $query handle that allow to build + * nested queries on simple handle + */ + +static int Mysqltcl_Query(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MYSQL_RES *result; + MysqlTclHandle *handle, *qhandle; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle sqlstatement")) == 0) + return TCL_ERROR; + + if (mysql_QueryTclObj(handle,objv[2])) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + + if ((result = mysql_store_result(handle->connection)) == NULL) { + Tcl_SetObjResult(interp, Tcl_NewIntObj(-1)); + return TCL_OK; + } + if ((qhandle = createHandleFrom(statePtr,handle,HT_QUERY)) == NULL) return TCL_ERROR; + qhandle->result = result; + qhandle->col_count = mysql_num_fields(qhandle->result) ; + + qhandle->res_count = mysql_num_rows(qhandle->result); + Tcl_SetObjResult(interp, Tcl_NewHandleObj(statePtr,qhandle)); + return TCL_OK; +} + +/* + * Mysqltcl_Enquery + * close and free a query handle + * if handle is not query than the result will be discarted + */ + +static int Mysqltcl_EndQuery(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + Tcl_HashEntry *entryPtr; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "queryhandle")) == 0) + return TCL_ERROR; + + if (handle->type==HT_QUERY) { + entryPtr = Tcl_FindHashEntry(&statePtr->hash,Tcl_GetStringFromObj(objv[1],NULL)); + if (entryPtr) { + Tcl_DeleteHashEntry(entryPtr); + } + closeHandle(handle); + } else { + if (handle->result != NULL) { + mysql_free_result(handle->result) ; + handle->result = NULL ; + } + } + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Exec + * Implements the mysqlexec command: + * usage: mysqlexec handle sql-statement + * + * Results: + * Number of affected rows on INSERT, UPDATE or DELETE, 0 otherwise. + * + * SIDE EFFECT: Flushes any pending result, even in case of conflict. + */ + + + +static int Mysqltcl_Exec(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int affected; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle sql-statement")) == 0) + return TCL_ERROR; + + /* Flush any previous result. */ + if (handle->result != NULL) { + mysql_free_result(handle->result) ; + handle->result = NULL ; + } + + if (mysql_QueryTclObj(handle,objv[2])) + return mysql_server_confl(interp,objc,objv,handle->connection); + + + if ((affected=mysql_affected_rows(handle->connection)) < 0) affected=0; + Tcl_SetIntObj(Tcl_GetObjResult(interp),affected); + return TCL_OK ; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Fetch + * Implements the mysqlnext command: + + * usage: mysql::fetch handle + * + * results: + * next row from pending results as tcl list, or null list. + */ + +static int Mysqltcl_Fetch(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + int idx ; + MYSQL_ROW row ; + Tcl_Obj *resList; + unsigned long *lengths; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_RES, + "handle")) == 0) + return TCL_ERROR; + + + if (handle->res_count == 0) + return TCL_OK ; + else if ((row = mysql_fetch_row(handle->result)) == NULL) { + handle->res_count = 0 ; + return mysql_prim_confl(interp,objc,objv,"result counter out of sync") ; + } else + handle->res_count-- ; + + lengths = mysql_fetch_lengths(handle->result); + + + resList = Tcl_GetObjResult(interp); + for (idx = 0 ; idx < handle->col_count ; idx++, row++) { + Tcl_ListObjAppendElement(interp, resList,getRowCellAsObject(statePtr,handle,row,lengths[idx])); + } + return TCL_OK; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Seek + * Implements the mysqlseek command: + * usage: mysqlseek handle rownumber + * + * results: + * number of remaining rows + */ + +static int Mysqltcl_Seek(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int row; + int total; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_RES, + " handle row-index")) == 0) + return TCL_ERROR; + + if (Tcl_GetIntFromObj(interp, objv[2], &row) != TCL_OK) + return TCL_ERROR; + + total = mysql_num_rows(handle->result); + + if (total + row < 0) { + mysql_data_seek(handle->result, 0); + + handle->res_count = total; + } else if (row < 0) { + mysql_data_seek(handle->result, total + row); + handle->res_count = -row; + } else if (row >= total) { + mysql_data_seek(handle->result, row); + handle->res_count = 0; + } else { + mysql_data_seek(handle->result, row); + handle->res_count = total - row; + } + + Tcl_SetObjResult(interp, Tcl_NewIntObj(handle->res_count)) ; + return TCL_OK; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Map + * Implements the mysqlmap command: + * usage: mysqlmap handle binding-list script + * + * Results: + * SIDE EFFECT: For each row the column values are bound to the variables + * in the binding list and the script is evaluated. + * The variables are created in the current context. + * NOTE: mysqlmap works very much like a 'foreach' construct. + * The 'continue' and 'break' commands may be used with their usual effect. + */ + +static int Mysqltcl_Map(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + int code ; + int count ; + + MysqlTclHandle *handle; + int idx ; + int listObjc ; + Tcl_Obj** listObjv ; + MYSQL_ROW row ; + int *val; + unsigned long *lengths; + + + if ((handle = mysql_prologue(interp, objc, objv, 4, 4, CL_RES, + "handle binding-list script")) == 0) + return TCL_ERROR; + + if (Tcl_ListObjGetElements(interp, objv[2], &listObjc, &listObjv) != TCL_OK) + return TCL_ERROR ; + + + if (listObjc > handle->col_count) + { + return mysql_prim_confl(interp,objc,objv,"too many variables in binding list") ; + } + else + count = (listObjc < handle->col_count)?listObjc + :handle->col_count ; + + val=(int*)Tcl_Alloc((count * sizeof(int))); + for (idx=0; idxres_count > 0) { + /* Get next row, decrement row counter. */ + if ((row = mysql_fetch_row(handle->result)) == NULL) { + handle->res_count = 0 ; + Tcl_Free((char *)val); + return mysql_prim_confl(interp,objc,objv,"result counter out of sync") ; + } else + handle->res_count-- ; + + /* Bind variables to column values. */ + for (idx = 0; idx < count; idx++, row++) { + lengths = mysql_fetch_lengths(handle->result); + if (val[idx]) { + if (Tcl_ObjSetVar2 (interp, + listObjv[idx], NULL,getRowCellAsObject(statePtr,handle,row,lengths[idx]), + TCL_LEAVE_ERR_MSG) == NULL) { + Tcl_Free((char *)val); + return TCL_ERROR ; + + } + + } + } + + /* Evaluate the script. */ + switch(code=Tcl_EvalObjEx(interp, objv[3],0)) { + case TCL_CONTINUE: + case TCL_OK: + break ; + case TCL_BREAK: + Tcl_Free((char *)val); + return TCL_OK ; + default: + Tcl_Free((char *)val); + return code ; + } + } + Tcl_Free((char *)val); + return TCL_OK ; +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Receive + * Implements the mysqlmap command: + * usage: mysqlmap handle sqlquery binding-list script + * + * The method use internal mysql_use_result that no cache statment on client but + * receive it direct from server + * + * Results: + * SIDE EFFECT: For each row the column values are bound to the variables + * in the binding list and the script is evaluated. + * The variables are created in the current context. + * NOTE: mysqlmap works very much like a 'foreach' construct. + * The 'continue' and 'break' commands may be used with their usual effect. + + */ + +static int Mysqltcl_Receive(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + int code ; + int count ; + + MysqlTclHandle *handle; + int idx ; + int listObjc ; + Tcl_Obj** listObjv ; + MYSQL_ROW row ; + int *val = NULL; + int breakLoop = 0; + unsigned long *lengths; + + + if ((handle = mysql_prologue(interp, objc, objv, 5, 5, CL_CONN, + "handle sqlquery binding-list script")) == 0) + return TCL_ERROR; + + if (Tcl_ListObjGetElements(interp, objv[3], &listObjc, &listObjv) != TCL_OK) + return TCL_ERROR ; + + if (handle->result != NULL) { + mysql_free_result(handle->result) ; + handle->result = NULL ; + } + + if (mysql_QueryTclObj(handle,objv[2])) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + + if ((handle->result = mysql_use_result(handle->connection)) == NULL) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } else { + while ((row = mysql_fetch_row(handle->result))!= NULL) { + if (val==NULL) { + /* first row compute all data */ + handle->col_count = mysql_num_fields(handle->result); + if (listObjc > handle->col_count) { + return mysql_prim_confl(interp,objc,objv,"too many variables in binding list") ; + } else { + count = (listObjc < handle->col_count)?listObjc:handle->col_count ; + } + val=(int*)Tcl_Alloc((count * sizeof(int))); + for (idx=0; idxresult); + + if (val[idx]) { + if (Tcl_ObjSetVar2 (interp, + listObjv[idx], NULL,getRowCellAsObject(statePtr,handle,row,lengths[idx]), + TCL_LEAVE_ERR_MSG) == NULL) { + Tcl_Free((char *)val); + return TCL_ERROR ; + } + } + } + + /* Evaluate the script. */ + switch(code=Tcl_EvalObjEx(interp, objv[4],0)) { + case TCL_CONTINUE: + case TCL_OK: + break ; + case TCL_BREAK: + breakLoop=1; + break; + default: + breakLoop=1; + break; + } + if (breakLoop==1) break; + } + } + if (val!=NULL) { + Tcl_Free((char *)val); + } + /* Read all rest rows that leave in error or break case */ + while ((row = mysql_fetch_row(handle->result))!= NULL); + if (code!=TCL_CONTINUE && code!=TCL_OK && code!=TCL_BREAK) { + return code; + } else { + return mysql_server_confl(interp,objc,objv,handle->connection); + } +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Info + * Implements the mysqlinfo command: + * usage: mysqlinfo handle option + * + + */ + +static int Mysqltcl_Info(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + + int count ; + MysqlTclHandle *handle; + int idx ; + MYSQL_RES* list ; + MYSQL_ROW row ; + const char* val ; + Tcl_Obj *resList; + static CONST char* MysqlDbOpt[] = + { + "dbname", "dbname?", "tables", "host", "host?", "databases", + "info","serverversion","serverversionid","sqlstate",NULL + }; + enum dboption { + MYSQL_INFNAME_OPT, MYSQL_INFNAMEQ_OPT, MYSQL_INFTABLES_OPT, + MYSQL_INFHOST_OPT, MYSQL_INFHOSTQ_OPT, MYSQL_INFLIST_OPT, MYSQL_INFO, + MYSQL_INF_SERVERVERSION,MYSQL_INFO_SERVERVERSION_ID,MYSQL_INFO_SQLSTATE + }; + + /* We can't fully check the handle at this stage. */ + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_PLAIN, + "handle option")) == 0) + return TCL_ERROR; + + if (Tcl_GetIndexFromObj(interp, objv[2], MysqlDbOpt, "option", + TCL_EXACT, &idx) != TCL_OK) + return TCL_ERROR; + + /* First check the handle. Checking depends on the option. */ + switch (idx) { + case MYSQL_INFNAMEQ_OPT: + if ((handle = get_handle(interp,objc,objv,CL_CONN))!=NULL) { + if (handle->database[0] == '\0') + return TCL_OK ; /* Return empty string if no current db. */ + } + break ; + case MYSQL_INFNAME_OPT: + case MYSQL_INFTABLES_OPT: + case MYSQL_INFHOST_OPT: + case MYSQL_INFLIST_OPT: + /* !!! */ + handle = get_handle(interp,objc,objv,CL_CONN); + break; + case MYSQL_INFO: + case MYSQL_INF_SERVERVERSION: + case MYSQL_INFO_SERVERVERSION_ID: + case MYSQL_INFO_SQLSTATE: + break; + case MYSQL_INFHOSTQ_OPT: + if (handle->connection == 0) + return TCL_OK ; /* Return empty string if not connected. */ + break; + default: /* should never happen */ + return mysql_prim_confl(interp,objc,objv,"weirdness in Mysqltcl_Info") ; + } + + if (handle == 0) return TCL_ERROR ; + + /* Handle OK, return the requested info. */ + switch (idx) { + case MYSQL_INFNAME_OPT: + case MYSQL_INFNAMEQ_OPT: + Tcl_SetObjResult(interp, Tcl_NewStringObj(handle->database, -1)); + break ; + case MYSQL_INFTABLES_OPT: + if ((list = mysql_list_tables(handle->connection,(char*)NULL)) == NULL) + return mysql_server_confl(interp,objc,objv,handle->connection); + + resList = Tcl_GetObjResult(interp); + for (count = mysql_num_rows(list); count > 0; count--) { + val = *(row = mysql_fetch_row(list)) ; + Tcl_ListObjAppendElement(interp, resList, Tcl_NewStringObj((val == NULL)?"":val,-1)); + } + mysql_free_result(list) ; + break ; + case MYSQL_INFHOST_OPT: + case MYSQL_INFHOSTQ_OPT: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_get_host_info(handle->connection), -1)); + break ; + case MYSQL_INFLIST_OPT: + if ((list = mysql_list_dbs(handle->connection,(char*)NULL)) == NULL) + return mysql_server_confl(interp,objc,objv,handle->connection); + + resList = Tcl_GetObjResult(interp); + for (count = mysql_num_rows(list); count > 0; count--) { + val = *(row = mysql_fetch_row(list)) ; + Tcl_ListObjAppendElement(interp, resList, + Tcl_NewStringObj((val == NULL)?"":val,-1)); + } + mysql_free_result(list) ; + break ; + case MYSQL_INFO: + val = mysql_info(handle->connection); + if (val!=NULL) { + Tcl_SetObjResult(interp, Tcl_NewStringObj(val,-1)); + } + break; + case MYSQL_INF_SERVERVERSION: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_get_server_info(handle->connection),-1)); + break; + case MYSQL_INFO_SERVERVERSION_ID: + Tcl_SetObjResult(interp, Tcl_NewIntObj(mysql_get_server_version(handle->connection))); + break; + case MYSQL_INFO_SQLSTATE: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_sqlstate(handle->connection),-1)); + break; + default: /* should never happen */ + return mysql_prim_confl(interp,objc,objv,"weirdness in Mysqltcl_Info") ; + } + + return TCL_OK ; +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_BaseInfo + * Implements the mysqlinfo command: + * usage: mysqlbaseinfo option + * + */ + +static int Mysqltcl_BaseInfo(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int idx ; + Tcl_Obj *resList; + char **option; + static CONST char* MysqlInfoOpt[] = + { + "connectparameters", "clientversion","clientversionid", NULL + }; + enum baseoption { + MYSQL_BINFO_CONNECT, MYSQL_BINFO_CLIENTVERSION,MYSQL_BINFO_CLIENTVERSIONID + }; + + if (objc <2) { + Tcl_WrongNumArgs(interp, 1, objv, "connectparameters | clientversion"); + + return TCL_ERROR; + } + if (Tcl_GetIndexFromObj(interp, objv[1], MysqlInfoOpt, "option", + TCL_EXACT, &idx) != TCL_OK) + return TCL_ERROR; + + /* First check the handle. Checking depends on the option. */ + switch (idx) { + case MYSQL_BINFO_CONNECT: + option = (char **)MysqlConnectOpt; + resList = Tcl_NewListObj(0, NULL); + + while (*option!=NULL) { + Tcl_ListObjAppendElement(interp, resList, Tcl_NewStringObj(*option,-1)); + option++; + } + Tcl_SetObjResult(interp, resList); + break ; + case MYSQL_BINFO_CLIENTVERSION: + Tcl_SetObjResult(interp, Tcl_NewStringObj(mysql_get_client_info(),-1)); + break; + case MYSQL_BINFO_CLIENTVERSIONID: + Tcl_SetObjResult(interp, Tcl_NewIntObj(mysql_get_client_version())); + break; + } + return TCL_OK ; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Result + + * Implements the mysqlresult command: + * usage: mysqlresult handle option + * + */ + +static int Mysqltcl_Result(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int idx ; + MysqlTclHandle *handle; + static CONST char* MysqlResultOpt[] = + { + "rows", "rows?", "cols", "cols?", "current", "current?", NULL + }; + enum resultoption { + MYSQL_RESROWS_OPT, MYSQL_RESROWSQ_OPT, MYSQL_RESCOLS_OPT, + MYSQL_RESCOLSQ_OPT, MYSQL_RESCUR_OPT, MYSQL_RESCURQ_OPT + }; + /* We can't fully check the handle at this stage. */ + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_PLAIN, + " handle option")) == 0) + + return TCL_ERROR; + + if (Tcl_GetIndexFromObj(interp, objv[2], MysqlResultOpt, "option", + TCL_EXACT, &idx) != TCL_OK) + return TCL_ERROR; + + /* First check the handle. Checking depends on the option. */ + switch (idx) { + case MYSQL_RESROWS_OPT: + case MYSQL_RESCOLS_OPT: + case MYSQL_RESCUR_OPT: + handle = get_handle(interp,objc,objv,CL_RES) ; + break ; + case MYSQL_RESROWSQ_OPT: + case MYSQL_RESCOLSQ_OPT: + case MYSQL_RESCURQ_OPT: + if ((handle = get_handle(interp,objc,objv,CL_RES))== NULL) + return TCL_OK ; /* Return empty string if no pending result. */ + break ; + default: /* should never happen */ + return mysql_prim_confl(interp,objc,objv,"weirdness in Mysqltcl_Result") ; + } + + + if (handle == 0) + return TCL_ERROR ; + + /* Handle OK; return requested info. */ + switch (idx) { + case MYSQL_RESROWS_OPT: + case MYSQL_RESROWSQ_OPT: + Tcl_SetObjResult(interp, Tcl_NewIntObj(handle->res_count)); + break ; + case MYSQL_RESCOLS_OPT: + case MYSQL_RESCOLSQ_OPT: + Tcl_SetObjResult(interp, Tcl_NewIntObj(handle->col_count)); + break ; + case MYSQL_RESCUR_OPT: + case MYSQL_RESCURQ_OPT: + Tcl_SetObjResult(interp, + Tcl_NewIntObj(mysql_num_rows(handle->result) + - handle->res_count)) ; + break ; + default: + return mysql_prim_confl(interp,objc,objv,"weirdness in Mysqltcl_Result"); + } + return TCL_OK ; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Col + + * Implements the mysqlcol command: + * usage: mysqlcol handle table-name option ?option ...? + * mysqlcol handle -current option ?option ...? + * '-current' can only be used if there is a pending result. + * + * results: + * List of lists containing column attributes. + * If a single attribute is requested the result is a simple list. + * + * SIDE EFFECT: '-current' disturbs the field position of the result. + */ + +static int Mysqltcl_Col(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int coln ; + int current_db ; + MysqlTclHandle *handle; + int idx ; + int listObjc ; + Tcl_Obj **listObjv, *colinfo, *resList, *resSubList; + MYSQL_FIELD* fld ; + MYSQL_RES* result ; + char *argv ; + + /* This check is enough only without '-current'. */ + if ((handle = mysql_prologue(interp, objc, objv, 4, 99, CL_CONN, + "handle table-name option ?option ...?")) == 0) + return TCL_ERROR; + + /* Fetch column info. + * Two ways: explicit database and table names, or current. + */ + argv=Tcl_GetStringFromObj(objv[2],NULL); + current_db = strcmp(argv, "-current") == 0; + + if (current_db) { + if ((handle = get_handle(interp,objc,objv,CL_RES)) == 0) + return TCL_ERROR ; + else + result = handle->result ; + } else { + if ((result = mysql_list_fields(handle->connection, argv, (char*)NULL)) == NULL) { + return mysql_server_confl(interp,objc,objv,handle->connection) ; + } + } + /* Must examine the first specifier at this point. */ + if (Tcl_ListObjGetElements(interp, objv[3], &listObjc, &listObjv) != TCL_OK) + return TCL_ERROR ; + resList = Tcl_GetObjResult(interp); + if (objc == 4 && listObjc == 1) { + mysql_field_seek(result, 0) ; + while ((fld = mysql_fetch_field(result)) != NULL) + if ((colinfo = mysql_colinfo(interp,objc,objv,fld, objv[3])) != NULL) { + Tcl_ListObjAppendElement(interp, resList, colinfo); + } else { + goto conflict; + } + } else if (objc == 4 && listObjc > 1) { + mysql_field_seek(result, 0) ; + while ((fld = mysql_fetch_field(result)) != NULL) { + resSubList = Tcl_NewListObj(0, NULL); + for (coln = 0; coln < listObjc; coln++) + if ((colinfo = mysql_colinfo(interp,objc,objv,fld, listObjv[coln])) != NULL) { + Tcl_ListObjAppendElement(interp, resSubList, colinfo); + } else { + + goto conflict; + } + Tcl_ListObjAppendElement(interp, resList, resSubList); + } + } else { + for (idx = 3; idx < objc; idx++) { + resSubList = Tcl_NewListObj(0, NULL); + mysql_field_seek(result, 0) ; + while ((fld = mysql_fetch_field(result)) != NULL) + if ((colinfo = mysql_colinfo(interp,objc,objv,fld, objv[idx])) != NULL) { + Tcl_ListObjAppendElement(interp, resSubList, colinfo); + } else { + goto conflict; + } + Tcl_ListObjAppendElement(interp, resList, resSubList); + } + } + if (!current_db) mysql_free_result(result) ; + return TCL_OK; + + conflict: + if (!current_db) mysql_free_result(result) ; + return TCL_ERROR; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_State + * Implements the mysqlstate command: + * usage: mysqlstate handle ?-numeric? + * + */ + +static int Mysqltcl_State(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int numeric=0 ; + Tcl_Obj *res; + + if (objc!=2 && objc!=3) + Tcl_WrongNumArgs(interp, 1, objv, "handle ?-numeric"); + + if (objc==3) { + if (strcmp(Tcl_GetStringFromObj(objv[2],NULL), "-numeric")) + return mysql_prim_confl(interp,objc,objv,"last parameter should be -numeric"); + else + numeric=1; + } + + if (GetHandleFromObj(interp, objv[1], &handle) != TCL_OK) + res = (numeric)?Tcl_NewIntObj(0):Tcl_NewStringObj("NOT_A_HANDLE",-1); + else if (handle->connection == 0) + res = (numeric)?Tcl_NewIntObj(1):Tcl_NewStringObj("UNCONNECTED",-1); + else if (handle->database[0] == '\0') + res = (numeric)?Tcl_NewIntObj(2):Tcl_NewStringObj("CONNECTED",-1); + else if (handle->result == NULL) + res = (numeric)?Tcl_NewIntObj(3):Tcl_NewStringObj("IN_USE",-1); + else + res = (numeric)?Tcl_NewIntObj(4):Tcl_NewStringObj("RESULT_PENDING",-1); + + Tcl_SetObjResult(interp, res); + return TCL_OK ; +} + + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_InsertId + * Implements the mysqlstate command: + * usage: mysqlinsertid handle + * Returns the auto increment id of the last INSERT statement + * + */ + +static int Mysqltcl_InsertId(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + + Tcl_SetObjResult(interp, Tcl_NewIntObj(mysql_insert_id(handle->connection))); + + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Ping + * usage: mysqlping handle + * It can be used to check and refresh (reconnect after time out) the connection + * Returns 0 if connection is OK + */ + +static int Mysqltcl_Ping(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + + Tcl_SetObjResult(interp, Tcl_NewBooleanObj(mysql_ping(handle->connection)==0)); + + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_ChangeUser + * usage: mysqlchangeuser handle user password database + * return TCL_ERROR if operation failed + */ + +static int Mysqltcl_ChangeUser(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + char *user,*password,*database=NULL; + + if ((handle = mysql_prologue(interp, objc, objv, 4, 5, CL_CONN, + "handle user password ?database?")) == 0) + return TCL_ERROR; + + user = Tcl_GetStringFromObj(objv[2],NULL); + password = Tcl_GetStringFromObj(objv[3],NULL); + if (objc==5) { + database = Tcl_GetStringFromObj(objv[4],NULL); + + } + if (mysql_change_user(handle->connection, user, password, database)!=0) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_AutoCommit + * usage: mysql::autocommit bool + * set autocommit mode + */ + +static int Mysqltcl_AutoCommit(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int isAutocommit = 0; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle bool")) == 0) + return TCL_ERROR; + if (Tcl_GetBooleanFromObj(interp,objv[2],&isAutocommit) != TCL_OK ) + return TCL_ERROR; + if (mysql_autocommit(handle->connection, isAutocommit)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Commit + * usage: mysql::commit + * + */ + +static int Mysqltcl_Commit(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + if (mysql_commit(handle->connection)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Rollback + * usage: mysql::rollback + * + */ + +static int Mysqltcl_Rollback(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + if (mysql_rollback(handle->connection)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_MoreResult + * usage: mysql::moreresult handle + * return true if more results exists + */ + +static int Mysqltcl_MoreResult(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int boolResult = 0; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_RES, + "handle")) == 0) + return TCL_ERROR; + boolResult = mysql_more_results(handle->connection); + Tcl_SetObjResult(interp,Tcl_NewBooleanObj(boolResult)); + return TCL_OK; +} +/* + + *---------------------------------------------------------------------- + * + * Mysqltcl_NextResult + * usage: mysql::nextresult + * + * return nummber of rows in result set. 0 if no next result + */ + +static int Mysqltcl_NextResult(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int result = 0; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_RES, + "handle")) == 0) + return TCL_ERROR; + if (handle->result != NULL) { + + mysql_free_result(handle->result) ; + handle->result = NULL ; + } + result = mysql_next_result(handle->connection); + if (result==0) { + Tcl_SetObjResult(interp, Tcl_NewIntObj(0)); + return TCL_OK; + } + if (result<0) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + handle->result = mysql_store_result(handle->connection); + if (handle->result == NULL) { + Tcl_SetObjResult(interp, Tcl_NewIntObj(-1)); + } else { + handle->res_count = mysql_num_rows(handle->result); + Tcl_SetObjResult(interp, Tcl_NewIntObj(handle->res_count)); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_WarningCount + * usage: mysql::warningcount + * + */ + +static int Mysqltcl_WarningCount(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int count = 0; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + count = mysql_warning_count(handle->connection); + Tcl_SetObjResult(interp,Tcl_NewIntObj(count)); + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_IsNull + * usage: mysql::isnull value + * + */ + +static int Mysqltcl_IsNull(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + int boolResult = 0; + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "value"); + return TCL_ERROR; + } + boolResult = objv[1]->typePtr == &mysqlNullType; + Tcl_SetObjResult(interp,Tcl_NewBooleanObj(boolResult)); + return TCL_OK; + + return TCL_OK; +} +/* + * Create new Mysql NullObject + * (similar to Tcl API for example Tcl_NewIntObj) + */ +static Tcl_Obj *Mysqltcl_NewNullObj(MysqltclState *mysqltclState) { + Tcl_Obj *objPtr; + objPtr = Tcl_NewObj(); + objPtr->bytes = NULL; + objPtr->typePtr = &mysqlNullType; + objPtr->internalRep.otherValuePtr = mysqltclState; + return objPtr; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_NewNull + * usage: mysql::newnull + * + */ + +static int Mysqltcl_NewNull(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + Tcl_Obj *objPtr; + if (objc != 1) { + Tcl_WrongNumArgs(interp, 1, objv, ""); + return TCL_ERROR; + } + Tcl_SetObjResult(interp,Mysqltcl_NewNullObj((MysqltclState *)clientData)); + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_SetServerOption + * usage: mysql::setserveroption (- + * + */ +static CONST char* MysqlServerOpt[] = + { + "-multi_statment_on", "-multi_statment_off",NULL + }; + +static int Mysqltcl_SetServerOption(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int idx; + enum enum_mysql_set_option mysqlServerOption; + + enum serveroption { + MYSQL_MSTATMENT_ON_SOPT, MYSQL_MSTATMENT_OFF_SOPT + }; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle option")) == 0) + return TCL_ERROR; + + if (Tcl_GetIndexFromObj(interp, objv[2], MysqlServerOpt, "option", + 0, &idx) != TCL_OK) + return TCL_ERROR; + + switch (idx) { + case MYSQL_MSTATMENT_ON_SOPT: + mysqlServerOption = MYSQL_OPTION_MULTI_STATEMENTS_ON; + break; + case MYSQL_MSTATMENT_OFF_SOPT: + mysqlServerOption = MYSQL_OPTION_MULTI_STATEMENTS_OFF; + break; + default: + return mysql_prim_confl(interp,objc,objv,"Weirdness in server options"); + } + if (mysql_set_server_option(handle->connection,mysqlServerOption)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_ShutDown + * usage: mysql::shutdown handle + * + */ +static int Mysqltcl_ShutDown(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqlTclHandle *handle; + int idx; + enum enum_mysql_set_option mysqlServerOption; + + enum serveroption { + MYSQL_MSTATMENT_ON_SOPT, MYSQL_MSTATMENT_OFF_SOPT + }; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "handle")) == 0) + return TCL_ERROR; + + if (mysql_shutdown(handle->connection,SHUTDOWN_DEFAULT)!=0) { + mysql_server_confl(interp,objc,objv,handle->connection); + } + return TCL_OK; +} +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Close -- + * Implements the mysqlclose command: + * usage: mysqlclose ?handle? + * + * results: + * null string + */ + +static int Mysqltcl_Close(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle,*thandle; + Tcl_HashEntry *entryPtr; + Tcl_HashEntry *qentries[16]; + Tcl_HashSearch search; + + int i,qfound = 0; + + + /* If handle omitted, close all connections. */ + if (objc == 1) { + Mysqltcl_CloseAll(clientData) ; + return TCL_OK ; + } + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "?handle?")) == 0) + return TCL_ERROR; + + + /* Search all queries and statements on this handle and close those */ + if (handle->type==HT_CONNECTION) { + while (1) { + for (entryPtr=Tcl_FirstHashEntry(&statePtr->hash,&search); + entryPtr!=NULL; + entryPtr=Tcl_NextHashEntry(&search)) { + + thandle=(MysqlTclHandle *)Tcl_GetHashValue(entryPtr); + if (thandle->connection == handle->connection && + thandle->type!=HT_CONNECTION) { + qentries[qfound++] = entryPtr; + } + if (qfound==16) break; + } + if (qfound>0) { + for(i=0;ihash,Tcl_GetStringFromObj(objv[1],NULL)); + if (entryPtr) Tcl_DeleteHashEntry(entryPtr); + closeHandle(handle); + return TCL_OK; +} + +#ifdef PREPARED_STATEMENT +/* + *---------------------------------------------------------------------- + * + * Mysqltcl_Prepare -- + * Implements the mysql::prepare command: + * usage: mysql::prepare handle statements + * + * results: + * prepared statment handle + */ + +static int Mysqltcl_Prepare(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + MysqlTclHandle *shandle; + MYSQL_STMT *statement; + char *query; + int queryLen; + int resultColumns; + int paramCount; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle sql-statement")) == 0) + return TCL_ERROR; + + statement = mysql_stmt_init(handle->connection); + if (statement==NULL) { + return TCL_ERROR; + } + query = (char *)Tcl_GetByteArrayFromObj(objv[2], &queryLen); + if (mysql_stmt_prepare(statement,query,queryLen)) { + mysql_stmt_close(statement); + return mysql_server_confl(interp,objc,objv,handle->connection); + } + if ((shandle = createHandleFrom(statePtr,handle,HT_STATEMENT)) == NULL) return TCL_ERROR; + shandle->statement=statement; + shandle->resultMetadata = mysql_stmt_result_metadata(statement); + shandle->paramMetadata = mysql_stmt_param_metadata(statement); + /* set result bind memory */ + resultColumns = mysql_stmt_field_count(statement); + if (resultColumns>0) { + shandle->bindResult = (MYSQL_BIND *)Tcl_Alloc(sizeof(MYSQL_BIND)*resultColumns); + memset(shandle->bindResult,0,sizeof(MYSQL_BIND)*resultColumns); + } + paramCount = mysql_stmt_param_count(statement); + if (resultColumns>0) { + shandle->bindParam = (MYSQL_BIND *)Tcl_Alloc(sizeof(MYSQL_BIND)*paramCount); + memset(shandle->bindParam,0,sizeof(MYSQL_BIND)*paramCount); + } + Tcl_SetObjResult(interp, Tcl_NewHandleObj(statePtr,shandle)); + return TCL_OK; +} +static int Mysqltcl_ParamMetaData(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + MYSQL_RES *res; + MYSQL_ROW row; + Tcl_Obj *colinfo,*resObj; + unsigned long *lengths; + int i; + int colCount; + MYSQL_FIELD* fld; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "statement-handle")) == 0) + return TCL_ERROR; + if(handle->type!=HT_STATEMENT) + return TCL_ERROR; + + resObj = Tcl_GetObjResult(interp); + printf("statement %p count %d\n",handle->statement,mysql_stmt_param_count(handle->statement)); + res = mysql_stmt_result_metadata(handle->statement); + printf("res %p\n",res); + if(res==NULL) + return TCL_ERROR; + + mysql_field_seek(res, 0) ; + while ((fld = mysql_fetch_field(res)) != NULL) { + if ((colinfo = mysql_colinfo(interp,objc,objv,fld, objv[2])) != NULL) { + Tcl_ListObjAppendElement(interp, resObj, colinfo); + } else { + goto conflict; + } + } + conflict: + + mysql_free_result(res); + return TCL_OK; +} +/*---------------------------------------------------------------------- + * + * Mysqltcl_PSelect -- + * Implements the mysql::pselect command: + * usage: mysql::pselect $statement_handle ?arguments...? + * + * results: + * number of returned rows + */ + +static int Mysqltcl_PSelect(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle sql-statement")) == 0) + return TCL_ERROR; + if (handle->type!=HT_STATEMENT) { + return TCL_ERROR; + } + mysql_stmt_reset(handle->statement); + if (mysql_stmt_execute(handle->statement)) { + return mysql_server_confl(interp,objc,objv,handle->connection); + } + mysql_stmt_bind_result(handle->statement, handle->bindResult); + mysql_stmt_store_result(handle->statement); + return TCL_OK; +} +/*---------------------------------------------------------------------- + * + * Mysqltcl_PFetch -- + * Implements the mysql::pfetch command: + * usage: mysql::pfetch $statement_handle + * + * results: + * number of returned rows + */ + +static int Mysqltcl_PFetch(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 2, 2, CL_CONN, + "prep-stat-handle")) == 0) + return TCL_ERROR; + if (handle->type!=HT_STATEMENT) { + return TCL_ERROR; + } + + return TCL_OK; +} +/*---------------------------------------------------------------------- + * + * Mysqltcl_PExecute -- + * Implements the mysql::pexecute command: + * usage: mysql::pexecute statement-handle ?arguments...? + * + * results: + * number of effected rows + */ + +static int Mysqltcl_PExecute(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) +{ + MysqltclState *statePtr = (MysqltclState *)clientData; + MysqlTclHandle *handle; + + if ((handle = mysql_prologue(interp, objc, objv, 3, 3, CL_CONN, + "handle sql-statement")) == 0) + return TCL_ERROR; + if (handle->type!=HT_STATEMENT) { + return TCL_ERROR; + } + mysql_stmt_reset(handle->statement); + + if (mysql_stmt_param_count(handle->statement)!=0) { + Tcl_SetStringObj(Tcl_GetObjResult(interp),"works only for 0 params",-1); + return TCL_ERROR; + } + if (mysql_stmt_execute(handle->statement)) + { + Tcl_SetStringObj(Tcl_GetObjResult(interp),mysql_stmt_error(handle->statement),-1); + return TCL_ERROR; + } + return TCL_OK; +} +#endif + +/* + *---------------------------------------------------------------------- + * Mysqltcl_Init + * Perform all initialization for the MYSQL to Tcl interface. + * Adds additional commands to interp, creates message array, initializes + * all handles. + * + * A call to Mysqltcl_Init should exist in Tcl_CreateInterp or + * Tcl_CreateExtendedInterp. + + */ + + +#ifdef _WINDOWS +__declspec( dllexport ) +#endif +int Mysqltcl_Init(interp) + Tcl_Interp *interp; +{ + char nbuf[MYSQL_SMALL_SIZE]; + MysqltclState *statePtr; + + if (Tcl_InitStubs(interp, "8.1", 0) == NULL) + return TCL_ERROR; + if (Tcl_PkgRequire(interp, "Tcl", "8.1", 0) == NULL) + return TCL_ERROR; + if (Tcl_PkgProvide(interp, "mysqltcl" , VERSION) != TCL_OK) + return TCL_ERROR; + /* + * Initialize the new Tcl commands. + * Deleting any command will close all connections. + */ + statePtr = (MysqltclState*)Tcl_Alloc(sizeof(MysqltclState)); + Tcl_InitHashTable(&statePtr->hash, TCL_STRING_KEYS); + statePtr->handleNum = 0; + + Tcl_CreateObjCommand(interp,"mysqlconnect",Mysqltcl_Connect,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqluse", Mysqltcl_Use,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlescape", Mysqltcl_Escape,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlsel", Mysqltcl_Sel,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlnext", Mysqltcl_Fetch,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlseek", Mysqltcl_Seek,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlmap", Mysqltcl_Map,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlexec", Mysqltcl_Exec,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlclose", Mysqltcl_Close,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlinfo", Mysqltcl_Info,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlresult", Mysqltcl_Result,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlcol", Mysqltcl_Col,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlstate", Mysqltcl_State,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlinsertid", Mysqltcl_InsertId,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlquery", Mysqltcl_Query,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlendquery", Mysqltcl_EndQuery,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlbaseinfo", Mysqltcl_BaseInfo,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlping", Mysqltcl_Ping,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlchangeuser", Mysqltcl_ChangeUser,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"mysqlreceive", Mysqltcl_Receive,(ClientData)statePtr, NULL); + + Tcl_CreateObjCommand(interp,"::mysql::connect",Mysqltcl_Connect,(ClientData)statePtr, Mysqltcl_Kill); + Tcl_CreateObjCommand(interp,"::mysql::use", Mysqltcl_Use,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::escape", Mysqltcl_Escape,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::sel", Mysqltcl_Sel,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::fetch", Mysqltcl_Fetch,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::seek", Mysqltcl_Seek,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::map", Mysqltcl_Map,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::exec", Mysqltcl_Exec,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::close", Mysqltcl_Close,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::info", Mysqltcl_Info,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::result", Mysqltcl_Result,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::col", Mysqltcl_Col,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::state", Mysqltcl_State,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::insertid", Mysqltcl_InsertId,(ClientData)statePtr, NULL); + /* new in mysqltcl 2.0 */ + Tcl_CreateObjCommand(interp,"::mysql::query", Mysqltcl_Query,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::endquery", Mysqltcl_EndQuery,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::baseinfo", Mysqltcl_BaseInfo,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::ping", Mysqltcl_Ping,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::changeuser", Mysqltcl_ChangeUser,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::receive", Mysqltcl_Receive,(ClientData)statePtr, NULL); + /* new in mysqltcl 3.0 */ + Tcl_CreateObjCommand(interp,"::mysql::autocommit", Mysqltcl_AutoCommit,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::commit", Mysqltcl_Commit,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::rollback", Mysqltcl_Rollback,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::nextresult", Mysqltcl_NextResult,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::moreresult", Mysqltcl_MoreResult,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::warningcount", Mysqltcl_WarningCount,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::isnull", Mysqltcl_IsNull,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::newnull", Mysqltcl_NewNull,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::setserveroption", Mysqltcl_SetServerOption,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::shutdown", Mysqltcl_ShutDown,(ClientData)statePtr, NULL); + /* prepared statements */ + +#ifdef PREPARED_STATEMENT + Tcl_CreateObjCommand(interp,"::mysql::prepare", Mysqltcl_Prepare,(ClientData)statePtr, NULL); + // Tcl_CreateObjCommand(interp,"::mysql::parammetadata", Mysqltcl_ParamMetaData,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::pselect", Mysqltcl_PSelect,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::pselect", Mysqltcl_PFetch,(ClientData)statePtr, NULL); + Tcl_CreateObjCommand(interp,"::mysql::pexecute", Mysqltcl_PExecute,(ClientData)statePtr, NULL); +#endif + + + /* Initialize mysqlstatus global array. */ + + clear_msg(interp); + + /* Link the null value element to the corresponding C variable. */ + if ((statePtr->MysqlNullvalue = Tcl_Alloc (12)) == NULL) return TCL_ERROR; + strcpy (statePtr->MysqlNullvalue, MYSQL_NULLV_INIT); + sprintf (nbuf, "%s(%s)", MYSQL_STATUS_ARR, MYSQL_STATUS_NULLV); + + /* set null object in mysqltcl state */ + /* statePtr->nullObjPtr = Mysqltcl_NewNullObj(statePtr); */ + + if (Tcl_LinkVar(interp,nbuf,(char *)&statePtr->MysqlNullvalue, TCL_LINK_STRING) != TCL_OK) + return TCL_ERROR; + + /* Register the handle object type */ + Tcl_RegisterObjType(&mysqlHandleType); + /* Register own null type object */ + Tcl_RegisterObjType(&mysqlNullType); + + /* A little sanity check. + * If this message appears you must change the source code and recompile. + */ + if (strlen(MysqlHandlePrefix) == MYSQL_HPREFIX_LEN) + return TCL_OK; + else { + panic("*** mysqltcl (mysqltcl.c): handle prefix inconsistency!\n"); + return TCL_ERROR ; + } +} + +#ifdef _WINDOWS +__declspec( dllexport ) +#endif +int Mysqltcl_SafeInit(interp) + Tcl_Interp *interp; +{ + return Mysqltcl_Init(interp); +} diff --git a/tclconfig/install-sh b/tclconfig/install-sh new file mode 100755 index 0000000..0ff4b6a --- /dev/null +++ b/tclconfig/install-sh @@ -0,0 +1,119 @@ +#!/bin/sh + +# +# install - install a program, script, or datafile +# This comes from X11R5; it is not part of GNU. +# +# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" + +instcmd="$mvprog" +chmodcmd="" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +fi + +if [ x"$dst" = x ] +then + echo "install: no destination specified" + exit 1 +fi + + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + +if [ -d $dst ] +then + dst="$dst"/`basename $src` +fi + +# Make a temp file name in the proper directory. + +dstdir=`dirname $dst` +dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + +$doit $instcmd $src $dsttmp + +# and set any options; do chmod last to preserve setuid bits + +if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi +if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi +if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi +if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi + +# Now rename the file to the real destination. + +$doit $rmcmd $dst +$doit $mvcmd $dsttmp $dst + + +exit 0 diff --git a/tclconfig/tcl.m4 b/tclconfig/tcl.m4 new file mode 100644 index 0000000..c271e6a --- /dev/null +++ b/tclconfig/tcl.m4 @@ -0,0 +1,3356 @@ +# 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-2003 ActiveState Corporation. +# +# See the file "license.terms" for information on usage and redistribution +# of this file, and for a DISCLAIMER OF ALL WARRANTIES. + +#------------------------------------------------------------------------ +# 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, [ + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + AC_MSG_ERROR([Must call TEA INIT before PATH_TCLCONFIG]) + fi + # + # 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, [ --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 + 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]]* 2>/dev/null` \ + ../../tcl \ + `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tcl \ + `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -f "$i/unix/tclConfig.sh" ; then + ac_cv_c_tclconfig=`(cd $i/unix; 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 ${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` \ + ; 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]]* 2>/dev/null` ; do + 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_WARN("Cannot find Tcl configuration definitions") + exit 0 + 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, [ --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 + 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]]* 2>/dev/null` \ + ../../tk \ + `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../tk \ + `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do + if test -f "$i/unix/tkConfig.sh" ; then + ac_cv_c_tkconfig=`(cd $i/unix; 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 ${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` \ + ; 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]]* 2>/dev/null` ; do + 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_WARN("Cannot find Tk configuration definitions") + exit 0 + 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: +# +# Subst 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([file not found]) + fi + + # + # 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} + fi + + # + # eval is required to do the TCL_DBGX substitution + # + + eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" + eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" + eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" + + eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" + 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_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_SUBST(TCL_DBGX) + AC_SUBST(TCL_LIBS) + AC_SUBST(TCL_DEFS) + AC_SUBST(TCL_EXTRA_CFLAGS) + AC_SUBST(TCL_LD_FLAGS) + AC_SUBST(TCL_SHLIB_LD_LIBS) + #AC_SUBST(TCL_BUILD_LIB_SPEC) + #AC_SUBST(TCL_BUILD_STUB_LIB_SPEC) +]) + +#------------------------------------------------------------------------ +# 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 + + # + # 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} + fi + + # + # eval is required to do the TK_DBGX substitution + # + + eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" + eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" + eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" + + eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" + eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" + eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" + + 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) + + AC_SUBST(TK_LIBS) + AC_SUBST(TK_XINCLUDES) +]) + +#------------------------------------------------------------------------ +# 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, + [ --enable-shared build and link with shared libraries [--enable-shared]], + [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) + 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. +# +# 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 +# +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_ENABLE_THREADS, [ + AC_ARG_ENABLE(threads, [ --enable-threads build with threads], + [tcl_ok=$enableval], [tcl_ok=$1]) + + if test "$tcl_ok" = "yes"; then + TCL_THREADS=1 + + if test "${TEA_PLATFORM}" != "windows" ; then + # We are always OK on Windows, so check what this platform wants. + AC_DEFINE(USE_THREAD_ALLOC) + AC_DEFINE(_REENTRANT) + AC_DEFINE(_THREAD_SAFE) + 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("Don t know how to find pthread lib on your system - thread support disabled") + fi + fi + fi + fi + + # Does the pthread-implementation provide + # 'pthread_attr_setstacksize' ? + + ac_saved_libs=$LIBS + LIBS="$LIBS $THREADS_LIBS" + AC_CHECK_FUNCS(pthread_attr_setstacksize) + LIBS=$ac_saved_libs + AC_CHECK_FUNCS(readdir_r) + 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) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no (default)]) + 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} without threads enabled, but building against a Tcl + that IS thread-enabled.]) + fi + ;; + *) + if test "${TCL_THREADS}" = "1"; then + AC_MSG_WARN([ + --enable-threads requested, but attempting building against a Tcl + that is NOT thread-enabled.]) + 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 +# +# Requires the following vars to be set: +# CFLAGS_DEBUG +# CFLAGS_OPTIMIZE +# LDFLAGS_DEBUG +# LDFLAGS_OPTIMIZE +# +# 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 if false +# LDFLAGS_DEFAULT Sets to LDFLAGS_DEBUG if true +# Sets to LDFLAGS_OPTIMIZE if false +# DBGX Debug library extension +# +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_ENABLE_SYMBOLS, [ + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + AC_MSG_ERROR([Must call TEA INIT before ENABLE_SYMBOLS]) + fi + + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_dbgx=d + else + tcl_dbgx=g + fi + + AC_MSG_CHECKING([for build with symbols]) + AC_ARG_ENABLE(symbols, [ --enable-symbols build with debugging symbols [--disable-symbols]], [tcl_ok=$enableval], [tcl_ok=no]) + if test "$tcl_ok" = "no"; then + CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)' + LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)' + DBGX="" + TCL_DBGX="" + AC_MSG_RESULT([no]) + else + CFLAGS_DEFAULT='$(CFLAGS_DEBUG)' + LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)' + DBGX=${tcl_dbgx} + TCL_DBGX=${tcl_dbgx} + if test "$tcl_ok" = "yes"; then + AC_MSG_RESULT([yes (standard debugging)]) + fi + fi + + AC_SUBST(TCL_DBGX) + AC_SUBST(CFLAGS_DEFAULT) + AC_SUBST(LDFLAGS_DEFAULT) + + if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then + AC_DEFINE(TCL_MEM_DEBUG) + 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, + [ --enable-langinfo use nl_langinfo if possible to determine + encoding at startup, otherwise use old heuristic], + [langinfo_ok=$enableval], [langinfo_ok=yes]) + + HAVE_LANGINFO=0 + if test "$langinfo_ok" = "yes"; then + if test "$langinfo_ok" = "yes"; then + AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) + fi + fi + AC_MSG_CHECKING([whether to use nl_langinfo]) + if test "$langinfo_ok" = "yes"; then + AC_TRY_COMPILE([#include ], + [nl_langinfo(CODESET);],[langinfo_ok=yes],[langinfo_ok=no]) + if test "$langinfo_ok" = "no"; then + langinfo_ok="no (could not compile with nl_langinfo)"; + fi + if test "$langinfo_ok" = "yes"; then + AC_DEFINE(HAVE_LANGINFO) + fi + fi + AC_MSG_RESULT([$langinfo_ok]) +]) + +#-------------------------------------------------------------------- +# 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 the following vars: +# +# DL_OBJS - Name of the object file that implements dynamic +# loading for Tcl on this system. +# DL_LIBS - Library file(s) to include in tclsh and other base +# applications in order for the "load" command to work. +# 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. +# 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 is +# "${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. +# TCL_LIB_FILE - Name of the file that contains the Tcl library, such +# as libtcl7.8.so or libtcl7.8.a. +# TCL_LIB_SUFFIX -Specifies everything that comes after the "libtcl" +# in the shared library name, using the $VERSION variable +# to put the version in the right place. This is used +# by platforms that need non-standard library names. +# Examples: ${VERSION}.so.1.1 on NetBSD, since it needs +# to have a version after the .so, and ${VERSION}.a +# on AIX, since the Tcl shared library needs to have +# a .a extension whereas shared objects for loadable +# extensions have a .so extension. Defaults to +# ${VERSION}${SHLIB_SUFFIX}. +# TCL_NEEDS_EXP_FILE - +# 1 means that an export file is needed to link to a +# shared library. +# TCL_EXP_FILE - The name of the installed export / import file which +# should be used to link to the Tcl shared library. +# Empty if Tcl is unshared. +# TCL_BUILD_EXP_FILE - +# The name of the built export / import file which +# should be used to link to the Tcl shared library. +# Empty if Tcl is unshared. +# CFLAGS_DEBUG - +# Flags used when running the compiler in debug mode +# CFLAGS_OPTIMIZE - +# Flags used when running the compiler in optimize mode +# EXTRA_CFLAGS - +# Extra CFLAGS to pass to the compiler +# +# Subst's the following vars: +# DL_LIBS +# CFLAGS_DEBUG +# CFLAGS_OPTIMIZE +# CFLAGS_WARNING +# +# STLIB_LD +# SHLIB_LD +# SHLIB_CFLAGS +# SHLIB_LDFLAGS +# LDFLAGS_DEBUG +# LDFLAGS_OPTIMIZE +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_CONFIG_CFLAGS, [ + if test x"${TEA_INITED}" = x ; then + # Can't refer to exact macro name or it will be substituted + AC_MSG_ERROR([Must call TEA INIT before CONFIG_CFLAGS]) + fi + + # Step 0: Enable 64 bit support? + + AC_MSG_CHECKING([if 64bit support is enabled]) + AC_ARG_ENABLE(64bit,[ --enable-64bit enable 64bit support (where applicable)], [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,[ --enable-64bit-vis enable 64bit Sparc VIS support], [do64bitVIS=$enableval], [do64bitVIS=no]) + AC_MSG_RESULT([$do64bitVIS]) + + if test "$do64bitVIS" = "yes"; then + # Force 64bit on with VIS + do64bit=yes + fi + + # Step 0.c: Cross-compiling options for Windows/CE builds? + + if test "${TEA_PLATFORM}" = "windows" ; then + AC_MSG_CHECKING([if Windows/CE build is requested]) + AC_ARG_ENABLE(wince,[ --enable-wince enable Win/CE support (where applicable)], [doWince=$enableval], [doWince=no]) + AC_MSG_RESULT($doWince) + fi + + # Step 1: set the variable "system" to hold the name and version number + # for the system. This can usually be done via the "uname" command, but + # there are a few systems, like Next, where this doesn't work. + + AC_MSG_CHECKING([system version (for dynamic loading)]) + if test -f /usr/lib/NextStep/software_version; then + system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + AC_MSG_RESULT([unknown (can't find uname command)]) + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird + # results, and the version is kept in special file). + + if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then + system=MP-RAS-`awk '{print $3}' /etc/.relid'` + fi + if test "`uname -s`" = "AIX" ; then + system=AIX-`uname -v`.`uname -r` + fi + if test "${TEA_PLATFORM}" = "windows" ; then + system=windows + fi + AC_MSG_RESULT([$system]) + fi + fi + + # Step 2: check for existence of -ldl library. This is needed because + # Linux can use either -ldl or -ldld for dynamic loading. + + AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) + + # Step 3: set configuration options based on system name and version. + + do64bit_ok=no + EXTRA_CFLAGS="" + TCL_EXPORT_FILE_SUFFIX="" + UNSHARED_LIB_SUFFIX="" + TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`' + ECHO_VERSION='`echo ${VERSION}`' + TCL_LIB_VERSIONS_OK=ok + CFLAGS_DEBUG=-g + CFLAGS_OPTIMIZE=-O + if test "$GCC" = "yes" ; then + CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int" + else + CFLAGS_WARNING="" + fi + TCL_NEEDS_EXP_FILE=0 + TCL_BUILD_EXP_FILE="" + TCL_EXP_FILE="" +dnl FIXME: Replace AC_CHECK_PROG with AC_CHECK_TOOL once cross compiling is fixed. +dnl AC_CHECK_TOOL(AR, ar, :) + AC_CHECK_PROG(AR, ar, ar) + STLIB_LD='${AR} cr' + case $system in + 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. + if test "$do64bit" = "yes" ; then + if test "x${MSSDK}x" = "xx" ; then + MSSDK="C:/Progra~1/Microsoft SDK" + fi + # In order to work in the tortured autoconf environment, + # we need to ensure that this path has no spaces + MSSDK=`cygpath -w -s "$MSSDK" | sed -e 's!\\\!/!g'` + if test ! -d "${MSSDK}/bin/win64" ; then + AC_MSG_WARN("could not find 64-bit SDK to enable 64bit mode") + do64bit="no" + else + do64bit_ok="yes" + fi + fi + + if test "$doWince" != "no" ; then + if test "$do64bit" = "yes" ; 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 + # Currently Tcl requires 300+ + CEVERSION=300; # could be 211 300 301 ... + TARGETCPU=ARM; # could be ARM MIPS SH3 X86 ... + ARCH=$TARGETCPU; # could be ARM MIPS SH3 X86 X86EM ... + PLATFORM="Pocket PC 2002" + if test "$doWince" = "yes"; then + doWince="300,ARM,ARM,Pocket PC 2002" + fi + eval `echo $doWince | awk -F "," '{ \ + if (length([$]1)) { printf "CEVERSION=%s\n", [$]1 }; \ + if (length([$]2)) { printf "TARGETCPU=%s\n", toupper([$]2) }; \ + if (length([$]3)) { printf "ARCH=%s\n", toupper([$]3) } \ + else { printf "ARCH=[$]TARGETCPU" }; \ + if (length([$]4)) { printf "PLATFORM=%s\n", [$]4 }; \ + }'` + OSVERSION=WCE$CEVERSION; + if test "x${WCEROOT}" = "x" ; then + WCEROOT="C:/Program Files/Microsoft eMbedded Tools" + fi + if test "x${SDKROOT}" = "x" ; then + SDKROOT="C:/Windows CE Tools" + fi + # In order to work in the tortured autoconf environment, + # we need to ensure that this path has no spaces + WCEROOT=`cygpath -w -s "$WCEROOT" | sed -e 's!\\!/!g'` + SDKROOT=`cygpath -w -s "$SDKROOT" | sed -e 's!\\!/!g'` + CELIB_DIR=`cygpath -w -s "$CELIB_DIR" | sed -e 's!\\!/!g'` + if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}" \ + -o ! -e "${WCEROOT}/EVC/${OSVERSION}/bin/cl${TARGETCPU}.exe"; then + AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode]) + doWince="no" + else + CEINCLUDE=`cygpath -w -s "${SDKROOT}/${OSVERSION}/${PLATFORM}/include" | sed -e 's!\\!/!g'` + CELIBPATH=`cygpath -w -s "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" | sed -e 's!\\!/!g'` + fi + fi + + if test "$GCC" != "yes" ; then + if test "${SHARED_BUILD}" = "0" ; then + runtime=-MT + else + runtime=-MD + fi + + if test "$do64bit" = "yes" ; then + # All this magic is necessary for the Win64 SDK RC1 - hobbs + export CC="${MSSDK}/Bin/Win64/cl.exe \ + -I${MSSDK}/Include/prerelease \ + -I${MSSDK}/Include/Win64/crt \ + -I${MSSDK}/Include" + export RC="${MSSDK}/bin/rc.exe" + export lflags="-MACHINE:IA64 -LIBPATH:${MSSDK}/Lib/IA64 \ + -LIBPATH:${MSSDK}/Lib/Prerelease/IA64" + export STLIB_LD="${MSSDK}/bin/win64/lib.exe -nologo ${lflags}" + export LINKBIN="${MSSDK}/bin/win64/link.exe ${lflags}" + CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -Gs -W2 ${runtime}" + elif test "$doWince" != "no" ; then + if test "${TARGETCPU}" = "X86"; then + CC="${WCEROOT}/EVC/${OSVERSION}/bin/cl.exe -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + else + CC="${WCEROOT}/EVC/${OSVERSION}/bin/cl${TARGETCPU}.exe -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" + fi + RC="${WCEROOT}/Common/EVC/bin/rc.exe" + cpulower=`echo ${TARGETCPU} | awk '{print tolower([$]0)}'` + defs="${TARGETCPU} _${TARGETCPU}_ ${cpulower} _${cpulower}_ POCKET_SIZE PALM_SIZE _MT _DLL _WINDOWS" + for i in $defs ; do + AC_DEFINE_UNQUOTED($i) + done + AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION) + AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION) + CFLAGS_DEBUG="-nologo -Zi -Od" + CFLAGS_OPTIMIZE="-nologo -Ox" + lflags="-MACHINE:${TARGETCPU} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,3.00" + STLIB_LD="${WCEROOT}/EVC/${OSVERSION}/bin/lib.exe -nologo ${lflags}" + LINKBIN="${WCEROOT}/EVC/${OSVERSION}/bin/link.exe ${lflags}" + else + RC="rc" + STLIB_LD="lib -nologo" + LINKBIN="link -link50compat" + CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" + CFLAGS_OPTIMIZE="-nologo -O2 -Gs -GD -W2 ${runtime}" + fi + fi + + if test "$GCC" = "yes"; then + # mingw gcc mode + RC="windres" + CFLAGS_DEBUG="-g" + CFLAGS_OPTIMIZE="-O2" + SHLIB_LD="$CC -shared" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" + LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" + else + SHLIB_LD="${LINKBIN} -dll -nologo" + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.lib' + EXTRA_CFLAGS="-YX" + PATHTYPE=-w + # For information on what debugtype is most useful, see: + # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp + # This essentially turns it all on. + LDFLAGS_DEBUG="-debug:full -debugtype:both -warn:2" + 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_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dll" + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.dll' + + TCL_LIB_VERSIONS_OK=nodots + # Bogus to avoid getting this turned off + DL_OBJS="tclLoadNone.obj" + ;; + AIX-*) + if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then + # AIX requires the _r compiler when gcc isn't being used + if test "${CC}" != "cc_r" ; then + CC=${CC}_r + fi + AC_MSG_RESULT([Using $CC for compiling with threads]) + fi + LIBS="$LIBS -lc" + SHLIB_CFLAGS="" + SHLIB_SUFFIX=".so" + SHLIB_LD_LIBS='${LIBS}' + if test "`uname -m`" = "ia64" ; then + # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + # AIX-5 has dl* in libc.so + DL_LIBS="" + if test "$GCC" = "yes" ; then + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' + fi + else + SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" + DL_LIBS="-ldl" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + TCL_NEEDS_EXP_FILE=1 + TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp' + fi + DL_OBJS="tclLoadDl.o" + LDFLAGS="" + + # AIX v<=4.1 has some different flags than 4.2+ + if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then + AC_LIBOBJ([tclLoadAix]) + DL_LIBS="-lld" + fi + + # On AIX <=v4 systems, libbsd.a has to be linked in to support + # non-blocking file IO. This library has to be linked in after + # the MATH_LIBS or it breaks the pow() function. The way to + # insure proper sequencing, is to add it to the tail of MATH_LIBS. + # This library also supplies gettimeofday. + # + # AIX does not have a timezone field in struct tm. When the AIX + # bsd library is used, the timezone global and the gettimeofday + # methods are to be avoided for timezone deduction instead, we + # deduce the timezone by comparing the localtime result on a + # known GMT value. + + AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes, libbsd=no) + if test $libbsd = yes; then + MATH_LIBS="$MATH_LIBS -lbsd" + AC_DEFINE(USE_DELTA_FOR_TZ) + fi + + # Check to enable 64-bit flags for compiler/linker on AIX 4+ + if test "$do64bit" = "yes" -a "`uname -v`" -gt "3" ; then + if test "$GCC" = "yes" ; then + AC_MSG_WARN("64bit mode not supported with GCC on $system") + else + do64bit_ok=yes + EXTRA_CFLAGS="-q64" + LDFLAGS="-q64" + RANLIB="${RANLIB} -X64" + AR="${AR} -X64" + SHLIB_LDFLAGS="-b64" + fi + fi + ;; + BSD/OS-2.1*|BSD/OS-3*) + SHLIB_CFLAGS="" + SHLIB_LD="shlicc -r" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + BSD/OS-4.*) + SHLIB_CFLAGS="-export-dynamic -fPIC" + SHLIB_LD="cc -shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-export-dynamic" + LD_SEARCH_FLAGS="" + ;; + dgux*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + HP-UX-*.11.*) + # Use updated header definitions where possible + AC_DEFINE(_XOPEN_SOURCE_EXTENDED) + + SHLIB_SUFFIX=".sl" + AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = yes; then + SHLIB_CFLAGS="+z" + SHLIB_LD="ld -b" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadShl.o" + DL_LIBS="-ldld" + LDFLAGS="-Wl,-E" + LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + fi + + # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc + #EXTRA_CFLAGS="+DAportable" + + # Check to enable 64-bit flags for compiler/linker + if test "$do64bit" = "yes" ; then + if test "$GCC" = "yes" ; then + hpux_arch=`${CC} -dumpmachine` + case $hpux_arch in + hppa64*) + # 64-bit gcc in use. Fix flags for GNU ld. + do64bit_ok=yes + SHLIB_LD="${CC} -shared" + SHLIB_LD_LIBS="" + LD_SEARCH_FLAGS='' + ;; + *) + AC_MSG_WARN("64bit mode not supported with GCC on $system") + ;; + esac + else + do64bit_ok=yes + if test "`uname -m`" = "ia64" ; then + EXTRA_CFLAGS="+DD64" + LDFLAGS="+DD64 $LDFLAGS" + else + EXTRA_CFLAGS="+DA2.0W" + LDFLAGS="+DA2.0W $LDFLAGS" + fi + fi + fi + ;; + HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) + SHLIB_SUFFIX=".sl" + AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) + if test "$tcl_ok" = yes; then + SHLIB_CFLAGS="+z" + SHLIB_LD="ld -b" + SHLIB_LD_LIBS="" + DL_OBJS="tclLoadShl.o" + DL_LIBS="-ldld" + LDFLAGS="-Wl,-E" + LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' + fi + ;; + IRIX-4.*) + SHLIB_CFLAGS="-G 0" + SHLIB_SUFFIX=".a" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a' + ;; + IRIX-5.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + EXTRA_CFLAGS="" + LDFLAGS="" + ;; + IRIX-6.*|IRIX64-6.5*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + if test "$GCC" = "yes" ; then + EXTRA_CFLAGS="-mabi=n32" + LDFLAGS="-mabi=n32" + else + case $system in + IRIX-6.3) + # Use to build 6.2 compatible binaries on 6.3. + EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS" + ;; + *) + EXTRA_CFLAGS="-n32" + ;; + esac + LDFLAGS="-n32" + fi + ;; + IRIX64-6.*) + SHLIB_CFLAGS="" + SHLIB_LD="ld -n32 -shared -rdata_shared" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + + # Check to enable 64-bit flags for compiler/linker + + if test "$do64bit" = "yes" ; then + if test "$GCC" = "yes" ; then + AC_MSG_WARN([64bit mode not supported by gcc]) + else + do64bit_ok=yes + SHLIB_LD="ld -64 -shared -rdata_shared" + EXTRA_CFLAGS="-64" + LDFLAGS="-64" + fi + fi + ;; + Linux*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings + # when you inline the string and math operations. Turn this off to + # get rid of the warnings. + + CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES" + + if test "$have_dl" = yes; then + SHLIB_LD="${CC} -shared" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-rdynamic" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + else + AC_CHECK_HEADER(dld.h, [ + SHLIB_LD="ld -shared" + DL_OBJS="tclLoadDld.o" + DL_LIBS="-ldld" + LDFLAGS="" + LD_SEARCH_FLAGS=""]) + fi + if test "`uname -m`" = "alpha" ; then + EXTRA_CFLAGS="-mieee" + fi + + # 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. + if test x"${LIB@&t@OBJS}" != x ; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -fno-inline" + fi + + ;; + GNU*) + SHLIB_CFLAGS="-fPIC" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + + if test "$have_dl" = yes; then + SHLIB_LD="${CC} -shared" + DL_OBJS="" + DL_LIBS="-ldl" + LDFLAGS="-rdynamic" + LD_SEARCH_FLAGS="" + else + AC_CHECK_HEADER(dld.h, [ + SHLIB_LD="ld -shared" + DL_OBJS="" + DL_LIBS="-ldld" + LDFLAGS="" + LD_SEARCH_FLAGS=""]) + fi + if test "`uname -m`" = "alpha" ; then + EXTRA_CFLAGS="-mieee" + fi + ;; + MP-RAS-02*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + MP-RAS-*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="-Wl,-Bexport" + LD_SEARCH_FLAGS="" + ;; + NetBSD-*|FreeBSD-[[1-2]].*|OpenBSD-*) + # Not available on all versions: check for include file. + AC_CHECK_HEADER(dlfcn.h, [ + # NetBSD/SPARC needs -fPIC, -fpic will not do. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="ld -Bshareable -x" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + AC_MSG_CHECKING([for ELF]) + AC_EGREP_CPP(yes, [ +#ifdef __ELF__ + yes +#endif + ], + AC_MSG_RESULT([yes]) + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so', + AC_MSG_RESULT([no]) + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0' + ) + ], [ + SHLIB_CFLAGS="" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".a" + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + ]) + + # FreeBSD doesn't handle version numbers with dots. + + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + FreeBSD-*) + # FreeBSD 3.* and greater have ELF. + SHLIB_CFLAGS="-fPIC" + SHLIB_LD="ld -Bshareable -x" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="-export-dynamic" + LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' + if test "${TCL_THREADS}" = "1" ; then + # The -pthread needs to go in the CFLAGS, not LIBS + LIBS=`echo $LIBS | sed s/-pthread//` + EXTRA_CFLAGS="-pthread" + LDFLAGS="$LDFLAGS -pthread" + fi + case $system in + FreeBSD-3.*) + # FreeBSD-3 doesn't handle version numbers with dots. + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so' + TCL_LIB_VERSIONS_OK=nodots + ;; + esac + ;; + Rhapsody-*|Darwin-*) + SHLIB_CFLAGS="-fno-common" + SHLIB_LD="cc -dynamiclib \${LDFLAGS}" + TCL_SHLIB_LD_EXTRAS="-compatibility_version ${TCL_MAJOR_VERSION} -current_version \${VERSION} -install_name \${LIB_RUNTIME_DIR}/\${TCL_LIB_FILE} -prebind -seg1addr 0xa000000" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".dylib" + DL_OBJS="tclLoadDyld.o" + DL_LIBS="" + LDFLAGS="-prebind" + LD_SEARCH_FLAGS="" + CFLAGS_OPTIMIZE="-O3" + EXTRA_CFLAGS="-arch ppc -pipe" + ;; + NEXTSTEP-*) + SHLIB_CFLAGS="" + SHLIB_LD="cc -nostdlib -r" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadNext.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OS/390-*) + CFLAGS_OPTIMIZE="" # Optimizer is buggy + AC_DEFINE(_OE_SOCKETS) # needed in sys/socket.h + ;; + OSF1-1.0|OSF1-1.1|OSF1-1.2) + # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 + SHLIB_CFLAGS="" + # Hack: make package name same as library name + SHLIB_LD='ld -R -export $@:' + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadOSF.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OSF1-1.*) + # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 + SHLIB_CFLAGS="-fPIC" + if test "$SHARED_BUILD" = "1" ; then + SHLIB_LD="ld -shared" + else + SHLIB_LD="ld -non_shared" + fi + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + OSF1-V*) + # Digital OSF/1 + SHLIB_CFLAGS="" + if test "$SHARED_BUILD" = "1" ; then + SHLIB_LD='ld -shared -expect_unresolved "*"' + else + SHLIB_LD='ld -non_shared -expect_unresolved "*"' + fi + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' + if test "$GCC" != "yes" ; then + EXTRA_CFLAGS="-DHAVE_TZSET -std1" + fi + # see pthread_intro(3) for pthread support on osf1, k.furukawa + if test "${TCL_THREADS}" = "1" ; then + EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" + EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" + LIBS=`echo $LIBS | sed s/-lpthreads//` + if test "$GCC" = "yes" ; then + LIBS="$LIBS -lpthread -lmach -lexc" + else + EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread" + LDFLAGS="-pthread" + fi + fi + + ;; + 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" + DL_OBJS="tclLoadDl.o" + # dlopen is in -lc on QNX + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + RISCos-*) + SHLIB_CFLAGS="-G 0" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".a" + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + ;; + SCO_SV-3.2*) + # Note, dlopen is available only on SCO 3.2.5 and greater. However, + # this test works, since "uname -s" was non-standard in 3.2.4 and + # below. + if test "$GCC" = "yes" ; then + SHLIB_CFLAGS="-fPIC -melf" + LDFLAGS="-melf -Wl,-Bexport" + else + SHLIB_CFLAGS="-Kpic -belf" + LDFLAGS="-belf -Wl,-Bexport" + fi + SHLIB_LD="ld -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + LD_SEARCH_FLAGS="" + ;; + SINIX*5.4*) + SHLIB_CFLAGS="-K PIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS="" + ;; + SunOS-4*) + SHLIB_CFLAGS="-PIC" + SHLIB_LD="ld" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + + # SunOS can't handle version numbers with dots in them in library + # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it + # requires an extra version number at the end of .so file names. + # So, the library has to have a name like libtcl75.so.1.0 + + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0' + UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a' + TCL_LIB_VERSIONS_OK=nodots + ;; + SunOS-5.[[0-6]]*) + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS) + + SHLIB_CFLAGS="-KPIC" + + # Note: need the LIBS below, otherwise Tk won't find Tcl's + # symbols when dynamically loaded into tclsh. + + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + LDFLAGS="" + if test "$GCC" = "yes" ; then + SHLIB_LD="$CC -shared" + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + fi + ;; + SunOS-5*) + + # Note: If _REENTRANT isn't defined, then Solaris + # won't define thread-safe library routines. + + AC_DEFINE(_REENTRANT) + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS) + + SHLIB_CFLAGS="-KPIC" + LDFLAGS="" + + # Check to enable 64-bit flags for compiler/linker + if test "$do64bit" = "yes" ; then + arch=`isainfo` + if test "$arch" = "sparcv9 sparc" ; then + if test "$GCC" = "yes" ; then + AC_MSG_WARN("64bit mode not supported with GCC on $system") + else + do64bit_ok=yes + if test "$do64bitVIS" = "yes" ; then + EXTRA_CFLAGS="-xarch=v9a" + LDFLAGS="-xarch=v9a" + else + EXTRA_CFLAGS="-xarch=v9" + LDFLAGS="-xarch=v9" + fi + fi + else + AC_MSG_WARN("64bit mode only supported sparcv9 system") + fi + fi + + # Note: need the LIBS below, otherwise Tk won't find Tcl's + # symbols when dynamically loaded into tclsh. + + SHLIB_LD_LIBS='${LIBS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + if test "$GCC" = "yes" ; then + SHLIB_LD="$CC -shared" + LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' + else + SHLIB_LD="/usr/ccs/bin/ld -G -z text" + LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' + fi + ;; + ULTRIX-4.*) + SHLIB_CFLAGS="-G 0" + SHLIB_SUFFIX=".a" + SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" + SHLIB_LD_LIBS='${LIBS}' + DL_OBJS="tclLoadAout.o" + DL_LIBS="" + LDFLAGS="-Wl,-D,08000000" + LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' + if test "$GCC" != "yes" ; then + EXTRA_CFLAGS="-DHAVE_TZSET -std1" + fi + ;; + UNIX_SV* | UnixWare-5*) + SHLIB_CFLAGS="-KPIC" + SHLIB_LD="cc -G" + SHLIB_LD_LIBS="" + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="-ldl" + # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers + # that don't grok the -Bexport option. Test that it does. + hold_ldflags=$LDFLAGS + AC_MSG_CHECKING([for ld accepts -Bexport flag]) + LDFLAGS="${LDFLAGS} -Wl,-Bexport" + AC_TRY_LINK(, [int i;], found=yes, found=no) + LDFLAGS=$hold_ldflags + AC_MSG_RESULT([$found]) + if test $found = yes; then + LDFLAGS="-Wl,-Bexport" + else + LDFLAGS="" + fi + LD_SEARCH_FLAGS="" + ;; + esac + + if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then + AC_MSG_WARN("64bit support being disabled -- don\'t know magic for this platform") + fi + + # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic + # Loading for Tcl -- What Became of It?". Proc. 2nd Tcl/Tk Workshop, + # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need + # to determine which of several header files defines the a.out file + # format (a.out.h, sys/exec.h, or sys/exec_aout.h). At present, we + # support only a file format that is more or less version-7-compatible. + # In particular, + # - a.out files must begin with `struct exec'. + # - the N_TXTOFF on the `struct exec' must compute the seek address + # of the text segment + # - The `struct exec' must contain a_magic, a_text, a_data, a_bss + # and a_entry fields. + # The following compilation should succeed if and only if either sys/exec.h + # or a.out.h is usable for the purpose. + # + # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the + # `struct exec' includes a second header that contains information that + # duplicates the v7 fields that are needed. + + if test "x$DL_OBJS" = "xtclLoadAout.o" ; then + AC_MSG_CHECKING([sys/exec.h]) + AC_TRY_COMPILE([#include ],[ + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_magic == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + ], tcl_ok=usable, tcl_ok=unusable) + AC_MSG_RESULT([$tcl_ok]) + if test $tcl_ok = usable; then + AC_DEFINE(USE_SYS_EXEC_H) + else + AC_MSG_CHECKING([a.out.h]) + AC_TRY_COMPILE([#include ],[ + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_magic == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + ], tcl_ok=usable, tcl_ok=unusable) + AC_MSG_RESULT([$tcl_ok]) + if test $tcl_ok = usable; then + AC_DEFINE(USE_A_OUT_H) + else + AC_MSG_CHECKING([sys/exec_aout.h]) + AC_TRY_COMPILE([#include ],[ + struct exec foo; + unsigned long seek; + int flag; +#if defined(__mips) || defined(mips) + seek = N_TXTOFF (foo.ex_f, foo.ex_o); +#else + seek = N_TXTOFF (foo); +#endif + flag = (foo.a_midmag == OMAGIC); + return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; + ], tcl_ok=usable, tcl_ok=unusable) + AC_MSG_RESULT([$tcl_ok]) + if test $tcl_ok = usable; then + AC_DEFINE(USE_SYS_EXEC_AOUT_H) + else + DL_OBJS="" + fi + fi + fi + fi + + # Step 5: disable dynamic loading if requested via a command-line switch. + + AC_ARG_ENABLE(load, [ --disable-load disallow dynamic loading and "load" command], + [tcl_ok=$enableval], [tcl_ok=yes]) + if test "$tcl_ok" = "no"; then + DL_OBJS="" + fi + + if test "x$DL_OBJS" != "x" ; then + BUILD_DLTEST="\$(DLTEST_TARGETS)" + else + echo "Can't figure out how to do dynamic loading or shared libraries" + echo "on this system." + SHLIB_CFLAGS="" + SHLIB_LD="" + SHLIB_SUFFIX="" + DL_OBJS="tclLoadNone.o" + DL_LIBS="" + LDFLAGS="" + LD_SEARCH_FLAGS="" + BUILD_DLTEST="" + fi + + # 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. + + if test "$DL_OBJS" != "tclLoadNone.o" ; then + if test "$GCC" = "yes" ; then + case $system in + AIX-*) + ;; + BSD/OS*) + ;; + IRIX*) + ;; + NetBSD-*|FreeBSD-*|OpenBSD-*) + ;; + Rhapsody-*|Darwin-*) + ;; + RISCos-*) + ;; + SCO_SV-3.2*) + ;; + ULTRIX-4.*) + ;; + windows) + ;; + *) + SHLIB_CFLAGS="-fPIC" + ;; + esac + fi + fi + + if test "$SHARED_LIB_SUFFIX" = "" ; then + SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}' + fi + if test "$UNSHARED_LIB_SUFFIX" = "" ; then + UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a' + fi + + AC_SUBST(DL_LIBS) + AC_SUBST(CFLAGS_DEBUG) + AC_SUBST(CFLAGS_OPTIMIZE) + AC_SUBST(CFLAGS_WARNING) + AC_SUBST(EXTRA_CFLAGS) + + SHLIB_LDFLAGS='$(LDFLAGS_DEFAULT)' + AC_SUBST(STLIB_LD) + AC_SUBST(SHLIB_LD) + AC_SUBST(SHLIB_CFLAGS) + AC_SUBST(SHLIB_LDFLAGS) + AC_SUBST(SHLIB_LD_LIBS) + AC_SUBST(LDFLAGS_DEBUG) + AC_SUBST(LDFLAGS_OPTIMIZE) +]) + +#-------------------------------------------------------------------- +# 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_MSG_CHECKING([termios vs. termio vs. sgtty]) + AC_CACHE_VAL(tcl_cv_api_serial, [ + AC_TRY_RUN([ +#include + +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 + +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 + +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=none, tcl_cv_api_serial=none) + fi + if test $tcl_cv_api_serial = no ; then + AC_TRY_RUN([ +#include +#include + +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 +#include + +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 +#include + +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);; + termio) AC_DEFINE(USE_TERMIO);; + sgtty) AC_DEFINE(USE_SGTTY);; + esac + AC_MSG_RESULT([$tcl_cv_api_serial]) +]) + +#-------------------------------------------------------------------- +# TEA_MISSING_POSIX_HEADERS +# +# Supply substitutes for missing POSIX header files. Special +# notes: +# - stdlib.h doesn't define strtol, strtoul, or +# strtod insome 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 +# NO_LIMITS_H +# NO_STDLIB_H +# NO_STRING_H +# NO_SYS_WAIT_H +# NO_DLFCN_H +# HAVE_UNISTD_H +# HAVE_SYS_PARAM_H +# +# HAVE_STRING_H ? +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_MISSING_POSIX_HEADERS, [ + AC_MSG_CHECKING([dirent.h]) + AC_TRY_LINK([#include +#include ], [ +#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_ok=yes, tcl_ok=no) + + if test $tcl_ok = no; then + AC_DEFINE(NO_DIRENT_H) + fi + + AC_MSG_RESULT([$tcl_ok]) + AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H)]) + AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H)]) + AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H)]) + AC_CHECK_HEADER(limits.h, , [AC_DEFINE(NO_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) + 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) + fi + + AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H)]) + AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H)]) + + # OS/390 lacks sys/param.h (and doesn't need it, by chance). + + AC_HAVE_HEADERS(unistd.h 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 +# LIBS (appends to) +# +#-------------------------------------------------------------------- + +AC_DEFUN(TEA_PATH_X, [ + if test "${TEA_PLATFORM}" = "unix" ; 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 ], , not_really_there="yes") + else + if test ! -r $x_includes/X11/Intrinsic.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]) + XINCLUDES="# no special path needed" + AC_TRY_CPP([#include ], , XINCLUDES="nope") + if test "$XINCLUDES" = nope; 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/Intrinsic.h; then + AC_MSG_RESULT([$i]) + XINCLUDES=" -I$i" + break + fi + done + fi + else + if test "$x_includes" != ""; then + XINCLUDES=-I$x_includes + else + XINCLUDES="# no special path needed" + fi + fi + if test "$XINCLUDES" = nope; then + AC_MSG_RESULT([could not find any!]) + XINCLUDES="# no include files found" + 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; 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 + if test x"${XLIBSW}" != x ; then + LIBS="${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) + AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) + if test -f /usr/lib/NextStep/software_version; then + system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + else + system=`uname -s`-`uname -r` + if test "$?" -ne 0 ; then + system=unknown + else + # Special check for weird MP-RAS system (uname returns weird + # results, and the version is kept in special file). + + if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then + system=MP-RAS-`awk '{print $3}' /etc/.relid'` + fi + if test "`uname -s`" = "AIX" ; then + system=AIX-`uname -v`.`uname -r` + fi + fi + fi + case $system in + # There used to be code here to use FIONBIO under AIX. However, it + # was reported that FIONBIO doesn't work under AIX 3.2.5. Since + # using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO + # code (JO, 5/31/97). + + OSF*) + AC_DEFINE(USE_FIONBIO) + AC_MSG_RESULT([FIONBIO]) + ;; + SunOS-4*) + AC_DEFINE(USE_FIONBIO) + AC_MSG_RESULT([FIONBIO]) + ;; + ULTRIX-4.*) + AC_DEFINE(USE_FIONBIO) + AC_MSG_RESULT([FIONBIO]) + ;; + *) + AC_MSG_RESULT([O_NONBLOCK]) + ;; + esac +]) + +#-------------------------------------------------------------------- +# TEA_TIME_HANLDER +# +# 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_MSG_CHECKING([tm_tzadj in struct tm]) + AC_CACHE_VAL(tcl_cv_member_tm_tzadj, + AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], + tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)) + AC_MSG_RESULT([$tcl_cv_member_tm_tzadj]) + if test $tcl_cv_member_tm_tzadj = yes ; then + AC_DEFINE(HAVE_TM_TZADJ) + fi + + AC_MSG_CHECKING([tm_gmtoff in struct tm]) + AC_CACHE_VAL(tcl_cv_member_tm_gmtoff, + AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], + tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)) + AC_MSG_RESULT([$tcl_cv_member_tm_gmtoff]) + if test $tcl_cv_member_tm_gmtoff = yes ; then + AC_DEFINE(HAVE_TM_GMTOFF) + fi + + # + # Its important to include time.h in this check, as some systems + # (like convex) have timezone functions, etc. + # + AC_MSG_CHECKING([long timezone variable]) + AC_CACHE_VAL(tcl_cv_var_timezone, + AC_TRY_COMPILE([#include ], + [extern long timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)) + AC_MSG_RESULT([$tcl_cv_timezone_long]) + if test $tcl_cv_timezone_long = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR) + else + # + # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. + # + AC_MSG_CHECKING([time_t timezone variable]) + AC_CACHE_VAL(tcl_cv_timezone_time, + AC_TRY_COMPILE([#include ], + [extern time_t timezone; + timezone += 1; + exit (0);], + tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)) + AC_MSG_RESULT([$tcl_cv_timezone_time]) + if test $tcl_cv_timezone_time = yes ; then + AC_DEFINE(HAVE_TIMEZONE_VAR) + 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_MSG_CHECKING([for Solaris2.4/Tru64 strtod bugs]) + AC_TRY_RUN([ + extern double strtod(); + int main() + { + char *string = "NaN", *spaceString = " "; + char *term; + double value; + value = strtod(string, &term); + if ((term != string) && (term[-1] == 0)) { + exit(1); + } + value = strtod(spaceString, &term); + if (term == (spaceString+1)) { + exit(1); + } + exit(0); + }], tcl_ok=1, tcl_ok=0, tcl_ok=0) + if test "$tcl_ok" = 1; then + AC_MSG_RESULT([ok]) + else + AC_MSG_RESULT([buggy]) + AC_LIBOBJ([fixstrtod]) + AC_DEFINE(strtod, fixstrtod) + 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 +# LIBS +# MATH_LIBS +# +# Results: +# +# Subst's the following var: +# 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)) + + #-------------------------------------------------------------------- + # 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"])]) + + # 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 +# +#-------------------------------------------------------------------- + +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) + 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 ], + [char *p = (char *)strtoll; char *q = (char *)strtoull;]) + TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], + [struct stat64 buf; int i = stat64("/", &buf);]) + 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,[ + AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], + tcl_cv_type_64bit=__int64,tcl_cv_type_64bit=none + AC_TRY_RUN([#include + int main() {exit(!(sizeof(long long) > sizeof(long)));} + ], tcl_cv_type_64bit="long long"))]) + if test "${tcl_cv_type_64bit}" = none ; then + AC_MSG_RESULT([using long]) + else + AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}) + AC_MSG_RESULT([${tcl_cv_type_64bit}]) + + # Now check for auxiliary declarations + AC_MSG_CHECKING([for struct dirent64]) + AC_CACHE_VAL(tcl_cv_struct_dirent64,[ + AC_TRY_COMPILE([#include +#include ],[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) + fi + AC_MSG_RESULT([${tcl_cv_struct_dirent64}]) + + AC_MSG_CHECKING([for struct stat64]) + AC_CACHE_VAL(tcl_cv_struct_stat64,[ + AC_TRY_COMPILE([#include ],[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) + fi + AC_MSG_RESULT([${tcl_cv_struct_stat64}]) + + AC_MSG_CHECKING([for off64_t]) + AC_CACHE_VAL(tcl_cv_type_off64_t,[ + AC_TRY_COMPILE([#include ],[off64_t offset; +], + tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) + if test "x${tcl_cv_type_off64_t}" = "xyes" ; then + AC_DEFINE(HAVE_TYPE_OFF64_T) + fi + AC_MSG_RESULT([${tcl_cv_type_off64_t}]) + 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_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, [ + AC_MSG_CHECKING([for correct TEA configuration]) + if test x"${PACKAGE}" = x ; then + AC_MSG_ERROR([ +The PACKAGE variable must be defined by your TEA configure.in]) + fi + AC_MSG_RESULT([ok]) + TEA_INITED=ok + case "`uname -s`" in + *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) + AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) + EXEEXT=".exe" + TEA_PLATFORM="windows" + ;; + *) + CYGPATH=echo + EXEEXT="" + TEA_PLATFORM="unix" + ;; + esac + + # Check if exec_prefix is set. If not use fall back to prefix + if test x$exec_prefix = xNONE ; then exec_prefix=$prefix ; fi + + AC_SUBST(EXEEXT) + AC_SUBST(CYGPATH) +]) + +#------------------------------------------------------------------------ +# 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, [ + # Should be AC_MSG_NOTICE, but that requires autoconf 2.50 + if test "${prefix}" = "NONE"; then + prefix_default=yes + if test x"${TCL_PREFIX}" != x; then + AC_MSG_WARN([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) + prefix=${TCL_PREFIX} + else + prefix=/usr/local + fi + fi + if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" ; then + if test x"${TCL_EXEC_PREFIX}" != x; then + AC_MSG_WARN([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) + exec_prefix=${TCL_EXEC_PREFIX} + else + exec_prefix=$prefix + fi + fi +]) + +#------------------------------------------------------------------------ +# TEA_PROG_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, [ + # If the user did not set CFLAGS, set it now to keep + # the AC_PROG_CC macro from adding "-g -O2". + if test "${CFLAGS+set}" != "set" ; then + CFLAGS="" + fi + + AC_PROG_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_MSG_CHECKING([if the compiler understands -pipe]) + OLDCC="$CC" + CC="$CC -pipe" + AC_TRY_COMPILE(,, AC_MSG_RESULT([yes]), CC="$OLDCC" + AC_MSG_RESULT([no])) + fi + + AC_PROG_INSTALL + + #-------------------------------------------------------------------- + # Checks to see if the make program sets the $MAKE variable. + #-------------------------------------------------------------------- + + AC_PROG_MAKE_SET + + #-------------------------------------------------------------------- + # Find ranlib + #-------------------------------------------------------------------- + + AC_PROG_RANLIB + + #-------------------------------------------------------------------- + # Determines the correct binary file extension (.o, .obj, .exe etc.) + #-------------------------------------------------------------------- + + AC_OBJEXT + AC_EXEEXT + + #-------------------------------------------------------------------- + # Common compiler flag setup + #-------------------------------------------------------------------- + + TEA_TCL_EARLY_FLAGS + TEA_TCL_64BIT_FLAGS + #TEA_C_BIGENDIAN + if test "${TEA_PLATFORM}" = "unix" ; then + TEA_MISSING_POSIX_HEADERS + 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 +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_MAKE_LIB, [ + if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then + MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(\[$](PACKAGE)_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS} \$(LDFLAGS) -out:\[$]@ \$(\[$](PACKAGE)_OBJECTS)" + MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(\[$](PACKAGE)stub_OBJECTS)" + else + MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(\[$](PACKAGE)_OBJECTS)" + MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(\[$](PACKAGE)_OBJECTS) \${SHLIB_LDFLAGS} \${SHLIB_LD_LIBS}" + MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(\[$](PACKAGE)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 the ${DBGX} in the suffix is + # substituted. + #-------------------------------------------------------------------- + + 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 "${PACKAGE}_LIB_FILE=${PACKAGE}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "${PACKAGE}_LIB_FILE=${PACKAGE}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build there own stubs libraries + eval eval "${PACKAGE}stub_LIB_FILE=${PACKAGE}stub${UNSHARED_LIB_SUFFIX}" + else + 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 "${PACKAGE}_LIB_FILE=lib${PACKAGE}${SHARED_LIB_SUFFIX}" + RANLIB=: + else + eval eval "${PACKAGE}_LIB_FILE=lib${PACKAGE}${UNSHARED_LIB_SUFFIX}" + fi + # Some packages build there own stubs libraries + eval eval "${PACKAGE}stub_LIB_FILE=lib${PACKAGE}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) +]) + +#------------------------------------------------------------------------ +# 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/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: +# +# Substs the following vars: +# TCL_TOP_DIR_NATIVE +# TCL_GENERIC_DIR_NATIVE +# TCL_UNIX_DIR_NATIVE +# TCL_WIN_DIR_NATIVE +# TCL_BMAP_DIR_NATIVE +# TCL_TOOL_DIR_NATIVE +# TCL_PLATFORM_DIR_NATIVE +# TCL_BIN_DIR_NATIVE +# TCL_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PRIVATE_TCL_HEADERS, [ + AC_MSG_CHECKING([for Tcl private include files]) + + if test "${TEA_PLATFORM}" = "windows"; then + TCL_TOP_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}`\" + TCL_GENERIC_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/generic`\" + TCL_UNIX_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/unix`\" + TCL_WIN_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/win`\" + TCL_BMAP_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/bitmaps`\" + TCL_TOOL_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/tools`\" + TCL_COMPAT_DIR_NATIVE=\"`${CYGPATH} ${TCL_SRC_DIR}/compat`\" + TCL_PLATFORM_DIR_NATIVE=${TCL_WIN_DIR_NATIVE} + else + TCL_TOP_DIR_NATIVE='$(TCL_SRC_DIR)' + TCL_GENERIC_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/generic' + TCL_UNIX_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/unix' + TCL_WIN_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/win' + TCL_BMAP_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/bitmaps' + TCL_TOOL_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/tools' + TCL_COMPAT_DIR_NATIVE='$(TCL_TOP_DIR_NATIVE)/compat' + TCL_PLATFORM_DIR_NATIVE=${TCL_UNIX_DIR_NATIVE} + fi + + AC_SUBST(TCL_TOP_DIR_NATIVE) + AC_SUBST(TCL_GENERIC_DIR_NATIVE) + AC_SUBST(TCL_UNIX_DIR_NATIVE) + AC_SUBST(TCL_WIN_DIR_NATIVE) + AC_SUBST(TCL_BMAP_DIR_NATIVE) + AC_SUBST(TCL_TOOL_DIR_NATIVE) + AC_SUBST(TCL_PLATFORM_DIR_NATIVE) + + TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" + AC_SUBST(TCL_INCLUDES) + AC_MSG_RESULT([Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}]) +]) + +#------------------------------------------------------------------------ +# 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. +# +# Substs 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 + # Check order: pkg --prefix location, Tcl's --prefix location, + # directory of tclConfig.sh, and Tcl source directory. + # Looking in the source dir is not ideal, but OK. + + eval "temp_includedir=${includedir}" + 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` \ + `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + 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: +# +# Substs the following vars: +# TK_INCLUDES +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PRIVATE_TK_HEADERS, [ + AC_MSG_CHECKING([for Tk private include files]) + + if test "${TEA_PLATFORM}" = "windows"; then + TK_TOP_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}`\" + TK_UNIX_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/unix`\" + TK_WIN_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/win`\" + TK_GENERIC_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/generic`\" + TK_XLIB_DIR_NATIVE=\"`${CYGPATH} ${TK_SRC_DIR}/xlib`\" + TK_PLATFORM_DIR_NATIVE=${TK_WIN_DIR_NATIVE} + + TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE} -I${TK_XLIB_DIR_NATIVE}" + else + TK_TOP_DIR_NATIVE='$(TK_SRC_DIR)' + TK_GENERIC_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/generic' + TK_UNIX_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/unix' + TK_WIN_DIR_NATIVE='$(TK_TOP_DIR_NATIVE)/win' + TK_PLATFORM_DIR_NATIVE=${TK_UNIX_DIR_NATIVE} + + TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" + fi + + AC_SUBST(TK_TOP_DIR_NATIVE) + AC_SUBST(TK_UNIX_DIR_NATIVE) + AC_SUBST(TK_WIN_DIR_NATIVE) + AC_SUBST(TK_GENERIC_DIR_NATIVE) + AC_SUBST(TK_XLIB_DIR_NATIVE) + AC_SUBST(TK_PLATFORM_DIR_NATIVE) + + AC_SUBST(TK_INCLUDES) + AC_MSG_RESULT([Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}]) +]) + +#------------------------------------------------------------------------ +# 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. +# +# Substs 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 + # Check order: pkg --prefix location, Tcl's --prefix location, + # directory of tclConfig.sh, and Tcl source directory. + # Looking in the source dir is not ideal, but OK. + + eval "temp_includedir=${includedir}" + list="`ls -d ${temp_includedir} 2>/dev/null` \ + `ls -d ${TK_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ + `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null` \ + `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" + if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then + list="$list /usr/local/include /usr/include" + 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) +]) + +#------------------------------------------------------------------------ +# TEA_PROG_TCLSH +# Locate a tclsh shell in the following directories: +# ${TCL_BIN_DIR} ${TCL_BIN_DIR}/../bin +# ${exec_prefix}/bin ${prefix}/bin +# ${PATH} +# +# Arguments +# none +# +# Results +# Subst's the following values: +# TCLSH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PROG_TCLSH, [ + AC_MSG_CHECKING([for tclsh]) + + AC_CACHE_VAL(ac_cv_path_tclsh, [ + if test "x${CELIB_DIR}" != "x" ; then + # If CELIB_DIR is defined, assume Windows/CE target is requested + # which means target tclsh cannot be run (cross-compile) + search_path=`echo ${PATH} | sed -e 's/:/ /g'` + else + search_path=`echo ${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${exec_prefix}/bin:${prefix}/bin:${PATH} | sed -e 's/:/ /g'` + fi + for dir in $search_path ; do + for j in `ls -r $dir/tclsh[[8-9]]*${EXEEXT} 2> /dev/null` \ + `ls -r $dir/tclsh*${EXEEXT} 2> /dev/null` ; do + if test x"$ac_cv_path_tclsh" = x ; then + if test -f "$j" ; then + ac_cv_path_tclsh=$j + break + fi + fi + done + done + ]) + + if test -f "$ac_cv_path_tclsh" ; then + TCLSH_PROG=$ac_cv_path_tclsh + AC_MSG_RESULT([$TCLSH_PROG]) + else + AC_MSG_ERROR([No tclsh found in PATH: $search_path]) + fi + AC_SUBST(TCLSH_PROG) +]) + +#------------------------------------------------------------------------ +# TEA_PROG_WISH +# Locate a wish shell in the following directories: +# ${TK_BIN_DIR} ${TK_BIN_DIR}/../bin +# ${TCL_BIN_DIR} ${TCL_BIN_DIR}/../bin +# ${exec_prefix}/bin ${prefix}/bin +# ${PATH} +# +# Arguments +# none +# +# Results +# Subst's the following values: +# WISH_PROG +#------------------------------------------------------------------------ + +AC_DEFUN(TEA_PROG_WISH, [ + AC_MSG_CHECKING([for wish]) + + AC_CACHE_VAL(ac_cv_path_wish, [ + if test "x${CELIB_DIR}" != "x" ; then + # If CELIB_DIR is defined, assume Windows/CE target is requested + # which means target wish cannot be run (cross-compile) + search_path=`echo ${PATH} | sed -e 's/:/ /g'` + else + search_path=`echo ${TK_BIN_DIR}:${TK_BIN_DIR}/../bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${exec_prefix}/bin:${prefix}/bin:${PATH} | sed -e 's/:/ /g'` + fi + for dir in $search_path ; do + for j in `ls -r $dir/wish[[8-9]]*${EXEEXT} 2> /dev/null` \ + `ls -r $dir/wish*${EXEEXT} 2> /dev/null` ; do + if test x"$ac_cv_path_wish" = x ; then + if test -f "$j" ; then + ac_cv_path_wish=$j + break + fi + fi + done + done + ]) + + if test -f "$ac_cv_path_wish" ; then + WISH_PROG=$ac_cv_path_wish + AC_MSG_RESULT([$WISH_PROG]) + else + AC_MSG_ERROR([No wish found in PATH: $search_path]) + fi + AC_SUBST(WISH_PROG) +]) + +#------------------------------------------------------------------------ +# 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 + 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[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../$1 \ + `ls -dr ../../$1[[8-9]].[[0-9]]* 2>/dev/null` \ + ../../../$1 \ + `ls -dr ../../../$1[[8-9]].[[0-9]]* 2>/dev/null` \ + ${srcdir}/../$1 \ + `ls -dr ${srcdir}/../$1[[8-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 ${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` \ + ; 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: +# +# Subst 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} + fi + + AC_SUBST($1_VERSION) + 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) +]) + +#------------------------------------------------------------------------ +# 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 + CELIB_DIR="# no Celib configs found" + AC_MSG_ERROR([Cannot find celib support library directory]) + else + no_celib= + CELIB_DIR=${ac_cv_c_celibconfig} + AC_MSG_RESULT([found $CELIB_DIR]) + fi + fi +]) diff --git a/tests/binarytest.tcl b/tests/binarytest.tcl new file mode 100755 index 0000000..0565b53 --- /dev/null +++ b/tests/binarytest.tcl @@ -0,0 +1,111 @@ +#!/usr/bin/tcl +# Write and read file into database +# using +# binarytest.tcl file +# The output file will be written with file.bin + +if {[file exists libload.tcl]} { + source libload.tcl +} else { + source [file join [file dirname [info script]] libload.tcl] +} + + +if {[llength $argv]==0} { + puts "usage. binarytest.tcl filename. File name should be binary test file that will be put in Datebase read from it and save als filename.bin" + exit +} + +set file [lindex $argv 0] +set fhandle [open $file r] +fconfigure $fhandle -translation binary -encoding binary +set binary [read $fhandle] +close $fhandle + +puts "test conection without encoding option" + +# What is saved in mysql is dependend from your system encoding +# if system encoding is not utf-8 then data could not be safed correctly +# It is also not so good idea to safe binary data as utf-8. +# I recommend always to use -encoding binary if you handle binary data +# You can alway build multiple handles if you want handle binary and utf-8 data. + +set handle [mysqlconnect -user root -db uni] +mysqlexec $handle "INSERT INTO Binarytest (data) VALUES ('[mysqlescape $binary]')" +set id [mysqlinsertid $handle] + +set nfile [file tail $file].bin +set fhandle [open $nfile w] +fconfigure $fhandle -translation binary -encoding binary +#set nbinary [lindex [lindex [mysqlsel $handle "SELECT data from Binarytest where id=$id" -list] 0] 0] +mysqlsel $handle "SELECT data from Binarytest where id=$id" +#set nbinary [encoding convertfrom [encoding system] [lindex [mysqlnext $handle] 0]] +set nbinary [lindex [mysqlnext $handle] 0] +puts "primary length [string bytelength $binary] new length [string bytelength $nbinary] - [string length $binary] [string length $nbinary]" +puts -nonewline $fhandle $nbinary +close $fhandle +if {[catch {exec cmp $file $nfile}]} { + puts "binary comparing failed primary length [file size $file] new length [file size $nfile]" +} else { + puts "binary comparing ok" +} +puts "Length in Mysql [mysqlsel $handle "SELECT LENGTH(data) from Binarytest where id=$id" -flatlist]" + + +puts "test with -encoding binary" +set handle2 [mysqlconnect -user root -db uni -encoding binary] +mysqlexec $handle2 "Update Binarytest set data = '[mysqlescape $binary]' where id=$id" +mysqlsel $handle2 "SELECT data from Binarytest where id=$id" +set nbinary [lindex [mysqlnext $handle2] 0] + +set nfile [file tail $file].bin +set fhandle [open $nfile w] +fconfigure $fhandle -translation binary -encoding binary +puts "primary length [string bytelength $binary] new length [string bytelength $nbinary] - [string length $binary] [string length $nbinary]" +puts -nonewline $fhandle $nbinary +close $fhandle +if {[catch {exec cmp $file $nfile}]} { + puts "binary comparing failed primary length [file size $file] new length [file size $nfile]" +} else { + puts "binary comparing ok" +} +puts "Length in Mysql [mysqlsel $handle2 "SELECT LENGTH(data) from Binarytest where id=$id" -flatlist]" + + +puts "test reading binary data but do not use -binary option but iso8859-1" +# please do not try to read binary data if your system encoding is set to +# utf-8. The converting from it will crash system +set handle2 [mysqlconnect -user root -db uni -encoding iso8859-1] +mysqlsel $handle2 "SELECT data from Binarytest where id=$id" +set nbinary [lindex [mysqlnext $handle2] 0] +set nfile [file tail $file].bin +set fhandle [open $nfile w] +fconfigure $fhandle -translation binary -encoding binary +puts "primary length [string bytelength $binary] new length [string bytelength $nbinary] - [string length $binary] [string length $nbinary]" +puts -nonewline $fhandle $nbinary +close $fhandle +if {[catch {exec cmp $file $nfile}]} { + puts "binary comparing failed primary length [file size $file] new length [file size $nfile]" +} else { + puts "binary comparing ok" +} + + +puts "test with -encoding iso8859-15" +set handle3 [mysqlconnect -user root -db uni -encoding iso8859-15] +# iso8859-1] +set umlaute "ÄÖ äö ß Deutsch Umlaute 26" +mysqlexec $handle3 "Update Binarytest set data = '$umlaute' where id=$id" +mysqlsel $handle3 "SELECT data from Binarytest where id=$id" +set umlauteOut [lindex [mysqlnext $handle3] 0] + +puts "$umlaute $umlauteOut" +if {$umlaute!=$umlauteOut} { + puts "Umlaut Test Failed" +} + +puts "Length in Mysql [mysqlsel $handle3 "SELECT LENGTH(data) from Binarytest where id=$id" -flatlist]" + + + +puts "Testing finished" diff --git a/tests/edv.jpg.bin b/tests/edv.jpg.bin new file mode 100644 index 0000000000000000000000000000000000000000..ee1335097f919992f134574e8c8daead38ad30fa GIT binary patch literal 29141 zcmbT6Wl&tf_ofFYKnM^ZID{E&kl^kF8QdL0aEBR!OK@j^!3i$GA-D&3cY-?sGPskF z&2M*Ww`%MEVR!r1=@0jIb)Bc~y?svidH*i|-2xCO%0c7+C@25`%D)TncNHK5z{bGD z!on5&ml`GHPl{GD-?sAR7biTku;7N=9BLFvmMCZY~-I zeqnx2VKz=K&i_n;g8kwJ9uD3cJiIrYbd+?Q|Ih7jH-Hcug#{%L4TTN>643z)g0ROY0prWDwa~S&t4(`7JjRXKx6f`tcbTkYMbo76t{r^1&pc7&cz2%a^ ze68^jiylhM9h8`l4V13!A<>*U2l1H0f?wc}z9A#0U|?ioW&!i^@e2qF3Cp~fm6KP1 zC~9fz=<4Yk7+P3bS=-p!*}Hvm_we-c_6Z3M3y+A5ibf78QRjDJ?6n zt8Zv*YHn$5>+S0w7#tcN8J(S*UszmP{;{&Xv%9x{aQO4+_~P>F`sViT{^9XITqppv z|AFv`MG<2;0aG{`j{xdW}bd0xLm_$+A8cjiKP?sYkOV* zc{I;S%waP)q#)jHhKv88{dcneJFwvYFS7py_P@DS0C;F9|6U#%AwU9f8Mf9sEXefR z-u6LA)9olTkVx_%g)C%B9lKT98o!GPNt(AU^BFYGICBbG~&b)G2knAVR zkePX9&=>FC+rv(Ah*K4^2O(``5tuxWW4THHyS!EKwuHPl6`lL4x9O$zz7tM#YipkI zs|M+We*WD93)8Z%ii{0%fLJ`UC4_C|v(G7p)GyWs*C(a5~{2z}&~CQ31@L zyNQ5_r?9`58z_hd_Y-T#0{$!WQ<=U}of;d!lT&NHpJjzk&$CbX5TRmn^@tsNrPuql zP{CAmwQ{(k5u}I31`LsC9J8C80IU3{(#?aR81;eml-9SMxbE%E%XoeudXJ+7o=YY#hd0V*r7+fr13gA z(_rr(Gi%~5%=!yRQrTqIByfENqWO#y_d-)?4sCraqB`g5^Cyx>|#(4>5^M`x_*-r`sbfe*Y$yS%?; z1cWbv6NHc5J?!FBN9BwnKZ+@?k+o>S5U$c+P{KYb;T#`s}haD=Y;u8=ps?o=&1vy1#lW&6xRre`4( z4VRz|W5+kJ-$kS&LI-upHD!uSHTEAUZy-3IEp1a>OGMYkXE|xMrGx$g{3#|r#B4Ap zHb=1ys&O&Y(k60jj_ajM{~9fq)R9Rb+j~wC8?jtIqdXnyUh$%7xxOnsWS6CxDf(^L zcBObs%0D|W#QBp8TMyfNTJkE8FSa>ij z>d)Yrh6RWSIW9OPR&Y>EJcT2#GQNB(hb8TkCa|Xb8}O5*=yHt6 z>=nDw9?c=&ktx-ElAUMWOHEp^?q5J^)M#_3-HSD?ud{7pSipJB1z)9f=N*H*6b3me z;mlmuVREX)uhKKJ#DJN_>^|dJWmVM;-WA6z-6}d=B!I^S z&nRIfQV>NkaOacE6+$ah-ZS`8QNR-MnWDN5?G8g#h!WCM`Xf0ipN?aFlb7m4t{0~iC5>G6Ik%_7cdJou_$Eypmb&bq z&J!4=bp8D-AO9dXmM6?lG6x1X>pRDjhy)ZSdYjzlmKtHBg|Iq)bq&MxJD;qTg};C= zB4>%qTc^GKt-EMl_U?7$#e~$SCZiFiZl|ow!$p=MEA1!<yx-p>o9*(;WgkN=W?o^fo9DltpWy{;Ugr>^lPsI;qIF z%^!o~D6K511%EpnP6&Ty8bb+^ zFU#}OGLc#ah>6FIEha0{={*(hXF#3c>suCMB+I36M?G08*&8hKYO?*FDcWn%wn#p% z+sa)CoiL{nvQ9S1@lNx-G*#1%+e%Rpx=*z6w1S45d=+u`fAuH+=iYr%S%2$GIG3s_ z788ArHW&JA-U=rc=&q8yoG4L2h_xBsF^do|3l2yw71tz$kRz4R@zq9MMdmMH++-+6 znfl1})i87DY|e~u2{_LuDYGIlk*d|oO!63|icC6ivWU~gaB%KS^udrN)^T`~MF$vv zQFWqfVfH|&2IJAv)YaqQI$%)fVU!659BHVzR`$|8q4{ckU8NwZi4eo!)8L?`{HE>W zURlU^Q)@adn|`{t9YGcCl?kOY*^nL=yfWAn8fZ2^P?uU{dNdXv)+ zig8qRR@AG2z5QC{OF{pNRM9&j5)U1BI`lPP0^vXQ=CS7EiAY$>kYdZ|4wMDEx9;>1 zm`4?z!d`&m!G%^frEYH-_gx3a!toj?bXS41VcaVk{AU`jwyou_)D&jqCCLEo^!dF$ z0Q=4$AFtOcJt|$EvH}BK*GSekzzuNeU4}HW2pp0wZYqY#2DKxelr6|cjx^q!)eA=t zA8;maIgMGcBelwzmBFrZFnO8x(}S~Iy6Ve-Iap6q1Uhu1nUf$8M9Ho1*Ip-Y*l7N= z?KFk=k%tTKh0AH!hw&_(0R9{~6@Hx_6n#9rTpt-;G}cmu9*ry(W{=ay`O7W+oL!lErE#HQVc@=n(@mj57BrA+YyOLcDKi@$1gNOsn9+nQ664bu3u*D+ACz_0t8jxlK z0S$60&N$37jZJW0ZGuW4gkr zP=0FPh~iVyEG&ER3?$j5LF_~?)Lgja2*XAIH6qwsW`}gw)ueM8bJkgrjdsej7%CMg zDjOkKA@g_?b4psyc;7b5zh1VmVaG+NtDjejea}AjFO1w*B_SQ6f@ehHJ z2G}QI)YyOv)B3L`y3H%bZx%y&Ux&o2cPDiJc}23ISWuRKu$Xt`FkL0yz`HdYHa?YpM|2Wuh1+7Pm6_-%lvRSb7 zhNRM%_yKqg5txou3U5r6h~;r5OiC;!rA z?}9>2&KH89KSF2Gh(H|Xf`69xZ(6_$w6X!>2&^iMh|+^V(&#GodFTkd2wxIua7WRh zZbJ5ZK#06s!Xtr}vCqEda)Mt!Hn1=l?DfkWecK?ATFt(JlB0a@g$`#6m4*2ChJA)8 zJOKM;mgkV--m!i3*I8nXrvfsR3GpAKJmK8j-$t{{bXq2-OPGavdWK8)Im)YDmnTuL zWYhb@rJuUxR7$?e@_T&?xF9QfW0lC?Tl}SLO0CLJ+m6swJy-CTkM?>M&P=*tP8O2~ z0_ACDSPbPa;AHNaUAvylIT_UTDa)Ot76@`_k{cx6wJA2=>~Uh-E;4FakY_7GF~OPD zHEV67fYl;2$q0N<;I_?j@1E+$w`fy*5_Q>RJDOs^Z?ioBItQAc2^TAeTzm=ikf(HBy$B>-{Fj4=wCSKVElTApkE+f-R(|eY1~AueL8h8r zO;b>5xlCnk3lVsX&cEV$=0xY`{))Ox|e;b75hP2!SO7Z zl*Ppr_hr5jnoEm+H;o9z$OS{f0`hIRE&aF7s7M(Yo;{WjYmgM zZh2ULmOs~ZneML5f zad}F`JzXV9lvq|GSbJ!Q9c{KxEqsyx6*~9eDQE9`tmutM6Tz#1!bX`tX^aKGV!wTm z`(3kQASc#*cXDDlMBJ8DgT)bhY2)E^L_uQNJp|)X9rG^2*9*E|GAR3*X|LMU%<5S@ z*`Leu7vL326N)l9r{9(n;r3MyftZz+=Xh&5RAQR4L=mlUkWJo`F@(EJBv{ftu=X}> zUn2{ANJ7X)fZ#g#tpPtSj9KQIL z?mG5r6R6`MI14ZK{sOeD1$CKW?L_3Yhaz~atz_$T<}j{U0>OuRW1{RIM{-#j*?dW< zkasr@X{ich>B{ZIrzZ{g(t9X3^f4+x`EWIM-r>1n&C~JXFSvuM!m(&eRCB4w(StEH z0eU?TO^anXPx``LQWtK!h~yA?0r@+Q4d1lj!5>VqDG|`L!1gb8SgdzOa4a!@>$5yQ zno>CRI~ASaVfoCRt$2 zC8kJXYvv}`ff77P*NozGw@dCGtH8vCDc#dQMnfzw%}`RJ(Dx3>2i0mwI{Ei`a?1C^ zBbUyr+9tN|clD=VKdp}!aXL+wkl*dJ`{VX6@r%GLAD%=Hycqcrj-eKjoONvI1g~0kSl|RT6DA@cXGu8@x|c`hI+{Hu zky~#1W3U<51Wd@lTOfIPvmSJn&St7wMYpN-YL8pKr3~xP8BpxXG3FZcCY`%a@WH#3 zsY`!_VbJ6%`T6a=?uV6qBYJx9ArvEhONaGKO99yxHjbbe>&>~tjJB|V;Huu!$Lik&6>D)J>shYi$X?T-V-&24*|1x0pyQ?UBp)0_r*W4VJS zZR+IwuoaV=vzV;K`ntk}C?W{|8D(=sd_i}cQF^+Ew>IUW$1QQn)DE#)0dj#MK@Q!A zbeWBWJQMHjgtN1D5gXxon@u`#>F(6E8==Utw(@hmOsh6wRD0bgi=WP^>N$|?> z>v)f+r}%=By4h_z8EVnZ^Jh~L&3!djAY?BwYYoCZk$6>s%AYG`!jS?!=q9UI;@}iO ziT$)kv4>opv@wni8x*kl3s_qAcRNvOXhqO%7+0ouQ{7Y%Q#HuWl@?x5YiFX{aryFy zwYQSn?o&?*=}clRR;Y=Wm4J;EH=RNidKMDisq!Sely|CB1gUY>I$G=tp=(c6jlaG# z)hv-T5T+Q~&}@L0Sl7H(oa=w|C?g2J)Qw6Cg*>~XO}o>klQ7VAiW8{4^S zXwrxO0=`3y%k4g_P{bxgD!VzYDYo=TD1PZHjiHKigWWzWxAR|{`W!mjDQ4*xY8vqr zKTkJFU&zoasJ=*?vmF$vyHr~uo$xA4f{P|kDwOYrS zkUqJfhxcMgW?1~Xesc)+HfQC9)2W4AB(m=;7B4Ae^FZ*91pLnO(*~hoYJn|Bs(Yhv zWKmeRIsR;D4u8owHnl?ck-=h#hKc5hQiiqf@?}|M@;5Yu$MrT0a(z%UP&z>Di8(;V zFvI@bz}(u+B*7thW)J{2_&x0IRIqaJGI1n!FR;WxAfSuomRF9bGm{afahKR^<5D`g zBSLr^LWs)^B79BfatFcsDa2Qw|6^6fug(950qG;L7sJZOjbkqQ+}nuD0a(*(w%e0Z z{q|M1QqnzEqJaoWuDR0?cw=4!QrNF4*CAr^y}KISH@!WooUMz+`cKB|;U}dPnW?%L zgTM|IIS9L?!J<&4d8ouXn?&e!Px*@8t#u0TwCs1GRGZZ4Fs6wJP`FvZ35!(E4O*w> z3`5R|lCp5mrMIcYcB+unLqgCn*-iNdFxj9pYlbXh`Scs=?^PnHVeyVc*vIs~TeYVr`Bt|DO1K_sLhw?q80fU1!+C$oX|sZHH1M@h2ExEd!f8}9g%ck5!Hf{aLwEa-6WBI(#V-oL)ekN zAyocutc3jQN19*|o_^ z(dcrJB^vEQFLAq-O8sB};L>NeSweAqferY9@ffMGqe~!~I6?)l#dyHhMFZ<^{qFlS zqj4Y7uW+X%p3K;G8EDPQ5-iT`txJV~J}in&+!jOq5Cwk_D@(&Z2wa;kHe@RC4>(2JxWCL4z9%OeMDwT`yqj`&;4 zC!2o(H72Q{yasF=2S)s<@6D(W)f!1RU_Q6Qg#!VEDvD$g5vOeZ9)AIXx`Mb_pFL0E zZc`+U0u-=%uF_&bTPuC;ILw(Q>0hWAY#zxE-_KgaUM*JGJ>yb@ZfHZDiTI@+0;#gh z{Dl|SR@{zijh5Hmzp?EjaoUmOTur`1U;GOQf45x+X938nP;O&|e>!8?5B6=faI6pw0~~(S8agzhP>Uv#qFuq?2jirW zNu;IPNCbNC=r51Ji))2lLOB59@p-aYe!Ps%OBQ~D8G&{D}5rX5E zmGcUK-ziz6!`FA;nP(KjFbg0o6q*!znYl=bm~`m*F21s9(_x$dK-FeGLWbPb$j;4J zYIxefW`V(qwOF}|JMOqf>?$-$_Z??^uKeX`XjFbfm=*WV&!2HlY7NMX(je_gc0@N} zZ~$;6svwfqGTnm=(gw+{~h}LCftOt^#eftZbFMj(avvA04xg{GxLfLe>wWyQbGha=k z-IN%Nhn5s5b{rHgvZ|Z9y%zdR%#^r#nm96$=KT5*j7re_67KFYjd*8nDMYI`jpNBzli>Jlg zHEm9^+p;xPQu+-2ZXvP>eg|z`J&!R7aP48dpH8Q=YwC1?^r;a0TS2rVNgD1-4Y#BT zAx3PjhO12~9oYB-P98wWaZV5R&ZO^QiKLNFHYN<;Q|^h%152p4N62f0tLdcDxRT?4D>Q?eB5yxN>s}4%5~= zJaQ(iVgbw!+UOV!X7_AQcQw`NsmE)M61>H4T-T)8me>kJGH@ZN9Hk1b}usC&$^Gp=t7^Q1D1-ST%3>>V%BXwYxUF#Hs4M$*k7 zDL8VXn}n@&9*6Hm%lUD$WU*dX&WP2MFc0sApS$k1w^+G$21kxM$qvp;*oT0Je`hN? zp0xts_t#m><7iesQPQV}SxhcqeSHPvd0fcQbofFVIo2Xpn`S57-VH(QzM@(K_(#1XM*v4u$~1Gv3J7coO%nV%!A!g8dX_Xbz>ZGv*dDk{9+GRLqf zSCD}q^tsv4xeKZQzO0ncoN$jI^C{|uj&C9zJOubVRS8lqA9K=Ah70>iE8ayoGd@+k zu4r(&YOoN(0+xz&DK?uw>vnpbUb2AG7?P38zdSsDKWELaB-7eAXTIa$WdMy8BA4@s zTBq>Tlzr!oeG3}Pa>w9SSB%PRF}2|eRJ*ic+S7hd-i^4na}&63X;vRw;yV+6Ne=oS zJ2ARG$_B#e>&An0<^RPjw+Z!N2z{D97g4c>lG9#pQkJidSR8QrpqOd=p%8$OBHyF< zq>RgKQZ6;cSP(#k@!-wA1p2pAWMMo@_YE>+hkIVoL~TWVd>$7JY{_cl=5g8_vPK#^ zCsnQ6R&QG9lPjS;4M%~>Kmi}B+)ZC}C@FbSm9rLw`gO4q&fjch?!L1Ka(0fD%GTAz z?%v9}nyL{`31c|poh(OQ4h~jFluEg|6C3`jpR%5`M3DHGtC{rQPz&Qb%oz0;29)F} z`mx^<1*K$KyR}XkyO3KBwbW1t_3}e{=-j3Q_`32P+EOE!lN4JK^m|B7SV>DLKdgLdxkh}MeIfU}AMf1J19;KoGAf)>87dNj>(UX(#m;4=OUBZn+eln~W)A zlQHGF%J0B$T=9f{*A58@>KRUCceInx>?eHO2_+fy4O=b>`ZZW;eBX&o)ZJjAPV^X@ zYkjK0O66@q~hx-QrKplQiTML3(k zm>;8&YDD(df-DB=f$q0Fd^p#&ZE!wj0n-|5Z}jM%vY3XNU@hmR_WiouX6)>Iiyow4 zDedYihE>J+@iRNJImFQl^0meHtDJTV*=3sb8r`w{*uR=`gO~&9I%D<<7uf?A)6!y_ z3+b2(dRst}3*#_5a71X&CQt$(p<&!Ou(a~7IQj>JzIqtjn&o_cszKr0FYYdpVUNTm zvT_*Ysbx1&_cdbNA47#Mg?$nGv47x;>p|iME33BtZQC2Hxv_FkQr?rG4vsz7h}-*ZT+ z6Yxe*nL!`sc0|yeMF|nuN01!FvTZdWaadQlWXJVRIBJJql!fSL;hNGi2Z(_rC_!Ef z>;-GZL&IOzinjWVZZuH~i3?XnnY3f?9!v@tT+K=~{==*l|5a#e7s93IzP#_XyAdX8 zM*U;UY^Ny-#3pnoSi-Uv1ebg^&t)V|2G%s+lrBU9Y|PNgs97a>{r0^IE_Z1+#sui# zHv`ZG-QElXV(bB%4x zt=Di%D&44op&vI7i-1dd!sP_wl&#$hiNnQWn-3fg*6Fg8ia%J7mV)l* zJ)5*v>qOgQol&AzxZAsjL~rs@SSQ=7ESW@JXs)WddPx{|k@VG1UdRPlp$GPfei}y3 z);sgCSC9^BN(BpUWoE94dggt-W&?nz2t$tT15=6g`W5PgzuvN5{_b{06B=4l$3yaLlW&wBSC1Ww%;nEvy33F1)|domDtaxcMsGiY~Me8D-`>j{gFEX zS=UsJ!)jH9MgZ%je|3^O$5#L+HNbOo(w2bgF+`aTT~z{x-6dy4ot2$BbMIa6cN&T_ zWr@69I;9U0Eqr1@j-wmY-mjIlHFr6nLlg6NM>-tjdGWfo_0MHeQ$l#rJh^4G>17Rq zn@{8bROY=AYpF@MX$n6C{ql+18V~C>svM@2MYHQ8Z26I0qxpxBOA53h%Yq6f$V-GZ z5gToDUSUE06U*LfSQM^CR`p1=uCi((g}inuFB^}*5{0wkbM8QbK)Ia>K8tY;R=*5l zO07ik;3<+oV-6XZD&{N9`rw639p~Xs>OvX`0MRVC{hB%?HqE4Ei>v4NOL>xdg=fu< z&|TaH8wtf)CkFy|y+~3({Fk>8+q(N}V_KipF0Auis2e+rQoFk=-h3f`-;r+0b2LR= zuWi*e&!-f`cBOd#(<;H$Huzv_$^P>PjXaikE6I7bFyKn9-fonLD`mOdaLow!mYucHh&T~HwtJR>!b&n zGI9@A^7g;vqg_@}vzvuKO7I(?#3qytjrzvBX@C&?5gijE3*j3VFP{3KgV^ZKJDn0e zY_(*M7y!cf-j2HSU7bWznYOFLg{u5OTOy-Xs{Q?JTpHm7=Hl~2Q@xaU zS398g#<;dcmCf2FTLxV8yA-(@ReiDbL9#`$J`KK29nU3z;PLQRnRcwbzbS^9J^HNM#4mc7k(D`r}>yG7z0@84Oo z*4GhFLR8OiqjYX*HONC+jB0H z4H&(*^(M&S=0|++-pdiuq8{AhYE<(mN0rG{{#2%E&Rue#abnE2{`%~4zAkX@hINvq z&Y78(+GpOkt~=-w-ZvX&9+!2oM2^(@7;iv^x3#-i>C7mRzD2lE#^YkXy!Prli%t_{ zzl8}16e|l#0(&cK*D$MLCb*MzlQ`%GtvYTcVE2%fTO@D?d|V=F@L)hl01x)&E&Ym! zgo=kmT8~tY@xcXer!iyj(v7KyT(@-RXV~w4R09<>*1WAW*+aZUlQx;?Y>F+ti>p=` zWcvspJ!}5uk4EMF=c6RpbVXrC`xetr+I5MBH+Y^`ku$rj9NIK$s-Mx6KXVHf;$us< z&pWTTuleBHuaB}XY;UaY*=q06W*7+qPmnrijw>tM1tM8=*sWVZOC|F&1Qv|wJtDhj z;4RHQI*9(BBbZxAbasMFNi)K{U7;2!CP{r%t}~j;C#4b60G-ydOv=bnN=N5FL%A$F zE$!N&Rgn8 zmnMRd8d*srTW(q-uo**R`BWS^IUrcVaLRyRjctTZezKe3bp7Ohc2iL$E8mLY4on6A zQo&JN6~)_KFo>@CG;c%Lbng8VI-92BZX$d*hVH#2i~s6Q?=PT|W!yZN@G5eY89nT5 zwyrUaesPWSFvEv1YcU44|IT9oH8hygY`6?HMH4{x=|Paz)Skip5D4!hKG&{c%DNR} z)yn$mNb9pSxrP&qEnioAOmS4b5Nu-!C;I_mN zS<*j2jzsO$H;ynB0mRj7Zyk-n%grLXj3gga}<&5DMNu&&ns!gHKUG@(>fz`_V~Lf+5}?0gAytRhOpOkn6~=w4=;X%XdZvl z*14f9zPI5ny8C4bM9iMYJk!RxxA_-Y(!Z}@i<%QIcsCH0`QE2CuyLeGed%y}S zj;AU9_R6%kChnagVBpUeJF;ZL16*kCY+-i2s&qp{@&6nxB|cv3%`E|_Cuh6XaUQI zROuIo`M2fu21aXRl&UcYL)r1|d3PkdF#l{xSh4UywrePhd(wfZ(~#l}q+iI{`pc)L zdAyPdZZjvR-!@0;D4yP;b;cXxFtxD+07(T<-gP_)6T?+VljpkpYT1NuEr#e_68$!g zTYQy=R+$^3h;8`Ow@>@t?0WCoE3)P^+*#XiJ+s$nPYExdQS&-5H%3{R^+kq%cu4g6 zOBgyfT@-0KW|Jx`y^I)qL9*~V=lub>`P2K}Z5u}<)iteZSDcC?`!1wPS&gk96GP6v zgL8S+z{xL_jsPFx7Qe3>(m-lXsjW~=WtElNCQ)oa@kx{uUgVB^nElxNN;#lG#AygU z82Xrr%^Iv`n$kO&I3x)0nPm$~FV$4I-3f(pEBv&>jr*|=ImIHLe(i)K4xKtuu@g7n z*AJA$5+a5}o>eAVB+t0n;UkK&)TNgmWsV@i+R1?~M)4_#^WI@w4q z)T$7LnM-Hkcf;%xB5Wj>!ESSzaZ%*E7i9)qSIk@fE0KF;-BYtw0IX$_5HmPTIC`-@ zbO6^gT%`l>qlAK1|5Z8Cw*{1^=J zB44>F6bqGBlW*D;93Iv)%Vl(I5)uk84@Kzx%o(IR!$9fSsulganZq#;e2M zHMyJ5c<8Y91*yTNTl&qdoU4&0p7?%)Kv6h^3>hrTed%>zYp%X)#`bHL;}vuo?PxyJ zX+@U85ud>iwU~-KaXuFQr|d!&9F9Qrk)aPRU_POzc zejEJwgcGe+n|VsvXRiAD{OMnS!1$ViJcd8uwmkkd9E48Ta|fJT$ubEa?x9pYT`wD5 z*0t&Z#lCW!(`FVu_n&wfCTek{d!t9h&nMJTfonS*&+;ZamvdywXR^_Sk(W(?S%Sq> zO?<)p^u|&@CBW=WvQ+M5lA7&`?8n%xEgMh(NxDGk`SBYEmH=NC40|sc>lGsLpl`;3 zT-RTDLz9>v#;6G7zzzn)SsdIQLGv@P#iCgtI%P*CK-@Mt6J||>I&cuWub6}A61WA5dmwztM{PE*PVjy=m zzh1w9)grWKlRmYl_wuEYfoSmq#7z8DR6uFM?g|(XHcp5t6U~O&+aPrGsEgHbo)=d=U>4;71(42h$Moo4iPhb%w~% zFNs&(gKkR1Cu!mC_$6duXzpMpn$hb<@2Pc3NXZnjR>j8@>}xT5cS)NyI~Mz$_Z#P@ zpc?nT073)34^}M>C1WJkv;)CVq|x*khzBe&nSSVLU&fg6TItYRQHmjwiR?G)_pr}( zlZFjGiALC)A3s@1x`wN=v?X5{t*Nq)AhyDKoH694)0Qc#)keL#A9cQXX^_g>MvQZ# z;j2wQ>RBHj66xBcsBFh1;Ie%i^|>svh=1eewVSJ@`tk!a24VHi=gtAG zG`rEZQu1!00hzDiUuSwDR_+A!zIOCj?JVTK?Yl-@J0(w9r^l?czhefdtAdLsvrE?G z25o`nC1)1D!TuSF`8^X*0@2`Ap`k|3si1_CF&B-0K74TBwzaajCAV7f!dUubmRq9O zJU2=WCAcgX2tOv`ROP96r{CyLiV= zZMF`v3l4|;JDN0)8F|+C0CUCC5xjq*^lY%*8-xjQBThRf#4pPx4{M`SC|sIbPkdJ6&y#M%9K4C=8L=E*ow z904I0#tJ^LQ*N$T$XE5bh_A9c_HjySK~zY##M_TOw6o>xt@a<-fQ0l-q1&kp58tcy$k zgTR;~2fG=yU{K;0+C7B(==vYjlo$y@sslex4xg)NTPx=izV2%?uC-k5{lyc^v(zQC z5~GG?Fbr~V5>p%uux9HMwTwLlTucf*>dEA-{k)7S4weCV41e_|?~M{1G3k_|7INsbYD9!b0VAc@TS)CMxLLqt}%>QScDX(@46%vcm=igdiW}cvi%_es(;g=v-Q7hP{ zi(e>)M#FP`lZUfJdND+2)fkle%kb<-<7;vuvfsxlIERXzzL94froO&j1M|;@2o$Y$_J47C@=cBE zb>?&mV}`c8SjV##GhEriAxG`o)OAIoOSpes;FoFYAjnjwi-}jXEuB)u`?+d!@OS0v zd;hB85#+K(m3q^nyT2;A>Bc8GEi)E&%>JP$y6VI8MYZqp>?O5}UAr3mKw+AvcEvLV zU=s{gUg!{VXXJ0nwLvAY%CsXxy4-qV9@3;&wyqi?4A^T2rTj z_E5Ax;_N!kZqc?cQ`B+<-^$6mfOV}OMp0i3nfq!x7f{x4?D8M*y-f9E(VEUI?R=j= za8CUbwUqn@-QRwprSS%?;>@V%7S$WZ`8=Ntmj+cFtdFA$= zo8X*qiTro@n$yd9{1&B1W49Kw`19&$uWWCFG2P&Gs+WV=9%v%6^ziiv!=hVQp<|!f zWjCkb<5FwW7Y7cVZHX|ww)4SUVTs}64`o=5KFSw`B85Fn%_&;844i6Yj0G<_V|)rz zpNgTA{tinw?@$M4UZa=fEcft@+MANJHNqwcr>vMl{^@~=Eo6CNSUTCsz;U2@1h^2+ zGV>wsXC)P>MoZ4CzW~F^<4m@14>2HX^kMX%1gWj7`z1cNHoPVecrI7j@{B>IUYkjH zNoop((5v4~VbX%PAa`2BeZDSyW4l`1mQiEFTDtKN6qwiO4c6L)(XHX&66;lVk!6sP zu3OZH0939mE^_mdQeZw-m!EYEqqqZ&t`-&uRcbXCx)>}4=o%HFIQgx&J&a)NoFfEM zWjKZG7t(ITKW99-Q=h~oHq)k`OVVYASK4P!;EFJxR^vfOxeJA0!~u=X7Tfaa?`K(m zr39y%N{&$d5j#m&_gn9ggf8Wzh;`1-koAtdT?sg@Jv=f{UEE5&maQ(rkRTm#v$a5fL8?WnmmtUfJdLd1 zRW0$ojcl=1bVgo9U+g6Kd$ITwGXpy-Quixb$UjUvxNxvg?%NiQtjGyXp@&SUIezOt z9o288Q@Z4}2W+_t9%e06__EMP4hT98rKr0_Hvsl6^v4J%)%Y^k{Dwys8wA>7O_p=P z2cqc;E@{*~;@5uxuk7PLRiO{htTT;(Y(j=yS#`1ZAowF0L5By%PT~u>RX?vxQA+KW zqmQ|s>hJu`q^#_r9PoXoCWZkaq{>cE7q^mqWe$U-qZzJ{IqH zB$=Tdcz?;1>F|h?|L(+0)VCEi3JLV41K2$3FRr>zwIMd*&4nG z39RPUgCaPAPAhIB2W?_PpTwjY9Y}I^cn2XFA=!n3I6^n%B*nW*8Q(ItYxUmabXSQs!96?Ln6|W-C`Zb4q`9x0O?zNQTa&l)DR9 z`|!|11|+9hX#LahZO|EXsVlfH`g3Z60xh#rUtWEHh#tTG^4-gr)?cUm}9D`dWcK z6d_%M-U8lG{wi86fLHoYP|cG| z!dPV^w2gJdb^K165!{c;~`0ax;(^nfW;HLYIq%lx_ z_9n_A$_VCE?>bNnSM#Hct z*U)#Z%Se{`4?oOkq*6xc&fE}smG$GHtBl!%6#*mu*M}^gUD0B zKJ}$>6Yl~?-y$*dc7lPu56i_;n=FKFWt8;*cB;QoMRO~iCBCNwh)8wZIUbG4tC1IE zB(~3BGyZy41*Yn0YJwqfBqV*tARk)jZS}O=N-F`zHl4tqO8N$mnObOVTp17p8kf(f z6-we`8QRK7BPVbK=A(~Ljmc>+M?rvi{{T3st}Y{$-Gbl_G3{27EX>yQ%RA*@>Z-)# zHaZ-7cdt6}ABNf^x+Yf)a&Rzs{{THJ(Jm!e-GFW}$?K15#+}rSj53X$O5_9eq~mi) zNu$MY;hAMTfaLR$gMm!bZ&_wgUP3dDE4=Y0j)F99AszPBD8d(t@4y*+%b|! z#%rQ0_T3(I*bCY^OoJrtLUyqF<&^#va@7+Z9gjbY!YtqjuR>t-k}`8jd@FZtJZ#Fh z5CfS6c?^5-I@ehwSztln510>QQpdR9Tn&-B{H&*;?ag!Zb~-tBFt7XzaQBxJY42+l zn?IQn7jKnV0u=C0Mb%!qYa@x!kQs>ilpYQ%N_#&w zQe^-f9n0zU_N=8gwKPyin_FmiZb5k=h!MdBq$lV`Kb>5+@cc?uu5M+NjGw$y1K%N! z>s?Ltmy`_ALc2i3$WJOyLI_c>WgdqFFQx}k_|iujvi!=-zjbg3;;jf|3Z(!HqYZ(aj{N%6 zxi%IXJW-Vn^9F2Z2s~jca|(+x`{KpqPQKK)9YH^8`mShjI7a^?qm68i1m#74&c_5Hq+g1j@?zA zSx5!2Up(M_Mryx^yd^Wlb*&j;x4wjVs*tf@NAV&4^I&uwinUrV-C^wI9eNwK`ef20 zx0IPg$YM{+yQe)ebH!=Rr2gpna_M)?0APC!+4H(_Q1v=$bGCK2IlZ?~4*z2aC(WPwG%^khV zzuOj4WEcw494-pu*!2|2bx5t(W%Mx1Z5(@*rwZs!dSOo0BP=oWtG0I5QNwojD;=?w zyvaPLeU3>Zb~xH|$Mqd+C&o7RTIPn(Oe8l}@x1Xg5^$0+;d6kcNarLUsp@f!W-D$&seQQ(woEc89-DLSE2Gi$2rTp$u(6iy5=jdzvd+VC z$8Dsk=ZxTfHA}+26S%gX9a{eYQfa2x35pnsgS(QaJn@m73>^I{t97=KB)7nZRzO*n zRSGb8AROcJt*XmTTagIa-p3Q--8SOyOOnEQzRcp`UQ+R&n1ykcY+$iCA|Fk`PdAC3ii*1zCOX#7T& z;_WoOKH;+(x*gf-Rd6=9Kb2hyv9+0;wlPNncE$)E+>jBs6$FT1bZQaDvrJm#yc%k%NLMwf4 zDEzP83(WN9{>2+Ectb7$Z6;Wr)b`e(>WNs|a?KDl)j^YgJj|l^xYkD*}4Zle#Lbh;W_2;L!CZ?Hjsv`y)#P zmoh;FxCCQ7uTR3a^u2k}+j+#hfmw&j#CvCo<6?B)FxcJB81gFga?2EeV96djk#d+P|-|NL@2XiL&AY+1E!2N2X>ehsLODL8`P(cUoli2!IxZE^hPX`?2 za7_`F_aVcTSsWF$;wA#^0Y~u+=bmdu+V2bsKG6NZJP+{|$t1wC;#qJBC2}fguQoxr zGwvC{?knjpq4RDBZ62j57?G98JRI%M`Q!Dguxcfhl)I*Vvs_KR@!EvAJGdOx$Zu4F z&fsIwy45CT;B`jnb_NVdbI^`+RIViwD`#juF`o588@E*(Wdt5qB9ci%@K4OgIUmlQ z!63R|@ktvg>zp6q73N+lfnmNNB9MJ6zP+0meZ&^~-r!de;&xk|PsxaJ9!Wj^ZhuTx zH4UlmKShmLMoV=Z;PkH3OO7?tHHl>N6BgE+s1H*pYJmg4{?f_J0nQ0X;^~h#^NuUYjYsM+aosN-?-wL zYTiuH?3G9FB&wazV=a9LR)*WWi0U8*1~x=yCmOcL=V?p_gtl&Btv204m%~0tn(J zStpbUa1kT{BSXn-_XM7uxT*C`0?J_<>AP(oa}_Tm0VYO3C$}6{Ue#X6zhu(6&Y2}x zH;3C9+!(OKbk76R12t|2f0HiqK-~_`J9nvkC#&gNfpGRQ+iDOt*&%4p%<2l@_hFI9 zJv;QR*q#|7YfaJ33V=im1fXsQ+Yy1vVYdMtXtX znW$;$_Dk>V_}}f8v7atCA%x7Mabi1hii+Lz+dG*pZ0>his+qpcFfSx!hB2Il10$w$ z$GvH57PhZxJbHjuidOs3DGuK#ByvaujE+J2RuZf4E1e3GQP9rt{{V<|{a(&%q<^u> zBNAN8w+XjA5<3PtIqkryNa_b)$I_$FG^jL*ZglG#1%xAw zmrL`RlNnh9HdiE&y8?lbdF@uOZU&(gx^A)N#SPkw8IPW4mda?rTl zp^agnYkG@nKVj3RyWCbrnL~rX+ri_V!>Fv=&j|Q;QAe62xq*q=?`~NFk=F}`Tm#f7 z6}6&xe#b_#hA6Hc<)X{1#y{Q_U^{|2#&M2ol$Tu8^gU&*Y~hPij&tT)st0)$JMLxy zn+ga3kG}DD2H*t*R^8YRaj-r)0yjt2}4s+;PG0js;0&ac6kZ zTRrB|KYYPf*^q$LQWLzSMN4m7pS3Sjsi93Ww%9fDR5l^H+Y?d3A7cupnRE z#$|a)C#hkTPs=o;PEdC;l;bX@PK|SWq4=szDs4?JY@vY4iMfI@w*Z~o5`IXKCz6Q~PILB_aVoOVTt{&n`WHOPr%<{m(e{}vLtr%n8S$G?V zKse+1S4xjlA8ENyPZt(e;ZkC%i}#~NIn-soEiFXwae($wh zj^asO6(d@!s1qpMDi;FpWn#;06C#MI}pfjBUe(& z%tLY&NC2Oq=DEFF!|_P+T-q`ukA{^UK1+kw=26js0|azDn(3MrLS~Die69--k4zrN zujx>mM4sebER(WEHY{r33hmG2JJ+CUnnbsR-q|xH?gAMbh~-Y6RGry-20X5F(wSi>y;G{{Ev_3-_t=+tk*mUYcW1%%_)<`aaVBS=n<8Hk=nyA-d>{HnDJ3kC~irMzM z+S@7|;7Z4E?gq?*Th_iBmPt{yZAN>IxnC~cG`CZemdOV#lg~BRtRVx%!=oNg@dNEo zgfInF<02umk&@Z(^{lE?Z=umn%S(}IwoqHD!Xs4(FgEe|vFln>kcO`G&M-||dyxXMX;_`u3I8mk+OV|yDK9P>c|$Rq=J{773cCfg`kcveDa3J~z5FV3j(z>Bwea7A zn&!!_bqrcqA_r+@KPkcL7q8>eo{MoM*rVZ14mgZP^};3U*g$&C{o`gTrfP`s`-ZqpXOr zSn83{DJIbcw%r;792$i3Lm?_-kbp)z@wEPA)oY&?Sy#KV;`aF(6w}14AS)FnLV8QXZvxA;KwbSX6M(|r* zS*FyTos8l@6omysGIh^Vc&h#q@l)#dsc}3^vO_q8O0h9l$OPnWIXn;2v^Cqy8<)9> z-^;uadCJ&O`Az09++mfy2RQ3hR`OiENR6YfL!R-?gX&UQO9ZyCJZ|`vizzWJ^ zD586b?gR<|3vlS54wzLW{nP8)r*U1mAoGENJ<~-ycnd?<&ypK?~ zp5oeQ?Ab^OJ3<>hGtl4-*ci`D)>Jok>Z={2Jb<$+qeXxS8OVNdoKY1kjmagccJB5| zYq-i(j6m zoh^**nNj0~m-mCpj{uX^Ny#kVh#&0Mea4M7i>|Zb)l|8NpFRVUvV+) z2m~-4I`N9Ou*)Rq@gQ~?!iD7Y?OA>$ylY)POPfezmS92vQ#sEaJN2ucAMq5T1RABK z#-Dj8AS{;BK$$_pgN>!Q&ND>bgu!z=mYG&-eac=oCy}21n5RcJen((e8EoSe?N;U~ z?hNrOpk*7~usp-S$ph}xdt#jxQ34V3F$R%*(*5+#(# z!*nC%3NwPF@N#fJ8tSE-G}8GfQYK*PgcKe7FH_A?(=_>RY@rZ~XFhwb*yHjz>KT+| z9{&I}KTLvop5hzWZHk*<;D;?b9mn+Jr_!>&EUpgnRxL*gyEx+#5Lf_7sOOEXr7j5b zH**?}-%8K4@hzRTRE|bOktA;9FE-9{GL>>B$m>afyPbF{Ew#vCT0HT$1Mey5LFA5=W>`)Yx2bh(2?+sQ zeMeF~sqydM8o_&U8p1X(;gsh+ci{0;b|VfO$tJv#()0*52vcs%e6pbaIK5YnomAwW zDe@)MGbus=gc#a3#tCkxJbhJSyb;GFj|IXXG7Fdn*MN`WLFv%#@6B`Y>Nj>* zf7zPNv~lVzo2_0Wi0+rw3F(2=e()rom9%4YK5H6!ZQq|8AsZ#zjk(To#%lV&?1C$K z3QEI~8v?-k)@-(>OuSL-kyS|``JCgiYQJSWw2}GlJixdZ7$@+lmWI)d^&)7bFg#OS zyn)ya{qsF9E zkZxQOS2-sijYR6Kqo*BBO|i=zsLi--1067Wew8xXT(DpwDnoX!e#eAn`C*B{Tplx? zDe)pp!28YDALrV(ZS+>1N1UfUKrR4b{uR<_{tv#JVYIN3;vlv|d1^pm&o#>1ydqiWAflt?j(rEWTJ$|L!Vue9q?)zVHo$@!5{l9f zZNT$V-fGr5b+CiOmXOB90zgp+~O{?5%O&U83djZNr7a@;0CmsE(F66xO8Jb6TCz)ho&iVfF=to|iDn$;e zLwu-sP&o<*@~#S%oU}V>&`VZjI&Ou)GM689f4h#~=hCHwdCH|&23`rl!S<)mZo*R} zh<9|sY-Wpek8%N&m#6^bXWp^3&Zw(sL@i9wETLEBC(Hm~(*#UGcmX*)DxKfTwV<6O z5t%?%Io^KnKT3joX8B(YlaevV6`Rnz8Pi!M&}7Ju9oP}gahk`5WwbL$vMh>?ljagI zPo`_TW{u(vxpx!BIRsRnXO7^yOoJ_gK10bBtSWMtPMyyib$>G(;e374qa*2Ee}Mc) zeFgM-V^6-`ZOBXG_jnl$po7z|PH|ed{td96Or&yx2`6h{0)PEg%W57Ny|%grD5QA6 zAYt&vx+Tk5S(wICr0$PT)31iDJhw1i&X(R|18WITu?%e)>6UMl<7w(f4@%dHB)0$* znOTdx!ef+Tagcs+FhK-v+z)E;O(R&m(e9O?l1RY8a-KRSq0ah2ODbrV)3@cyl1eWn>K zBKtfs%apf_E2;oM1$TYoah|y!OjP=++iDs-))NSvZ)Fm!Z6Y_wKw;PrNc*RX!O%QC zb)h}ov)vn|8B}2#E;F8UpQk?6dfv`BVG+c#G$nEalKXgE=W*jC8qvi@r!~x-ThryS z&G<|ES}hjlDJ?E7+ymtaV@<41(Sjry=sOQu>MY~bWVebdhPR0oOl)96P6);_O8TAv z#aXwBV=5wDg@#Hg?cc98Ysf;2fw>R*w$EQ$xmr@aj8vwK%Nq!zR0auf$@2*|gOUEq zlaHrv)p|85ps3rp^y!M0C`X#2MIe#6Phtf~BUug`a)L=?vmr-nE!cd{Tajt@l3riO z92YSo^O)Fz!`vQ%uE!F@USG4JDo>bHVTm2jV^ra^w-=FJEO9K!kg^Yu)%$6S0W(Vs zvm+J#;oxVn>^~ZC+>?*-E}JfusmZQrqjkgteXiUv3vi@oJ4dE!{*|lRYPxdYX=S*| zxMP-A{^=R|{#CnsJ+p;ti(rbMD0eu(>|5KD`d0<6*~{V0VRgL@H1aM+XR_|Ve-=9f z*wGLdbvG42Ng?6 z)$KJ)3v0V6eAt^g4fmrx(TDlzSDp(wL{Bs+FhjpQsYdK;l5yoXgzl_8m&uWp_YJML zk^+)C@!pn12|E>F(LNg};B)DUu#!93i+{9DENv$6uZG75raAurCaa|8IF3{(jNmri z!iXS{ulwJW!i>`W&`$((CaLSU6X|+%)4>;-=M4~KVsp^s_Q2<#O4GKD0YQR_-#L(E zhCbkP->B(Ih$goL!8}j9V?;!MCV$#ecLF)dfoj*9y`@ zAy7x&P&WR3YTlWujT6OA*OyGThIUmF0-kVk3bs7*c*=g=gph+njwV`crDr!9Av<_FI5P zV|e2rr#!Dbk?-wUIBG6p^4i4GKbs3UPn?%H*baL7b5%iPD3K&+!#jyn^LlgMrHn@# z#w1lqlQDua71VQ<%}FvOt^~nJ$mASihZYwgi&R1-G0h1U&4vJsf_r;ZH@5ay(4~&0 z1ac$uxGQ2e9PU^nHiaVHI zJDYfJZKN9|ibcvv_}4pgB;Fi!F7I`uZY}4?3(aPK>7gGqpX|69007(y*Of@Sv~(^@ z#~5X1E5eZ6nyT$PNrk{=;11@1LosxmGnL;P1_yXJIUk;X$fv>{JZ(bcA6zpZL0PET zmwTg^w$ik?*;TbGRy^V;cSu{W8&e>kt!~BPn~Q{oO&Z$e-*z`k3L=5VPUq!+0DhH` z;S0Dd-4ET{#_l=%>(Z=zPiCqhLfepM=Odq|wR`u_`R1L*+4xr4+S~myJ5^Alb9sJa zXPo7mgZL<@FRv|Zt=0sUgb{J_ouCioDh*%7kw~6Ya;Cw{5V`ybt_xSyKHaFKK3|zU zr{s)eek4@6TX0ahrKosYc<_8gnh%x7s6<=VwJfB%RkE z-Sj;v_BL$rFeuG2bG+jvvC#Wgm9zQIVwwhZmxlp64y1d5Tor2bXnHi^%7~%N@Ewb| zV}PsEzxAr_gaz|hlKfx}G4Dg#{{UucNgKS5Kr&iB_S-rE)Q*`^oYj_qe2n;Y``dfu z`&T1Rc67w2aT9s&$S}D66OYi-U?KYaasYqxx!#Fo)5}$Gf+<)VYaM} z$>Nzx;fk#wXrIl>s2pP%sh28vA&ZT~ zRI!b?whcHc>cxQIAplfId@_Y`v`PG3!K=|2{z4ZS=rfRi8jj@vh=eP&A6%UKP>E!L z%d#Yr?&F40*XvOjOp%9Q+>l#5WSWKF27N0>J0cuPc9xLb z1xYO-a+xKziqaO_xSBpDM_&v|x1y@uyqPSTheON*%B^lar5H zn*(Cq+Y71VYj=_s94v0Zg9^^Sj%dj~PFUm>E&w2R#ckTiu?|(0lNky#&$UY}jCzf` zeV+zp;1)cb^{Hf>y|I=yFCYa^BMqPOD%wV-G79dD{qdi>?kUFFLKHff)mv%#dLQyl zEEcjLDJwfLB!X8MqToc);mj?!%n_Ni?~T!Nq;{P9)f1th^js(w(}&fjWvtg>XI zZTVXnCanRZ9CI`50!YE&asVUo?NLE$QI#5BB}9bEJhj7camdN35g8pB*|xDKlhFSF zg;=%wJYr?G`K55o*-}nGBnq^I#(Avrl(mjCIT!>ccpdt6s&^JpNf?^wy~D^zVKU=B zzm95qiS{PsjDn{HyMjlhK@qr;-4(zs89Q5{Bm8Q)tSfUIPOqb0cuP`~RnVY$tmNkI z*+nP zY0cruwJlQ03EDZ4Wk?{AOf4pJF7$7kJ4ebu#_Ux|s+*G^-JL&}f;Kyxf_jcfKUzkf zBB~@LJCE-GKMJFxYL>dKlHFO#vLuQLT!3Od*8|_buhy;=2+G6&2T`L0@q zMHp#Qcmn~?BoD%$Bw^L|sGb?QA#x8K_543ds}!rXoVu>jj08EUR#R_tx<+-v1M;vc z+;{Y<)C3Z=6ROU_XyhL&jtc|Z9-^#-mMEE(qHv{lFgXNzQ*Gu+oI)aCyLdf+D!pL| ziG(sokfiPN4gsvCxC~2I4*pv@w%~gFqu!r7hl3_P(u0qb;Gb{v>r#js5|KinW9A2c ze%#dwbt_g>k1H#_NCW3=j@)$5Kcz?$!WKwz8EDxE1QH47gHKN`=0}a)46H!O>BnMg z8~zd-D`tqu>ZSN04-&6XKMqH|W$GR(xQUm_wRTr#Dm>LzQS|<_`6R{76ROu*^4i5E z)9k+3%-=ex+83MxGyLe^C{5EwR|(EsGUW01ha4K)SUMdB-)8|%9p2ij1y%}B)zAKy)Bs#tG%IcwvVM)o_Li9haT9$Q4)*v3v?jxAyiH6ovdgSmcqmniw zotE_NLv9j8`TYh)J?l`04BJ*HP&?u3u|?@jn6Fn5zoDDSom%z zo6Ndnb0O}{(ETf0n5dVNQq(nqqRuHk&$JejP=E2!_|~nCn;on^VRn)G%3J2owK~mk z2=bJG6d=w3$6uvim7-ZPBV`ORw{UD9UMo2}n?@-b8f1+wWKxLnj5uo5LehCsMy{@) zf~oxL8ClbFDqx%f2Y-6nwz)?o{I>-_2OTSxQPkQjTdP5-*!cn83xIb)IboO_axy== zo}#jBu2{$RNz^3qow7y&9$6=b9=p2!IIZ~-69EMY4bD{Zr`EDOPp6x)_Ul;Vd#Fz7 zQaqNDJa7~atT1U?n?b!bBf3qcH%R0Wo!J0%$jw49V#JHIqhJs)q<@o4)2^bthib^! zld)jjj=cH|RI?`k0GXLlqa<uq+~g#}1C2ZQ+4HN=UAUUB?f z8g;bcj@%V+K2^p;53NWvgpo@sJV3%r9r)z;s}^^J#uyB-;F7%lwD?3Isq)J+a&y3_ z<%9<;jki32yw$ygTVdu!BRM!EX9?Py5kP)Zj1og0GCe8?rfhuefIH_EVj1uXK1!ZJ z9lh!X_B3rT7D(6=mhFYjMR*&Pjmo||Emc(!zVw;Oj)Ax*+zQZ&;t69eNORB@;p^>L_b`aoZ*V{({A&wPl1p_BVj=TD0gQ(j9go(uBh)2UG0EmQ=ngOiI`Dm< ztd^KEfsLeRHIVl(Eo8gD+%FI_slh85S{x1HBBRbicd0ledeLyNbNi$$5wKgR{QU(* zFjhtLroyPl%yQrlL)=!eXoiW_c@`-dA@f;Ou#CP7W4EK_tobUj~PgCnj zY^d=j6;Qhner)5?qFa^wF_Bj0H;k3r!QGSn-nB84e7HMgaufu|=lImUbpa@)A=>rG3@LbSH>K=CPIB#dx~RAsVz zU;PTtO=S=4J;xpWryH?K=dd3M6H={ST#i zt;Vx;H0v?EXeL32jzCq%rZ(gNX$gYk`gS;<3pI>UC{y3Ux9xDWu0}QrC)j~Tmo_Y1I9U>@Y@*{y`ar46o^2X87 zjAUp01r~_&Iz{Bj9lqQ9!~IL`+F zV?2tbb$2wU&ys1%ONKHTK3MR0+El0tPCAN)=HBV8P2bt>a8U0r8iLGt!N=V^oM)~o zDC9_{St502m}Ri1F1W_mUc?bXfaaF#@Q4DwVRBUIT`KA9qQsr`x#?-8*VYM zfC1y7J!>^Y(SouVo;WjxoO0~l)9FvPo-m~w%yFFV@1OAJ^rAv8o2gpnLoP17z&zs^ z+8pC6><$M()|AMC5pf(|dC2+42c9@yyn5A3mM=E%nS%~qZg|Mb;B^_~`mh9Xnt>rI z56*UFkIS5lk^0ow4OY1fyLMq=U_NF95IN$h7Lf{wuA~t&Z9B)y&Oz*W$PM^Xh5qp0 zx9*e1N4+{2w>QeG>PC1KY9Kc9(Jlm%VI_N&4&P`(!HCDq2|Je^a0=(p^r9^?)F_JG zXZtz%gbu<)hp`IB2a}V=-+k3GfEDDB=ga$`9M!1UDzC^uVUb%!3Pf>@>y~C99AFG_ zR^lQ)BSMOQylOt@=~J)#d;T zmCK8<(%W1`JS#rJ$iwEr!BbW5t_f%!24$RrQv?mTH*}yA~#~A!8LK~3q303zv`2w=wFdaW0wPyGJJ*EEu zuO*;(;y6}IQFTnr1=7_{ki0o zs+0c!$H1u<{y(Crv8;73q^mS)r4HpgOCC1Viz>l0ASIAsoQxGUM*jf)bN>L>MXhVk z^%o!R59L;nq>*j5+(to=sxaV@!Tf53rJ#4*3nBTB&4O|0D!+%n)DOq`*FiVlU-v(# zrqPQkL9}l2WM^)9!StzvMDuMa7n>gd=LLs+Qz!obRX6*?`Bh6_`3zhC0J>`@ z9Yu1Ey*&1Et@13F7GRMm9LWb`BIEBV92Nc^y{fR58-zQqi&w9Y=BW>0LAb z0I5G#{zkZehoABfPx||t{{TZ3tAe$~eN8bBnydDg`50~|a4f#-j?|1++I5acQ<6k` zjxtA}?rBH-geLz0b-(l~%<=d9c=1axaLNAwAq$`Q5A!wBPyYZQmHz;A{{S&vDhR?; zV=wi+U6O03z7RSx$16mn?j1m3(SQ2Ft6VMB(+S$An_O8)?l*gxP^axxMt z-}HB5DJOd?dA~1C)cw#zTgr+f9I6Sz=bvIZsAc<~@FPr@?nU*a1%|$o*4dpcqMtmN znmzmR(~@&lTIzQT7>&HNC6^8k-1C9oy;vXXKMHNH-g=UT$GNkT%oBwqGtIuUdbu{3$SGs0YmLl6nmB$I_moEApIFtM`o${;Tn!4k5Iz4tff3IYP>X zv&Qb2rbqs-@u9!eANQ)u9}dtAWPn@SH9SUD*c)*l%Bb7_0IwfP(vSUXf4fYUfB)HA C==R100} {puts "loop [incr p]"; set i 0} + incr i + if {$p>=2000} break +} +mysqlclose $c +unset c diff --git a/tests/test.sql b/tests/test.sql new file mode 100644 index 0000000..7012332 --- /dev/null +++ b/tests/test.sql @@ -0,0 +1,23 @@ +CREATE TABLE Student ( + MatrNr int(11) DEFAULT '0' NOT NULL auto_increment, + Name varchar(20), + Semester int(11), + PRIMARY KEY (MatrNr) +); + +INSERT INTO Student VALUES (1,'Sojka',4); +INSERT INTO Student VALUES (2,'Preisner',2); +INSERT INTO Student VALUES (3,'Killar',2); +INSERT INTO Student VALUES (4,'Penderecki',10); +INSERT INTO Student VALUES (5,'Turnau',2); +INSERT INTO Student VALUES (6,'Grechuta',3); +INSERT INTO Student VALUES (7,'Gorniak',1); +INSERT INTO Student VALUES (8,'Niemen',3); +INSERT INTO Student VALUES (9,'Bem',5); + +CREATE TABLE Binarytest ( + id int(11) DEFAULT '0' NOT NULL auto_increment, + data longblob, + PRIMARY KEY (id) +); + diff --git a/tests/test.tcl b/tests/test.tcl new file mode 100755 index 0000000..a93f618 --- /dev/null +++ b/tests/test.tcl @@ -0,0 +1,427 @@ +#!/usr/bin/tcl +# Simple Test file to test all mysqltcl commands and parameters +# please create test database first +# from test.sql file +# >mysql -u root +# >create database uni; +# +# >mysql -u root 0) break + incr count + } + return +} + +tcltest::test {receive-1.2} {with error} -body { + set count 0 + mysqlreceive $handle {select MatrNr,Name from Student order by Name} {nr name} { + set res [list $nr $name] + if ($count>0) { + error "Test Error" + } + incr count + } + return +} -returnCodes error -result "Test Error" + +tcltest::test {query-1.0} {base case} -body { + set query1 [mysqlquery $handle {select MatrNr,Name From Student Order By Name}] + mysqlnext $query1 + set query2 [mysqlquery $handle {select MatrNr,Name From Student Order By Name}] + mysqlnext $query2 + mysqlendquery $query1 + mysqlnext $query2 + mysqlresult $query2 cols + mysqlresult $query2 rows + mysqlresult $query2 current + mysqlseek $query2 0 + mysqlnext $query2 + mysqlresult $query2 current + mysqlcol $query2 -current {name type length table non_null prim_key decimals numeric} + mysqlendquery $query2 + return +} + +tcltest::test {query-1.1} {endquery on handle} -body { + mysqlsel $handle {select * from Student} + mysqlendquery $handle + mysqlresult $handle current +} -returnCodes error -match glob -result "*no result*" + +tcltest::test {status-1.0} {read status array} -body { + set ret "code=$mysqlstatus(code) command=$mysqlstatus(command) message=$mysqlstatus(message) nullvalue=$mysqlstatus(nullvalue)" + return +} + +tcltest::test {insert-1.0} {new insert id check} -body { + mysqlexec $handle {INSERT INTO Student (Name,Semester) VALUES ('Artur Trzewik',11)} + set newid [mysqlinsertid $handle] + mysqlexec $handle "UPDATE Student SET Semester=12 WHERE MatrNr=$newid" + mysqlinfo $handle info + mysqlexec $handle "DELETE FROM Student WHERE MatrNr=$newid" +} -result 1 + +tcltest::test {nullvalue-1.0} {null value handling} -body { + # Test NULL Value setting + mysqlexec $handle {INSERT INTO Student (Name) VALUES (Null)} + set id [mysqlinsertid $handle] + set mysqlstatus(nullvalue) NULL + set res [lindex [mysqlsel $handle "select Name,Semester from Student where MatrNr=$id" -list] 0] + lindex $res 1 +} -result NULL + +tcltest::test {schema-1.0} {querry on schema} -body { + # Metadata querries + mysqlcol $handle Student name + mysqlcol $handle Student {name type length table non_null prim_key decimals numeric} + return +} + +tcltest::test {info-1.0} {info} -body { + mysqlinfo $handle databases + mysqlinfo $handle dbname + mysqlinfo $handle host + mysqlinfo $handle tables + mysqlinfo $handle dbname? + mysqlinfo $handle host? + return +} + +tcltest::test {state-1.0} {state} -body { + mysqlstate $handle + mysqlstate $handle -numeric + return +} + +tcltest::test {errorhandling-1.0} {not a handle} -body { + mysqlsel bad0 {select * from Student} +} -returnCodes error -match glob -result "*not mysqltcl handle*" + +tcltest::test {errorhandling-1.1} {error in sql select, no table} -body { + mysqlsel $handle {select * from Unknown} +} -returnCodes error -match glob -result "*Table*" + +tcltest::test {errorhandling-1.2} {error in sql} -body { + mysqlexec $handle {unknown command} +} -returnCodes error -match glob -result "*SQL syntax*" + +tcltest::test {errorhandling-1.3} {read after end} -body { + set rows [mysqlsel $handle {select * from Student}] + for {set x 0} {$x<$rows} {incr x} { + set res [mysqlnext $handle] + set nr [lindex $res 0] + set name [lindex $res 1] + set sem [lindex $res 2] + } + mysqlnext $handle +} -result {} + + +tcltest::test {errorhandling-1.4} {false map binding} -body { + #read after end by map + mysqlsel $handle {select * from Student} + mysqlmap $handle {nr name} { + set row [format "nr %16s name:%s" $nr $name] + } + mysqlseek $handle 0 + mysqlmap $handle {nr name err err2} { + set row [format "nr %16s name:%s" $nr $name] + } + return +} -returnCodes error -match glob -result "*too many variables*" + +tcltest::test {sel-1.2} {-list option} -body { + mysqlsel $handle {select * from Student} -list + return +} + +tcltest::test {sel-1.3} {-flatlist option} -body { + mysqlsel $handle {select * from Student} -flatlist + return +} + +tcltest::test {handle-1.0} {interanl finding handle} -body { + set shandle [string trim " $handle "] + mysqlinfo $shandle databases + return +} + +mysqlclose $handle + +tcltest::test {handle-1.1} {operation on closed handle} -body { + mysqlinfo $handle tables + return +} -returnCodes error -match glob -result "*handle already closed*" + +tcltest::test {handle-1.2} {operation on closed handle} -body { + set a " $handle " + unset handle + set a [string trim $a] + mysqlinfo $a tables +} -returnCodes error -match glob -result "*not mysqltcl handle*" + + +tcltest::test {handle-1.2} {open 20 connection, close all} -body { + for {set x 0} {$x<20} {incr x} { + lappend handles [getConnection] + } + foreach h $handles { + mysqlsel $h {select * from Student} + } + mysqlclose + return +} + +tcltest::test {handle-1.3} {10 queries, close all} -body { + set handle [mysqlconnect -user root -db uni] + for {set x 0} {$x<10} {incr x} { + lappend queries [mysqlquery $handle {select * from Student}] + } + for {set x 0} {$x<10} {incr x} { + mysqlquery $handle {select * from Student} + } + mysqlclose $handle + mysqlnext [lindex $queries 0] +} -returnCodes error -match glob -result "*handle already closed*" + +tcltest::test {handle-1.4} {10 queries, close all} -body { + set handle [mysqlconnect -user root -db uni] + mysqlquery $handle {select * from Student} + mysqlclose + return +} + +tcltest::test {handle-1.5} {Testing false connecting} -body { + mysqlconnect -user nouser -db nodb +} -returnCodes error -match glob -result "*Unknown database*" + + +set handle [getConnection] + +tcltest::test {escape-1.0} {escaping} -body { + mysqlescape "art\"ur" + mysqlescape $handle "art\"ur" + return +} + +tcltest::test {ping-1.0} {escaping} -body { + mysqlping $handle + return +} + +tcltest::test {changeuser-1.0} {escaping} -body { + mysqlchangeuser $handle root {} + mysqlchangeuser $handle root {} uni + return +} + +# does not work for mysql4.1 +if 0 { +tcltest::test {changeuser-1.1} {no such user} -body { + mysqlchangeuser $handle nonuser {} uni +} -returnCodes error -match glob -result "*Unknown database*" +} + +tcltest::test {interpreter-1.0} {mysqltcl in slave interpreter} -body { + set handle [mysqlconnect -user root -db uni] + set i1 [interp create] + $i1 eval { + package require mysqltcl + set hdl [mysqlconnect -user root -db uni] + } + interp delete $i1 + mysqlinfo $handle databases + mysqlclose $handle + return +} + +tcltest::cleanupTests +puts "End of test" diff --git a/tests/test2.tcl b/tests/test2.tcl new file mode 100755 index 0000000..7a4477b --- /dev/null +++ b/tests/test2.tcl @@ -0,0 +1,26 @@ +#!/usr/bin/tcl +# Simple Test file to test all mysqltcl commands and parameters +# please create test database first +# from test.sql file +# >mysql -u root +# >create database uni; +# +# >mysql -u root mysql -u root +# >create database uni; +# +# >mysql -u root 0} {} + mysql::moreresult $conn +} -result 1 + +tcltest::test {nextresult-1.0} {only one result} -body { + mysql::ping $conn + mysql::sel $conn { + select * from transtest; + select * from Student; + } + while {[llength [set row [mysql::fetch $conn]]]>0} { + } + mysql::nextresult $conn + set hadRow 0 + while {[llength [set row [mysql::fetch $conn]]]>0} { + set hadRow 1 + } + return $hadRow +} -result 1 -returnCodes 2 + +tcltest::test {setserveroption-1.0} {set multistatment off} -body { + mysql::setserveroption $conn -multi_statment_off + mysql::exec $conn { + insert into transtest (name,id) values ('row1',31); + insert into transtest (name,id) values ('row2',32); + insert into transtest (name,id) values ('row3',33); + } +} -returnCodes error -match glob -result "mysql::exec/db server*" + +tcltest::test {setserveroption-1.1} {set multistatment on} -body { + mysql::setserveroption $conn -multi_statment_on + mysql::exec $conn { + insert into transtest (name,id) values ('row1',31); + insert into transtest (name,id) values ('row2',32); + insert into transtest (name,id) values ('row3',33); + } + return +} + +tcltest::test {info-1.0} {asking about host} -body { + set res [mysql::info $conn host] + expr {[string length $res]>0} +} -result 1 + +tcltest::test {info-1.1} {serverversion} -body { + mysql::info $conn serverversion + expr {[mysql::info $conn serverversionid]>0} +} -result 1 + +tcltest::test {info-1.2} {sqlstate} -body { + mysql::info $conn sqlstate + return +} + +tcltest::test {state-1.0} {reported bug in 3.51} -body { + mysql::state nothandle -numeric +} -result 0 + +tcltest::test {state-1.1} {reported bug in 3.51} -body { + mysql::state nothandle +} -result NOT_A_HANDLE + +tcltest::test {null-2.0} {reading and checking null from database} -body { + mysql::ping $conn + mysql::autocommit $conn 1 + mysql::exec $conn { + delete from transtest where name="nulltest" + } + mysql::exec $conn { + insert into transtest (name,id) values ('nulltest',NULL); + } + mysql::sel $conn {select id from transtest where name='nulltest'} + set res [lindex [mysql::fetch $conn] 0] + mysql::isnull $res +} -result 1 + +tcltest::test {baseinfo-1.0} {clientversionid} -body { + expr {[mysql::baseinfo clientversionid]>0} +} -result 1 + + +# no prepared statements in this version +if 0 { + +tcltest::test {preparedstatment-1.0} {create test} -body { + set phandle [mysql::prepare $conn {insert into transtest (id,name) values (?,?)}] + mysql::close $phandle + return +} + +tcltest::test {preparedstatment-1.1} {create errortest} -body { + set phandle [mysql::prepare $conn {nosql command ?,?}] + mysql::close $phandle + return +} -returnCodes error -match glob -result "*SQL*" + +tcltest::test {preparedstatment-1.3} {select} -body { + set phandle [mysql::prepare $conn {select id,name from transtest}] + mysql::pselect $phandle + set rowcount 0 + while {[llength [set row [mysql::fetch $phandle]]]>0} { + incr rowcount + } + mysql::close $phandle + return +} + + +tcltest::test {preparedstatment-1.2} {insert} -body { + set phandle [mysql::prepare $conn {insert into transtest (id,name) values (?,?)}] + set count [mysql::param $phandle count] + mysql::param $phandle type 0 + mysql::param $phandle type 1 + mysql::param $phandle type + mysql::pexecute $phandle 2 Artur + mysql::close $phandle + return $count +} -result 2 + + +tcltest::test {preparedstatment-1.4} {select mit bind} -body { + set phandle [mysql::prepare $conn {select id,name from transtest where id=?}] + set countin [mysql::paramin $phandle count] + set countout [mysql::paramin $phandle count] + mysql::paramin $phandle type 0 + mysql::paramin $phandle type + mysql::paramout $phandle type 0 + mysql::paramout $phandle type 1 + mysql::paramout $phandle type + mysql::execute $phandle + mysql::close $phandle + list $countin $countout +} -result {1 2} + +} + +tcltest::cleanupTests + +puts "End of test" + -- 2.23.0